Fix unique constraint on role. Added tests.

Change-Id: Iea36c28ed63b744103492396a71b057f93a3f882
diff --git a/src/main/java/de/ids_mannheim/korap/entity/Role.java b/src/main/java/de/ids_mannheim/korap/entity/Role.java
index da0a1e4..6e78582 100644
--- a/src/main/java/de/ids_mannheim/korap/entity/Role.java
+++ b/src/main/java/de/ids_mannheim/korap/entity/Role.java
@@ -40,7 +40,7 @@
     @Enumerated(EnumType.STRING)
     private PrivilegeType privilege;
     
-    @ManyToOne(fetch = FetchType.LAZY)
+    @ManyToOne(fetch = FetchType.EAGER)
     @JoinColumn(name = "query_id", referencedColumnName = "id")
     private QueryDO query;
 
@@ -100,8 +100,9 @@
     @Override
     public boolean equals (Object obj) {
         Role r = (Role) obj;
-        if (this.id == r.getId() && this.name.equals(r.getName())
-                && this.privilege.equals(r.getPrivilege())) {
+        if (this.name.equals(r.getName())
+                && this.privilege.equals(r.getPrivilege())
+                && this.userGroup.equals(r.getUserGroup())) {
             return true;
         }
         return false;
diff --git a/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java b/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
index 94778c6..4638191 100644
--- a/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
+++ b/src/main/java/de/ids_mannheim/korap/exceptions/StatusCodes.java
@@ -81,16 +81,18 @@
     // policy errors
 
     // database codes
-    public static final int DB_GET_FAILED = 500;
+//    public static final int DB_GET_FAILED = 500;
     public static final int DB_INSERT_FAILED = 501;
-    public static final int DB_DELETE_FAILED = 502;
-    public static final int DB_UPDATE_FAILED = 503;
+//    public static final int DB_DELETE_FAILED = 502;
+//    public static final int DB_UPDATE_FAILED = 503;
 
-    public static final int DB_GET_SUCCESSFUL = 504;
-    public static final int DB_INSERT_SUCCESSFUL = 505;
-    public static final int DB_DELETE_SUCCESSFUL = 506;
-    public static final int DB_UPDATE_SUCCESSFUL = 507;
-    public static final int DB_ENTRY_EXISTS = 508;
+//    public static final int DB_GET_SUCCESSFUL = 504;
+//    public static final int DB_INSERT_SUCCESSFUL = 505;
+//    public static final int DB_DELETE_SUCCESSFUL = 506;
+//    public static final int DB_UPDATE_SUCCESSFUL = 507;
+//    public static final int DB_ENTRY_EXISTS = 508;
+    
+    public static final int DB_UNIQUE_CONSTRAINT_FAILED = 509;
 
     //    public static final int ARGUMENT_VALIDATION_FAILURE = 700;
     // public static final int ARGUMENT_VALIDATION_FAILURE = 701;
diff --git a/src/main/java/de/ids_mannheim/korap/service/QueryService.java b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
index b9d7c3c..c04441f 100644
--- a/src/main/java/de/ids_mannheim/korap/service/QueryService.java
+++ b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
@@ -97,7 +97,7 @@
     @Autowired
     private QueryConverter converter;
     @Autowired
-    private RoleConverter accessConverter;
+    private RoleConverter roleConverter;
 
     private void verifyUsername (String contextUsername, String pathUsername)
             throws KustvaktException {
@@ -500,13 +500,14 @@
                 Throwable lastCause = null;
                 while ((cause = cause.getCause()) != null
                         && !cause.equals(lastCause)) {
-                    if (cause instanceof SQLException) {
-                        break;
-                    }
+//                    if (cause instanceof SQLException) {
+//                        break;
+//                    }
                     lastCause = cause;
                 }
-                throw new KustvaktException(StatusCodes.DB_INSERT_FAILED,
-                        e.getMessage());
+                throw new KustvaktException(
+                        StatusCodes.DB_UNIQUE_CONSTRAINT_FAILED,
+                        lastCause.getMessage());
             }
 
             ResourceType queryType = query.getType();
@@ -592,7 +593,7 @@
             throw new KustvaktException(StatusCodes.AUTHORIZATION_FAILED,
                     "Unauthorized operation for user: " + username, username);
         }
-        return accessConverter.createRoleDto(roles);
+        return roleConverter.createRoleDto(roles);
     }
 
     @Deprecated
