From 82c6b50d7c8a44ee50eea39df8e4be7f41eb3917 Mon Sep 17 00:00:00 2001 From: tosmers Date: Wed, 27 Sep 2017 17:48:47 +0000 Subject: [PATCH] [CCM][FEATURE] - adds import capabilities for workflow templates, workflows and task comments - fixes problems in workflow imports git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5014 8810af33-2d31-482b-a856-94f89814c4df --- .../org/libreccm/security/Permission.java | 1 + .../org/libreccm/workflow/AssignableTask.java | 3 + .../workflow/AssignableTaskIdResolver.java | 2 +- .../workflow/AssignableTaskRepository.java | 4 +- .../org/libreccm/workflow/TaskComment.java | 13 +++- .../workflow/TaskCommentIdResolver.java | 60 ++++++++++++++++++ .../workflow/TaskCommentMarshaller.java | 47 ++++++++++++++ .../workflow/TaskCommentRepository.java | 63 +++++++++++++++++++ .../java/org/libreccm/workflow/Workflow.java | 7 ++- .../libreccm/workflow/WorkflowTemplate.java | 3 +- .../workflow/WorkflowTemplateIdResolver.java | 6 +- .../portation/CoreDataImportTest.java | 19 ++---- .../org/libreccm/portation/ImportHelper.java | 19 +++++- 13 files changed, 220 insertions(+), 27 deletions(-) create mode 100644 ccm-core/src/main/java/org/libreccm/workflow/TaskCommentIdResolver.java create mode 100644 ccm-core/src/main/java/org/libreccm/workflow/TaskCommentMarshaller.java create mode 100644 ccm-core/src/main/java/org/libreccm/workflow/TaskCommentRepository.java diff --git a/ccm-core/src/main/java/org/libreccm/security/Permission.java b/ccm-core/src/main/java/org/libreccm/security/Permission.java index 73a62208f..7ab5d5ced 100644 --- a/ccm-core/src/main/java/org/libreccm/security/Permission.java +++ b/ccm-core/src/main/java/org/libreccm/security/Permission.java @@ -143,6 +143,7 @@ public class Permission implements Serializable, Portable { @ManyToOne @JoinColumn(name = "CREATION_USER_ID") @XmlElement(name = "creation-user", namespace = CORE_XML_NS) + @JsonIdentityReference(alwaysAsId = true) private User creationUser; /** diff --git a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java index a7156e362..72188cac9 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java @@ -19,6 +19,7 @@ package org.libreccm.workflow; import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.libreccm.portation.Portable; @@ -100,6 +101,7 @@ public class AssignableTask extends Task implements Serializable, Portable { */ @OneToOne @JoinColumn(name = "LOCKING_USER_ID") + @JsonIdentityReference(alwaysAsId = true) private User lockingUser; /** @@ -128,6 +130,7 @@ public class AssignableTask extends Task implements Serializable, Portable { @OneToOne @JoinColumn(name = "NOTIFICATION_SENDER") @SuppressWarnings("PMD.LongVariable") //Shorter name would not be descriptive + @JsonIdentityReference(alwaysAsId = true) private User notificationSender; /** diff --git a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskIdResolver.java b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskIdResolver.java index ace033871..1b6dcbb3b 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskIdResolver.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskIdResolver.java @@ -47,7 +47,7 @@ public class AssignableTaskIdResolver implements ObjectIdResolver { return assignableTaskRepository .findByUuid(id.key.toString()) .orElseThrow(() -> new IllegalArgumentException(String - .format("No assignableTasks with uuid %s in the " + + .format("No assignable tasks with uuid %s in the " + "database.", id.key.toString()))); } diff --git a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java index 30e1eb2e0..ee45c5d66 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java @@ -36,8 +36,8 @@ import java.util.stream.Collectors; * @author Jens Pelzetter */ @RequestScoped -public class AssignableTaskRepository - extends AbstractEntityRepository { +public class AssignableTaskRepository extends AbstractEntityRepository { @Override public Class getEntityClass() { diff --git a/ccm-core/src/main/java/org/libreccm/workflow/TaskComment.java b/ccm-core/src/main/java/org/libreccm/workflow/TaskComment.java index 922155169..50a0efb4e 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/TaskComment.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/TaskComment.java @@ -18,9 +18,12 @@ */ package org.libreccm.workflow; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.annotations.Type; import org.libreccm.core.CoreConstants; import org.libreccm.core.Identifiable; +import org.libreccm.portation.Portable; import org.libreccm.security.User; import javax.persistence.*; @@ -36,7 +39,15 @@ import java.util.Objects; */ @Entity @Table(name = "WORKFLOW_TASK_COMMENTS", schema = CoreConstants.DB_SCHEMA) -public class TaskComment implements Identifiable, Serializable { +@NamedQueries({ + @NamedQuery( + name = "TaskComment.findByUuid", + query = "SELECT c FROM TaskComment c WHERE c.uuid = :uuid") +}) +@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = TaskCommentIdResolver.class, + property = "uuid") +public class TaskComment implements Identifiable, Serializable, Portable { private static final long serialVersionUID = 3842991529698351698L; diff --git a/ccm-core/src/main/java/org/libreccm/workflow/TaskCommentIdResolver.java b/ccm-core/src/main/java/org/libreccm/workflow/TaskCommentIdResolver.java new file mode 100644 index 000000000..6a9ea2330 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/workflow/TaskCommentIdResolver.java @@ -0,0 +1,60 @@ +/* + * 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 com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; + +/** + * @author Tobias Osmers<\a> + * @version created the 9/27/17 + */ +@RequestScoped +public class TaskCommentRepository extends AbstractEntityRepository { + @Override + public Class getEntityClass() { + return TaskComment.class; + } + + @Override + public boolean isNew(TaskComment entity) { + return entity.getCommentId() == 0; + } + + /** + * Finds a {@link TaskComment} by its uuid. + * + * @param uuid The uuid of the item to find + * + * @return An optional either with the found item or empty + */ + public Optional findByUuid(final String uuid) { + final TypedQuery query = getEntityManager() + .createNamedQuery("TaskComment.findByUuid", TaskComment.class); + query.setParameter("uuid", uuid); + + try { + return Optional.of(query.getSingleResult()); + } catch (NoResultException ex) { + return Optional.empty(); + } + } +} diff --git a/ccm-core/src/main/java/org/libreccm/workflow/Workflow.java b/ccm-core/src/main/java/org/libreccm/workflow/Workflow.java index 0518aaf86..b3477b209 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/Workflow.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/Workflow.java @@ -19,6 +19,7 @@ package org.libreccm.workflow; import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.libreccm.core.CcmObject; @@ -48,12 +49,12 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA; @NamedQueries({ @NamedQuery( name = "Workflow.findByUuid", - query = "SELECT W FROM Workflow w WHERE w.uuid = :uuid") + query = "SELECT w FROM Workflow w WHERE w.uuid = :uuid") , @NamedQuery( name = "Workflow.findForObject", query = "SELECT w FROM Workflow w " - + "WHERE W.object = :object") + + "WHERE w.object = :object") }) @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, resolver = WorkflowIdResolver.class, @@ -82,6 +83,7 @@ public class Workflow implements Identifiable, Serializable, Portable { */ @ManyToOne @JoinColumn(name = "TEMPLATE_ID") + @JsonIdentityReference(alwaysAsId = true) private WorkflowTemplate template; /** @@ -136,6 +138,7 @@ public class Workflow implements Identifiable, Serializable, Portable { */ @OneToOne @JoinColumn(name = "OBJECT_ID") + @JsonIdentityReference(alwaysAsId = true) private CcmObject object; /** diff --git a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowTemplate.java b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowTemplate.java index 54616d6f7..cf905a8ee 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowTemplate.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowTemplate.java @@ -43,7 +43,8 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA; @NamedQueries({ @NamedQuery( name = "WorkflowTemplate.findByUuid", - query = "SELECT T FROM WorkflowTemplate t WHERE t.uuid = :uuid") + query = "SELECT t FROM WorkflowTemplate t " + + "WHERE t.uuid = :uuid") }) @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, resolver = WorkflowTemplateIdResolver.class, diff --git a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowTemplateIdResolver.java b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowTemplateIdResolver.java index 572396af4..3c95223ac 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowTemplateIdResolver.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowTemplateIdResolver.java @@ -38,16 +38,16 @@ public class WorkflowTemplateIdResolver implements ObjectIdResolver { } @Override - public Object resolveId(ObjectIdGenerator.IdKey idKey) { + public Object resolveId(ObjectIdGenerator.IdKey id) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final WorkflowTemplateRepository workflowTemplateRepository = cdiUtil .findBean(WorkflowTemplateRepository.class); return workflowTemplateRepository - .findByUuid(idKey.toString()) + .findByUuid(id.key.toString()) .orElseThrow(() -> new IllegalArgumentException(String .format("No workflow templates with uuid %s in the " + - "database.", idKey.toString()))); + "database.", id.key.toString()))); } @Override diff --git a/ccm-core/src/test/java/org/libreccm/portation/CoreDataImportTest.java b/ccm-core/src/test/java/org/libreccm/portation/CoreDataImportTest.java index 4c0eade0b..caef187a8 100644 --- a/ccm-core/src/test/java/org/libreccm/portation/CoreDataImportTest.java +++ b/ccm-core/src/test/java/org/libreccm/portation/CoreDataImportTest.java @@ -127,24 +127,14 @@ public class CoreDataImportTest { @Test @InSequence(100) - public void objectsShouldBeImported() throws InterruptedException { + public void objectsShouldBeImported() { // assert for no errors Assert.assertFalse(importHelper.importUsers()); Assert.assertFalse(importHelper.importGroups()); Assert.assertFalse(importHelper.importGroupMemberships()); - Assert.assertFalse(importHelper.importRoles()); Assert.assertFalse(importHelper.importRoleMemberships()); - - /*final String name = "research_Administration_Publisher"; - Group group = groupRepository - .findByName(name) - .orElseThrow(() -> new IllegalArgumentException(String - .format("No Group fount with the name: %s", name))); - System.err.println(group.toString());*/ - - Assert.assertFalse(importHelper.importCategories()); Assert.assertFalse(importHelper.importCategorizations()); Assert.assertFalse(importHelper.importResourceTypes()); @@ -155,9 +145,10 @@ public class CoreDataImportTest { Assert.assertFalse(importHelper.importPermissions()); Assert.assertFalse(importHelper.importWorkflowTemplates()); - //Assert.assertFalse(importHelper.importWorkflows()); - - + Assert.assertFalse(importHelper.importWorkflows()); + Assert.assertFalse(importHelper.importTaskComments()); + //Assert.assertFalse(importHelper.importAssignableTasks()); + //Assert.assertFalse(importHelper.importTaskAssignments()); } } diff --git a/ccm-core/src/test/java/org/libreccm/portation/ImportHelper.java b/ccm-core/src/test/java/org/libreccm/portation/ImportHelper.java index 3d5e50e78..1a3ac087a 100644 --- a/ccm-core/src/test/java/org/libreccm/portation/ImportHelper.java +++ b/ccm-core/src/test/java/org/libreccm/portation/ImportHelper.java @@ -79,6 +79,10 @@ class ImportHelper { @Marshals(DomainOwnership.class) private DomainOwnershipMarshaller domainOwnershipMarshaller; + @Inject + @Marshals(Permission.class) + private PermissionMarshaller permissionMarshaller; + @Inject @Marshals(WorkflowTemplate.class) private WorkflowTemplateMarshaller workflowTemplateMarshaller; @@ -86,15 +90,15 @@ class ImportHelper { @Marshals(Workflow.class) private WorkflowMarshaller workflowMarshaller; @Inject + @Marshals(TaskComment.class) + private TaskCommentMarshaller taskCommentMarshaller; + @Inject @Marshals(AssignableTask.class) private AssignableTaskMarshaller assignableTaskMarshaller; @Inject @Marshals(TaskAssignment.class) private TaskAssignmentMarshaller taskAssignmentMarshaller; - @Inject - @Marshals(Permission.class) - private PermissionMarshaller permissionMarshaller; boolean importUsers() { @@ -223,6 +227,15 @@ class ImportHelper { return workflowMarshaller.importFile(); } + boolean importTaskComments() { + taskCommentMarshaller.prepare( + Format.XML, + repoPath + projectPath, + "taskComments.xml", + indentation); + return taskCommentMarshaller.importFile(); + } + boolean importAssignableTasks() { assignableTaskMarshaller.prepare( Format.XML,