From 4b1a3e8f274cc42626a2e10efcf3eb8c555b7979 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Thu, 18 Mar 2021 21:11:19 +0100 Subject: [PATCH] Template Skeletons for editing content items, some refactoring --- .../ContentSectionApplication.java | 6 + .../documents/AuthoringStepNotAvailable.java | 4 +- .../documents/ContentSectionNotFound.java | 2 +- .../documents/ContentTypeNotAvailable.java | 2 +- .../documents/CreateStepNotAvailable.java | 2 +- .../documents/DocumentController.java | 306 ++++-------------- .../DocumentLifecyclesController.java | 3 +- .../documents/DocumentNotFound.java | 2 +- .../documents/DocumentTypeClassNotFound.java | 4 +- .../documents/DocumentWorkflowController.java | 4 +- .../documents/MvcAuthoringKit.java | 7 +- .../documents/MvcAuthoringStep.java | 2 +- .../documents/SelectedDocumentModel.java | 69 +++- .../documents/UnsupportedDocumentType.java | 4 +- .../MvcArticlePropertiesStep.java | 2 +- .../contenttypes/MvcArticleTextBodyStep.java | 2 +- .../authoringstep-not-available.xhtml | 29 ++ .../documents/authoringstep.xhtml | 40 +++ .../documents/create-step-not-available.xhtml | 30 ++ .../documents/document-breadcrumbs.xhtml | 32 ++ .../documents/document-not-found.xhtml | 33 ++ .../document-type-not-available.xhtml | 30 ++ .../contentsection/documents/document.xhtml | 54 ++++ .../documents/folder-not-found.xhtml | 43 +++ .../ui/contentsection/documents/history.xhtml | 20 ++ .../documents/lifecycle-def-not-found.xhtml | 31 ++ .../documents/phase-not-found.xhtml | 32 ++ .../ui/contentsection/documents/publish.xhtml | 28 ++ .../documents/task-not-found.xhtml | 33 ++ .../documents/unsupported-documenttype.xhtml | 35 ++ .../documents/workflow-not-found.xhtml | 32 ++ .../documents/LifecyclesControllerTest.java | 61 ---- 32 files changed, 651 insertions(+), 333 deletions(-) create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/authoringstep-not-available.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/authoringstep.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/create-step-not-available.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-breadcrumbs.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-not-found.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-type-not-available.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/folder-not-found.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/history.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/lifecycle-def-not-found.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/phase-not-found.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/publish.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/task-not-found.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/unsupported-documenttype.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/workflow-not-found.xhtml delete mode 100644 ccm-cms/src/test/java/org/librecms/ui/contentsections/documents/LifecyclesControllerTest.java diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java index 88f291cde..632fc10b4 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java @@ -6,6 +6,9 @@ package org.librecms.ui.contentsections; import org.libreccm.ui.IsAuthenticatedFilter; +import org.librecms.ui.contentsections.documents.DocumentController; +import org.librecms.ui.contentsections.documents.DocumentLifecyclesController; +import org.librecms.ui.contentsections.documents.DocumentWorkflowController; import java.util.HashSet; import java.util.Set; @@ -33,6 +36,9 @@ public class ContentSectionApplication extends Application { classes.add(ConfigurationWorkflowController.class); classes.add(ContentSectionController.class); classes.add(DocumentFolderController.class); + classes.add(DocumentController.class); + classes.add(DocumentLifecyclesController.class); + classes.add(DocumentWorkflowController.class); classes.add(IsAuthenticatedFilter.class); return classes; diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/AuthoringStepNotAvailable.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/AuthoringStepNotAvailable.java index ec96faaf7..b52ba3ca4 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/AuthoringStepNotAvailable.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/AuthoringStepNotAvailable.java @@ -25,7 +25,7 @@ import javax.ws.rs.Path; public class AuthoringStepNotAvailable implements MvcAuthoringStep { @Override - public Class supportedDocumenType() { + public Class supportedDocumentType() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @@ -66,7 +66,7 @@ public class AuthoringStepNotAvailable implements MvcAuthoringStep { @Override public String showStep() { - return "org/librecms/ui/contentsection/authoringstep-not-available.xhtml"; + return "org/librecms/ui/contentsection/documents/authoringstep-not-available.xhtml"; } @GET diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/ContentSectionNotFound.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/ContentSectionNotFound.java index 8fd748c3e..7a2d78606 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/ContentSectionNotFound.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/ContentSectionNotFound.java @@ -62,7 +62,7 @@ public class ContentSectionNotFound } @Override - public Class supportedDocumenType() { + public Class supportedDocumentType() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/ContentTypeNotAvailable.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/ContentTypeNotAvailable.java index 67d5318d0..63e108c96 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/ContentTypeNotAvailable.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/ContentTypeNotAvailable.java @@ -64,7 +64,7 @@ public class ContentTypeNotAvailable @Override public String createContentItem() { - return "org/librecms/ui/contentsection/documents/document-type-not-notavailable.xhtml"; + return "org/librecms/ui/contentsection/documents/document-type-not-available.xhtml"; } @Override diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CreateStepNotAvailable.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CreateStepNotAvailable.java index 19a4bc53c..0999f3cb9 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CreateStepNotAvailable.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/CreateStepNotAvailable.java @@ -64,7 +64,7 @@ public class CreateStepNotAvailable @Override public String createContentItem() { - return "org/librecms/ui/contentsection/documents/create-step-not-notavailable.xhtml"; + return "org/librecms/ui/contentsection/documents/create-step-not-available.xhtml"; } @Override diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentController.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentController.java index 955ddd7ec..4f72b3c29 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentController.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentController.java @@ -22,6 +22,8 @@ import org.librecms.ui.contentsections.ContentSectionsUi; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -181,6 +183,36 @@ public class DocumentController { return createStep; } + @Path("/{documentPath:(.+)?}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String editDocument( + @PathParam("sectionIdentifider") final String sectionIdentifier, + @PathParam("documentPath") final String documentPath + ) { + final Optional sectionResult = sectionsUi + .findContentSection(sectionIdentifier); + if (!sectionResult.isPresent()) { + sectionsUi.showContentSectionNotFound(sectionIdentifier); + } + final ContentSection section = sectionResult.get(); + + final Optional itemResult = itemRepo + .findByPath(section, documentPath); + if (!itemResult.isPresent()) { + models.put("section", section.getLabel()); + models.put("documentPath", documentPath); + documentUi.showDocumentNotFound(section, documentPath); + } + final ContentItem item = itemResult.get(); + return String.format( + "redirect:/%s/documents/%s/@authoringsteps/%s", + sectionIdentifier, + documentPath, + findPathFragmentForFirstStep(item) + ); + } + @Path("/{documentPath:(.+)?}/@authoringsteps/{authoringStep}") @AuthorizationRequired @Transactional(Transactional.TxType.REQUIRED) @@ -220,7 +252,7 @@ public class DocumentController { } final MvcAuthoringStep authoringStep = instance.get(); - if (!authoringStep.supportedDocumenType().isAssignableFrom(item + if (!authoringStep.supportedDocumentType().isAssignableFrom(item .getClass())) { models.put("section", section.getLabel()); models.put("documentPath", documentPath); @@ -367,7 +399,7 @@ public class DocumentController { if (!result.isPresent()) { models.put("section", section.getLabel()); models.put("lifecycleDefUuid", selectedLifecycleUuid); - return "org/librecms/ui/contentsection/lifecycle-def-not-found.xhtml"; + return "org/librecms/ui/contentsection/documents/lifecycle-def-not-found.xhtml"; } } @@ -452,248 +484,34 @@ public class DocumentController { ); } -// @POST -// @Path("/{documentPath:(.+)?}/@workflow/tasks/${taskIdentifier}/@lock") -// @AuthorizationRequired -// @Transactional(Transactional.TxType.REQUIRED) -// public String lockTask( -// @PathParam("sectionIdentifider") final String sectionIdentifier, -// @PathParam("documentPath") final String documentPath, -// @PathParam("taskIdentifier") final String taskIdentifier, -// @FormParam("returnUrl") final String returnUrl -// ) { -// final Optional sectionResult = sectionsUi -// .findContentSection(sectionIdentifier); -// if (!sectionResult.isPresent()) { -// return sectionsUi.showContentSectionNotFound(sectionIdentifier); -// } -// final ContentSection section = sectionResult.get(); -// -// final Optional itemResult = itemRepo -// .findByPath(section, documentPath); -// if (!itemResult.isPresent()) { -// return documentUi.showDocumentNotFound(section, documentPath); -// } -// final ContentItem item = itemResult.get(); -// selectedDocumentModel.setContentItem(item); -// -// final Optional taskResult = findTask( -// item, taskIdentifier -// ); -// if (!taskResult.isPresent()) { -// return showTaskNotFound(section, documentPath, taskIdentifier); -// } -// -// final AssignableTask task = taskResult.get(); -// assignableTaskManager.lockTask(task); -// -// return String.format("redirect:%s", returnUrl); -// } -// @POST -// @Path("/{documentPath:(.+)?}/@workflow/tasks/${taskIdentifier}/@unlock") -// @AuthorizationRequired -// @Transactional(Transactional.TxType.REQUIRED) -// public String unlockTask( -// @PathParam("sectionIdentifider") final String sectionIdentifier, -// @PathParam("documentPath") final String documentPath, -// @PathParam("taskIdentifier") final String taskIdentifier, -// @FormParam("returnUrl") final String returnUrl -// ) { -// final Optional sectionResult = sectionsUi -// .findContentSection(sectionIdentifier); -// if (!sectionResult.isPresent()) { -// return sectionsUi.showContentSectionNotFound(sectionIdentifier); -// } -// final ContentSection section = sectionResult.get(); -// -// final Optional itemResult = itemRepo -// .findByPath(section, documentPath); -// if (!itemResult.isPresent()) { -// return documentUi.showDocumentNotFound(section, documentPath); -// } -// final ContentItem item = itemResult.get(); -// selectedDocumentModel.setContentItem(item); -// -// final Optional taskResult = findTask( -// item, taskIdentifier -// ); -// if (!taskResult.isPresent()) { -// return showTaskNotFound(section, documentPath, taskIdentifier); -// } -// -// final AssignableTask task = taskResult.get(); -// assignableTaskManager.unlockTask(task); -// -// return String.format("redirect:%s", returnUrl); -// } -// -// @POST -// @Path("/{documentPath:(.+)?}/@workflow/tasks/${taskIdentifier}/@finish") -// @AuthorizationRequired -// @Transactional(Transactional.TxType.REQUIRED) -// public String finishTask( -// @PathParam("sectionIdentifider") final String sectionIdentifier, -// @PathParam("documentPath") final String documentPath, -// @PathParam("taskIdentifier") final String taskIdentifier, -// @FormParam("comment") @DefaultValue("") final String comment, -// @FormParam("returnUrl") final String returnUrl -// ) { -// final Optional sectionResult = sectionsUi -// .findContentSection(sectionIdentifier); -// if (!sectionResult.isPresent()) { -// return sectionsUi.showContentSectionNotFound(sectionIdentifier); -// } -// final ContentSection section = sectionResult.get(); -// -// final Optional itemResult = itemRepo -// .findByPath(section, documentPath); -// if (!itemResult.isPresent()) { -// return documentUi.showDocumentNotFound(section, documentPath); -// } -// final ContentItem item = itemResult.get(); -// selectedDocumentModel.setContentItem(item); -// -// final Optional taskResult = findTask( -// item, taskIdentifier -// ); -// if (!taskResult.isPresent()) { -// return showTaskNotFound(section, documentPath, taskIdentifier); -// } -// -// final AssignableTask task = taskResult.get(); -// if (comment.isEmpty()) { -// assignableTaskManager.finish(task); -// } else { -// assignableTaskManager.finish(task, comment); -// } -// -// return String.format("redirect:%s", returnUrl); -// } -// -// @POST -// @Path( -// "/{documentPath:(.+)?}/@workflow/@applyAlternative/{workflowIdentifier}") -// @AuthorizationRequired -// @Transactional(Transactional.TxType.REQUIRED) -// public String applyAlternateWorkflow( -// @PathParam("sectionIdentifider") final String sectionIdentifier, -// @PathParam("documentPath") final String documentPath, -// @FormParam("newWorkflowUuid") final String newWorkflowUuid, -// @FormParam("returnUrl") final String returnUrl -// ) { -// final Optional sectionResult = sectionsUi -// .findContentSection(sectionIdentifier); -// if (!sectionResult.isPresent()) { -// return sectionsUi.showContentSectionNotFound(sectionIdentifier); -// } -// final ContentSection section = sectionResult.get(); -// -// final Optional itemResult = itemRepo -// .findByPath(section, documentPath); -// if (!itemResult.isPresent()) { -// return documentUi.showDocumentNotFound(section, documentPath); -// } -// final ContentItem item = itemResult.get(); -// selectedDocumentModel.setContentItem(item); -// -// if (!permissionChecker.isPermitted( -// ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, item)) { -// return sectionsUi.showAccessDenied( -// "sectionIdentifier", sectionIdentifier, -// "documentPath", documentPath -// ); -// } -// -// final Optional workflowResult = section -// .getWorkflowTemplates() -// .stream() -// .filter(template -> template.getUuid().equals(newWorkflowUuid)) -// .findAny(); -// if (!workflowResult.isPresent()) { -// models.put("section", section.getLabel()); -// models.put("workflowUuid", newWorkflowUuid); -// return "org/librecms/ui/contentsection/workflow-not-found.xhtml"; -// } -// -// workflowManager.createWorkflow(workflowResult.get(), item); -// return String.format("redirect:%s", returnUrl); -// } -// -// @POST -// @Path("/{documentPath:(.+)?}/@workflow/@restart") -// @AuthorizationRequired -// @Transactional(Transactional.TxType.REQUIRED) -// public String restartWorkflow( -// @PathParam("sectionIdentifider") final String sectionIdentifier, -// @PathParam("documentPath") final String documentPath, -// @FormParam("returnUrl") final String returnUrl -// ) { -// final Optional sectionResult = sectionsUi -// .findContentSection(sectionIdentifier); -// if (!sectionResult.isPresent()) { -// return sectionsUi.showContentSectionNotFound(sectionIdentifier); -// } -// final ContentSection section = sectionResult.get(); -// -// final Optional itemResult = itemRepo -// .findByPath(section, documentPath); -// if (!itemResult.isPresent()) { -// return documentUi.showDocumentNotFound(section, documentPath); -// } -// final ContentItem item = itemResult.get(); -// selectedDocumentModel.setContentItem(item); -// -// if (!permissionChecker.isPermitted( -// ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, item)) { -// return sectionsUi.showAccessDenied( -// "sectionIdentifier", sectionIdentifier, -// "documentPath", documentPath -// ); -// } -// -// if (item.getWorkflow() != null) { -// workflowManager.start(item.getWorkflow()); -// } -// -// return String.format("redirect:%s", returnUrl); -// } -// -// private Optional findTask( -// final ContentItem item, -// final String taskIdentifier -// ) { -// final Workflow workflow = item.getWorkflow(); -// if (workflow == null) { -// return Optional.empty(); -// } -// -// final Identifier identifier = identifierParser.parseIdentifier( -// taskIdentifier -// ); -// switch (identifier.getType()) { -// case ID: -// return workflow -// .getTasks() -// .stream() -// .filter(task -> task instanceof AssignableTask) -// .map(task -> (AssignableTask) task) -// .filter( -// task -> task.getTaskId() == Long -// .parseLong(identifier.getIdentifier()) -// ).findAny(); -// default: -// return workflow -// .getTasks() -// .stream() -// .filter(task -> task instanceof AssignableTask) -// .map(task -> (AssignableTask) task) -// .filter( -// task -> task.getUuid().equals( -// identifier.getIdentifier() -// ) -// ).findAny(); -// } -// } + private List readAuthoringSteps( + final ContentItem item + ) { + final MvcAuthoringKit authoringKit = item + .getClass() + .getAnnotation(MvcAuthoringKit.class); + + final Class[] stepClasses = authoringKit + .authoringSteps(); + + return Arrays + .stream(stepClasses) + .map(authoringSteps::select) + .filter(instance -> instance.isResolvable()) + .map(Instance::get) + .collect(Collectors.toList()); + } + + private String findPathFragmentForFirstStep(final ContentItem item) { + final List steps = readAuthoringSteps(item); + + final MvcAuthoringStep firstStep = steps.get(0); + final AuthoringStepPathFragment pathFragment = firstStep + .getClass() + .getAnnotation(AuthoringStepPathFragment.class); + return pathFragment.value(); + } + private LifecycleListEntry buildLifecycleListEntry( final LifecycleDefinition definition ) { diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentLifecyclesController.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentLifecyclesController.java index 8d19f1d85..5cb830726 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentLifecyclesController.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentLifecyclesController.java @@ -24,7 +24,6 @@ import java.util.Optional; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; -import javax.inject.Named; import javax.mvc.Controller; import javax.mvc.Models; import javax.transaction.Transactional; @@ -102,7 +101,7 @@ public class DocumentLifecyclesController { if (!phaseResult.isPresent()) { models.put("section", section.getLabel()); models.put("phaseId", phaseId); - return "org/librecms/ui/contentsection/phase-not-found.xhtml"; + return "org/librecms/ui/contentsection/documents/phase-not-found.xhtml"; } final Phase phase = phaseResult.get(); diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentNotFound.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentNotFound.java index c450cf37a..3638963a8 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentNotFound.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentNotFound.java @@ -25,7 +25,7 @@ import javax.ws.rs.Path; public class DocumentNotFound implements MvcAuthoringStep { @Override - public Class supportedDocumenType() { + public Class supportedDocumentType() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentTypeClassNotFound.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentTypeClassNotFound.java index 859d201dc..03d064ecc 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentTypeClassNotFound.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentTypeClassNotFound.java @@ -59,12 +59,12 @@ class DocumentTypeClassNotFound @Override public String showCreateForm() { - return "org/librecms/ui/contentsection/documents/document-type-not-found.xhtml"; + return "org/librecms/ui/contentsection/documents/document-type-not-available.xhtml"; } @Override public String createContentItem() { - return "org/librecms/ui/contentsection/documents/document-type-not-found.xhtml"; + return "org/librecms/ui/contentsection/documents/document-type-not-available.xhtml"; } @Override diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentWorkflowController.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentWorkflowController.java index 3f487054e..057485116 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentWorkflowController.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/DocumentWorkflowController.java @@ -228,7 +228,7 @@ public class DocumentWorkflowController { if (!workflowResult.isPresent()) { models.put("section", section.getLabel()); models.put("workflowUuid", newWorkflowUuid); - return "org/librecms/ui/contentsection/workflow-not-found.xhtml"; + return "org/librecms/ui/contentsection/documents/workflow-not-found.xhtml"; } workflowManager.createWorkflow(workflowResult.get(), item); @@ -319,7 +319,7 @@ public class DocumentWorkflowController { models.put("section", section.getLabel()); models.put("documentPath", documentPath); models.put("taskIdentifier", taskIdentifier); - return "org/librecms/ui/contentsection/task-not-found.xhtml"; + return "org/librecms/ui/contentsection/documents/task-not-found.xhtml"; } } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/MvcAuthoringKit.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/MvcAuthoringKit.java index d2057be6d..23f9ad7f1 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/MvcAuthoringKit.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/MvcAuthoringKit.java @@ -7,7 +7,9 @@ package org.librecms.ui.contentsections.documents; import org.librecms.contentsection.ContentItem; -import javax.mvc.Controller; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Provides the steps for creating and viewing and editing a document (content @@ -19,6 +21,7 @@ import javax.mvc.Controller; * * @author Jens Pelzetter */ +@Retention(RetentionPolicy.RUNTIME) public @interface MvcAuthoringKit { /** @@ -26,7 +29,7 @@ public @interface MvcAuthoringKit { * * @return Descriptor class for the create step. */ - Class createStep(); + Class> createStep(); /** * The authoring steps for editing the properties of the document. They are diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/MvcAuthoringStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/MvcAuthoringStep.java index 247ee6516..7f0bad00a 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/MvcAuthoringStep.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/MvcAuthoringStep.java @@ -32,7 +32,7 @@ public interface MvcAuthoringStep { * * @return The document type supported by the authoring step. */ - Class supportedDocumenType(); + Class supportedDocumentType(); /** * Gets the localized label of the authoring step. The language variant to diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/SelectedDocumentModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/SelectedDocumentModel.java index 0783967f8..4f30485fd 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/SelectedDocumentModel.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/SelectedDocumentModel.java @@ -13,11 +13,15 @@ import org.libreccm.workflow.AssignableTaskManager; import org.libreccm.workflow.TaskState; import org.libreccm.workflow.Workflow; import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentItemManager; +import org.librecms.contentsection.Folder; +import org.librecms.contentsection.FolderManager; import org.librecms.contentsection.privileges.ItemPrivileges; +import org.librecms.ui.contentsections.FolderBreadcrumbsModel; +import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.Optional; import java.util.stream.Collectors; import javax.enterprise.context.RequestScoped; @@ -35,6 +39,12 @@ public class SelectedDocumentModel { @Inject private AssignableTaskManager taskManager; + @Inject + private ContentItemManager itemManager; + + @Inject + private FolderManager folderManager; + @Inject private GlobalizationHelper globalizationHelper; @@ -46,14 +56,55 @@ public class SelectedDocumentModel { private ContentItem item; + private String itemTitle; + + private String itemPath; + + private List parentFolderBreadcrumbs; + private Workflow workflow; private TaskListEntry currentTask; private List allTasks; + public String getItemTitle() { + return itemTitle; + } + + public String getItemPath() { + return itemPath; + } + + public List getParentFolderBreadcrumbs() { + return Collections.unmodifiableList(parentFolderBreadcrumbs); + } + + public List getAllTasks() { + return Collections.unmodifiableList(allTasks); + } + + public TaskListEntry getCurrentTask() { + return currentTask; + } + + public boolean getCanChangeWorkflow() { + return permissionChecker.isPermitted( + ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, item + ); + } + void setContentItem(final ContentItem item) { this.item = Objects.requireNonNull(item); + itemTitle = globalizationHelper.getValueFromLocalizedString( + item.getTitle() + ); + itemPath = itemManager.getItemPath(item); + parentFolderBreadcrumbs = itemManager + .getItemFolders(item) + .stream() + .map(this::buildFolderBreadcrumbsModel) + .collect(Collectors.toList()); workflow = item.getWorkflow(); allTasks = workflow .getTasks() @@ -73,14 +124,14 @@ public class SelectedDocumentModel { } } - public TaskListEntry getCurrentTask() { - return currentTask; - } - - public boolean getCanChangeWorkflow() { - return permissionChecker.isPermitted( - ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, item - ); + private FolderBreadcrumbsModel buildFolderBreadcrumbsModel( + final Folder folder + ) { + final FolderBreadcrumbsModel model = new FolderBreadcrumbsModel(); + model.setCurrentFolder(false); + model.setPath(folderManager.getFolderPath(folder)); + model.setPathToken(folder.getName()); + return model; } private TaskListEntry buildTaskListEntry(final AssignableTask task) { diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/UnsupportedDocumentType.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/UnsupportedDocumentType.java index 2c1ea8385..9196c521f 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/UnsupportedDocumentType.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/UnsupportedDocumentType.java @@ -25,7 +25,7 @@ import javax.ws.rs.Path; public class UnsupportedDocumentType implements MvcAuthoringStep { @Override - public Class supportedDocumenType() { + public Class supportedDocumentType() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @@ -66,7 +66,7 @@ public class UnsupportedDocumentType implements MvcAuthoringStep { @Override public String showStep() { - return "org/librecms/ui/contentsection/unsupported-documenttype.xhtml"; + return "org/librecms/ui/contentsection/documents/unsupported-documenttype.xhtml"; } @GET diff --git a/ccm-cms/src/main/java/org/librecms/ui/contenttypes/MvcArticlePropertiesStep.java b/ccm-cms/src/main/java/org/librecms/ui/contenttypes/MvcArticlePropertiesStep.java index 64378bec5..71cb64c1f 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contenttypes/MvcArticlePropertiesStep.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contenttypes/MvcArticlePropertiesStep.java @@ -62,7 +62,7 @@ public class MvcArticlePropertiesStep implements MvcAuthoringStep { private Article document; @Override - public Class supportedDocumenType() { + public Class supportedDocumentType() { return Article.class; } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contenttypes/MvcArticleTextBodyStep.java b/ccm-cms/src/main/java/org/librecms/ui/contenttypes/MvcArticleTextBodyStep.java index 2181b012e..f0500e06e 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contenttypes/MvcArticleTextBodyStep.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contenttypes/MvcArticleTextBodyStep.java @@ -61,7 +61,7 @@ public class MvcArticleTextBodyStep implements MvcAuthoringStep { private Article document; @Override - public Class supportedDocumenType() { + public Class supportedDocumentType() { return Article.class; } diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/authoringstep-not-available.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/authoringstep-not-available.xhtml new file mode 100644 index 000000000..2d5a25f79 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/authoringstep-not-available.xhtml @@ -0,0 +1,29 @@ +]> + + + + + + + + + + + + +
+ +
+
+ +
+ + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/authoringstep.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/authoringstep.xhtml new file mode 100644 index 000000000..43a6042fc --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/authoringstep.xhtml @@ -0,0 +1,40 @@ +]> + + + + + + + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/create-step-not-available.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/create-step-not-available.xhtml new file mode 100644 index 000000000..aa426b661 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/create-step-not-available.xhtml @@ -0,0 +1,30 @@ +]> + + + + + + + + + + + + +
+ +
+
+ +
+ + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-breadcrumbs.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-breadcrumbs.xhtml new file mode 100644 index 000000000..a38dbe581 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-breadcrumbs.xhtml @@ -0,0 +1,32 @@ +]> + + + + + + + + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-not-found.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-not-found.xhtml new file mode 100644 index 000000000..c58a2b9d6 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-not-found.xhtml @@ -0,0 +1,33 @@ +]> + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-type-not-available.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-type-not-available.xhtml new file mode 100644 index 000000000..c8b505275 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document-type-not-available.xhtml @@ -0,0 +1,30 @@ +]> + + + + + + + + + + + + +
+ +
+
+ +
+ + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document.xhtml new file mode 100644 index 000000000..33037dde4 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/document.xhtml @@ -0,0 +1,54 @@ +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