diff --git a/src/main/java/de/ids_mannheim/korap/service/UserGroupService.java b/src/main/java/de/ids_mannheim/korap/service/UserGroupService.java
index 6a4fa8b..a361716 100644
--- a/src/main/java/de/ids_mannheim/korap/service/UserGroupService.java
+++ b/src/main/java/de/ids_mannheim/korap/service/UserGroupService.java
@@ -649,31 +649,45 @@
                         memberUsername, member.getStatus().name());
             }
 
-            Set<Role> roles = member.getRoles();
+            Set<Role> existingRoles = member.getRoles();
             for (PredefinedRole role : roleNames) {
-                if (role.equals(PredefinedRole.GROUP_ADMIN)) {
-                    Role r1 = new Role(role,PrivilegeType.READ_MEMBER, userGroup);
-                    roleDao.addRole(r1);
-                    roles.add(r1);
-                    
-                    Role r2 = new Role(role,PrivilegeType.DELETE_MEMBER, userGroup);
-                    roleDao.addRole(r2);
-                    roles.add(r2);
+                boolean roleExists = false;
+                for (Role r :existingRoles) {
+                    if (r.getName().equals(role)) {
+                        roleExists = true;
+                        break;
+                    }
+                }
+                if (!roleExists) {
+                    if (role.equals(PredefinedRole.GROUP_ADMIN)) {
+                        Role r1 = new Role(role,PrivilegeType.READ_MEMBER, userGroup);
+                        roleDao.addRole(r1);
+                        existingRoles.add(r1);
+                        
+                        Role r2 = new Role(role,PrivilegeType.DELETE_MEMBER, userGroup);
+                        roleDao.addRole(r2);
+                        existingRoles.add(r2);
 
-                    Role r3 = new Role(role,PrivilegeType.WRITE_MEMBER, userGroup);
-                    roleDao.addRole(r3);
-                    roles.add(r3);
-                    
-                    Role r4 = new Role(role,PrivilegeType.SHARE_QUERY, userGroup);
-                    roleDao.addRole(r4);
-                    roles.add(r4);
-                    
-                    Role r5 = new Role(role,PrivilegeType.DELETE_QUERY, userGroup);
-                    roleDao.addRole(r5);
-                    roles.add(r5);
+                        Role r3 = new Role(role,PrivilegeType.WRITE_MEMBER, userGroup);
+                        roleDao.addRole(r3);
+                        existingRoles.add(r3);
+                        
+                        Role r4 = new Role(role,PrivilegeType.SHARE_QUERY, userGroup);
+                        roleDao.addRole(r4);
+                        existingRoles.add(r4);
+                        
+                        Role r5 = new Role(role,PrivilegeType.DELETE_QUERY, userGroup);
+                        roleDao.addRole(r5);
+                        existingRoles.add(r5);
+                    }
+//                    else {
+//                        throw new KustvaktException(StatusCodes.NOT_ALLOWED,
+//                                "Adding role " + role.name()
+//                                        + " is not allowed.");
+//                    }
                 }
             }
-            member.setRoles(roles);
+            member.setRoles(existingRoles);
             groupMemberDao.updateMember(member);
 
         }
@@ -682,6 +696,11 @@
                     "Unauthorized operation for user: " + username, username);
         }
     }
+    
+    private void checkRole () {
+        // TODO Auto-generated method stub
+
+    }
 
     public void deleteMemberRoles (String username, String groupName,
             String memberUsername, List<PredefinedRole> rolesToBeDeleted)
diff --git a/src/main/java/de/ids_mannheim/korap/web/KustvaktResponseHandler.java b/src/main/java/de/ids_mannheim/korap/web/KustvaktResponseHandler.java
index 1118b26..ba8a81e 100644
--- a/src/main/java/de/ids_mannheim/korap/web/KustvaktResponseHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/web/KustvaktResponseHandler.java
@@ -28,6 +28,10 @@
             r = Response.status(Response.Status.BAD_REQUEST)
                     .entity(e.getNotification()).build();
         }
+        else if (e.getStatusCode() == StatusCodes.DB_UNIQUE_CONSTRAINT_FAILED) {
+            r = Response.status(Response.Status.CONFLICT)
+                    .entity(e.getNotification()).build();
+        }
         else if (e.getStatusCode() == StatusCodes.USER_REAUTHENTICATION_REQUIRED
                 || e.getStatusCode() == StatusCodes.AUTHORIZATION_FAILED
                 || e.getStatusCode() >= StatusCodes.AUTHENTICATION_FAILED) {