Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.gridFailureInformation.backend into DEVELOP
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/GfiGrid.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/GfiGrid.java
index 610d505..3fb2a3d 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/GfiGrid.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/GfiGrid.java
@@ -24,8 +24,7 @@
 import org.eclipse.openk.gridfailureinformation.constants.Constants;
 import org.springframework.stereotype.Component;
 
-import static org.eclipse.openk.gridfailureinformation.bpmn.base.tasks.DecisionTask.OutputPort.NO;
-import static org.eclipse.openk.gridfailureinformation.bpmn.base.tasks.DecisionTask.OutputPort.YES;
+import static org.eclipse.openk.gridfailureinformation.bpmn.base.tasks.DecisionTask.OutputPort.*;
 import static org.eclipse.openk.gridfailureinformation.bpmn.impl.GfiProcessState.*;
 
 @Log4j2
@@ -52,6 +51,9 @@
 
         ProcessTask canceledEndpoint = register( CANCELED,
                 new UIStoreFailureInformationTask( "State CANCELED UI Task", true));
+
+        DecisionTask decidePublished = new DecideFailureInfoPublished();
+        ProcessTask storePubStatusWithdrawnOnCancel = new StorePublishStatusTask(Constants.PUB_STATUS_ZURUECKGEZOGEN);
         ProcessTask publishMessage = register( QUALIFIED,
                 new UIStoreFailureInformationTask( "State QUALIFIED UI Task", true));
 
@@ -80,7 +82,6 @@
         enterMessage.connectOutputTo( storeEditStatusCreated );
         // -> nein
         storeEditStatusCreated.connectOutputTo( qualifyMessage );
-        // TODO Beabreitungsstatus: aktualisiert berücksichtigen: Zweig: Meldung aktualisieren
         qualifyMessage.connectOutputTo(decideCanceled);
         //Meldung storniert?
         decideCanceled.connectOutputTo( YES, storeEditStatusCanceled ); //Status nicht speichern da sonst doppelt, -> nächster Porzessschritt
@@ -88,12 +89,17 @@
 
         storeEditStatusQualified.connectOutputTo(publishMessage);
         publishMessage.connectOutputTo(decideUpdated);
-        decideUpdated.connectOutputTo(YES, storeEditStatusUpdated);
-        //decideUpdated.connectOutputTo(NO, completedEndpoint);
-        decideUpdated.connectOutputTo(NO, setEndDate);
+        decideUpdated.connectOutputTo(PORT1, storeEditStatusUpdated);
+        decideUpdated.connectOutputTo(PORT2, setEndDate);
+        decideUpdated.connectOutputTo(PORT3, storeEditStatusCanceled);
         setEndDate.connectOutputTo(storePublicationStatusWithdrawn);
         storePublicationStatusWithdrawn.connectOutputTo(completedEndpoint);
 
