make/change/deleteReservation and getResources implemented
[staff/due1/sed-hs15-srs-purple.git] / src / main / java / ch / bfh / ti / srs / controller / UserController.java
index f97f1de..aeceff9 100644 (file)
@@ -8,22 +8,30 @@
 package ch.bfh.ti.srs.controller;\r
 \r
 import java.rmi.AlreadyBoundException;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.UUID;\r
 \r
+import ch.bfh.ti.daterange.DateRange;\r
 import ch.bfh.ti.srs.datahandler.DataHandler;\r
+import ch.bfh.ti.srs.dataschema.Reservation;\r
+import ch.bfh.ti.srs.dataschema.Resource;\r
 import ch.bfh.ti.srs.dataschema.User;\r
 \r
 /**\r
  * @author Michael Grossen\r
  */\r
 public class UserController {\r
-       final String filePath = "test.xls";\r
-       User currentUser;\r
-       DataHandler dh;\r
+       private User currentUser;\r
+       private DataHandler dh;\r
        \r
        public UserController(){\r
        }\r
        \r
-       \r
        /**\r
         * Sets the DataHandler implementation for this Controller, must be set before using all other methods!\r
         * \r
@@ -36,28 +44,28 @@ public class UserController {
        /**\r
         * Tries to logIn a user with the given credentials\r
         * \r
-        * @param userName      username\r
-        * @param password      the stored password for the given username\r
-        * @return                      <code>true</code> if the user could log in successfully;\r
-        *                                      <code>false</code> eighter the username or the password was not correct.\r
-        * @throws                      Exception\r
+        * @param userName                                      username\r
+        * @param password                                      the stored password for the given username\r
+        * @return                                                      <code>true</code> if the user could log in successfully;\r
+        *                                                                      <code>false</code> eighter the username or the password was not correct.\r
+        * @throws Exception                            no datahandler set or thrown by datahandler\r
+        * @throws AlreadyBoundException        a user is already logged in\r
         */\r
        public boolean logIn(String userName, String password) throws Exception{\r
                if(dh == null) throw new Exception("No DataHandler set");\r
                if(currentUser != null) throw new AlreadyBoundException("A user is already logged in");\r
                User tempUser = dh.findUser(userName);\r
-               if(tempUser == null) return false;\r
-               if(tempUser.checkPassword(password)){\r
+               if(tempUser == null || !tempUser.checkPassword(password)) return false;\r
+               else{\r
                        currentUser = tempUser;\r
                        return true;\r
                }\r
-               else return false;\r
        }\r
        \r
        /**\r
         * Logs out the current user, throws exception if no user is logged in\r
         * \r
-        * @throws Exception \r
+        * @throws Exception eighter no datahandler is set or no user is logged in\r
         */\r
        public void logOut() throws Exception{\r
                if(dh == null) throw new Exception("No DataHandler set");\r
@@ -73,7 +81,7 @@ public class UserController {
         * @param email                 E-Mail address\r
         * @param name                  Name\r
         * @param lastname              Lastname\r
-        * @throws Exception\r
+        * @throws Exception    eighter no datahandler is set or user could not be added to the userlist\r
         */\r
        public void addUser(String userName, String password, String email, String name, String lastname) throws Exception{\r
                if(dh == null) throw new Exception("No DataHandler set");\r
@@ -84,49 +92,198 @@ public class UserController {
                dh.addUser(newUser);\r
        }\r
 \r
-\r
        /**\r
-        * Gets the username of the current user\r
+        * @deprecated use getLoggedUser\r
+        * Gets the username of the current user, use getLoggedUser\r
         * \r
-        * @return      Username\r
-        * @throws      Exception\r
+        * @return      Username        unique username\r
+        * @throws      Exception       no datahandler is set\r
         */\r
+       @Deprecated \r
        public String getLoggedUserName() throws Exception{\r
                if(currentUser == null) throw new Exception("No user is logged in");\r
                return currentUser.getUserName();\r
        }\r
 \r
-\r
        /**\r
+        * @deprecated use getLoggedUser\r
         * Gets the mail address of the current user\r
         * \r
         * @return      Mail address\r
-        * @throws      Exception\r
+        * @throws      Exception       no user is logged in\r
         */\r
+       @Deprecated\r
        public String getLoggedMail() throws Exception{\r
                if(currentUser == null) throw new Exception("No user is logged in");\r
                return currentUser.getMail();\r
        }\r
 \r
        /**\r
+        * @deprecated use getLoggedUser\r
         * Gets the first name of the current user\r
         * \r
         * @return      First name\r
-        * @throws      Exception\r
+        * @throws      Exception       no user is logged in\r
         */\r
-       public String getLoggedName() throws Exception {\r
+       @Deprecated\r
+       public String getLoggedName() throws Exception{\r
                if(currentUser == null) throw new Exception("No user is logged in");\r
                return currentUser.getName();\r
        }\r
 \r
        /**\r
+        * @deprecated use getLoggedUser\r
         * Gets the last name of the current user\r
         * \r
         * @return      Last name\r
-        * @throws      Exception\r
+        * @throws      Exception       no user is logged in\r
         */\r
-       public String getLoggedLastname() throws Exception {\r
+       @Deprecated\r
+       public String getLoggedLastname() throws Exception{\r
                if(currentUser == null) throw new Exception("No user is logged in");\r
                return currentUser.getLastname();\r
        }\r
+       \r
+       public User getLoggedUser(){\r
+               if(currentUser == null) return null;\r
+               return currentUser;\r
+       }\r
+       \r
+       public User getUser(String userName) throws Exception{\r
+               if(dh == null) throw new Exception("No DataHandler set");\r
+               return dh.findUser(userName).clone();\r
+       }\r
+       \r
+       /**\r
+        * Returns all reservations overlapping the given dateRange in a List\r
+        * \r
+        * @param       dateRange\r
+        * @return      <code>Map</code> if list is empty, no overlapping reservation could be found\r
+        * @throws      Exception       no user is logged in\r
+        */\r
+       public Map<Reservation, Boolean> getReservationsInDateRange(DateRange dateRange) throws Exception{\r
+               if(dh == null) throw new Exception("No DataHandler set");\r
+               if(dateRange == null) throw new Exception("dateRange must be defined");\r
+               \r
+               // Could be swapped out to private method for better performance (just check currentUser once)\r
+               // and easier code maintenance\r
+               Map<Reservation, Boolean> returnSet = new HashMap<Reservation, Boolean>();\r
+               for (Reservation reservation : dh.overlaps(dateRange)) {\r
+                       returnSet.put(reservation, reservation.getUser().equals(currentUser));\r
+               }\r
+               return returnSet;\r
+       }\r
+       \r
+       /**\r
+        * Returns the reservation or null if no reservation was found\r
+        * \r
+        * @param id universal unique idendifier\r
+        * @return      <code>Reservation</code> copy of reservation with given id\r
+        *                      <code>null</code> no reservation with this id found\r
+        * @throws Exception\r
+        */\r
+       public Reservation getReservation(UUID id) throws Exception{\r
+               if(dh == null) throw new Exception("No DataHandler set");\r
+               if(id == null) throw new Exception("uuid must be defined");\r
+               if(dh.findReservation(id) == null) return null;\r
+               else return dh.findReservation(id).clone();\r
+       }\r
+       \r
+       /**\r
+        * Returns the reservations of the given user, if null returns the reservations of the current logged in user\r
+        * \r
+        * @param user                          user you want the reservations of\r
+        * @return                                      List of reservations copies of a specific user\r
+        * @throws Exception            eighter no datahandler is set or no user is logged in while user param = null\r
+        */\r
+       public Map<Reservation, Boolean> getUserReservations(User user) throws Exception{\r
+               if(dh == null) throw new Exception("No DataHandler set");\r
+               if(user == null){\r
+                       if(currentUser == null) throw new Exception("user must be defined, if no user is logged in");\r
+                       else user = currentUser;\r
+               }\r
+               \r
+               // Could be swapped out to private method for better performance (just check currentUser once)\r
+               // and easier code maintenance\r
+               Map<Reservation, Boolean> returnSet = new HashMap<Reservation, Boolean>();\r
+               for (Reservation reservation : dh.userReservations(user)) {\r
+                       returnSet.put(reservation, reservation.getUser().equals(currentUser));\r
+               }\r
+               return returnSet;\r
+       }\r
+       \r
+       /**\r
+        * @param groupId               groupId of the searched reservations group, throws Exception if groupId is null\r
+        * @return      <code>List</code> reservation copies of a group\r
+        * @throws Exception    eighter no datahandler is set or groupId is null\r
+        */\r
+       public Map<Reservation, Boolean> getReservationGroup(UUID groupId) throws Exception{\r
+               if(dh == null) throw new Exception("No DataHandler set");\r
+               if(groupId == null) throw new Exception("groupId has to be defined");\r
+               \r
+               // Could be swapped out to private method for better performance (just check currentUser once)\r
+               // and easier code maintenance\r
+               Map<Reservation, Boolean> returnSet = new HashMap<Reservation, Boolean>();\r
+               for (Reservation reservation : dh.findGroupReservations(groupId)) {\r
+                       returnSet.put(reservation, reservation.getUser().equals(currentUser));\r
+               }\r
+               return returnSet;\r
+       }\r
+       \r
+\r
+       /**\r
+        * @param user\r
+        * @param resource\r
+        * @param dateRangeList\r
+        * @param remark\r
+        * @return\r
+        * @throws Exception\r
+        */\r
+       public Set<Reservation> makeReservation(User user, Resource resource, List<DateRange> dateRangeList, String remark) throws Exception\r
+       {\r
+               if(user == null) user = currentUser;\r
+               if(resource == null) throw new Exception("Resource must be definded");\r
+               if(dateRangeList == null) throw new Exception("dateRangeList can not be null");\r
+               if(dateRangeList.isEmpty()) throw new Exception("dateRangeList empty");\r
+               \r
+               Set<Reservation> invalidReservations = new HashSet<Reservation>();\r
+               UUID groupId = UUID.randomUUID();\r
+               for (DateRange dateRange : dateRangeList) {\r
+                       Reservation reservation = new Reservation(groupId, user, resource, dateRange, remark);\r
+                       if(!dh.addReservation(reservation)) invalidReservations.add(reservation);\r
+               }\r
+               if(invalidReservations.isEmpty())\r
+                       {\r
+                               dh.saveChanges();\r
+                               return null;\r
+                       }\r
+               else return invalidReservations;\r
+       }\r
+       \r
+       public boolean changeReservation(Reservation reservation) throws Exception\r
+       {\r
+               if(dh == null) throw new Exception("No DataHandler set");\r
+               if(currentUser == null) throw new Exception("No user is logged in");\r
+               if(reservation == null) throw new IllegalArgumentException("Reservation must be defined");\r
+               if(!reservation.getUser().equals(currentUser)) throw new Exception("You are not authorized to make this change");\r
+               return dh.editReservation(reservation);\r
+       }\r
+       \r
+       public boolean deleteReservation(Reservation reservation) throws Exception\r
+       {\r
+               if(dh == null) throw new Exception("No DataHandler set");\r
+               if(currentUser == null) throw new Exception("No user is logged in");\r
+               if(reservation == null) throw new IllegalArgumentException("Reservation must be defined");\r
+               if(!reservation.getUser().equals(currentUser)) throw new Exception("You are not authorized to make this change");\r
+               return dh.deleteReservation(reservation);\r
+       }\r
+       \r
+       public List<Resource> getResources() throws Exception{\r
+               if(dh == null) throw new Exception("No DataHandler set");\r
+               List<Resource> resourceList = new ArrayList<Resource>();\r
+               for (Resource resource : dh.getAllResources()) {\r
+                       resourceList.add(resource.clone());\r
+               }\r
+               return resourceList;\r
+       }\r
 }\r