From e71aa8b670d255de0f543b5fd104d040785870d2 Mon Sep 17 00:00:00 2001
From: Jonas Blatt <jonasblatt@uni-koblenz.de>
Date: Mon, 29 Apr 2019 11:42:51 +0200
Subject: [PATCH] Add rfid API call and second process for product review

---
 camunda/camunda.iml                           |  5 +-
 camunda/pom.xml                               | 14 +++++
 .../fgbas/bs/bpm/iot/Application.java         |  1 +
 .../bs/bpm/iot/RfidTimerReaderService.java    | 62 +++++++++++++++++++
 .../fgbas/bs/bpm/iot/TestService.java         | 15 -----
 .../bpm/iot/service/RfidProductService.java   | 22 +++++++
 .../main/resources/META-INF/diagram_1.bpmn    |  6 +-
 .../main/resources/META-INF/diagram_2.bpmn    | 45 ++++++++++++++
 8 files changed, 151 insertions(+), 19 deletions(-)
 create mode 100644 camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/RfidTimerReaderService.java
 delete mode 100644 camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/TestService.java
 create mode 100644 camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/service/RfidProductService.java
 create mode 100644 camunda/src/main/resources/META-INF/diagram_2.bpmn

diff --git a/camunda/camunda.iml b/camunda/camunda.iml
index 55e3152..d78afcb 100644
--- a/camunda/camunda.iml
+++ b/camunda/camunda.iml
@@ -14,7 +14,7 @@
       </configuration>
     </facet>
   </component>
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
     <output url="file://$MODULE_DIR$/target/classes" />
     <output-test url="file://$MODULE_DIR$/target/test-classes" />
     <content url="file://$MODULE_DIR$">
@@ -126,5 +126,8 @@
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.9.7" level="project" />
     <orderEntry type="library" name="Maven: org.camunda.bpm.webapp:camunda-webapp-webjar:7.10.0" level="project" />
     <orderEntry type="library" name="Maven: com.h2database:h2:1.4.197" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.6" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.10" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/camunda/pom.xml b/camunda/pom.xml
index 4133078..9a967b4 100644
--- a/camunda/pom.xml
+++ b/camunda/pom.xml
@@ -26,10 +26,24 @@
       <groupId>com.h2database</groupId>
       <artifactId>h2</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>4.5.6</version>
+    </dependency>
   </dependencies>
 
   <build>
     <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.7.0</version>
+        <configuration>
+          <source>8</source>
+          <target>8</target>
+        </configuration>
+      </plugin>
       <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