+        storeEditStatusCanceled.connectOutputTo(decidePublished);
+        decidePublished.connectOutputTo( YES, storePubStatusWithdrawnOnCancel);
+        decidePublished.connectOutputTo( NO, canceledEndpoint);
+        storePubStatusWithdrawnOnCancel.connectOutputTo( canceledEndpoint );
+
         storeForceEditStatusQualified.connectOutputTo(publishMessageToChannels);
         publishMessageToChannels.connectOutputTo(storePublicationStatusPublished);
         storePublicationStatusPublished.connectOutputTo(updateMessage);
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/tasks/DecideFailureInfoPublished.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/tasks/DecideFailureInfoPublished.java
new file mode 100644
index 0000000..fe76268
--- /dev/null
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/tasks/DecideFailureInfoPublished.java
@@ -0,0 +1,48 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+
+package org.eclipse.openk.gridfailureinformation.bpmn.impl.tasks;
+
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.gridfailureinformation.bpmn.base.ProcessException;
+import org.eclipse.openk.gridfailureinformation.bpmn.base.tasks.DecisionTask;
+import org.eclipse.openk.gridfailureinformation.bpmn.impl.GfiProcessSubject;
+import org.eclipse.openk.gridfailureinformation.constants.Constants;
+
+@Log4j2
+public class DecideFailureInfoPublished extends DecisionTask<GfiProcessSubject> {
+
+    public DecideFailureInfoPublished() {
+        super("Decision: Ist die Störungsinformation veröffentlicht?");
+    }
+
+    @Override
+    public OutputPort decide(GfiProcessSubject subject) throws ProcessException {
+        boolean isPublished = Constants.PUB_STATUS_VEROEFFENTLICHT.equals(
+                subject.getFailureInformationDto().getPublicationStatus()
+        );
+
+        String loggerOutput1 = "Decide: ";
+
+        if (isPublished) {
+            log.debug(loggerOutput1 + getDescription() + "\" -> Firing YES");
+            return OutputPort.YES;
+        } else {
+            log.debug(loggerOutput1 + getDescription() + "\" -> Firing NO");
+            return OutputPort.NO;
+        }
+    }
+
+}
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/tasks/DecideFailureInfoUpdated.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/tasks/DecideFailureInfoUpdated.java
index 11538aa..00f03df 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/tasks/DecideFailureInfoUpdated.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/tasks/DecideFailureInfoUpdated.java
@@ -38,12 +38,18 @@
         String loggerOutput1 = "Decide: ";
 
         if (newState == GfiProcessState.UPDATED) {
-            log.debug(loggerOutput1 + getDescription() + "\" -> Firing YES");
-            return OutputPort.YES;
-        } else if (newState == GfiProcessState.COMPLETED) {
-            log.debug(loggerOutput1 + getDescription() + "\" -> Firing NO");
-            return OutputPort.NO;
-        } else {
+            log.debug(loggerOutput1 + getDescription() + "\" -> Firing PORT1");
+            return OutputPort.PORT1;
+        }
+        else if (newState == GfiProcessState.COMPLETED) {
+            log.debug(loggerOutput1 + getDescription() + "\" -> Firing PORT2");
+            return OutputPort.PORT2;
+        }
+        else if (newState == GfiProcessState.CANCELED) {
+            log.debug(( loggerOutput1 + getDescription() + "\" -> Firing PORT3"));
+            return OutputPort.PORT3;
+        }
+        else {
             throw new ProcessException(this.getDescription() + ": Invalid status request:" + newState,
                     new InternalServerErrorException("invalid.status.request"));
         }
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/DecideFailureInfoPublishedTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/DecideFailureInfoPublishedTest.java
new file mode 100644
index 0000000..3fe3eb5
--- /dev/null
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/bpmn/impl/DecideFailureInfoPublishedTest.java
@@ -0,0 +1,28 @@
+package org.eclipse.openk.gridfailureinformation.bpmn.impl;
+
+import org.eclipse.openk.gridfailureinformation.bpmn.base.ProcessException;
+import org.eclipse.openk.gridfailureinformation.bpmn.base.tasks.DecisionTask;
+import org.eclipse.openk.gridfailureinformation.bpmn.impl.tasks.DecideFailureInfoPublished;
+import org.eclipse.openk.gridfailureinformation.constants.Constants;
+import org.eclipse.openk.gridfailureinformation.support.MockDataHelper;
+import org.eclipse.openk.gridfailureinformation.viewmodel.FailureInformationDto;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class DecideFailureInfoPublishedTest {
+
+
+    @Test
+    public void shouldDecideCorrectly() throws ProcessException {
+        FailureInformationDto fiDto = MockDataHelper.mockFailureInformationDto();
+        fiDto.setPublicationStatus(Constants.PUB_STATUS_VEROEFFENTLICHT);
+        GfiProcessSubject sub = GfiProcessSubject.of(fiDto, null);
+        DecisionTask dtask = new DecideFailureInfoPublished();
+        assertEquals(DecisionTask.OutputPort.YES, dtask.decide(sub));
+
+        sub.getFailureInformationDto().setPublicationStatus(Constants.PUB_STATUS_UNVEROEFFENTLICHT);
+        assertEquals(DecisionTask.OutputPort.NO, dtask.decide(sub));
+    }
+
+}