Coverage Summary for Class: XmlGenerator (org.kitodo.production.migration)

Class Class, % Method, % Line, %
XmlGenerator 100% (1/1) 100% (14/14) 100% (134/134)


 /*
  * (c) Kitodo. Key to digital objects e. V. <contact@kitodo.org>
  *
  * This file is part of the Kitodo project.
  *
  * It is licensed under GNU General Public License version 3 or later.
  *
  * For the full copyright and license information, please read the
  * GPL3-License.txt file that was distributed with this source code.
  */
 
 package org.kitodo.production.migration;
 
 import org.apache.commons.lang3.StringUtils;
 import org.kitodo.data.database.beans.Role;
 import org.kitodo.data.database.beans.Task;
 import org.kitodo.data.database.enums.TaskStatus;
 
 class XmlGenerator {
 
     private static final String END_LINE = "\">\n";
     private static final String SLASH_END_LINE = "\"/>\n";
     private static final String QUOTES = "\" ";
     private static final String OPEN_LABEL = "                <bpmndi:BPMNLabel>\n";
     private static final String CLOSE_LABEL = "                </bpmndi:BPMNLabel>\n";
     private static final String CLOSE_SHAPE = "            </bpmndi:BPMNShape>\n";
 
     private XmlGenerator() {
         // private constructor for static class
     }
 
     /**
      * Generate task.
      *
      * @param task
      *            for generating
      * @return generated task
      */
     static String generateTask(Task task, int order) {
         return generateTask(task, "Task_" + (order - 1), order);
     }
 
     /**
      * Generate task.
      *
      * @param task
      *            for generating
      * @param sourceReference
      *            for sequence flow
      * @return generated task
      */
     static String generateTask(Task task, String sourceReference, int ordering) {
         StringBuilder taskBuilder = new StringBuilder();
         openTask(taskBuilder, task);
 
         taskBuilder.append("id=\"Task_");
         taskBuilder.append(ordering);
         taskBuilder.append(QUOTES);
         taskBuilder.append("name=\"");
         taskBuilder.append(task.getTitle());
         taskBuilder.append(QUOTES);
 
         generateTemplateTaskProperty(taskBuilder, "editType", task.getEditType().getValue());
         generateTemplateTaskProperty(taskBuilder, "processingStatus",
             task.getProcessingStatus().equals(TaskStatus.DONE) ? TaskStatus.DONE.getValue()
                     : TaskStatus.LOCKED.getValue());
         generateTemplateTaskProperty(taskBuilder, "concurrent", task.isConcurrent());
         generateTemplateTaskProperty(taskBuilder, "typeMetadata", task.isTypeMetadata());
         generateTemplateTaskProperty(taskBuilder, "typeAutomatic", task.isTypeAutomatic());
         generateTemplateTaskProperty(taskBuilder, "typeExportDMS", task.isTypeExportDMS());
         generateTemplateTaskProperty(taskBuilder, "typeImagesRead", task.isTypeImagesRead());
         generateTemplateTaskProperty(taskBuilder, "typeImagesWrite", task.isTypeImagesRead());
         generateTemplateTaskProperty(taskBuilder, "typeAcceptClose", task.isTypeAcceptClose());
         generateTemplateTaskProperty(taskBuilder, "typeCloseVerify", task.isTypeCloseVerify());
         generateTemplateTaskProperty(taskBuilder, "batchStep", task.isBatchStep());
         generateTemplateTaskProperty(taskBuilder, "repeatOnCorrection", task.isRepeatOnCorrection());
 
         if (!task.getRoles().isEmpty()) {
             taskBuilder.append("template:permittedUserRole=\"");
             for (Role role : task.getRoles()) {
                 taskBuilder.append(role.getId());
                 taskBuilder.append(",");
             }
             taskBuilder.deleteCharAt(taskBuilder.length() - 1);
             taskBuilder.append(QUOTES);
         }
         if (StringUtils.isNotBlank(task.getScriptName()) || StringUtils.isNotBlank(task.getScriptPath())) {
             generateTemplateTaskProperty(taskBuilder, "scriptName", task.getScriptName());
             generateTemplateTaskProperty(taskBuilder, "scriptPath", task.getScriptPath());
         }
         taskBuilder.append(">\n");
 
         generateSequences(taskBuilder, ordering);
         closeTask(taskBuilder, task);
         generateSequenceFlow(taskBuilder, ordering, sourceReference);
 
         return taskBuilder.toString();
     }
 
     static void generateEndEvent(StringBuilder diagram, int tasksSize) {
         diagram.append("<bpmn2:endEvent id=\"EndEvent_1\">\n");
         diagram.append("            <bpmn2:incoming>SequenceFlow_");
         diagram.append(tasksSize + 1);
         diagram.append("</bpmn2:incoming>\n");
         diagram.append("        </bpmn2:endEvent>\n");
         diagram.append("<bpmn2:sequenceFlow id=\"SequenceFlow_");
         diagram.append(tasksSize + 1);
         diagram.append("\" sourceRef=\"Task_");
         diagram.append(tasksSize);
         diagram.append("\" targetRef=\"EndEvent_1\"/>\n");
         diagram.append("    </bpmn2:process>\n");
     }
 
     private static void openTask(StringBuilder taskBuilder, Task task) {
         if (StringUtils.isNotBlank(task.getScriptName()) || StringUtils.isNotBlank(task.getScriptPath())) {
             taskBuilder.append("        <bpmn2:scriptTask ");
         } else {
             taskBuilder.append("        <bpmn2:task ");
         }
     }
 
     private static void closeTask(StringBuilder taskBuilder, Task task) {
         if (StringUtils.isNotBlank(task.getScriptName()) || StringUtils.isNotBlank(task.getScriptPath())) {
             taskBuilder.append("        </bpmn2:scriptTask>\n");
         } else {
             taskBuilder.append("        </bpmn2:task>\n");
         }
     }
 
     private static void generateTemplateTaskProperty(StringBuilder taskBuilder, String propertyName,
             Object propertyValue) {
         taskBuilder.append("template:");
         taskBuilder.append(propertyName);
         taskBuilder.append("=\"");
         taskBuilder.append(propertyValue);
         taskBuilder.append(QUOTES);
     }
 
     private static void generateSequences(StringBuilder taskBuilder, Integer ordering) {
         taskBuilder.append("            <bpmn2:incoming>SequenceFlow_");
         taskBuilder.append(ordering);
         taskBuilder.append("</bpmn2:incoming>\n");
         taskBuilder.append("            <bpmn2:outgoing>SequenceFlow_");
         taskBuilder.append(ordering + 1);
         taskBuilder.append("</bpmn2:outgoing>\n");
     }
 
     private static void generateSequenceFlow(StringBuilder taskBuilder, Integer ordering, String sourceReference) {
         taskBuilder.append("        <bpmn2:sequenceFlow id=\"SequenceFlow_");
         taskBuilder.append(ordering);
         taskBuilder.append("\" sourceRef=\"");
         taskBuilder.append(sourceReference);
         taskBuilder.append("\" targetRef=\"");
         taskBuilder.append("Task_");
         taskBuilder.append(ordering);
         taskBuilder.append(SLASH_END_LINE);
     }
 
     /**
      * Generate task shape to display in workflow editor.
      *
      * @param taskOrdering
      *            order of task for which task shape should be generated
      * @param xAxe
      *            reference coordinate
      * @return task shape to display in workflow editor
      */
     static String generateTaskShape(Integer taskOrdering, int xAxe) {
         StringBuilder taskBuilder = new StringBuilder();
 
         final int diagramHeight = 218;
 
         taskBuilder.append("            <bpmndi:BPMNShape id=\"Task_");
         taskBuilder.append(taskOrdering);
         taskBuilder.append("_di\" bpmnElement=\"Task_");
         taskBuilder.append(taskOrdering);
         taskBuilder.append(END_LINE);
         generateBounds(taskBuilder, xAxe, diagramHeight, 100, 80);
         taskBuilder.append(CLOSE_SHAPE);
         taskBuilder.append("            <bpmndi:BPMNEdge id=\"SequenceFlow_");
         taskBuilder.append(taskOrdering + 1);
         taskBuilder.append("_di\" bpmnElement=\"SequenceFlow_");
         taskBuilder.append(taskOrdering + 1);
         taskBuilder.append(END_LINE);
         generateWayPoint(taskBuilder, xAxe + 100, diagramHeight + 40);
         generateWayPoint(taskBuilder, xAxe + 150, diagramHeight + 40);
         taskBuilder.append(OPEN_LABEL);
         generateBounds(taskBuilder, xAxe + 125, diagramHeight + 29, 0, 12);
         taskBuilder.append(CLOSE_LABEL);
         taskBuilder.append("            </bpmndi:BPMNEdge>\n");
 
         return taskBuilder.toString();
     }
 
     static void generateBpmnDiagram(StringBuilder diagram, String title) {
         final int xAxe = 498;
 
         diagram.append("    <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n");
         diagram.append("        <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"");
         diagram.append(title);
         diagram.append(END_LINE);
         diagram.append("            <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_1\" bpmnElement=\"StartEvent_1\">\n");
         generateBounds(diagram, 412, 240, 36, 36);
         diagram.append(CLOSE_SHAPE);
         diagram.append("            <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n");
         generateWayPoint(diagram, xAxe - 50, 258);
         generateWayPoint(diagram, xAxe, 258);
         diagram.append(OPEN_LABEL);
         generateBounds(diagram, xAxe - 25, 237, 0, 12);
         diagram.append(CLOSE_LABEL);
         diagram.append("            </bpmndi:BPMNEdge>\n");
     }
 
     static void generateBpmnEndEvent(StringBuilder diagram, int xAxe) {
         diagram.append("            <bpmndi:BPMNShape id=\"EndEvent_1_di\" bpmnElement=\"EndEvent_1\">\n");
         generateBounds(diagram, xAxe, 240, 36, 36);
         diagram.append(OPEN_LABEL);
         generateBounds(diagram, xAxe + 18, 280, 0, 12);
         diagram.append(CLOSE_LABEL);
         diagram.append(CLOSE_SHAPE);
     }
 
     static void generateCloseBpmnDiagram(StringBuilder diagram) {
         diagram.append("        </bpmndi:BPMNPlane>\n");
         diagram.append("    </bpmndi:BPMNDiagram>\n");
         diagram.append("</bpmn2:definitions>");
     }
 
     private static void generateBounds(StringBuilder diagram, int xAxe, int yAxe, int width, int height) {
         diagram.append("                <dc:Bounds x=\"");
         diagram.append(xAxe);
         diagram.append("\" y=\"");
         diagram.append(yAxe);
         diagram.append("\" width=\"");
         diagram.append(width);
         diagram.append("\" height=\"");
         diagram.append(height);
         diagram.append(SLASH_END_LINE);
     }
 
     private static void generateWayPoint(StringBuilder diagram, int xAxe, int yAxe) {
         diagram.append("                <di:waypoint x=\"");
         diagram.append(xAxe);
         diagram.append("\" y=\"");
         diagram.append(yAxe);
         diagram.append(SLASH_END_LINE);
     }
 }