diff --git a/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/Application.java b/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/Application.java
index 14bc26a..f3792fd 100644
--- a/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/Application.java
+++ b/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/Application.java
@@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
 public class Application {
+
   public static void main(String... args) {
     SpringApplication.run(Application.class, args);
   }
diff --git a/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/RfidTimerReaderService.java b/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/RfidTimerReaderService.java
new file mode 100644
index 0000000..e4719fe
--- /dev/null
+++ b/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/RfidTimerReaderService.java
@@ -0,0 +1,62 @@
+package de.unikoblenz.fgbas.bs.bpm.iot;
+
+import de.unikoblenz.fgbas.bs.bpm.iot.service.RfidProductService;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.util.EntityUtils;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.camunda.bpm.engine.impl.util.json.JSONArray;
+import org.camunda.bpm.engine.impl.util.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.http.impl.client.HttpClients;
+
+public class RfidTimerReaderService implements JavaDelegate {
+
+  public static final String GET_HTTP_RFID_API = "http://localhost/postserver/rfidtest.json";
+
+  private final Logger LOGGER = LoggerFactory.getLogger(RfidTimerReaderService.class);
+
+  public void execute(DelegateExecution delegateExecution) throws Exception {
+    LOGGER.info("Amazing IoT api call....");
+    Optional<HttpResponse> response = sendHTTPRequest();
+    if (response.isPresent()) {
+      String result = EntityUtils.toString(response.get().getEntity());
+      LOGGER.info("Response: " + result);
+      JSONArray listOfRfidTags = new JSONArray(result);
+      for (int i = 0; i < listOfRfidTags.length(); i++) {
+        JSONObject jo = listOfRfidTags.getJSONObject(i);
+        String rfidTag = jo.getString("tagId");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = sdf.parse(jo.getString("timeStamp"));
+        LOGGER.info("Starting product review  with rfid tag {" + rfidTag + "}");
+        // Create new Process
+        Map<String, Object> variables = new HashMap<String, Object>();
+        variables.put("rfidTag", rfidTag);
+        variables.put("product", RfidProductService.getProductByRfidTag(rfidTag));
+        delegateExecution.getProcessEngineServices().getRuntimeService()
+            .startProcessInstanceByKey("Process_2", variables);
+
+      }
+    }
+  }
+
+  private Optional<HttpResponse> sendHTTPRequest() {
+    LOGGER.info("Message send:");
+    HttpClient client = HttpClients.createDefault();
+    HttpGet get = new HttpGet(GET_HTTP_RFID_API);
+    get.setHeader("content-type", "application/json");
+    try {
+      return Optional.of(client.execute(get));
+    } catch (Exception e) {
+      return Optional.empty();
+    }
+  }
+}
diff --git a/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/TestService.java b/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/TestService.java
deleted file mode 100644
index a23ca4f..0000000
--- a/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/TestService.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package de.unikoblenz.fgbas.bs.bpm.iot;
-
-import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.camunda.bpm.engine.delegate.JavaDelegate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TestService implements JavaDelegate {
-
-  private final Logger LOGGER = LoggerFactory.getLogger(TestService.class);
-
-  public void execute(DelegateExecution delegateExecution) throws Exception {
-    LOGGER.info("Amazing IoT api call....");
-  }
-}
diff --git a/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/service/RfidProductService.java b/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/service/RfidProductService.java
new file mode 100644
index 0000000..c92b570
--- /dev/null
+++ b/camunda/src/main/java/de/unikoblenz/fgbas/bs/bpm/iot/service/RfidProductService.java
@@ -0,0 +1,22 @@
+package de.unikoblenz.fgbas.bs.bpm.iot.service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class RfidProductService {
+
+  private static Map<String, String> rifdProductMap = new HashMap<>();
+
+  static {
+    rifdProductMap.put("12345678", "Pizza");
+    rifdProductMap.put("87654321", "Doener");
+  }
+
+  private RfidProductService() {
+    // Nothing
+  }
+
+  public static String getProductByRfidTag(String tagId) {
+    return rifdProductMap.getOrDefault(tagId, "No product found");
+  }
+}
diff --git a/camunda/src/main/resources/META-INF/diagram_1.bpmn b/camunda/src/main/resources/META-INF/diagram_1.bpmn
index 5041e52..0ff4173 100644
--- a/camunda/src/main/resources/META-INF/diagram_1.bpmn
+++ b/camunda/src/main/resources/META-INF/diagram_1.bpmn
@@ -8,7 +8,7 @@
     <bpmn:endEvent id="EndEvent_11c5iyc">
       <bpmn:incoming>SequenceFlow_1wfucxl</bpmn:incoming>
     </bpmn:endEvent>
-    <bpmn:serviceTask id="Task_1ls08zd" name="Call IoT and do amazing stuff" camunda:class="de.unikoblenz.fgbas.bs.bpm.iot.TestService">
+    <bpmn:serviceTask id="Task_1ls08zd" name="Call IoT and do amazing stuff" camunda:class="de.unikoblenz.fgbas.bs.bpm.iot.RfidTimerReaderService">
       <bpmn:incoming>SequenceFlow_0nwksx9</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0cblkjr</bpmn:outgoing>
     </bpmn:serviceTask>
@@ -19,7 +19,7 @@
       <bpmn:outgoing>SequenceFlow_0nwksx9</bpmn:outgoing>
     </bpmn:exclusiveGateway>
     <bpmn:sequenceFlow id="SequenceFlow_0nwksx9" sourceRef="ExclusiveGateway_09r95mp" targetRef="Task_1ls08zd" />
-    <bpmn:intermediateCatchEvent id="IntermediateThrowEvent_1hvhn31" name="30 sec">
+    <bpmn:intermediateCatchEvent id="IntermediateThrowEvent_1hvhn31" name="1 min">
       <bpmn:incoming>SequenceFlow_0cblkjr</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1xiqxap</bpmn:outgoing>
       <bpmn:timerEventDefinition>
@@ -62,7 +62,7 @@
       <bpmndi:BPMNShape id="IntermediateCatchEvent_0j8ya9i_di" bpmnElement="IntermediateThrowEvent_1hvhn31">
         <dc:Bounds x="553" y="204" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="555" y="247" width="33" height="14" />
+          <dc:Bounds x="558" y="247" width="27" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1xiqxap_di" bpmnElement="SequenceFlow_1xiqxap">
diff --git a/camunda/src/main/resources/META-INF/diagram_2.bpmn b/camunda/src/main/resources/META-INF/diagram_2.bpmn
new file mode 100644
index 0000000..656c125
--- /dev/null
+++ b/camunda/src/main/resources/META-INF/diagram_2.bpmn
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_0m41206" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="2.2.4">
+  <bpmn:process id="Process_2" isExecutable="true">
+    <bpmn:startEvent id="StartEvent_1">
+      <bpmn:outgoing>SequenceFlow_1c5kgwq</bpmn:outgoing>
+    </bpmn:startEvent>
+    <bpmn:endEvent id="EndEvent_11c5iyc">
+      <bpmn:incoming>SequenceFlow_1mmk7vf</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_1c5kgwq" sourceRef="StartEvent_1" targetRef="Task_1lt29o9" />
+    <bpmn:sequenceFlow id="SequenceFlow_1mmk7vf" sourceRef="Task_1lt29o9" targetRef="EndEvent_11c5iyc" />
+    <bpmn:userTask id="Task_1lt29o9" name="Product Review">
+      <bpmn:extensionElements>
+        <camunda:formData>
+          <camunda:formField id="rfidTag" label="Rfid Tag" type="string" />
+          <camunda:formField id="product" label="Product" type="string" />
+          <camunda:formField id="productAccept" label="Accept?" type="boolean" defaultValue="false" />
+        </camunda:formData>
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1c5kgwq</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1mmk7vf</bpmn:outgoing>
+    </bpmn:userTask>
+  </bpmn:process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_2">
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
+        <dc:Bounds x="118" y="117" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_11c5iyc_di" bpmnElement="EndEvent_11c5iyc">
+        <dc:Bounds x="397" y="117" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1c5kgwq_di" bpmnElement="SequenceFlow_1c5kgwq">
+        <di:waypoint x="154" y="135" />
+        <di:waypoint x="223" y="135" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1mmk7vf_di" bpmnElement="SequenceFlow_1mmk7vf">
+        <di:waypoint x="323" y="135" />
+        <di:waypoint x="397" y="135" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="UserTask_09tmhqu_di" bpmnElement="Task_1lt29o9">
+        <dc:Bounds x="223" y="95" width="100" height="80" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>
-- 
GitLab