diff --git a/ccm-core/src/main/java/org/libreccm/security/Role.java b/ccm-core/src/main/java/org/libreccm/security/Role.java index a8a0705c5..6230afa7c 100644 --- a/ccm-core/src/main/java/org/libreccm/security/Role.java +++ b/ccm-core/src/main/java/org/libreccm/security/Role.java @@ -21,6 +21,7 @@ package org.libreccm.security; import static org.libreccm.core.CoreConstants.*; import org.hibernate.validator.constraints.NotBlank; +import org.libreccm.workflow.TaskAssignment; import java.io.Serializable; import java.util.ArrayList; @@ -92,6 +93,9 @@ public class Role implements Serializable { @XmlElement(name = "permission", namespace = CORE_XML_NS) private List permissions = new ArrayList<>(); + @OneToMany(mappedBy = "role") + private List assignedTasks; + protected Role() { super(); } @@ -151,6 +155,26 @@ public class Role implements Serializable { protected void removePermission(final Permission permission) { permissions.remove(permission); } + + public List assignedTasks() { + if (assignedTasks == null) { + return null; + } else { + return Collections.unmodifiableList(assignedTasks); + } + } + + protected void setAssignedTasks(final List assignedTasks) { + this.assignedTasks = assignedTasks; + } + + protected void addAssignedTask(final TaskAssignment taskAssignment) { + assignedTasks.add(taskAssignment); + } + + protected void removeAssignedTask(final TaskAssignment taskAssignment) { + assignedTasks.remove(taskAssignment); + } @Override public int hashCode() { diff --git a/ccm-core/src/main/java/org/libreccm/security/RoleMembership.java b/ccm-core/src/main/java/org/libreccm/security/RoleMembership.java index 954e2cf75..7414b5439 100644 --- a/ccm-core/src/main/java/org/libreccm/security/RoleMembership.java +++ b/ccm-core/src/main/java/org/libreccm/security/RoleMembership.java @@ -137,8 +137,8 @@ public class RoleMembership implements Serializable { return String.format("%s{ " + "membershipId = %d, " + "user = %s, " - + "role = %s, " - + " },", + + "role = %s " + + " }", super.toString(), membershipId, Objects.toString(member), diff --git a/ccm-core/src/main/java/org/libreccm/workflow/TaskAssignment.java b/ccm-core/src/main/java/org/libreccm/workflow/TaskAssignment.java new file mode 100644 index 000000000..efc8b0dd3 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/workflow/TaskAssignment.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2015 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.workflow; + +import static org.libreccm.core.CoreConstants.*; + +import org.libreccm.security.Role; + +import java.io.Serializable; +import java.util.Objects; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +/** + * + * @author Jens Pelzetter + */ +@Entity +@Table(name = "TASK_ASSIGNMENTS", schema = DB_SCHEMA) +public class TaskAssignment implements Serializable { + + private static final long serialVersionUID = -4427537363301565707L; + + @Id + @Column(name = "TASK_ASSIGNMENT_ID") + @GeneratedValue(strategy = GenerationType.AUTO) + private long taskAssignmentId; + + @ManyToOne + @JoinColumn(name = "TASK_ID") + private UserTask task; + + @ManyToOne + @JoinColumn(name = "ROLE_ID") + private Role role; + + public long getTaskAssignmentId() { + return taskAssignmentId; + } + + protected void setTaskAssignmentId(final long taskAssignmentId) { + this.taskAssignmentId = taskAssignmentId; + } + + public UserTask getTask() { + return task; + } + + protected void setTask(final UserTask task) { + this.task = task; + } + + public Role getRole() { + return role; + } + + protected void setRole(final Role role) { + this.role = role; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 67 * hash + + (int) (taskAssignmentId ^ (taskAssignmentId >>> 32)); + hash = 67 * hash + Objects.hashCode(task); + hash = 67 * hash + Objects.hashCode(role); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (obj == null) { + return false; + } + + if (!(obj instanceof TaskAssignment)) { + return false; + } + final TaskAssignment other = (TaskAssignment) obj; + if (!other.canEqual(this)) { + return false; + } + + if (taskAssignmentId != other.getTaskAssignmentId()) { + return false; + } + if (!Objects.equals(task, other.getTask())) { + return false; + } + return Objects.equals(role, other.getRole()); + } + + public boolean canEqual(final Object obj) { + return obj instanceof TaskAssignment; + } + + @Override + public String toString() { + return String.format("%s{ " + + "taskAssignmentId = %d, " + + "task = %s, " + + "role = %s" + + " }", + super.toString(), + taskAssignmentId, + Objects.toString(task), + Objects.toString(role)); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java b/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java index d38570501..aa844fb24 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java @@ -21,6 +21,7 @@ package org.libreccm.workflow; import static org.libreccm.core.CoreConstants.*; import org.libreccm.security.Group; +import org.libreccm.security.Role; import org.libreccm.security.User; import java.io.Serializable; @@ -34,6 +35,7 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; @@ -77,28 +79,12 @@ public class UserTask extends Task implements Serializable { @SuppressWarnings("PMD.LongVariable") //Shorter name would not be descriptive private User notificationSender; - @OneToMany - @JoinTable(name = "WORKFLOW_USER_TASK_ASSIGNED_USERS", - schema = DB_SCHEMA, - joinColumns = { - @JoinColumn(name = "USER_TASK_ID")}, - inverseJoinColumns = { - @JoinColumn(name = "ASSIGNED_USER_ID")}) - private List assignedUsers; - - @OneToMany - @JoinTable(name = "WORKFLOW_USER_TASK_ASSIGNED_GROUPS", - schema = DB_SCHEMA, - joinColumns = { - @JoinColumn(name = "USER_TASK_ID")}, - inverseJoinColumns = { - @JoinColumn(name = "ASSIGNED_GROUP_ID")}) - private List assignedGroups; + @OneToMany(mappedBy = "task") + private List assignments; public UserTask() { super(); - assignedUsers = new ArrayList<>(); - assignedGroups = new ArrayList<>(); + assignments = new ArrayList<>(); } public boolean isLocked() { @@ -166,44 +152,24 @@ public class UserTask extends Task implements Serializable { this.notificationSender = notificationSender; } - public List getAssignedUsers() { - if (assignedUsers == null) { + public List getAssignments() { + if (assignments == null) { return null; } else { - return Collections.unmodifiableList(assignedUsers); + return Collections.unmodifiableList(assignments); } } - protected void setAssignedUsers(final List assignedUsers) { - this.assignedUsers = assignedUsers; + protected void setAssignments(final List assignments) { + this.assignments = assignments; } - - protected void addAssignedUser(final User user) { - assignedUsers.add(user); + + protected void addAssignment(final TaskAssignment assignment) { + assignments.add(assignment); } - - protected void removeAssignedUser(final User user) { - assignedUsers.remove(user); - } - - public List getAssignedGroups() { - if (assignedGroups == null) { - return null; - } else { - return Collections.unmodifiableList(assignedGroups); - } - } - - protected void setAssignedGroups(final List assignedGroups) { - this.assignedGroups = assignedGroups; - } - - protected void addAssignedGroup(final Group group) { - assignedGroups.add(group); - } - - protected void removeAssignedGroup(final Group group) { - assignedGroups.remove(group); + + protected void removeAssignment(final TaskAssignment assignment) { + assignments.remove(assignment); } @Override @@ -214,7 +180,7 @@ public class UserTask extends Task implements Serializable { hash = 37 * hash + Objects.hashCode(startDate); hash = 37 * hash + Objects.hashCode(dueDate); hash - = 37 * hash + (int) (durationMinutes ^ (durationMinutes >>> 32)); + = 37 * hash + (int) (durationMinutes ^ (durationMinutes >>> 32)); hash = 37 * hash + Objects.hashCode(notificationSender); return hash; } @@ -223,7 +189,7 @@ public class UserTask extends Task implements Serializable { //Can't reduce complexity yet @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.StdCyclomaticComplexity", - "PMD.ModifiedCyclomaticComplexity", + "PMD.ModifiedCyclomaticComplexity", "PMD.NPathComplexity"}) public boolean equals(final Object obj) { if (obj == null) { @@ -268,11 +234,11 @@ public class UserTask extends Task implements Serializable { @Override public String toString(final String data) { return super.toString(String.format(", locked = %b, " - + "lockingUser = %s, " - + "startDate = %tF %> data() { return Arrays.asList(new Class[]{ Task.class, + TaskAssignment.class, UserTask.class, Workflow.class }); diff --git a/ccm-core/src/test/java/org/libreccm/workflow/ToStringTest.java b/ccm-core/src/test/java/org/libreccm/workflow/ToStringTest.java index ea3f7665d..1c8fa5644 100644 --- a/ccm-core/src/test/java/org/libreccm/workflow/ToStringTest.java +++ b/ccm-core/src/test/java/org/libreccm/workflow/ToStringTest.java @@ -39,6 +39,7 @@ public class ToStringTest extends ToStringVerifier { public static Collection> data() { return Arrays.asList(new Class[]{ Task.class, + TaskAssignment.class, UserTask.class, Workflow.class });