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) {