#{CmsAdminMessages.getMessage("contentsection.document.heading", [ContentSectionModel.sectionName, CmsSelectedDocumentModel.itemTitle])}

+ + + +
+
+ +
+ \ No newline at end of file diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/folder-not-found.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/folder-not-found.xhtml new file mode 100644 index 000000000..b1fd86359 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/folder-not-found.xhtml @@ -0,0 +1,43 @@ +]> + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/history.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/history.xhtml new file mode 100644 index 000000000..f1c4d6fd5 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/history.xhtml @@ -0,0 +1,20 @@ +]> + + + + + + +
+ +
+
+ +
+ \ No newline at end of file diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/lifecycle-def-not-found.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/lifecycle-def-not-found.xhtml new file mode 100644 index 000000000..ea82d9351 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/lifecycle-def-not-found.xhtml @@ -0,0 +1,31 @@ +]> + + + + + + + + + + + + +
+ +
+
+ +
+ + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/phase-not-found.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/phase-not-found.xhtml new file mode 100644 index 000000000..1088d8b8b --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/phase-not-found.xhtml @@ -0,0 +1,32 @@ +]> + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/publish.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/publish.xhtml new file mode 100644 index 000000000..f2e573dd9 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/publish.xhtml @@ -0,0 +1,28 @@ +]> + + + + + + + + + + + + +
+ +
+
+
+ + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/task-not-found.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/task-not-found.xhtml new file mode 100644 index 000000000..99f571477 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/task-not-found.xhtml @@ -0,0 +1,33 @@ +]> + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/unsupported-documenttype.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/unsupported-documenttype.xhtml new file mode 100644 index 000000000..e4d7997e3 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/unsupported-documenttype.xhtml @@ -0,0 +1,35 @@ +]> + + + + + + + + + +
  • + #{authoringStep} +
  • +
    + + +
    + +
    +
    + +
    + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/workflow-not-found.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/workflow-not-found.xhtml new file mode 100644 index 000000000..67481c514 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/workflow-not-found.xhtml @@ -0,0 +1,32 @@ +]> + + + + + + + + + + + + +
    + +
    +
    + +
    + + + + + diff --git a/ccm-cms/src/test/java/org/librecms/ui/contentsections/documents/LifecyclesControllerTest.java b/ccm-cms/src/test/java/org/librecms/ui/contentsections/documents/LifecyclesControllerTest.java deleted file mode 100644 index 5260b7fd1..000000000 --- a/ccm-cms/src/test/java/org/librecms/ui/contentsections/documents/LifecyclesControllerTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.librecms.ui.contentsections.documents; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.*; - -/** - * - * @author Jens Pelzetter - */ -public class LifecyclesControllerTest { - - public LifecyclesControllerTest() { - } - - @BeforeClass - public static void setUpClass() { - } - - @AfterClass - public static void tearDownClass() { - } - - @Before - public void setUp() { - } - - @After - public void tearDown() { - } - - /** - * Test of updatePhaseDates method, of class DocumentLifecyclesController. - */ - @Test - public void testUpdatePhaseDates() { - System.out.println("updatePhaseDates"); - String sectionIdentifier = ""; - String documentPath = ""; - long phaseId = 0L; - String startDateParam = ""; - String endDateParam = ""; - DocumentLifecyclesController instance = new DocumentLifecyclesController(); - String expResult = ""; - String result - = instance.updatePhaseDates(sectionIdentifier, documentPath, phaseId, - startDateParam, endDateParam); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } - -}