diff --git a/pom.xml b/pom.xml index e5a9405a..eef58541 100644 --- a/pom.xml +++ b/pom.xml @@ -24,23 +24,27 @@ org.springframework.boot spring-boot-actuator + 3.0.0 org.springframework.boot spring-boot-starter-web + 3.0.0 org.springframework.boot spring-boot-starter-security + 3.0.0 org.springframework.boot spring-boot-starter-tomcat + 3.0.0 provided @@ -48,18 +52,20 @@ org.springframework.boot spring-boot-starter-data-jpa + 3.0.0 com.h2database h2 - 1.4.193 + 2.1.214 org.springframework.boot spring-boot-starter-test + 3.0.0 test @@ -73,12 +79,12 @@ com.jayway.jsonpath json-path - 2.4.0 + 2.7.0 com.jayway.jsonpath json-path-assert - 0.9.1 + 2.7.0 test @@ -86,17 +92,18 @@ io.springfox springfox-swagger2 - 2.5.0 + 3.0.0 io.springfox springfox-swagger-ui - 2.5.0 + 3.0.0 org.hsqldb hsqldb + 2.7.1 runtime @@ -104,7 +111,72 @@ javax.xml.bind jaxb-api - 2.3.0 + 2.4.0-b180830.0359 + + + com.khoubyari + spring-boot-rest-example + 0.5.0 + + + commons-io + commons-io + 2.11.0 + + + com.google.code.gson + gson + 2.10 + + + serializable-fn + serializable-fn + 1.1.4 + + + io.github.portlek + serializable + 2.0.0 + + + jp.co.ap-com + spring-oauth2-serializable + 0.0.2 + + + org.danekja + jdk-serializable-functional + 1.9.0 + + + org.aksw.commons + aksw-commons-lambdas-serializable + 0.9.4 + + + junit + junit + test + + + org.springframework.boot + spring-boot-actuator + 1.5.9.RELEASE + + + javax.validation + validation-api + 1.1.0.Final + + + com.google.collections + google-collections + 18.0 + + + com.google.collections + google-collections + 1.0 @@ -135,4 +207,11 @@ + + + clojars + Clojars + https://repo.clojars.org/ + + diff --git a/src/main/java/com/khoubyari/example/api/rest/docs/SwaggerConfig.java b/src/main/java/com/khoubyari/example/api/rest/docs/SwaggerConfig.java index f3c33b8a..89fb2f44 100644 --- a/src/main/java/com/khoubyari/example/api/rest/docs/SwaggerConfig.java +++ b/src/main/java/com/khoubyari/example/api/rest/docs/SwaggerConfig.java @@ -1,17 +1,9 @@ package com.khoubyari.example.api.rest.docs; -import com.google.common.base.Predicates; - -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; - import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @@ -20,16 +12,16 @@ @ComponentScan("com.khoubyari.example.api.rest") public class SwaggerConfig { - - @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2) - .select() - .apis(RequestHandlerSelectors.any()) - .paths(Predicates.not(PathSelectors.regex("/error"))) - .build() - .apiInfo(apiInfo()); - } +// +// @Bean +// public Docket api() { +// return new Docket(DocumentationType.SWAGGER_2) +// .select() +// .apis(RequestHandlerSelectors.any()) +// .paths(Predicates.not(PathSelectors.regex("/error"))) +// .build() +// .apiInfo(apiInfo()); +// } private ApiInfo apiInfo() { diff --git a/src/main/java/com/khoubyari/example/domain/Hotel.java b/src/main/java/com/khoubyari/example/domain/Hotel.java index fb41e08d..c92f3b06 100644 --- a/src/main/java/com/khoubyari/example/domain/Hotel.java +++ b/src/main/java/com/khoubyari/example/domain/Hotel.java @@ -1,7 +1,10 @@ package com.khoubyari.example.domain; -import javax.persistence.*; -import javax.xml.bind.annotation.*; +import jakarta.persistence.*; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; /* * a simple domain entity doubling as a DTO diff --git a/src/main/java/com/khoubyari/example/model/CardholderName.java b/src/main/java/com/khoubyari/example/model/CardholderName.java new file mode 100644 index 00000000..7f1f27db --- /dev/null +++ b/src/main/java/com/khoubyari/example/model/CardholderName.java @@ -0,0 +1,20 @@ +package com.khoubyari.example.model; + +import org.codehaus.jackson.annotate.JsonProperty; + +public class CardholderName { + + @JsonProperty("key") + public T key; + + public T getKey(){ + return key; + } + + @Override + public String toString() { + return "CardholderName{" + + "key=" + key + + '}'; + } +} diff --git a/src/main/java/com/khoubyari/example/model/NotificationData.java b/src/main/java/com/khoubyari/example/model/NotificationData.java new file mode 100644 index 00000000..744fe448 --- /dev/null +++ b/src/main/java/com/khoubyari/example/model/NotificationData.java @@ -0,0 +1,48 @@ +package com.khoubyari.example.model; + +import javax.annotation.Nullable; +import java.io.Serializable; +import java.util.Optional; + +public class NotificationData implements Serializable { + + private String key; + + private String value; + + private String valueType; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Nullable + public Optional getValueType() { + return Optional.ofNullable(valueType); + } + + public void setValueType(String valueType) { + this.valueType = valueType; + } + + @Override + public String toString() { + return "NotificationData{" + + "key='" + key + '\'' + + ", value='" + value + '\'' + + ", valueType='" + valueType + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/khoubyari/example/model/NotificationDataMap.java b/src/main/java/com/khoubyari/example/model/NotificationDataMap.java new file mode 100644 index 00000000..ad6aca66 --- /dev/null +++ b/src/main/java/com/khoubyari/example/model/NotificationDataMap.java @@ -0,0 +1,45 @@ +package com.khoubyari.example.model; + +import java.util.List; + +public class NotificationDataMap { + + private String templateCode; + + private String templateId; + + private List notificationDataList; + + public String getTemplateCode() { + return templateCode; + } + + public void setTemplateCode(String templateCode) { + this.templateCode = templateCode; + } + + public String getTemplateId() { + return templateId; + } + + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + public List getNotificationDataList() { + return notificationDataList; + } + + public void setNotificationDataList(List notificationDataList) { + this.notificationDataList = notificationDataList; + } + + @Override + public String toString() { + return "NotificationDataMap{" + + "templateCode='" + templateCode + '\'' + + ", templateId='" + templateId + '\'' + + ", notificationDataList=" + notificationDataList + + '}'; + } +} diff --git a/src/main/java/com/khoubyari/example/model/TableTestItem.java b/src/main/java/com/khoubyari/example/model/TableTestItem.java new file mode 100644 index 00000000..9f36f3e2 --- /dev/null +++ b/src/main/java/com/khoubyari/example/model/TableTestItem.java @@ -0,0 +1,36 @@ +package com.khoubyari.example.model; + +import org.codehaus.jackson.annotate.JsonProperty; + +public class TableTestItem { + + @JsonProperty("desc") + private String description; + + @JsonProperty("no") + private String number; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + @Override + public String toString() { + return "TableTestItem{" + + "description='" + description + '\'' + + ", number='" + number + '\'' + + '}'; + } +} diff --git a/src/main/java/com/khoubyari/example/model/Template1.java b/src/main/java/com/khoubyari/example/model/Template1.java new file mode 100644 index 00000000..0002d6f8 --- /dev/null +++ b/src/main/java/com/khoubyari/example/model/Template1.java @@ -0,0 +1,34 @@ +package com.khoubyari.example.model; + +import java.io.Serializable; +import java.util.List; + +public class Template1 implements Serializable { + + public String firstName; + + public String alertTypeCode; + + public List updatedInfo; + + public String getFirstName() { return firstName; } + + public void setFirstName(String firstName) { this.firstName = firstName; } + + public String getAlertTypeCode() { return alertTypeCode; } + + public void setAlertTypeCode(String alertTypeCode) { this.alertTypeCode = alertTypeCode; } + + public List getUpdatedInfo() { return updatedInfo; } + + public void setUpdatedInfo(List updatedInfo) { this.updatedInfo = updatedInfo; } + + @Override + public String toString() { + return "Template1{" + + "firstName='" + firstName + '\'' + + ", alertTypeCode='" + alertTypeCode + '\'' + + ", updatedInfo=" + updatedInfo + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/khoubyari/example/model/Template2.java b/src/main/java/com/khoubyari/example/model/Template2.java new file mode 100644 index 00000000..081f15ba --- /dev/null +++ b/src/main/java/com/khoubyari/example/model/Template2.java @@ -0,0 +1,35 @@ +package com.khoubyari.example.model; + + +import java.io.Serializable; +import java.util.List; + +public class Template2 implements Serializable { + + public String firstName; + + public String alertTypeCode; + + public List cardholderNames; + + public String getFirstName() { return firstName; } + + public void setFirstName(String firstName) { this.firstName = firstName; } + + public String getAlertTypeCode() { return alertTypeCode; } + + public void setAlertTypeCode(String alertTypeCode) { this.alertTypeCode = alertTypeCode; } + + public List getCardholderNames() { return cardholderNames; } + + public void setCardholderNames(List cardholderNames) { this.cardholderNames = cardholderNames; } + + @Override + public String toString() { + return "Template2{" + + "firstName='" + firstName + '\'' + + ", alertTypeCode='" + alertTypeCode + '\'' + + ", cardholderNames=" + cardholderNames + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/khoubyari/example/model/Template3.java b/src/main/java/com/khoubyari/example/model/Template3.java new file mode 100644 index 00000000..61cd39e7 --- /dev/null +++ b/src/main/java/com/khoubyari/example/model/Template3.java @@ -0,0 +1,90 @@ +package com.khoubyari.example.model; + +import java.io.Serializable; +import java.util.List; + +public class Template3 implements Serializable { + + public String firstName; + + public String alertTypeCode; + + private String lastFour; + + private String icceUrl; + + private String clientName; + + private String bodyMod; + + private List tableTestItemList; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getAlertTypeCode() { + return alertTypeCode; + } + + public void setAlertTypeCode(String alertTypeCode) { + this.alertTypeCode = alertTypeCode; + } + + public String getLastFour() { + return lastFour; + } + + public void setLastFour(String lastFour) { + this.lastFour = lastFour; + } + + public String getIcceUrl() { + return icceUrl; + } + + public void setIcceUrl(String icceUrl) { + this.icceUrl = icceUrl; + } + + public String getClientName() { + return clientName; + } + + public void setClientName(String clientName) { + this.clientName = clientName; + } + + public String getBodyMod() { + return bodyMod; + } + + public void setBodyMod(String bodyMod) { + this.bodyMod = bodyMod; + } + + public List getTableTestItemList() { + return tableTestItemList; + } + + public void setTableTestItemList(List tableTestItemList) { + this.tableTestItemList = tableTestItemList; + } + + @Override + public String toString() { + return "Template3{" + + "firstName='" + firstName + '\'' + + ", alertTypeCode='" + alertTypeCode + '\'' + + ", lastFour='" + lastFour + '\'' + + ", icceUrl='" + icceUrl + '\'' + + ", clientName='" + clientName + '\'' + + ", bodyMod='" + bodyMod + '\'' + + ", tableTestItemList=" + tableTestItemList + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/khoubyari/example/model/UpdatedInfoItem.java b/src/main/java/com/khoubyari/example/model/UpdatedInfoItem.java new file mode 100644 index 00000000..92e359a0 --- /dev/null +++ b/src/main/java/com/khoubyari/example/model/UpdatedInfoItem.java @@ -0,0 +1,20 @@ +package com.khoubyari.example.model; + +import org.codehaus.jackson.annotate.JsonProperty; + +public class UpdatedInfoItem { + + @JsonProperty("value") + private T value; + + public T getValue(){ + return value; + } + + @Override + public String toString() { + return "UpdatedInfoItem{" + + "value=" + value + + '}'; + } +} diff --git a/src/main/java/com/khoubyari/example/service/MohsinService.java b/src/main/java/com/khoubyari/example/service/MohsinService.java new file mode 100644 index 00000000..92ffa9b8 --- /dev/null +++ b/src/main/java/com/khoubyari/example/service/MohsinService.java @@ -0,0 +1,78 @@ +package com.khoubyari.example.service; + + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.khoubyari.example.model.NotificationData; +import com.khoubyari.example.model.NotificationDataMap; +import com.khoubyari.example.utility.ResponseConverterUtility; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * This is an optional class used to inject application specific health check + * into the Spring Boot health management endpoint. + */ +@Service +public class MohsinService { + + @Autowired + ResponseConverterUtility responseConverterUtility; + + //request starts here, this is just skeleton + public String incomingRequest(NotificationDataMap notificationDataMap){ + + if(notificationDataMap.getTemplateCode()=="abc"){ + //map with template1 + return notificationDataMapConverter(notificationDataMap.getTemplateCode(), notificationDataMap.getNotificationDataList()); + } + + if(notificationDataMap.getTemplateCode()=="def"){ + //map with template1 + return notificationDataMapConverter(notificationDataMap.getTemplateCode(), notificationDataMap.getNotificationDataList()); + } + + if(notificationDataMap.getTemplateCode()=="ghi"){ + //map with template1 + return notificationDataMapConverter(notificationDataMap.getTemplateCode(), notificationDataMap.getNotificationDataList()); + } + + return null; + } + + + public String notificationDataMapConverter(String url, List notificationData) { + + // this returns NULL, how to fix this? //VIJAY + Object x = responseConverterUtility.test(url, notificationData); + + //output is null as of now + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String output = gson.toJson(gson.toJson(x)); + + return output; + } + + /* + Response + Response1 + Response2 + + Class Response { + toResponse(notificationData, type); + switch(type){ + case "": + new Converter(notificationData); + Response1; + break; + case ""; + new Converter(notificationData); + Response2; + break; + } + } + */ + +} diff --git a/src/main/java/com/khoubyari/example/utility/ResponseConverterUtility.java b/src/main/java/com/khoubyari/example/utility/ResponseConverterUtility.java new file mode 100644 index 00000000..0c5d3420 --- /dev/null +++ b/src/main/java/com/khoubyari/example/utility/ResponseConverterUtility.java @@ -0,0 +1,115 @@ +package com.khoubyari.example.utility; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.khoubyari.example.model.*; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +@Component +public class ResponseConverterUtility { + + //how in java to return different ObjectTypes in a method?? this Object returns NULL value //Vijay + public Object test(String templateType, List notificationData){ + switch(templateType){ + case "abc": + executeTemplate1(templateType, notificationData); + break; + case "def": + executeTemplate2(templateType, notificationData); + break; + case "ghi": + executeTemplate3(templateType, notificationData); + break; + } + + return null; + } + + //how to refactor this common executeTemplate1, executeTemplate2, executeTemplate3 into a generic function ?? //VIJAY + + private Template1 executeTemplate1(String templateType, List notificationData){ + Template1 template1 = new Template1(); + template1.setAlertTypeCode(templateType); + + for(int i=0; i>(){}.getType(); + List test = new Gson().fromJson(notificationData.get(i).getValue(), listType); + template1.setUpdatedInfo(test); + break; + case "firstName": + template1.setFirstName(notificationData.get(i).getValue()); + break; + } + } + + System.out.println("print template1: " + template1); + return template1; + } + + + private Template2 executeTemplate2(String templateType, List notificationData){ + Template2 template2 = new Template2(); + template2.setAlertTypeCode(templateType); + + for(int i=0; i>(){}.getType(); + List test = new Gson().fromJson(notificationData.get(i).getKey(), listType); + template2.setCardholderNames(test); + break; + case "firstName": + template2.setFirstName(notificationData.get(i).getValue()); + break; + } + } + + System.out.println("print template2: " + template2); + + return template2; + } + + private Template3 executeTemplate3(String templateType, List notificationData){ + Template3 template3 = new Template3(); + template3.setAlertTypeCode(templateType); + + for(int i=0; i>(){}.getType(); + System.out.println(listType.toString()); + List test = new Gson().fromJson(notificationData.get(i).getValue(), listType); + template3.setTableTestItemList(test); + break; + case "firstName": + template3.setFirstName(notificationData.get(i).getValue()); + break; + case "icceUrl": + template3.setIcceUrl(notificationData.get(i).getValue()); + break; + case "lastFour": + template3.setLastFour(notificationData.get(i).getValue()); + break; + case "clientName": + template3.setClientName(notificationData.get(i).getValue()); + break; + case "bodyMod": + template3.setBodyMod(notificationData.get(i).getValue()); + break; + } + } + + System.out.println("print template3: " + template3); + + return template3; + } + + + +} \ No newline at end of file diff --git a/src/test/java/com/khoubyari/example/test/MohsinServiceTest.java b/src/test/java/com/khoubyari/example/test/MohsinServiceTest.java new file mode 100644 index 00000000..ac97ec88 --- /dev/null +++ b/src/test/java/com/khoubyari/example/test/MohsinServiceTest.java @@ -0,0 +1,47 @@ +package com.khoubyari.example.test; + +import com.khoubyari.example.model.NotificationData; +import com.khoubyari.example.model.NotificationDataMap; +import com.khoubyari.example.service.MohsinService; +import com.khoubyari.example.utility.ResponseConverterUtility; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(MockitoJUnitRunner.class) +public class MohsinServiceTest { + + @InjectMocks + MohsinService mohsinService; + + @Mock + ResponseConverterUtility responseConverterUtility; + + @Test + public void incomingRequestTest(){ + NotificationDataMap notificationDataMap = new NotificationDataMap(); + notificationDataMap.setTemplateCode("abc"); + List notificationDataList = new ArrayList<>(); + NotificationData notificationData = new NotificationData(); + notificationData.setKey("firstName"); + notificationData.setValue("Mohsin"); + NotificationData notificationData1 = new NotificationData(); + notificationData1.setKey("updatedInfo"); + notificationData1.setValue(""); + notificationData1.setValueType("looparray"); + notificationDataList.add(notificationData); + notificationDataList.add(notificationData1); + notificationDataMap.setNotificationDataList(notificationDataList); + + Object x = new Object(); + + Mockito.when(responseConverterUtility.test(Mockito.anyString(), Mockito.anyList())).thenReturn(x); + mohsinService.incomingRequest(notificationDataMap); + } +} diff --git a/src/test/java/com/khoubyari/example/test/utility/ResponseConverterUtiltiyTest.java b/src/test/java/com/khoubyari/example/test/utility/ResponseConverterUtiltiyTest.java new file mode 100644 index 00000000..908167a5 --- /dev/null +++ b/src/test/java/com/khoubyari/example/test/utility/ResponseConverterUtiltiyTest.java @@ -0,0 +1,82 @@ +package com.khoubyari.example.test.utility; + +import com.khoubyari.example.model.NotificationData; +import com.khoubyari.example.utility.ResponseConverterUtility; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(MockitoJUnitRunner.class) +public class ResponseConverterUtiltiyTest { + + @InjectMocks + ResponseConverterUtility responseConverterUtility; + + // this test case has conversion issue + @Test + public void testTestTemplate3(){ + List notificationDataList = new ArrayList<>(); + NotificationData notificationData = new NotificationData(); + notificationData.setKey("firstName"); + notificationData.setValue("Mohsin"); + + NotificationData notificationData1 = new NotificationData(); + notificationData1.setKey("tableItem"); + notificationData1.setValue("[{\"number\":\"1\", \"description\":\"test1\"},{\"number\":\"2\", \"description\":\"test2\"},{\"number\":\"3\", \"description\":\"test3\"}]"); + notificationData1.setValueType("table"); + + NotificationData notificationData2 = new NotificationData(); + notificationData2.setKey("icceUrl"); + notificationData2.setValue("icceUrl"); + + NotificationData notificationData3 = new NotificationData(); + notificationData3.setKey("lastFour"); + notificationData3.setValue("1234"); + + NotificationData notificationData4 = new NotificationData(); + notificationData4.setKey("clientName"); + notificationData4.setValue("Test"); + + NotificationData notificationData5 = new NotificationData(); + notificationData5.setKey("bodyMod"); + notificationData5.setValue("1"); + + notificationDataList.add(notificationData); + notificationDataList.add(notificationData1); + notificationDataList.add(notificationData2); + notificationDataList.add(notificationData3); + notificationDataList.add(notificationData4); + notificationDataList.add(notificationData5); + + responseConverterUtility.test("ghi", notificationDataList); + } + + @Test + public void testTestTemplate1(){ + List notificationDataList = new ArrayList<>(); + NotificationData notificationData = new NotificationData(); + notificationData.setKey("firstName"); + notificationData.setValue("Mohsin"); + + NotificationData notificationData1 = new NotificationData(); + notificationData1.setKey("updatedInfo"); + notificationData1.setValue("[{\"value\": \"email address\"}, {\"value\": \"test code\"}, {\"value\": \"name\"}]"); + notificationData1.setValueType("looparray"); + + + NotificationData notificationData5 = new NotificationData(); + notificationData5.setKey("bodyMod"); + notificationData5.setValue("1"); + + notificationDataList.add(notificationData); + notificationDataList.add(notificationData1); + notificationDataList.add(notificationData5); + + responseConverterUtility.test("abc", notificationDataList); + } + +}