diff --git a/Trello/src/com/soumya/projectManagement/Board.java b/Trello/src/com/soumya/projectManagement/Board.java new file mode 100644 index 0000000..36ee771 --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/Board.java @@ -0,0 +1,67 @@ +package com.soumya.projectManagement; + +import java.util.ArrayList; +import java.util.List; + +// Model for Board +public class Board { + + private String name, bid, url; + private Privacy privacy; + private List lists; + private List members; + + public Board(String name, String bid, String url) { + this.name = name; + this.bid = bid; + this.privacy = Privacy.PUBLIC; + this.url = url; + this.lists = new ArrayList<>(); + this.members = new ArrayList<>();; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getBid() { + return bid; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Privacy getPrivacy() { + return privacy; + } + + public void setPrivacy(Privacy privacy) { + this.privacy = privacy; + } + + public List getLists() { + return lists; + } + + public void setLists(List lists) { + this.lists = lists; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + +} diff --git a/Trello/src/com/soumya/projectManagement/BoardManager.java b/Trello/src/com/soumya/projectManagement/BoardManager.java new file mode 100644 index 0000000..e1d0f1a --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/BoardManager.java @@ -0,0 +1,89 @@ +package com.soumya.projectManagement; + +import java.util.UUID; + +// Core Functions related to Board Management +public class BoardManager { + + // Checks whether BID is valid or not + public static boolean isValid(String bid, StorageUtil store) { + return store.boards.containsKey(bid); + } + + // Creates new Board with given name + public static String createBoard(String name, StorageUtil store) { + String bid = UUID.randomUUID().toString().replace("-",""); + String url = "/boards/"+bid; + store.boards.put(bid, new Board(name, bid, url)); + return bid; + } + + // Deletes Board with given BID + public static void deleteBoard(String bid, StorageUtil store) { + Board board = store.boards.get(bid); + for(CList list : board.getLists()) { + for(Card card : list.getCards()) + store.cards.remove(card.getCid()); + store.lists.remove(list.getLid()); + } + store.boards.remove(bid); + } + + // Updates Board property + public static void updateBoard(String bid, String name, String privacy, StorageUtil store) { + Board board = store.boards.get(bid); + if(name!=null) + board.setName(name); + if(privacy!=null) + switch(privacy.toUpperCase()) { + case "PUBLIC": + board.setPrivacy(Privacy.PUBLIC); + break; + case "PRIVATE": + board.setPrivacy(Privacy.PRIVATE); + break; + default: + System.out.println("ERROR: Wrong Privacy Specification !"); + } + } + + // Add Members to a Board + public static void addMember(String bid, String uid, StorageUtil store) { + Board board = store.boards.get(bid); + User user = (User) store.users.get(uid).keySet().toArray()[0]; + store.users.get(uid).get(user).add(board); + board.getMembers().add(user); + } + + // Removes Member form a Board + public static void removeMember(String bid, String uid, StorageUtil store) { + Board board = store.boards.get(bid); + User user = (User) store.users.get(uid).keySet().toArray()[0]; + store.users.get(uid).get(user).remove(board); + board.getMembers().remove(user); + } + + // Displays Particular Board with all sub details + public static void showBoard(String bid, Board board, StorageUtil store) { + board = board==null?store.boards.get(bid):board; + System.out.println("BID : "+bid); + System.out.println("BOARD NAME : "+board.getName()); + if(board.getPrivacy()==Privacy.PRIVATE) + System.out.println("BOARD PRIVACY : PRIVATE"); + else + System.out.println("BOARD PRIVACY : PUBLIC"); + System.out.println("BOARD MEMEBERS :"); + if(board.getMembers().size()>0) + for(User usr : board.getMembers()) + System.out.println("UID :"+usr.getUid()+" Name : "+usr.getName()+" Email : "+usr.getEmail()); + else + System.out.println("N/A"); + System.out.println("BOARD LISTS :"); + if(board.getLists().size()>0) + for(CList list : board.getLists()) + ListManager.showList(list.getLid(),list,store); + else + System.out.println("N/A"); + System.out.println(); + } +} diff --git a/Trello/src/com/soumya/projectManagement/CList.java b/Trello/src/com/soumya/projectManagement/CList.java new file mode 100644 index 0000000..3e844b6 --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/CList.java @@ -0,0 +1,39 @@ +package com.soumya.projectManagement; + +import java.util.ArrayList; +import java.util.List; + +// Model for List +public class CList { + + private String lid, name; + private List cards; + + public CList(String lid, String name) { + this.lid = lid; + this.name = name; + this.cards = new ArrayList<>(); + } + + public String getLid() { + return lid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getCards() { + return cards; + } + + public void setCards(List cards) { + this.cards = cards; + } + + +} diff --git a/Trello/src/com/soumya/projectManagement/Card.java b/Trello/src/com/soumya/projectManagement/Card.java new file mode 100644 index 0000000..b0ba800 --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/Card.java @@ -0,0 +1,43 @@ +package com.soumya.projectManagement; + +// Model for Card +public class Card { + + private String cid, name, description; + private User assgndUser; + + public Card(String cid, String name, String description) { + this.cid = cid; + this.name = name; + this.description = description; + this.assgndUser = null; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public User getAssgndUser() { + return assgndUser; + } + + public void setAssgndUser(User assgndUser) { + this.assgndUser = assgndUser; + } + + public String getCid() { + return cid; + } +} diff --git a/Trello/src/com/soumya/projectManagement/CardManager.java b/Trello/src/com/soumya/projectManagement/CardManager.java new file mode 100644 index 0000000..93b2d65 --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/CardManager.java @@ -0,0 +1,92 @@ +package com.soumya.projectManagement; + +import java.util.HashMap; +import java.util.UUID; + +//Core Functions related to Card Management +public class CardManager { + + // Checks whether CID is valid or not + public static boolean isValid(String cid, StorageUtil store) { + return store.cards.containsKey(cid); + } + + // Creates new Card with given name in specified List + public static String createCard(String lid, String name, StorageUtil store) { + String cid = UUID.randomUUID().toString().replace("-",""); + CList list = (CList) store.lists.get(lid).keySet().toArray()[0]; + Card card = new Card(cid, name, ""); + list.getCards().add(card); + store.cards.put(cid, new HashMap()); + store.cards.get(cid).put(card, list); + return cid; + } + + // Deletes Card with given CID + public static void deleteCard(String cid, StorageUtil store) { + CList list = (CList) store.cards.get(cid).values().toArray()[0]; + Card card = (Card) store.cards.get(cid).keySet().toArray()[0]; + store.cards.remove(cid); + list.getCards().remove(card); + } + + // Updates Card properties + public static void updateCard(String cid, String name, String description, StorageUtil store) { + Card card = (Card) store.cards.get(cid).keySet().toArray()[0]; + if(name!=null) + card.setName(name); + if(description!=null) + card.setDescription(description); + } + + // Assigns Member to a Card + public static void assignToCard(String cid, String uid, StorageUtil store) { + User user = (User) store.users.get(uid).keySet().toArray()[0]; + CList list = (CList) store.cards.get(cid).values().toArray()[0]; + Card card = (Card) store.cards.get(cid).keySet().toArray()[0]; + Board board = (Board) store.lists.get(list.getLid()).values().toArray()[0]; + if(board.getMembers().contains(user)) + card.setAssgndUser(user); + else + System.out.println("ERROR: USER DOESN'T BELONG TO CONTAINER BOARD - NAME: "+board.getName()+", BID: "+board.getBid()); + } + + // Unassigns Member from a Card + public static void unassignToCard(String cid, StorageUtil store) { + Card card = (Card) store.cards.get(cid).keySet().toArray()[0]; + card.setAssgndUser(null); + } + + // Moves Card to another List + public static void moveCard(String cid, String lid, StorageUtil store) { + CList newlist = (CList) store.lists.get(lid).keySet().toArray()[0]; + CList oldlist = (CList) store.cards.get(cid).values().toArray()[0]; + Board board = (Board) store.lists.get(lid).values().toArray()[0]; + if(!board.getLists().contains(oldlist)) { + System.out.println("ERROR: LIST : "+lid+" IS NOT IN THE SAME BOARD AS CARD : "+cid); + return; + } + Card card = (Card) store.cards.get(cid).keySet().toArray()[0]; + oldlist.getCards().remove(card); + newlist.getCards().add(card); + store.cards.get(cid).put(card, newlist); + } + + // Displays details of Card + public static void showCard(String cid, Card card, StorageUtil store) { + card = card==null?(Card) store.cards.get(cid).keySet().toArray()[0]:card; + System.out.println("CID : "+cid); + System.out.println("CARD NAME : "+card.getName()); + if(!card.getDescription().isEmpty()) + System.out.println("CARD DESCRIPTION : "+card.getDescription()); + else + System.out.println("CARD DESCRIPTION : N/A"); + System.out.print("CARD ASSIGNED USER : "); + if(card.getAssgndUser()==null) + System.out.println("N/A"); + else { + User usr=card.getAssgndUser(); + System.out.println("\nUID :"+usr.getUid()+" Name : "+usr.getName()+" Email : "+usr.getEmail()); + } + } +} diff --git a/Trello/src/com/soumya/projectManagement/DriverApp.java b/Trello/src/com/soumya/projectManagement/DriverApp.java new file mode 100644 index 0000000..d2015a7 --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/DriverApp.java @@ -0,0 +1,28 @@ +package com.soumya.projectManagement; + +import java.util.Scanner; + +// Main Driver Class +public class DriverApp { + + public static void main(String[] args) { + + // Initialize ProjectManager instance + ProjectManager pm = new ProjectManager(); + + // Hard coded registered users + pm.registerUser("User1", "user1@hello.com"); + pm.registerUser("User2", "user2@hello.com"); + pm.registerUser("User3", "user3@hello.com"); + + // Display details of registered users with their UID + pm.showAllUsers(); + + // User Command Input + Scanner sc=new Scanner(System.in); + while(true) { + // Execute Command + pm.handleRequest(sc.nextLine()); + } + } +} diff --git a/Trello/src/com/soumya/projectManagement/ListManager.java b/Trello/src/com/soumya/projectManagement/ListManager.java new file mode 100644 index 0000000..1a25cec --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/ListManager.java @@ -0,0 +1,54 @@ +package com.soumya.projectManagement; + +import java.util.HashMap; +import java.util.UUID; + +//Core Functions related to List Management +public class ListManager { + + // Checks whether LID is valid or not + public static boolean isValid(String lid, StorageUtil store) { + return store.lists.containsKey(lid); + } + + // Creates new List with given name in specified Board + public static String createList(String bid, String name, StorageUtil store) { + String lid = UUID.randomUUID().toString().replace("-",""); + Board board = store.boards.get(bid); + CList list = new CList(lid, name); + board.getLists().add(list); + store.lists.put(lid, new HashMap()); + store.lists.get(lid).put(list, board); + return lid; + } + + // Deletes List with given LID + public static void deleteList(String lid, StorageUtil store) { + CList list = (CList) store.lists.get(lid).keySet().toArray()[0]; + Board board = (Board) store.lists.get(lid).values().toArray()[0]; + for(Card card : list.getCards()) + store.cards.remove(card.getCid()); + store.lists.remove(lid); + board.getLists().remove(list); + } + + // Updates a List property + public static void updateList(String lid, String name, StorageUtil store) { + CList list = (CList) store.lists.get(lid).keySet().toArray()[0]; + list.setName(name); + } + + // Display details of a List + public static void showList(String lid, CList list, StorageUtil store) { + list = list==null?(CList) store.lists.get(lid).keySet().toArray()[0]:list; + System.out.println("LID : "+lid); + System.out.println("LIST NAME : "+list.getName()); + System.out.println("LIST CARDS :"); + if(list.getCards().size()>0) + for(Card card : list.getCards()) + CardManager.showCard(card.getCid(),card, store); + else + System.out.println("N/A"); + System.out.println(); + } +} diff --git a/Trello/src/com/soumya/projectManagement/Privacy.java b/Trello/src/com/soumya/projectManagement/Privacy.java new file mode 100644 index 0000000..0151991 --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/Privacy.java @@ -0,0 +1,7 @@ +package com.soumya.projectManagement; + +// Defines the Privacy properties for a Board +public enum Privacy { + PUBLIC, + PRIVATE; +} diff --git a/Trello/src/com/soumya/projectManagement/ProjectManager.java b/Trello/src/com/soumya/projectManagement/ProjectManager.java new file mode 100644 index 0000000..f339dcf --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/ProjectManager.java @@ -0,0 +1,205 @@ +package com.soumya.projectManagement; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// Orchestrates all the different functionalities [ Board, List, Card, User ] +public class ProjectManager { + + // Stores all the instance data related to users, boards, cards, lists + private StorageUtil store; + + public ProjectManager() { + store = new StorageUtil(); + } + + // Register new User + public void registerUser(String name, String email) { + ++store.userCount; + String uid = "user"+store.userCount; + store.users.put(uid, new HashMap>()); + store.users.get(uid).put(new User(name, uid, email), new ArrayList<>()); + } + + // Display all Registered Users + public void showAllUsers() { + System.out.println("ALL USERS : "); + for(Map> users : store.users.values()) { + User usr = (User) users.keySet().toArray()[0]; + System.out.println("UID :"+usr.getUid()+" Name : "+usr.getName()+" Email : "+usr.getEmail()); + } + } + + //Display all the Boards and their details + private void showAll() { + if(store.boards.size()==0) { + System.out.println("No Boards"); + return; + } + for(Board board : store.boards.values()) + BoardManager.showBoard(board.getBid(), board, store); + } + + // Parses the Input, validates the data and calls required functions + public void handleRequest(String request) { + String req[] = request.split(" "); + switch(req[0].toUpperCase()) { + case "BOARD": + switch(req[1].toUpperCase()) { + case "CREATE": + String name=request.substring(request.indexOf(" ", request.indexOf(req[1]))+1); + System.out.println("Created Board: "+BoardManager.createBoard(name, store)); + break; + case "DELETE": + if(!BoardManager.isValid(req[2], store)) { + System.out.println("ERROR: BOARD - "+req[2]+" DOESN'T EXIST"); + return; + } + BoardManager.deleteBoard(req[2], store); + break; + default: + if(!BoardManager.isValid(req[1], store)) { + System.out.println("ERROR: BOARD - "+req[1]+" DOESN'T EXIST"); + return; + } + switch(req[2].toUpperCase()) { + case "NAME": + name=request.substring(request.indexOf(" ", request.indexOf(req[2]))+1); + BoardManager.updateBoard(req[1], name, null,store); + break; + case "PRIVACY": + name=request.substring(request.indexOf(" ", request.indexOf(req[2]))+1); + BoardManager.updateBoard(req[1], null, name,store); + break; + case "ADD_MEMBER": + name=request.substring(request.indexOf(" ", request.indexOf(req[2]))+1); + BoardManager.addMember(req[1], name, store); + break; + case "REMOVE_MEMBER": + name=request.substring(request.indexOf(" ", request.indexOf(req[2]))+1); + BoardManager.removeMember(req[1], name, store); + break; + default: + System.out.println("ERROR: MALFORMED INPUT"); + } + } + break; + case "LIST": + switch(req[1].toUpperCase()) { + case "CREATE": + if(!BoardManager.isValid(req[2], store)) { + System.out.println("ERROR: BOARD - "+req[2]+" DOESN'T EXIST"); + return; + } + String name=request.substring(request.indexOf(" ", request.indexOf(req[2]))+1); + System.out.println("Created List: "+ListManager.createList(req[2], name, store)); + break; + case "DELETE": + if(!ListManager.isValid(req[2], store)) { + System.out.println("ERROR: LIST - "+req[1]+" DOESN'T EXIST"); + return; + } + ListManager.deleteList(req[2], store); + break; + default: + if(!ListManager.isValid(req[1], store)) { + System.out.println("ERROR: LIST - "+req[1]+" DOESN'T EXIST"); + return; + } + switch(req[2].toUpperCase()) { + case "NAME": + name=request.substring(request.indexOf(" ", request.indexOf(req[2]))+1); + ListManager.updateList(req[1], name, store); + break; + default: + System.out.println("ERROR: MALFORMED INPUT"); + } + } + break; + case "CARD": + switch(req[1].toUpperCase()) { + case "CREATE": + if(!ListManager.isValid(req[2], store)) { + System.out.println("ERROR: LIST - "+req[1]+" DOESN'T EXIST"); + return; + } + String name=request.substring(request.indexOf(" ", request.indexOf(req[2]))+1); + System.out.println("Created Card: "+CardManager.createCard(req[2],name,store)); + break; + case "DELETE": + if(!CardManager.isValid(req[2], store)) { + System.out.println("ERROR: CARD - "+req[2]+" DOESN'T EXIST"); + return; + } + CardManager.deleteCard(req[2], store); + break; + default: + if(!CardManager.isValid(req[1], store)) { + System.out.println("ERROR: CARD - "+req[1]+" DOESN'T EXIST"); + return; + } + switch(req[2].toUpperCase()) { + case "NAME": + name=request.substring(request.indexOf(" ", request.indexOf(req[2]))+1); + CardManager.updateCard(req[1], name, null,store); + break; + case "DESCRIPTION": + name=request.substring(request.indexOf(" ", request.indexOf(req[2]))+1); + CardManager.updateCard(req[1], null, name,store); + break; + case "ASSIGN": + name=request.substring(request.indexOf(" ", request.indexOf(req[2]))+1); + CardManager.assignToCard(req[1], name, store); + break; + case "UNASSIGN": + CardManager.unassignToCard(req[1], store); + break; + case "MOVE": + if(!ListManager.isValid(req[3], store)) { + System.out.println("ERROR: LIST - "+req[1]+" DOESN'T EXIST"); + return; + } + CardManager.moveCard(req[1], req[3], store); + break; + default: + System.out.println("ERROR: MALFORMED INPUT"); + } + } + break; + case "SHOW": + if(req.length==1) + showAll(); + else + switch(req[1].toUpperCase()) { + case "BOARD": + if(!BoardManager.isValid(req[2], store)) { + System.out.println("ERROR: BOARD - "+req[2]+" DOESN'T EXIST"); + return; + } + BoardManager.showBoard(req[2], null, store); + break; + case "LIST": + if(!ListManager.isValid(req[2], store)) { + System.out.println("ERROR: LIST - "+req[1]+" DOESN'T EXIST"); + return; + } + ListManager.showList(req[2], null, store); + break; + case "CARD": + if(!CardManager.isValid(req[2], store)) { + System.out.println("ERROR: LIST - "+req[1]+" DOESN'T EXIST"); + return; + } + CardManager.showCard(req[2], null, store); + break; + default: + System.out.println("ERROR: MALFORMED INPUT"); + } + break; + default: + System.out.println("ERROR: MALFORMED INPUT"); + } + } +} \ No newline at end of file diff --git a/Trello/src/com/soumya/projectManagement/StorageUtil.java b/Trello/src/com/soumya/projectManagement/StorageUtil.java new file mode 100644 index 0000000..451af45 --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/StorageUtil.java @@ -0,0 +1,32 @@ +package com.soumya.projectManagement; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// Utility class, holds all the different storage variables +public class StorageUtil { + + // Map of users and the Boards they are assigned to + public Map>> users; + + // Map of Boards + public Map boards; + + // Map of Lists and the Board they belong to + public Map> lists; + + // Map of Cards and the List they belong to + public Map> cards; + + // Counts no. of registered users + public int userCount; + + public StorageUtil() { + this.userCount = 0; + this.users = new HashMap<>(); + this.boards = new HashMap<>(); + this.lists = new HashMap<>(); + this.cards = new HashMap<>(); + } +} diff --git a/Trello/src/com/soumya/projectManagement/User.java b/Trello/src/com/soumya/projectManagement/User.java new file mode 100644 index 0000000..9c0d616 --- /dev/null +++ b/Trello/src/com/soumya/projectManagement/User.java @@ -0,0 +1,34 @@ +package com.soumya.projectManagement; + +// Model for the User +public class User { + + private String name, uid, email; + + public User(String name, String uid, String email) { + this.name = name; + this.uid = uid; + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getUid() { + return uid; + } + +}