From 873bf1e7bc2835e413a655c7f317d559c3d62b57 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 12:03:30 +0100 Subject: [PATCH 01/45] first rest service --- src/.gitignore | 4 ++ src/tamagotchi-service/app.yaml | 2 + src/tamagotchi-service/pom.xml | 53 ++++++++++++++++++ .../src/main/java/hello/Application.java | 11 ++++ .../src/main/java/hello/Greeting.java | 20 +++++++ .../main/java/hello/GreetingController.java | 19 +++++++ .../java/hello/GreetingControllerTests.java | 54 +++++++++++++++++++ 7 files changed, 163 insertions(+) create mode 100644 src/tamagotchi-service/app.yaml create mode 100644 src/tamagotchi-service/pom.xml create mode 100644 src/tamagotchi-service/src/main/java/hello/Application.java create mode 100644 src/tamagotchi-service/src/main/java/hello/Greeting.java create mode 100644 src/tamagotchi-service/src/main/java/hello/GreetingController.java create mode 100644 src/tamagotchi-service/src/test/java/hello/GreetingControllerTests.java diff --git a/src/.gitignore b/src/.gitignore index db07b3a..6576501 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -3,3 +3,7 @@ # run "dep ensure --vendor-only" to download the dependencies to vendor/ based # on the Gopkg.{toml,lock} files in that directory. vendor/ +tamagotchi-service/target +tamagotchi-service/.idea +*.iml + diff --git a/src/tamagotchi-service/app.yaml b/src/tamagotchi-service/app.yaml new file mode 100644 index 0000000..fe4a130 --- /dev/null +++ b/src/tamagotchi-service/app.yaml @@ -0,0 +1,2 @@ +runtime: java11 +entrypoint: java -jar target/tamagotchi-service-0.1.0.jar diff --git a/src/tamagotchi-service/pom.xml b/src/tamagotchi-service/pom.xml new file mode 100644 index 0000000..0d9d8fd --- /dev/null +++ b/src/tamagotchi-service/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + com.sap + tamagotchi-service + 0.1.0 + + + 1.8 + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-starter-parent + 2.1.6.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + com.jayway.jsonpath + json-path + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + com.google.appengine + appengine-maven-plugin + 1.9.77 + + + + + diff --git a/src/tamagotchi-service/src/main/java/hello/Application.java b/src/tamagotchi-service/src/main/java/hello/Application.java new file mode 100644 index 0000000..2eaac3d --- /dev/null +++ b/src/tamagotchi-service/src/main/java/hello/Application.java @@ -0,0 +1,11 @@ +package hello; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/src/tamagotchi-service/src/main/java/hello/Greeting.java b/src/tamagotchi-service/src/main/java/hello/Greeting.java new file mode 100644 index 0000000..5d10b59 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/hello/Greeting.java @@ -0,0 +1,20 @@ +package hello; + +public class Greeting { + + private final long id; + private final String content; + + public Greeting(long id, String content) { + this.id = id; + this.content = content; + } + + public long getId() { + return id; + } + + public String getContent() { + return content; + } +} diff --git a/src/tamagotchi-service/src/main/java/hello/GreetingController.java b/src/tamagotchi-service/src/main/java/hello/GreetingController.java new file mode 100644 index 0000000..e356ab2 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/hello/GreetingController.java @@ -0,0 +1,19 @@ +package hello; + +import java.util.concurrent.atomic.AtomicLong; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class GreetingController { + + private static final String template = "Hello, %s!"; + private final AtomicLong counter = new AtomicLong(); + + @RequestMapping("/greeting") + public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { + return new Greeting(counter.incrementAndGet(), + String.format(template, name)); + } +} diff --git a/src/tamagotchi-service/src/test/java/hello/GreetingControllerTests.java b/src/tamagotchi-service/src/test/java/hello/GreetingControllerTests.java new file mode 100644 index 0000000..4a3c64b --- /dev/null +++ b/src/tamagotchi-service/src/test/java/hello/GreetingControllerTests.java @@ -0,0 +1,54 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hello; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class GreetingControllerTests { + + @Autowired + private MockMvc mockMvc; + + @Test + public void noParamGreetingShouldReturnDefaultMessage() throws Exception { + + this.mockMvc.perform(get("/greeting")).andDo(print()).andExpect(status().isOk()) + .andExpect(jsonPath("$.content").value("Hello, World!")); + } + + @Test + public void paramGreetingShouldReturnTailoredMessage() throws Exception { + + this.mockMvc.perform(get("/greeting").param("name", "Spring Community")) + .andDo(print()).andExpect(status().isOk()) + .andExpect(jsonPath("$.content").value("Hello, Spring Community!")); + } + +} From dfaa41cc33738fe66c6866664ecba93f9a0efb87 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 15:48:12 +0100 Subject: [PATCH 02/45] restructure service --- src/tamagotchi-service/pom.xml | 16 +++++ .../sap/tamagotchi}/Application.java | 2 +- .../controller/DeviceController.java | 28 ++++++++ .../java/com/sap/tamagotchi/model/Device.java | 4 ++ .../com/sap/tamagotchi/model/DeviceEvent.java | 4 ++ .../sap/tamagotchi/model/DummyMessage.java | 13 ++++ .../com/sap/tamagotchi/model/IoTMessage.java | 7 ++ .../publisher/PublisherService.java | 71 +++++++++++++++++++ .../tamagotchi/service/TamagotchiService.java | 22 ++++++ .../src/main/java/hello/Greeting.java | 20 ------ .../main/java/hello/GreetingController.java | 19 ----- .../java/hello/GreetingControllerTests.java | 54 -------------- 12 files changed, 166 insertions(+), 94 deletions(-) rename src/tamagotchi-service/src/main/java/{hello => com/sap/tamagotchi}/Application.java (90%) create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DummyMessage.java create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/IoTMessage.java create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/publisher/PublisherService.java create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java delete mode 100644 src/tamagotchi-service/src/main/java/hello/Greeting.java delete mode 100644 src/tamagotchi-service/src/main/java/hello/GreetingController.java delete mode 100644 src/tamagotchi-service/src/test/java/hello/GreetingControllerTests.java diff --git a/src/tamagotchi-service/pom.xml b/src/tamagotchi-service/pom.xml index 0d9d8fd..d130b8b 100644 --- a/src/tamagotchi-service/pom.xml +++ b/src/tamagotchi-service/pom.xml @@ -19,6 +19,18 @@ 2.1.6.RELEASE + + + + com.google.cloud + libraries-bom + 2.9.0 + pom + import + + + + org.springframework.boot @@ -29,6 +41,10 @@ spring-boot-starter-test test + + com.google.cloud + google-cloud-pubsub + com.jayway.jsonpath json-path diff --git a/src/tamagotchi-service/src/main/java/hello/Application.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/Application.java similarity index 90% rename from src/tamagotchi-service/src/main/java/hello/Application.java rename to src/tamagotchi-service/src/main/java/com/sap/tamagotchi/Application.java index 2eaac3d..5c4e423 100644 --- a/src/tamagotchi-service/src/main/java/hello/Application.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/Application.java @@ -1,4 +1,4 @@ -package hello; +package com.sap.tamagotchi; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java new file mode 100644 index 0000000..4866888 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java @@ -0,0 +1,28 @@ +package com.sap.tamagotchi.controller; + +import java.util.concurrent.atomic.AtomicLong; + +import com.sap.tamagotchi.model.Device; +import com.sap.tamagotchi.publisher.PublisherService; +import com.sap.tamagotchi.service.TamagotchiService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class DeviceController { + + private static final String template = "Hello, %s!"; + private final AtomicLong counter = new AtomicLong(); + private final TamagotchiService tamagotchiService; + + @Autowired + public DeviceController(TamagotchiService tamagotchiService) { + this.tamagotchiService = tamagotchiService; + } + + @RequestMapping("devices/{deviceId}") + public Device getDevice(String deviceId) { + return tamagotchiService.getDevice(deviceId); + } +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java new file mode 100644 index 0000000..d224687 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java @@ -0,0 +1,4 @@ +package com.sap.tamagotchi.model; + +public class Device { +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java new file mode 100644 index 0000000..561b2e0 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java @@ -0,0 +1,4 @@ +package com.sap.tamagotchi.model; + +public class DeviceEvent { +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DummyMessage.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DummyMessage.java new file mode 100644 index 0000000..b717b70 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DummyMessage.java @@ -0,0 +1,13 @@ +package com.sap.tamagotchi.model; + +public class DummyMessage { + private final String message; + + public DummyMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/IoTMessage.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/IoTMessage.java new file mode 100644 index 0000000..f0acb0d --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/IoTMessage.java @@ -0,0 +1,7 @@ +package com.sap.tamagotchi.model; + +public interface IoTMessage { + String toMessage(); + + String getTopic(); +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/publisher/PublisherService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/publisher/PublisherService.java new file mode 100644 index 0000000..a05a399 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/publisher/PublisherService.java @@ -0,0 +1,71 @@ +package com.sap.tamagotchi.publisher; + + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.api.core.ApiFuture; +import com.google.api.core.ApiFutures; +import com.google.cloud.ServiceOptions; +import com.google.cloud.pubsub.v1.Publisher; +import com.google.protobuf.ByteString; +import com.google.pubsub.v1.ProjectTopicName; +import com.google.pubsub.v1.PubsubMessage; +import com.sap.tamagotchi.model.DummyMessage; +import com.sap.tamagotchi.model.IoTMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.List; + +@Service +public class PublisherService { + + private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + private static final ObjectMapper mapper = new ObjectMapper(); + + // use the default project id + private static final String PROJECT_ID = ServiceOptions.getDefaultProjectId(); + + public void publish(IoTMessage message) throws Exception { + String topicId = message.getTopic(); + ProjectTopicName topicName = ProjectTopicName.of(PROJECT_ID, topicId); + Publisher publisher = null; + List> futures = new ArrayList<>(); + + try { + // Create a publisher instance with default settings bound to the topic + publisher = Publisher.newBuilder(topicName).build(); + LOGGER.info("publish to topic" + publisher.getTopicNameString()); + + // convert message to bytes + ByteString data = ByteString.copyFromUtf8(message.toMessage()); + PubsubMessage pubsubMessage = PubsubMessage.newBuilder() + .setData(data) + .build(); + LOGGER.info("publish to message" + message.toMessage()); + + // Schedule a message to be published. Messages are automatically batched. + ApiFuture future = publisher.publish(pubsubMessage); + futures.add(future); + + } finally { + // Wait on any pending requests + List messageIds = ApiFutures.allAsList(futures).get(); + + for (String messageId : messageIds) { + System.out.println(messageId); + LOGGER.info("publish successful : " + messageId); + } + + if (publisher != null) { + // When finished with the publisher, shutdown to free up resources. + publisher.shutdown(); + } + + if (messageIds.isEmpty()) + LOGGER.info("no messages published "); + } + } +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java new file mode 100644 index 0000000..b4c7371 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -0,0 +1,22 @@ +package com.sap.tamagotchi.service; + +import com.sap.tamagotchi.model.Device; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +@Service +public class TamagotchiService { + + private final Map deviceRegistry = new HashMap<>(); + + public Device getDevice(String deviceId) { + return deviceRegistry.get(deviceId); + } + + public Collection getDevices() { + return deviceRegistry.values(); + } +} diff --git a/src/tamagotchi-service/src/main/java/hello/Greeting.java b/src/tamagotchi-service/src/main/java/hello/Greeting.java deleted file mode 100644 index 5d10b59..0000000 --- a/src/tamagotchi-service/src/main/java/hello/Greeting.java +++ /dev/null @@ -1,20 +0,0 @@ -package hello; - -public class Greeting { - - private final long id; - private final String content; - - public Greeting(long id, String content) { - this.id = id; - this.content = content; - } - - public long getId() { - return id; - } - - public String getContent() { - return content; - } -} diff --git a/src/tamagotchi-service/src/main/java/hello/GreetingController.java b/src/tamagotchi-service/src/main/java/hello/GreetingController.java deleted file mode 100644 index e356ab2..0000000 --- a/src/tamagotchi-service/src/main/java/hello/GreetingController.java +++ /dev/null @@ -1,19 +0,0 @@ -package hello; - -import java.util.concurrent.atomic.AtomicLong; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class GreetingController { - - private static final String template = "Hello, %s!"; - private final AtomicLong counter = new AtomicLong(); - - @RequestMapping("/greeting") - public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { - return new Greeting(counter.incrementAndGet(), - String.format(template, name)); - } -} diff --git a/src/tamagotchi-service/src/test/java/hello/GreetingControllerTests.java b/src/tamagotchi-service/src/test/java/hello/GreetingControllerTests.java deleted file mode 100644 index 4a3c64b..0000000 --- a/src/tamagotchi-service/src/test/java/hello/GreetingControllerTests.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hello; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; - -@RunWith(SpringRunner.class) -@SpringBootTest -@AutoConfigureMockMvc -public class GreetingControllerTests { - - @Autowired - private MockMvc mockMvc; - - @Test - public void noParamGreetingShouldReturnDefaultMessage() throws Exception { - - this.mockMvc.perform(get("/greeting")).andDo(print()).andExpect(status().isOk()) - .andExpect(jsonPath("$.content").value("Hello, World!")); - } - - @Test - public void paramGreetingShouldReturnTailoredMessage() throws Exception { - - this.mockMvc.perform(get("/greeting").param("name", "Spring Community")) - .andDo(print()).andExpect(status().isOk()) - .andExpect(jsonPath("$.content").value("Hello, Spring Community!")); - } - -} From 83db076e2d098b5a6ae06fa61f3f0defdd96a844 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 16:09:46 +0100 Subject: [PATCH 03/45] extend --- .../sap/tamagotchi/controller/DeviceController.java | 10 ++++++++++ .../com/sap/tamagotchi/model/CreateDevicePayload.java | 4 ++++ .../src/main/java/com/sap/tamagotchi/model/Owner.java | 4 ++++ .../com/sap/tamagotchi/service/TamagotchiService.java | 9 +++++++++ 4 files changed, 27 insertions(+) create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java index 4866888..223f943 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java @@ -1,5 +1,6 @@ package com.sap.tamagotchi.controller; +import java.util.Collection; import java.util.concurrent.atomic.AtomicLong; import com.sap.tamagotchi.model.Device; @@ -25,4 +26,13 @@ public class DeviceController { public Device getDevice(String deviceId) { return tamagotchiService.getDevice(deviceId); } + + @RequestMapping("devices") + public Collection getDevices() { + return tamagotchiService.getDevices(); + } + //TODO postmapping create + //request payload + // owner String + // color } diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java new file mode 100644 index 0000000..3c891d3 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java @@ -0,0 +1,4 @@ +package com.sap.tamagotchi.model; + +public class CreateDevicePayload { +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java new file mode 100644 index 0000000..46e5d61 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java @@ -0,0 +1,4 @@ +package com.sap.tamagotchi.model; + +public class Owner { +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index b4c7371..ef46e91 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -1,6 +1,8 @@ package com.sap.tamagotchi.service; import com.sap.tamagotchi.model.Device; +import com.sap.tamagotchi.publisher.PublisherService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Collection; @@ -10,8 +12,15 @@ import java.util.Map; @Service public class TamagotchiService { + private final PublisherService publisherService; + private final Map deviceRegistry = new HashMap<>(); + @Autowired + public TamagotchiService(PublisherService publisherService) { + this.publisherService = publisherService; + } + public Device getDevice(String deviceId) { return deviceRegistry.get(deviceId); } From 450b1393b255c3eed95f1713afce9e59a8aeeefe Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Tue, 10 Dec 2019 16:16:03 +0100 Subject: [PATCH 04/45] Update DeviceController.java --- .../sap/tamagotchi/controller/DeviceController.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java index 223f943..9173ca3 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java @@ -3,17 +3,17 @@ package com.sap.tamagotchi.controller; import java.util.Collection; import java.util.concurrent.atomic.AtomicLong; -import com.sap.tamagotchi.model.Device; -import com.sap.tamagotchi.publisher.PublisherService; -import com.sap.tamagotchi.service.TamagotchiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.sap.tamagotchi.model.Device; +import com.sap.tamagotchi.service.TamagotchiService; + @RestController public class DeviceController { - private static final String template = "Hello, %s!"; + private static final String template = "Hello !!!!!, %s!"; private final AtomicLong counter = new AtomicLong(); private final TamagotchiService tamagotchiService; @@ -31,8 +31,8 @@ public class DeviceController { public Collection getDevices() { return tamagotchiService.getDevices(); } - //TODO postmapping create - //request payload + // TODO postmapping create + // request payload // owner String // color } From de04d31825b699708e09c9c698aa3c5fe5d3be12 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 16:37:13 +0100 Subject: [PATCH 05/45] add device model --- .../java/com/sap/tamagotchi/model/Color.java | 5 +++ .../java/com/sap/tamagotchi/model/Device.java | 44 ++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Color.java diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Color.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Color.java new file mode 100644 index 0000000..82a9c2f --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Color.java @@ -0,0 +1,5 @@ +package com.sap.tamagotchi.model; + +public enum Color { + RED, YELLOW, BLUE, GREEN +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java index d224687..5fe8b0e 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java @@ -1,4 +1,46 @@ package com.sap.tamagotchi.model; -public class Device { +import java.time.Instant; +import java.util.Collection; +import java.util.Collections; +import java.util.Queue; +import java.util.UUID; +import java.util.concurrent.ConcurrentLinkedQueue; + +public class Device extends Thread { + + private final String getDeviceId = UUID.randomUUID().toString(); + private final String owner; + private final Color color; + private final Instant born = Instant.now(); + private final Queue messages = new ConcurrentLinkedQueue(); + + public Device(String owner, Color color) { + this.owner = owner; + this.color = color; + } + + public String getDeviceId() { + return getDeviceId; + } + + public String getOwner() { + return owner; + } + + public Color getColor() { + return color; + } + + public Instant getBorn() { + return born; + } + + public boolean hasMessages() { + return !messages.isEmpty(); + } + + public Collection getMessages() { + return Collections.emptyList(); + } } From 1a058ca1e865efeced3c4cf91c3ee4cb773fccb2 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Tue, 10 Dec 2019 16:41:04 +0100 Subject: [PATCH 06/45] Update TamagotchiService.java --- .../tamagotchi/service/TamagotchiService.java | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index ef46e91..7a69f91 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -1,20 +1,24 @@ package com.sap.tamagotchi.service; -import com.sap.tamagotchi.model.Device; -import com.sap.tamagotchi.publisher.PublisherService; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import com.sap.tamagotchi.model.Device; +import com.sap.tamagotchi.model.IoTMessage; +import com.sap.tamagotchi.publisher.PublisherService; @Service public class TamagotchiService { private final PublisherService publisherService; - private final Map deviceRegistry = new HashMap<>(); + private final Map deviceRegistry = Collections.synchronizedMap(new HashMap<>()); @Autowired public TamagotchiService(PublisherService publisherService) { @@ -28,4 +32,23 @@ public class TamagotchiService { public Collection getDevices() { return deviceRegistry.values(); } + + public Set getDeviceIds() { + return deviceRegistry.keySet(); + } + + public void createDevice(Device device) { + deviceRegistry.put(device.getDeviceId(), device); + } + + private void processDeviceEvents() { + deviceRegistry + .values() + .parallelStream() + .filter(d -> d.hasMessages()) + .forEach(d -> { + Collection messages = d.getMessages(); + + }); + } } From b1583185a5e4f3ed3fd8365ca4cff0aea59a6e1f Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Tue, 10 Dec 2019 16:42:02 +0100 Subject: [PATCH 07/45] Create .gitignore --- src/tamagotchi-service/.gitignore | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/tamagotchi-service/.gitignore diff --git a/src/tamagotchi-service/.gitignore b/src/tamagotchi-service/.gitignore new file mode 100644 index 0000000..5033dcd --- /dev/null +++ b/src/tamagotchi-service/.gitignore @@ -0,0 +1,32 @@ +.mta +.che + + +/**/node_modules +/**/target +/**/dist + +/**/.project +/**/.settings +/**/.classpath +/**/.springBeans +/**/.factorypath +/**/.idea + +// Generated Artifacts +/**/edmx/ +/**/gen +/**/src/generated +/**/dist +/**/webapp/localService/metadata.xml + + + + +// Files and folders generated by WebIDE build and not to be committed +/uideployer/resources/ +/uideployer/deploymentTemp/ + + +/**/package-lock.json +/**/*.mtar \ No newline at end of file From cd930c6b996ecf4814855425506611bed19e393e Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Tue, 10 Dec 2019 16:44:50 +0100 Subject: [PATCH 08/45] Update TamagotchiService.java --- .../com/sap/tamagotchi/service/TamagotchiService.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 7a69f91..e793207 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.sap.tamagotchi.model.Device; -import com.sap.tamagotchi.model.IoTMessage; import com.sap.tamagotchi.publisher.PublisherService; @Service @@ -37,18 +36,12 @@ public class TamagotchiService { return deviceRegistry.keySet(); } - public void createDevice(Device device) { + public Device createDevice(Device device) { deviceRegistry.put(device.getDeviceId(), device); + return device; } private void processDeviceEvents() { - deviceRegistry - .values() - .parallelStream() - .filter(d -> d.hasMessages()) - .forEach(d -> { - Collection messages = d.getMessages(); - }); } } From 41404db83aff2c91064ed09497b34a08dc54c778 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 16:47:33 +0100 Subject: [PATCH 09/45] add create device --- .../controller/DeviceController.java | 24 ++++++++++--------- .../tamagotchi/model/CreateDevicePayload.java | 15 ++++++++++++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java index 9173ca3..adf43d5 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java @@ -1,20 +1,21 @@ package com.sap.tamagotchi.controller; -import java.util.Collection; -import java.util.concurrent.atomic.AtomicLong; - +import com.sap.tamagotchi.model.CreateDevicePayload; +import com.sap.tamagotchi.model.Device; +import com.sap.tamagotchi.service.TamagotchiService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.sap.tamagotchi.model.Device; -import com.sap.tamagotchi.service.TamagotchiService; +import java.util.Collection; + +import static org.springframework.http.ResponseEntity.ok; @RestController public class DeviceController { - private static final String template = "Hello !!!!!, %s!"; - private final AtomicLong counter = new AtomicLong(); private final TamagotchiService tamagotchiService; @Autowired @@ -31,8 +32,9 @@ public class DeviceController { public Collection getDevices() { return tamagotchiService.getDevices(); } - // TODO postmapping create - // request payload - // owner String - // color + + @PostMapping + public ResponseEntity createDevice(CreateDevicePayload payload) { + return ok(tamagotchiService.createDevice(new Device(payload.getOwner(), payload.getColor()))).build(); + } } diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java index 3c891d3..fa9c81f 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java @@ -1,4 +1,19 @@ package com.sap.tamagotchi.model; public class CreateDevicePayload { + private final String owner; + private final Color color; + + public CreateDevicePayload(String owner, Color color) { + this.owner = owner; + this.color = color; + } + + public String getOwner() { + return owner; + } + + public Color getColor() { + return color; + } } From 69dae0673aeedb24d50cfde174d87508da086059 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 16:47:53 +0100 Subject: [PATCH 10/45] add create device --- .../com/sap/tamagotchi/controller/DeviceController.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java index adf43d5..5115a29 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java @@ -6,6 +6,7 @@ import com.sap.tamagotchi.service.TamagotchiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -23,18 +24,18 @@ public class DeviceController { this.tamagotchiService = tamagotchiService; } - @RequestMapping("devices/{deviceId}") + @RequestMapping("/devices/{deviceId}") public Device getDevice(String deviceId) { return tamagotchiService.getDevice(deviceId); } - @RequestMapping("devices") + @RequestMapping("/devices") public Collection getDevices() { return tamagotchiService.getDevices(); } - @PostMapping - public ResponseEntity createDevice(CreateDevicePayload payload) { + @PostMapping("/devices") + public ResponseEntity createDevice(@RequestBody CreateDevicePayload payload) { return ok(tamagotchiService.createDevice(new Device(payload.getOwner(), payload.getColor()))).build(); } } From c4b831d930405fac0142beb8eb71459608984308 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 16:48:23 +0100 Subject: [PATCH 11/45] add create device --- .../java/com/sap/tamagotchi/controller/DeviceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java index 5115a29..30596e9 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java @@ -36,6 +36,6 @@ public class DeviceController { @PostMapping("/devices") public ResponseEntity createDevice(@RequestBody CreateDevicePayload payload) { - return ok(tamagotchiService.createDevice(new Device(payload.getOwner(), payload.getColor()))).build(); + return ok(tamagotchiService.createDevice(new Device(payload.getOwner(), payload.getColor()))); } } From 5cd8e408ef822c66f1994de5c243b24fcc04ffe1 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Tue, 10 Dec 2019 17:05:14 +0100 Subject: [PATCH 12/45] Update TamagotchiService.java --- .../tamagotchi/service/TamagotchiService.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index e793207..e76e643 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; +import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -15,13 +16,19 @@ import com.sap.tamagotchi.publisher.PublisherService; @Service public class TamagotchiService { + private static final long DEVICE_EVENT_PROCESSOR_SCHEDULE = 5_000; + + private final Logger logger; + private final PublisherService publisherService; private final Map deviceRegistry = Collections.synchronizedMap(new HashMap<>()); @Autowired - public TamagotchiService(PublisherService publisherService) { + public TamagotchiService(PublisherService publisherService, Logger logger) { this.publisherService = publisherService; + this.logger = logger; + startDeviceEventProcessor(); } public Device getDevice(String deviceId) { @@ -37,11 +44,37 @@ public class TamagotchiService { } public Device createDevice(Device device) { + device.start(); deviceRegistry.put(device.getDeviceId(), device); return device; } private void processDeviceEvents() { + deviceRegistry + .values() + .parallelStream() + .filter(device -> device.hasMessages()) + .flatMap(device -> device.getMessages().stream()) + .forEach(message -> { + try { + publisherService.publish(message); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + }); + } + + public void startDeviceEventProcessor() { + new Thread(() -> { + try { + while (true) { + processDeviceEvents(); + Thread.sleep(DEVICE_EVENT_PROCESSOR_SCHEDULE); + } + } catch (InterruptedException e) { + logger.error("DeviceEventProcessor failed: {}", e.getMessage()); + } + }).start(); } } From 551b9b30e8a25cee7b7675174e9bb440855eead8 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Tue, 10 Dec 2019 17:09:13 +0100 Subject: [PATCH 13/45] Update TamagotchiService.java --- .../tamagotchi/service/TamagotchiService.java | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index e76e643..9ad1f94 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -8,12 +8,15 @@ import java.util.Set; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.sap.tamagotchi.model.Device; import com.sap.tamagotchi.publisher.PublisherService; @Service +@EnableScheduling public class TamagotchiService { private static final long DEVICE_EVENT_PROCESSOR_SCHEDULE = 5_000; @@ -28,7 +31,6 @@ public class TamagotchiService { public TamagotchiService(PublisherService publisherService, Logger logger) { this.publisherService = publisherService; this.logger = logger; - startDeviceEventProcessor(); } public Device getDevice(String deviceId) { @@ -49,8 +51,8 @@ public class TamagotchiService { return device; } + @Scheduled(fixedDelay = DEVICE_EVENT_PROCESSOR_SCHEDULE) private void processDeviceEvents() { - deviceRegistry .values() .parallelStream() @@ -60,21 +62,9 @@ public class TamagotchiService { try { publisherService.publish(message); } catch (Exception ex) { + logger.error("processing device events failed: {}", ex.getMessage()); throw new RuntimeException(ex); } }); } - - public void startDeviceEventProcessor() { - new Thread(() -> { - try { - while (true) { - processDeviceEvents(); - Thread.sleep(DEVICE_EVENT_PROCESSOR_SCHEDULE); - } - } catch (InterruptedException e) { - logger.error("DeviceEventProcessor failed: {}", e.getMessage()); - } - }).start(); - } } From 6de5dd02ede91507b4b594cdfadddaac2ab30043 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Tue, 10 Dec 2019 17:12:34 +0100 Subject: [PATCH 14/45] Update TamagotchiService.java --- .../main/java/com/sap/tamagotchi/service/TamagotchiService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 9ad1f94..9a94438 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -46,7 +46,6 @@ public class TamagotchiService { } public Device createDevice(Device device) { - device.start(); deviceRegistry.put(device.getDeviceId(), device); return device; } From a207d663a75ddb2e8f5363dadfe63c424a2c854e Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 17:21:40 +0100 Subject: [PATCH 15/45] latest controller --- .../ApplicationConfiguration.java | 22 +++++++++++++++ .../controller/DeviceController.java | 10 +++++-- .../tamagotchi/model/CreateDevicePayload.java | 8 +++++- .../java/com/sap/tamagotchi/model/Device.java | 27 ++++++++++++++++--- 4 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/configuration/ApplicationConfiguration.java diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/configuration/ApplicationConfiguration.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/configuration/ApplicationConfiguration.java new file mode 100644 index 0000000..aa36473 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/configuration/ApplicationConfiguration.java @@ -0,0 +1,22 @@ +package com.sap.tamagotchi.configuration; + + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ApplicationConfiguration { + + @Bean + public ObjectMapper objectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true); + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); + return objectMapper; + } +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java index 30596e9..bc303e5 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java @@ -10,7 +10,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import static org.springframework.http.ResponseEntity.ok; @@ -35,7 +37,11 @@ public class DeviceController { } @PostMapping("/devices") - public ResponseEntity createDevice(@RequestBody CreateDevicePayload payload) { - return ok(tamagotchiService.createDevice(new Device(payload.getOwner(), payload.getColor()))); + public ResponseEntity createDevice(@RequestBody Collection payload) { + List devices = new ArrayList<>(); + for (CreateDevicePayload p : payload) { + devices.add(tamagotchiService.createDevice(new Device(p.getOwner(), p.getColor()))); + } + return ok(devices); } } diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java index fa9c81f..b9f4774 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java @@ -1,18 +1,24 @@ package com.sap.tamagotchi.model; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + public class CreateDevicePayload { private final String owner; private final Color color; - public CreateDevicePayload(String owner, Color color) { + @JsonCreator + public CreateDevicePayload(@JsonProperty("owner") String owner, @JsonProperty("color") Color color) { this.owner = owner; this.color = color; } + @JsonProperty("owner") public String getOwner() { return owner; } + @JsonProperty("color") public Color getColor() { return color; } diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java index 5fe8b0e..0d42d6a 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java @@ -1,46 +1,65 @@ package com.sap.tamagotchi.model; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + import java.time.Instant; +import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.Queue; import java.util.UUID; import java.util.concurrent.ConcurrentLinkedQueue; -public class Device extends Thread { +@JsonIgnoreProperties(ignoreUnknown = true) +public class Device { + @JsonProperty("id") private final String getDeviceId = UUID.randomUUID().toString(); + @JsonProperty("owner") private final String owner; + @JsonProperty("color") private final Color color; + @JsonProperty("born") private final Instant born = Instant.now(); - private final Queue messages = new ConcurrentLinkedQueue(); + private final Queue messages = new ConcurrentLinkedQueue<>(); public Device(String owner, Color color) { this.owner = owner; this.color = color; } + @JsonProperty("id") public String getDeviceId() { return getDeviceId; } + @JsonProperty("owner") public String getOwner() { return owner; } + @JsonProperty("color") public Color getColor() { return color; } + @JsonProperty("born") public Instant getBorn() { return born; } + @JsonIgnore public boolean hasMessages() { return !messages.isEmpty(); } + @JsonIgnore public Collection getMessages() { - return Collections.emptyList(); + ArrayList m = new ArrayList<>(); + while (!messages.isEmpty()) { + m.add(messages.poll()); + } + return m; } } From 693d06c5e5c4224b1d37c0d932a170f808ba3ff0 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 18:30:54 +0100 Subject: [PATCH 16/45] add healthScore --- .../java/com/sap/tamagotchi/model/Device.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java index 0d42d6a..748003a 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java @@ -22,6 +22,8 @@ public class Device { private final Color color; @JsonProperty("born") private final Instant born = Instant.now(); + @JsonProperty("healthScore") + private int healthScore = 100; private final Queue messages = new ConcurrentLinkedQueue<>(); public Device(String owner, Color color) { @@ -49,6 +51,21 @@ public class Device { return born; } + @JsonProperty("healthScore") + public int getHealthScore() { + return healthScore; + } + + @JsonProperty("isAlive") + public boolean isAlive() { + return healthScore > 1; + } + + @JsonIgnore + public void changeHealthScore(int delta) { + this.healthScore += delta; + } + @JsonIgnore public boolean hasMessages() { return !messages.isEmpty(); From 199f411275ab0ffb7e3529979dcb956ae2096730 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Tue, 10 Dec 2019 18:31:03 +0100 Subject: [PATCH 17/45] update --- .../java/com/sap/tamagotchi/model/Care.java | 24 +++++++++++++++++++ .../tamagotchi/service/TamagotchiService.java | 6 +++++ 2 files changed, 30 insertions(+) create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Care.java diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Care.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Care.java new file mode 100644 index 0000000..5337c55 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Care.java @@ -0,0 +1,24 @@ +package com.sap.tamagotchi.model; + +public class Care { + + private int feed = 0; + private int pet = 0; + + public int getFeed() { + return feed; + } + + public void setFeed(int feed) { + this.feed = feed; + } + + public int getPet() { + return pet; + } + + public void setPet(int pet) { + this.pet = pet; + } + +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 9a94438..afabf93 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -12,6 +12,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import com.sap.tamagotchi.model.Care; import com.sap.tamagotchi.model.Device; import com.sap.tamagotchi.publisher.PublisherService; @@ -50,8 +51,13 @@ public class TamagotchiService { return device; } + public void takeCare(String decifeId, Care care) { + + } + @Scheduled(fixedDelay = DEVICE_EVENT_PROCESSOR_SCHEDULE) private void processDeviceEvents() { + // Set deadList = Collections.synchronizedSet(new HashSet()); deviceRegistry .values() .parallelStream() From a58b03aa33ae104a1dc27b6c6f43a4e0ae041c06 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Tue, 10 Dec 2019 18:31:49 +0100 Subject: [PATCH 18/45] Update TamagotchiService.java --- .../main/java/com/sap/tamagotchi/service/TamagotchiService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index afabf93..517e1cb 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -51,7 +51,7 @@ public class TamagotchiService { return device; } - public void takeCare(String decifeId, Care care) { + public void takeCare(String deviceId, Care care) { } From d179e02eee89c8497f4dd1f9b78bc5a137593286 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Tue, 10 Dec 2019 18:36:37 +0100 Subject: [PATCH 19/45] Update TamagotchiService.java --- .../java/com/sap/tamagotchi/service/TamagotchiService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 517e1cb..1b7b7e7 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -52,7 +52,9 @@ public class TamagotchiService { } public void takeCare(String deviceId, Care care) { - + Device device = deviceRegistry.get(deviceId); + device.changeHealthScore(care.getFeed()); + device.changeHealthScore(care.getPet()); } @Scheduled(fixedDelay = DEVICE_EVENT_PROCESSOR_SCHEDULE) From 0d87ceb0a65fe92d49fa1b9ead0bf579486e9805 Mon Sep 17 00:00:00 2001 From: Elisa Stelling Date: Tue, 10 Dec 2019 18:46:19 +0100 Subject: [PATCH 20/45] owner --- .../java/com/sap/tamagotchi/model/Owner.java | 101 +++++++++++++++++- 1 file changed, 97 insertions(+), 4 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java index 46e5d61..202f582 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java @@ -1,4 +1,97 @@ -package com.sap.tamagotchi.model; - -public class Owner { -} +/** + * Copyright (c) 2019, SAP SE, All rights reserved. + */ +package com.sap.tamagotchi.model; + +import java.util.Collection; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import com.sap.tamagotchi.service.TamagotchiService; + +public class Owner { + + private TamagotchiService tamagotchiService; + + private Collection devices; + + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + + @Autowired + public Owner(TamagotchiService tamagotchiService) { + this.tamagotchiService = tamagotchiService; + // start(); + } + + @Scheduled(fixedDelay = 5000) + public void setData() { + for (Device d : tamagotchiService.getDevices()) { + double random = Math.random(); + + if (random <= 0.5) { + Care care = new Care(); + care.setFeed(-(int) (random * 10)); + tamagotchiService.takeCare(d.getDeviceId(), new Care()); + } else { + Care care = new Care(); + care.setFeed((int) (random * 10)); + tamagotchiService.takeCare(d.getDeviceId(), new Care()); + } + + } + + } + + + + public void start() { + // Update device map + final ScheduledFuture handleGetMap = scheduler.scheduleAtFixedRate(getMapRunner, 0, 1, TimeUnit.MINUTES); + scheduler.schedule(new Runnable() { + @Override + public void run() { + handleGetMap.cancel(true); + } + }, 60, TimeUnit.MINUTES); + + // Add userType and doAction + final ScheduledFuture handleAction = scheduler.scheduleAtFixedRate(getMapRunner, 0, 5, TimeUnit.MINUTES); + scheduler.schedule(new Runnable() { + @Override + public void run() { + handleAction.cancel(true); + } + }, 60, TimeUnit.MINUTES); + } + + Runnable getMapRunner = new Runnable() { + @Override + public void run() { + getMap(); + } + }; + + Runnable actionRunner = new Runnable() { + @Override + public void run() { + addUserType(); + addAction(); + } + }; + + public void getMap() { + Collection currentDevices = tamagotchiService.getDevices(); + + } + + public void addUserType() { + + } + + public void addAction() { + + } +} From 8cb4183720cc1d52a44d85cf4d84ed851b07ea60 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 22:16:28 +0100 Subject: [PATCH 21/45] enable device data generation --- .../java/com/sap/tamagotchi/model/Device.java | 23 +++--- .../com/sap/tamagotchi/model/DeviceEvent.java | 82 ++++++++++++++++++- .../sap/tamagotchi/model/DummyMessage.java | 13 --- .../com/sap/tamagotchi/model/IoTMessage.java | 2 - .../java/com/sap/tamagotchi/model/Owner.java | 72 ++-------------- .../publisher/PublisherService.java | 19 ++++- .../tamagotchi/service/TamagotchiService.java | 33 ++++---- 7 files changed, 131 insertions(+), 113 deletions(-) delete mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DummyMessage.java diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java index 748003a..611af3f 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java @@ -5,8 +5,6 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import java.time.Instant; -import java.util.ArrayList; -import java.util.Collection; import java.util.Queue; import java.util.UUID; import java.util.concurrent.ConcurrentLinkedQueue; @@ -15,7 +13,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; public class Device { @JsonProperty("id") - private final String getDeviceId = UUID.randomUUID().toString(); + private final String id = UUID.randomUUID().toString(); @JsonProperty("owner") private final String owner; @JsonProperty("color") @@ -32,8 +30,8 @@ public class Device { } @JsonProperty("id") - public String getDeviceId() { - return getDeviceId; + public String getId() { + return id; } @JsonProperty("owner") @@ -63,7 +61,12 @@ public class Device { @JsonIgnore public void changeHealthScore(int delta) { - this.healthScore += delta; + if (healthScore >= 1) { + healthScore += delta; + if (healthScore > 150) + healthScore /= 10; + } + messages.add(new DeviceEvent(id, owner, color, born, healthScore, Instant.now())); } @JsonIgnore @@ -72,11 +75,7 @@ public class Device { } @JsonIgnore - public Collection getMessages() { - ArrayList m = new ArrayList<>(); - while (!messages.isEmpty()) { - m.add(messages.poll()); - } - return m; + public Queue getMessages() { + return messages; } } diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java index 561b2e0..9aede0e 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java @@ -1,4 +1,84 @@ package com.sap.tamagotchi.model; -public class DeviceEvent { +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.time.Instant; + +public class DeviceEvent implements IoTMessage { + + @JsonProperty("id") + private final String id; + @JsonProperty("owner") + private final String owner; + @JsonProperty("color") + private final Color color; + @JsonProperty("born") + private final Instant born; + @JsonProperty("healthScore") + private final Integer healthScore; + @JsonProperty("eventTime") + private final Instant eventTime; + + public DeviceEvent(String id, String owner, Color color, Instant born, Integer healthScore, Instant eventTime) { + this.id = id; + this.owner = owner; + this.color = color; + this.born = born; + this.healthScore = healthScore; + this.eventTime = eventTime; + } + + @JsonProperty("id") + public String getId() { + return id; + } + + @JsonProperty("owner") + public String getOwner() { + return owner; + } + + @JsonProperty("color") + public Color getColor() { + return color; + } + + @JsonProperty("born") + public Instant getBorn() { + return born; + } + + @JsonProperty("healthScore") + public Integer getHealthScore() { + return healthScore; + } + + @JsonProperty("eventTime") + public Instant getEventTime() { + return eventTime; + } + + @JsonProperty("isAlive") + public boolean isAlive() { + return healthScore > 1; + } + + @JsonIgnore + @Override + public String getTopic() { + return "tamagotchi-events"; + } + + @Override + public String toString() { + return "DeviceEvent{" + + "id='" + id + '\'' + + ", owner='" + owner + '\'' + + ", color=" + color + + ", born=" + born + + ", healthScore=" + healthScore + + ", eventTime=" + eventTime + + '}'; + } } diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DummyMessage.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DummyMessage.java deleted file mode 100644 index b717b70..0000000 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DummyMessage.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sap.tamagotchi.model; - -public class DummyMessage { - private final String message; - - public DummyMessage(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } -} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/IoTMessage.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/IoTMessage.java index f0acb0d..1de2d9b 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/IoTMessage.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/IoTMessage.java @@ -1,7 +1,5 @@ package com.sap.tamagotchi.model; public interface IoTMessage { - String toMessage(); - String getTopic(); } diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java index 202f582..efb2591 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java @@ -3,95 +3,33 @@ */ package com.sap.tamagotchi.model; -import java.util.Collection; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; +import com.sap.tamagotchi.service.TamagotchiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; -import com.sap.tamagotchi.service.TamagotchiService; +import org.springframework.stereotype.Service; +@Service public class Owner { private TamagotchiService tamagotchiService; - private Collection devices; - - private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - @Autowired public Owner(TamagotchiService tamagotchiService) { this.tamagotchiService = tamagotchiService; - // start(); } @Scheduled(fixedDelay = 5000) public void setData() { for (Device d : tamagotchiService.getDevices()) { double random = Math.random(); + Care care = new Care(); if (random <= 0.5) { - Care care = new Care(); care.setFeed(-(int) (random * 10)); - tamagotchiService.takeCare(d.getDeviceId(), new Care()); } else { - Care care = new Care(); care.setFeed((int) (random * 10)); - tamagotchiService.takeCare(d.getDeviceId(), new Care()); } - + tamagotchiService.takeCare(d.getId(), care); } - - } - - - - public void start() { - // Update device map - final ScheduledFuture handleGetMap = scheduler.scheduleAtFixedRate(getMapRunner, 0, 1, TimeUnit.MINUTES); - scheduler.schedule(new Runnable() { - @Override - public void run() { - handleGetMap.cancel(true); - } - }, 60, TimeUnit.MINUTES); - - // Add userType and doAction - final ScheduledFuture handleAction = scheduler.scheduleAtFixedRate(getMapRunner, 0, 5, TimeUnit.MINUTES); - scheduler.schedule(new Runnable() { - @Override - public void run() { - handleAction.cancel(true); - } - }, 60, TimeUnit.MINUTES); - } - - Runnable getMapRunner = new Runnable() { - @Override - public void run() { - getMap(); - } - }; - - Runnable actionRunner = new Runnable() { - @Override - public void run() { - addUserType(); - addAction(); - } - }; - - public void getMap() { - Collection currentDevices = tamagotchiService.getDevices(); - - } - - public void addUserType() { - - } - - public void addAction() { - } } diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/publisher/PublisherService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/publisher/PublisherService.java index a05a399..fd9724a 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/publisher/PublisherService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/publisher/PublisherService.java @@ -9,10 +9,10 @@ import com.google.cloud.pubsub.v1.Publisher; import com.google.protobuf.ByteString; import com.google.pubsub.v1.ProjectTopicName; import com.google.pubsub.v1.PubsubMessage; -import com.sap.tamagotchi.model.DummyMessage; import com.sap.tamagotchi.model.IoTMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.lang.invoke.MethodHandles; @@ -23,28 +23,39 @@ import java.util.List; public class PublisherService { private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - private static final ObjectMapper mapper = new ObjectMapper(); // use the default project id private static final String PROJECT_ID = ServiceOptions.getDefaultProjectId(); + private final ObjectMapper mapper; + + @Autowired + public PublisherService(ObjectMapper mapper) { + this.mapper = mapper; + } public void publish(IoTMessage message) throws Exception { + if (message == null) { + LOGGER.info("received null message"); + return; + } String topicId = message.getTopic(); ProjectTopicName topicName = ProjectTopicName.of(PROJECT_ID, topicId); Publisher publisher = null; List> futures = new ArrayList<>(); try { + String stringMessage = mapper.writeValueAsString(message); // Create a publisher instance with default settings bound to the topic publisher = Publisher.newBuilder(topicName).build(); LOGGER.info("publish to topic" + publisher.getTopicNameString()); // convert message to bytes - ByteString data = ByteString.copyFromUtf8(message.toMessage()); + ByteString data = ByteString.copyFromUtf8(stringMessage); PubsubMessage pubsubMessage = PubsubMessage.newBuilder() .setData(data) .build(); - LOGGER.info("publish to message" + message.toMessage()); + + LOGGER.info("publish to message" + stringMessage); // Schedule a message to be published. Messages are automatically batched. ApiFuture future = publisher.publish(pubsubMessage); diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 1b7b7e7..fa6d1c9 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -1,5 +1,6 @@ package com.sap.tamagotchi.service; +import java.lang.invoke.MethodHandles; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -7,6 +8,7 @@ import java.util.Map; import java.util.Set; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @@ -16,22 +18,23 @@ import com.sap.tamagotchi.model.Care; import com.sap.tamagotchi.model.Device; import com.sap.tamagotchi.publisher.PublisherService; +import static jdk.nashorn.internal.objects.Global.print; + @Service @EnableScheduling public class TamagotchiService { - private static final long DEVICE_EVENT_PROCESSOR_SCHEDULE = 5_000; + private static final long DEVICE_EVENT_PROCESSOR_SCHEDULE = 5000; - private final Logger logger; + private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private final PublisherService publisherService; private final Map deviceRegistry = Collections.synchronizedMap(new HashMap<>()); @Autowired - public TamagotchiService(PublisherService publisherService, Logger logger) { + public TamagotchiService(PublisherService publisherService) { this.publisherService = publisherService; - this.logger = logger; } public Device getDevice(String deviceId) { @@ -47,30 +50,32 @@ public class TamagotchiService { } public Device createDevice(Device device) { - deviceRegistry.put(device.getDeviceId(), device); + deviceRegistry.put(device.getId(), device); return device; } public void takeCare(String deviceId, Care care) { Device device = deviceRegistry.get(deviceId); + if (device == null) + return; device.changeHealthScore(care.getFeed()); device.changeHealthScore(care.getPet()); } @Scheduled(fixedDelay = DEVICE_EVENT_PROCESSOR_SCHEDULE) private void processDeviceEvents() { - // Set deadList = Collections.synchronizedSet(new HashSet()); deviceRegistry .values() .parallelStream() - .filter(device -> device.hasMessages()) - .flatMap(device -> device.getMessages().stream()) - .forEach(message -> { - try { - publisherService.publish(message); - } catch (Exception ex) { - logger.error("processing device events failed: {}", ex.getMessage()); - throw new RuntimeException(ex); + .filter(Device::hasMessages) + .forEach(device -> { + while (device.getMessages().peek() != null) { + try { + publisherService.publish(device.getMessages().peek()); + device.getMessages().poll(); + } catch (Exception ex) { + LOGGER.error("processing device events failed: {}", ex.getMessage()); + } } }); } From 3ce63bf91cfe0f32c569f59aeb8577a12ce5beff Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 22:22:16 +0100 Subject: [PATCH 22/45] enable device data generation --- .../main/java/com/sap/tamagotchi/service/TamagotchiService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index fa6d1c9..00e2d75 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -18,8 +18,6 @@ import com.sap.tamagotchi.model.Care; import com.sap.tamagotchi.model.Device; import com.sap.tamagotchi.publisher.PublisherService; -import static jdk.nashorn.internal.objects.Global.print; - @Service @EnableScheduling public class TamagotchiService { From 052e7c5793675587d6ed051f8d0a0f86fa3735d9 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Tue, 10 Dec 2019 22:49:00 +0100 Subject: [PATCH 23/45] final cleanup for tue --- .../src/main/java/com/sap/tamagotchi/model/Owner.java | 4 +++- .../java/com/sap/tamagotchi/service/TamagotchiService.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java index efb2591..87d1be8 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java @@ -8,6 +8,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import static com.sap.tamagotchi.service.TamagotchiService.DEVICE_EVENT_PROCESSOR_SCHEDULE; + @Service public class Owner { @@ -18,7 +20,7 @@ public class Owner { this.tamagotchiService = tamagotchiService; } - @Scheduled(fixedDelay = 5000) + @Scheduled(fixedDelay = DEVICE_EVENT_PROCESSOR_SCHEDULE) public void setData() { for (Device d : tamagotchiService.getDevices()) { double random = Math.random(); diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 00e2d75..a23c685 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -22,7 +22,7 @@ import com.sap.tamagotchi.publisher.PublisherService; @EnableScheduling public class TamagotchiService { - private static final long DEVICE_EVENT_PROCESSOR_SCHEDULE = 5000; + public static final long DEVICE_EVENT_PROCESSOR_SCHEDULE = 5000; private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); From d70c27bb3bfd492d690fe21b42ca5d104ffd6b7d Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Wed, 11 Dec 2019 09:25:27 +0100 Subject: [PATCH 24/45] Update TamagotchiService.java --- .../tamagotchi/service/TamagotchiService.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index a23c685..b9d362a 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -26,9 +26,9 @@ public class TamagotchiService { private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - private final PublisherService publisherService; + private static final Map deviceRegistry = Collections.synchronizedMap(new HashMap<>()); - private final Map deviceRegistry = Collections.synchronizedMap(new HashMap<>()); + private final PublisherService publisherService; @Autowired public TamagotchiService(PublisherService publisherService) { @@ -54,8 +54,9 @@ public class TamagotchiService { public void takeCare(String deviceId, Care care) { Device device = deviceRegistry.get(deviceId); - if (device == null) + if (device == null) { return; + } device.changeHealthScore(care.getFeed()); device.changeHealthScore(care.getPet()); } @@ -69,12 +70,19 @@ public class TamagotchiService { .forEach(device -> { while (device.getMessages().peek() != null) { try { - publisherService.publish(device.getMessages().peek()); - device.getMessages().poll(); + publisherService.publish(device.getMessages().poll()); } catch (Exception ex) { LOGGER.error("processing device events failed: {}", ex.getMessage()); } } }); + + // remove dead devices + deviceRegistry + .values() + .parallelStream() + .filter(device -> !device.isAlive()) + .forEach(device -> deviceRegistry.remove(device.getId())); } + } From 2d0e06bfce1f6fb52d949e5b33fdd04b023fd790 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Wed, 11 Dec 2019 09:46:28 +0100 Subject: [PATCH 25/45] test --- .../src/test/java/com/sap/tamagotchi/model/OwnerTest.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java diff --git a/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java b/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java new file mode 100644 index 0000000..bbb7bcb --- /dev/null +++ b/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java @@ -0,0 +1,7 @@ +package com.sap.tamagotchi.model; + +import static org.junit.jupiter.api.Assertions.*; + +class OwnerTest { + +} \ No newline at end of file From 622ab894311bea5178e8259933b6e58ffb81d39c Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Wed, 11 Dec 2019 09:58:14 +0100 Subject: [PATCH 26/45] refactor --- src/tamagotchi-service/app.yaml | 6 +++++ .../controller/DeviceController.java | 23 ++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/tamagotchi-service/app.yaml b/src/tamagotchi-service/app.yaml index fe4a130..23e61a6 100644 --- a/src/tamagotchi-service/app.yaml +++ b/src/tamagotchi-service/app.yaml @@ -1,2 +1,8 @@ runtime: java11 entrypoint: java -jar target/tamagotchi-service-0.1.0.jar +inbound_services: + - warmup +automatic_scaling: + max_instances: 1 + min_instances: 1 + diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java index bc303e5..e86d36d 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java @@ -1,8 +1,11 @@ package com.sap.tamagotchi.controller; -import com.sap.tamagotchi.model.CreateDevicePayload; -import com.sap.tamagotchi.model.Device; -import com.sap.tamagotchi.service.TamagotchiService; +import static org.springframework.http.ResponseEntity.ok; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -10,11 +13,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import static org.springframework.http.ResponseEntity.ok; +import com.sap.tamagotchi.model.CreateDevicePayload; +import com.sap.tamagotchi.model.Device; +import com.sap.tamagotchi.service.TamagotchiService; @RestController public class DeviceController { @@ -44,4 +45,10 @@ public class DeviceController { } return ok(devices); } + + @RequestMapping("/_ah/warmup") + public String warmup() { + return "warming up"; + } + } From b94adb14f18c63c41744132b815c3bd4dad8b360 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Wed, 11 Dec 2019 10:19:33 +0100 Subject: [PATCH 27/45] correct timestamp format --- .../src/main/java/com/sap/tamagotchi/model/Device.java | 4 ++-- .../main/java/com/sap/tamagotchi/model/DeviceEvent.java | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java index 611af3f..ac93b55 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java @@ -45,8 +45,8 @@ public class Device { } @JsonProperty("born") - public Instant getBorn() { - return born; + public String getBorn() { + return born.toString(); } @JsonProperty("healthScore") diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java index 9aede0e..dccd389 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.time.Instant; + public class DeviceEvent implements IoTMessage { @JsonProperty("id") @@ -45,8 +46,8 @@ public class DeviceEvent implements IoTMessage { } @JsonProperty("born") - public Instant getBorn() { - return born; + public String getBorn() { + return born.toString(); } @JsonProperty("healthScore") @@ -55,8 +56,8 @@ public class DeviceEvent implements IoTMessage { } @JsonProperty("eventTime") - public Instant getEventTime() { - return eventTime; + public String getEventTime() { + return eventTime.toString(); } @JsonProperty("isAlive") From 0467523939609c7f59393ba88a08f641efc4341c Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Wed, 11 Dec 2019 10:20:27 +0100 Subject: [PATCH 28/45] fix test --- .../src/test/java/com/sap/tamagotchi/model/OwnerTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java b/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java index bbb7bcb..3ee186d 100644 --- a/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java +++ b/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java @@ -1,7 +1,5 @@ package com.sap.tamagotchi.model; -import static org.junit.jupiter.api.Assertions.*; - class OwnerTest { } \ No newline at end of file From 004b5ed0378207a6cd03df74f7a6d6e86ce3f603 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Wed, 11 Dec 2019 10:23:42 +0100 Subject: [PATCH 29/45] Update TamagotchiService.java --- .../tamagotchi/service/TamagotchiService.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index b9d362a..ea10295 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -16,6 +16,7 @@ import org.springframework.stereotype.Service; import com.sap.tamagotchi.model.Care; import com.sap.tamagotchi.model.Device; +import com.sap.tamagotchi.model.IoTMessage; import com.sap.tamagotchi.publisher.PublisherService; @Service @@ -82,7 +83,37 @@ public class TamagotchiService { .values() .parallelStream() .filter(device -> !device.isAlive()) - .forEach(device -> deviceRegistry.remove(device.getId())); + .forEach(device -> { + deviceRegistry.remove(device.getId()); + sendTamagotchiDefunctNotifiction(device.getId()); + }); + } + + private void sendTamagotchiDefunctNotifiction(String id) { + + Device device = deviceRegistry.get(id); + + IoTMessage m = new IoTMessage() { + + private String message = String.format("Tamagotchi %s of %s passed away", + device.getOwner(), device.getOwner()); + + @Override + public String getTopic() { + return "tamagotchi-defunct"; + } + + public String getMessage() { + return message; + } + + }; + + try { + publisherService.publish(m); + } catch (Exception ex) { + LOGGER.error("sendTamagotchiDefunctNotifiction failed: {}", ex.getMessage()); + } } } From 5d6199e865b11d7890ac3951f351a138e66e5776 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Wed, 11 Dec 2019 10:25:23 +0100 Subject: [PATCH 30/45] Update TamagotchiService.java --- .../main/java/com/sap/tamagotchi/service/TamagotchiService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index ea10295..7413d37 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -14,6 +14,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import com.fasterxml.jackson.annotation.JsonProperty; import com.sap.tamagotchi.model.Care; import com.sap.tamagotchi.model.Device; import com.sap.tamagotchi.model.IoTMessage; @@ -95,6 +96,7 @@ public class TamagotchiService { IoTMessage m = new IoTMessage() { + @JsonProperty("message") private String message = String.format("Tamagotchi %s of %s passed away", device.getOwner(), device.getOwner()); From f8dc13d5843f3c7e8a347b8ef28841295026f9e1 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Wed, 11 Dec 2019 10:27:33 +0100 Subject: [PATCH 31/45] Update TamagotchiService.java --- .../java/com/sap/tamagotchi/service/TamagotchiService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 7413d37..4da1943 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -97,8 +97,7 @@ public class TamagotchiService { IoTMessage m = new IoTMessage() { @JsonProperty("message") - private String message = String.format("Tamagotchi %s of %s passed away", - device.getOwner(), device.getOwner()); + private String message = String.format("Tamagotchi %s of %s passed away", device.getOwner(), device.getOwner()); @Override public String getTopic() { From ef9daa5d4f85bb1aa82f5126a877cdbcf51271fc Mon Sep 17 00:00:00 2001 From: Elisa Stelling Date: Wed, 11 Dec 2019 10:27:40 +0100 Subject: [PATCH 32/45] owner fix --- src/tamagotchi-service/pom.xml | 127 +++++++++--------- .../java/com/sap/tamagotchi/model/Owner.java | 25 +++- .../com/sap/tamagotchi/model/OwnerTest.java | 39 +++++- 3 files changed, 121 insertions(+), 70 deletions(-) diff --git a/src/tamagotchi-service/pom.xml b/src/tamagotchi-service/pom.xml index d130b8b..1800402 100644 --- a/src/tamagotchi-service/pom.xml +++ b/src/tamagotchi-service/pom.xml @@ -1,69 +1,76 @@ - - 4.0.0 + + 4.0.0 - com.sap - tamagotchi-service - 0.1.0 + com.sap + tamagotchi-service + 0.1.0 - - 1.8 - 1.8 - 1.8 - + + 1.8 + 1.8 + 1.8 + - - org.springframework.boot - spring-boot-starter-parent - 2.1.6.RELEASE - + + org.springframework.boot + spring-boot-starter-parent + 2.1.6.RELEASE + - - - - com.google.cloud - libraries-bom - 2.9.0 - pom - import - - - + + + + com.google.cloud + libraries-bom + 2.9.0 + pom + import + + + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - com.google.cloud - google-cloud-pubsub - - - com.jayway.jsonpath - json-path - test - - + + + org.springframework.boot + spring-boot-starter-test + + test + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + com.google.cloud + google-cloud-pubsub + + + com.jayway.jsonpath + json-path + test + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - com.google.appengine - appengine-maven-plugin - 1.9.77 - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + com.google.appengine + appengine-maven-plugin + 1.9.77 + + + diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java index 87d1be8..0f8ad6f 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java @@ -3,14 +3,15 @@ */ package com.sap.tamagotchi.model; -import com.sap.tamagotchi.service.TamagotchiService; +import static com.sap.tamagotchi.service.TamagotchiService.DEVICE_EVENT_PROCESSOR_SCHEDULE; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; - -import static com.sap.tamagotchi.service.TamagotchiService.DEVICE_EVENT_PROCESSOR_SCHEDULE; +import com.sap.tamagotchi.service.TamagotchiService; @Service +@EnableScheduling public class Owner { private TamagotchiService tamagotchiService; @@ -23,13 +24,23 @@ public class Owner { @Scheduled(fixedDelay = DEVICE_EVENT_PROCESSOR_SCHEDULE) public void setData() { for (Device d : tamagotchiService.getDevices()) { - double random = Math.random(); + + String userName = d.getOwner().substring(0, d.getOwner().indexOf("@")).toUpperCase(); + + int careAboutThePet = 0; + + for (int i = 0; i < userName.length(); i++) { + if (d.getColor().toString().indexOf(userName.charAt(i)) != -1) { + careAboutThePet++; + } + } + Care care = new Care(); - if (random <= 0.5) { - care.setFeed(-(int) (random * 10)); + if (careAboutThePet == 0) { + care.setFeed(-5); } else { - care.setFeed((int) (random * 10)); + care.setFeed(5); } tamagotchiService.takeCare(d.getId(), care); } diff --git a/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java b/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java index bbb7bcb..35e2820 100644 --- a/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java +++ b/src/tamagotchi-service/src/test/java/com/sap/tamagotchi/model/OwnerTest.java @@ -1,7 +1,40 @@ +/** + * Copyright (c) 2019, SAP SE, All rights reserved. + */ package com.sap.tamagotchi.model; -import static org.junit.jupiter.api.Assertions.*; +import static java.util.Arrays.asList; +import static org.mockito.Mockito.when; +import java.util.Collection; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import com.sap.tamagotchi.service.TamagotchiService;; -class OwnerTest { +@RunWith(SpringRunner.class) +@SpringBootTest +public class OwnerTest { -} \ No newline at end of file + @Autowired + Owner owner; + + @MockBean + TamagotchiService tamagotchiService; + + Collection mockDevices; + + // @Before + // public void init() { + // MockitoAnnotations.initMocks(this); + // } + + @Test + public void testIt() { + when(tamagotchiService.getDevices()).thenReturn(asList(new Device("elisa@sap.com", Color.BLUE))); + owner.setData(); + + } +} From ef8bf3e86af71a5427efd2a51c8cab44d652e1cd Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Wed, 11 Dec 2019 10:54:48 +0100 Subject: [PATCH 33/45] add new payload format --- .../ApplicationConfiguration.java | 2 ++ .../controller/DeviceController.java | 15 ++++++++++++-- .../tamagotchi/model/CreateDevicePayload.java | 20 +++++++++---------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/configuration/ApplicationConfiguration.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/configuration/ApplicationConfiguration.java index aa36473..88c0409 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/configuration/ApplicationConfiguration.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/configuration/ApplicationConfiguration.java @@ -3,6 +3,7 @@ package com.sap.tamagotchi.configuration; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.springframework.context.annotation.Bean; @@ -17,6 +18,7 @@ public class ApplicationConfiguration { objectMapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true); objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); + objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); return objectMapper; } } diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java index e86d36d..08a44fc 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/DeviceController.java @@ -1,11 +1,14 @@ package com.sap.tamagotchi.controller; +import static com.sap.tamagotchi.model.Color.RED; +import static com.sap.tamagotchi.model.Color.YELLOW; import static org.springframework.http.ResponseEntity.ok; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import com.sap.tamagotchi.model.Color; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -27,6 +30,15 @@ public class DeviceController { this.tamagotchiService = tamagotchiService; } + private static Color mapColor(String productId) { + switch (productId) { + case "66VCHSJNUP": + return RED; + default: + return YELLOW; + } + } + @RequestMapping("/devices/{deviceId}") public Device getDevice(String deviceId) { return tamagotchiService.getDevice(deviceId); @@ -41,7 +53,7 @@ public class DeviceController { public ResponseEntity createDevice(@RequestBody Collection payload) { List devices = new ArrayList<>(); for (CreateDevicePayload p : payload) { - devices.add(tamagotchiService.createDevice(new Device(p.getOwner(), p.getColor()))); + devices.add(tamagotchiService.createDevice(new Device(p.getOwner(), mapColor(p.getProductId())))); } return ok(devices); } @@ -50,5 +62,4 @@ public class DeviceController { public String warmup() { return "warming up"; } - } diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java index b9f4774..52f9782 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/CreateDevicePayload.java @@ -4,22 +4,22 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; public class CreateDevicePayload { - private final String owner; - private final Color color; + private final String userId; + private final String productId; @JsonCreator - public CreateDevicePayload(@JsonProperty("owner") String owner, @JsonProperty("color") Color color) { - this.owner = owner; - this.color = color; + public CreateDevicePayload(@JsonProperty("userId") String userId, @JsonProperty("productId") String productId) { + this.userId = userId; + this.productId = productId; } - @JsonProperty("owner") + @JsonProperty("userId") public String getOwner() { - return owner; + return userId; } - @JsonProperty("color") - public Color getColor() { - return color; + @JsonProperty("productId") + public String getProductId() { + return productId; } } From 6ab8fdedc1c1f035f1d15e8fc43c3f20c2996e07 Mon Sep 17 00:00:00 2001 From: Elisa Stelling Date: Wed, 11 Dec 2019 11:01:49 +0100 Subject: [PATCH 34/45] kill tamagotchi by Restcall --- .../controller/OwnerController.java | 24 +++++++++++++++++++ .../java/com/sap/tamagotchi/model/Owner.java | 13 ++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/OwnerController.java diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/OwnerController.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/OwnerController.java new file mode 100644 index 0000000..557cdca --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/controller/OwnerController.java @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2019, SAP SE, All rights reserved. + */ +package com.sap.tamagotchi.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.sap.tamagotchi.model.Owner; + +@RestController +@RequestMapping("/owner") +public class OwnerController { + + @Autowired + Owner owner; + + @GetMapping() + public void killTamagotchi() { + owner.killRendomDevice(); + } + +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java index 0f8ad6f..99690df 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java @@ -4,6 +4,7 @@ package com.sap.tamagotchi.model; import static com.sap.tamagotchi.service.TamagotchiService.DEVICE_EVENT_PROCESSOR_SCHEDULE; +import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @@ -45,4 +46,16 @@ public class Owner { tamagotchiService.takeCare(d.getId(), care); } } + + public void killRendomDevice() { + + Collection devices = tamagotchiService.getDevices(); + + if (devices != null) { + Device first = devices.iterator().next(); + Care care = new Care(); + care.setFeed(-1000); + tamagotchiService.takeCare(first.getId(), care); + } + } } From 2a35e91cdd4364d9e1b39f611bdebdb2277cc579 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Wed, 11 Dec 2019 11:17:41 +0100 Subject: [PATCH 35/45] Update TamagotchiService.java --- .../main/java/com/sap/tamagotchi/service/TamagotchiService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 4da1943..99f5d32 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -87,6 +87,7 @@ public class TamagotchiService { .forEach(device -> { deviceRegistry.remove(device.getId()); sendTamagotchiDefunctNotifiction(device.getId()); + LOGGER.info("{} has died", device.getId()); }); } @@ -112,6 +113,7 @@ public class TamagotchiService { try { publisherService.publish(m); + LOGGER.info("defunct notification sent for {}", device.getId()); } catch (Exception ex) { LOGGER.error("sendTamagotchiDefunctNotifiction failed: {}", ex.getMessage()); } From 68ef63210f4de48e41715e879707fdcca9d0cb47 Mon Sep 17 00:00:00 2001 From: Elisa Stelling Date: Wed, 11 Dec 2019 11:29:35 +0100 Subject: [PATCH 36/45] kill update --- .../src/main/java/com/sap/tamagotchi/model/Owner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java index 99690df..2587886 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java @@ -54,7 +54,7 @@ public class Owner { if (devices != null) { Device first = devices.iterator().next(); Care care = new Care(); - care.setFeed(-1000); + care.setFeed(-100000); tamagotchiService.takeCare(first.getId(), care); } } From f62787de04f95fa13ed47373f235b039f30754f9 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Wed, 11 Dec 2019 11:30:31 +0100 Subject: [PATCH 37/45] min health = 0 --- .../src/main/java/com/sap/tamagotchi/model/Device.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java index ac93b55..256f3a6 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java @@ -65,6 +65,8 @@ public class Device { healthScore += delta; if (healthScore > 150) healthScore /= 10; + } else { + healthScore = 0; } messages.add(new DeviceEvent(id, owner, color, born, healthScore, Instant.now())); } From dfc219cfde5ac3d068c8fb1b4cab849ebd78525d Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Wed, 11 Dec 2019 11:31:09 +0100 Subject: [PATCH 38/45] refactor Notification --- .../tamagotchi/model/DefunctNotification.java | 23 ++++++++++++++++++ .../tamagotchi/service/TamagotchiService.java | 24 ++++--------------- 2 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DefunctNotification.java diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DefunctNotification.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DefunctNotification.java new file mode 100644 index 0000000..17fc505 --- /dev/null +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DefunctNotification.java @@ -0,0 +1,23 @@ +package com.sap.tamagotchi.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class DefunctNotification implements IoTMessage { + + @JsonProperty("message") + private final String message; + + public DefunctNotification(String message) { + this.message = message; + } + + @Override + public String getTopic() { + return "tamagotchi-defunct"; + } + + public String getMessage() { + return message; + } + +} diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 99f5d32..793c94f 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -14,10 +14,9 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; -import com.fasterxml.jackson.annotation.JsonProperty; import com.sap.tamagotchi.model.Care; +import com.sap.tamagotchi.model.DefunctNotification; import com.sap.tamagotchi.model.Device; -import com.sap.tamagotchi.model.IoTMessage; import com.sap.tamagotchi.publisher.PublisherService; @Service @@ -94,25 +93,10 @@ public class TamagotchiService { private void sendTamagotchiDefunctNotifiction(String id) { Device device = deviceRegistry.get(id); - - IoTMessage m = new IoTMessage() { - - @JsonProperty("message") - private String message = String.format("Tamagotchi %s of %s passed away", device.getOwner(), device.getOwner()); - - @Override - public String getTopic() { - return "tamagotchi-defunct"; - } - - public String getMessage() { - return message; - } - - }; - + String defunctMessage = String.format("Tamagotchi %s of %s passed away", device.getOwner(), device.getOwner()); + DefunctNotification defunctNotification = new DefunctNotification(defunctMessage); try { - publisherService.publish(m); + publisherService.publish(defunctNotification); LOGGER.info("defunct notification sent for {}", device.getId()); } catch (Exception ex) { LOGGER.error("sendTamagotchiDefunctNotifiction failed: {}", ex.getMessage()); From c123ff8ac016c46b6355ed873e5f79c187266f1d Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Wed, 11 Dec 2019 11:35:41 +0100 Subject: [PATCH 39/45] Update TamagotchiService.java --- .../java/com/sap/tamagotchi/service/TamagotchiService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 793c94f..4f22013 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -84,8 +84,8 @@ public class TamagotchiService { .parallelStream() .filter(device -> !device.isAlive()) .forEach(device -> { - deviceRegistry.remove(device.getId()); sendTamagotchiDefunctNotifiction(device.getId()); + deviceRegistry.remove(device.getId()); LOGGER.info("{} has died", device.getId()); }); } @@ -93,6 +93,9 @@ public class TamagotchiService { private void sendTamagotchiDefunctNotifiction(String id) { Device device = deviceRegistry.get(id); + if (device == null) { + return; + } String defunctMessage = String.format("Tamagotchi %s of %s passed away", device.getOwner(), device.getOwner()); DefunctNotification defunctNotification = new DefunctNotification(defunctMessage); try { From 7b2d2ec45c2879d84fd87e5cf318a8bc15d91aee Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Wed, 11 Dec 2019 11:39:11 +0100 Subject: [PATCH 40/45] fix ownercontroller --- .../src/main/java/com/sap/tamagotchi/model/Owner.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java index 2587886..b01e7cd 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java @@ -4,7 +4,9 @@ package com.sap.tamagotchi.model; import static com.sap.tamagotchi.service.TamagotchiService.DEVICE_EVENT_PROCESSOR_SCHEDULE; + import java.util.Collection; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @@ -51,7 +53,7 @@ public class Owner { Collection devices = tamagotchiService.getDevices(); - if (devices != null) { + if (devices != null && devices.iterator().hasNext()) { Device first = devices.iterator().next(); Care care = new Care(); care.setFeed(-100000); From 37e31c67b82aea45d167bbb3b4c14c2c91200988 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Wed, 11 Dec 2019 11:43:46 +0100 Subject: [PATCH 41/45] Update TamagotchiService.java --- .../main/java/com/sap/tamagotchi/service/TamagotchiService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 4f22013..6665821 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -96,7 +96,7 @@ public class TamagotchiService { if (device == null) { return; } - String defunctMessage = String.format("Tamagotchi %s of %s passed away", device.getOwner(), device.getOwner()); + String defunctMessage = String.format("Tamagotchi %s of %s passed away", device.getId(), device.getOwner()); DefunctNotification defunctNotification = new DefunctNotification(defunctMessage); try { publisherService.publish(defunctNotification); From 89bd50dda7b660f0c910cf0d077bfe5cc6162d25 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Wed, 11 Dec 2019 11:44:01 +0100 Subject: [PATCH 42/45] fix event message --- .../main/java/com/sap/tamagotchi/model/DefunctNotification.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DefunctNotification.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DefunctNotification.java index 17fc505..1666c9a 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DefunctNotification.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DefunctNotification.java @@ -1,5 +1,6 @@ package com.sap.tamagotchi.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; public class DefunctNotification implements IoTMessage { @@ -11,6 +12,7 @@ public class DefunctNotification implements IoTMessage { this.message = message; } + @JsonIgnore @Override public String getTopic() { return "tamagotchi-defunct"; From d371c32103caa652680a4c95611ab782cf4b4c8c Mon Sep 17 00:00:00 2001 From: Elisa Stelling Date: Wed, 11 Dec 2019 11:47:46 +0100 Subject: [PATCH 43/45] owner changes --- .../src/main/java/com/sap/tamagotchi/model/Owner.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java index 2587886..9e6d8cc 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Owner.java @@ -47,6 +47,7 @@ public class Owner { } } + @Scheduled(fixedDelay = 30000) public void killRendomDevice() { Collection devices = tamagotchiService.getDevices(); From bd0db888ae424c0eb87db36fbc99335a27a01826 Mon Sep 17 00:00:00 2001 From: Tibor Tarnai Date: Wed, 11 Dec 2019 11:57:42 +0100 Subject: [PATCH 44/45] last healthScore --- .../main/java/com/sap/tamagotchi/model/Device.java | 10 +++++++--- .../java/com/sap/tamagotchi/model/DeviceEvent.java | 12 +++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java index 256f3a6..58226ca 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/Device.java @@ -61,14 +61,18 @@ public class Device { @JsonIgnore public void changeHealthScore(int delta) { + int oldScore = healthScore; if (healthScore >= 1) { healthScore += delta; if (healthScore > 150) healthScore /= 10; - } else { - healthScore = 0; } - messages.add(new DeviceEvent(id, owner, color, born, healthScore, Instant.now())); + + if (healthScore < 1) { + healthScore = 0; + messages.add(new DeviceEvent(id, owner, color, born, healthScore, oldScore, Instant.now())); + } else + messages.add(new DeviceEvent(id, owner, color, born, healthScore, null, Instant.now())); } @JsonIgnore diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java index dccd389..d757795 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/model/DeviceEvent.java @@ -1,6 +1,7 @@ package com.sap.tamagotchi.model; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import java.time.Instant; @@ -18,15 +19,18 @@ public class DeviceEvent implements IoTMessage { private final Instant born; @JsonProperty("healthScore") private final Integer healthScore; + @JsonProperty("lastHealthScore") + private final Integer lastHealthScore; @JsonProperty("eventTime") private final Instant eventTime; - public DeviceEvent(String id, String owner, Color color, Instant born, Integer healthScore, Instant eventTime) { + public DeviceEvent(String id, String owner, Color color, Instant born, Integer healthScore, Integer lastHealthScore, Instant eventTime) { this.id = id; this.owner = owner; this.color = color; this.born = born; this.healthScore = healthScore; + this.lastHealthScore = lastHealthScore; this.eventTime = eventTime; } @@ -55,6 +59,12 @@ public class DeviceEvent implements IoTMessage { return healthScore; } + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonProperty("lastHealthScore") + public Integer getLastHealthScore() { + return lastHealthScore; + } + @JsonProperty("eventTime") public String getEventTime() { return eventTime.toString(); From ea60a15e89d97bacd987e0b4c33dc4d6192ca229 Mon Sep 17 00:00:00 2001 From: Steinwagner Date: Wed, 11 Dec 2019 11:58:09 +0100 Subject: [PATCH 45/45] Update TamagotchiService.java --- .../main/java/com/sap/tamagotchi/service/TamagotchiService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java index 6665821..5f609de 100644 --- a/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java +++ b/src/tamagotchi-service/src/main/java/com/sap/tamagotchi/service/TamagotchiService.java @@ -93,7 +93,7 @@ public class TamagotchiService { private void sendTamagotchiDefunctNotifiction(String id) { Device device = deviceRegistry.get(id); - if (device == null) { + if (device == null || device.getId() == null || device.getOwner() == null) { return; } String defunctMessage = String.format("Tamagotchi %s of %s passed away", device.getId(), device.getOwner());