diff --git a/src/main/java/com/grydtech/msstack/modelconverter/Main.java b/src/main/java/com/grydtech/msstack/modelconverter/Main.java index d72f4ba..62b566f 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/Main.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/Main.java @@ -1,8 +1,8 @@ package com.grydtech.msstack.modelconverter; -import com.grydtech.msstack.modelconverter.business.BusinessModel; +import com.grydtech.msstack.modelconverter.models.BusinessModel; import com.grydtech.msstack.modelconverter.services.*; -import com.grydtech.msstack.modelconverter.microservice.MicroServiceModel; +import com.grydtech.msstack.modelconverter.models.MicroServiceModel; import com.grydtech.msstack.modelconverter.services.impl.DefaultModelConverter; import com.grydtech.msstack.modelconverter.services.impl.DefaultModelReader; import com.grydtech.msstack.modelconverter.services.impl.DefaultModelWriter; diff --git a/src/main/java/com/grydtech/msstack/modelconverter/business/BusinessModel.java b/src/main/java/com/grydtech/msstack/modelconverter/business/BusinessModel.java deleted file mode 100644 index c88d6d0..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/business/BusinessModel.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.grydtech.msstack.modelconverter.business; - -import com.grydtech.msstack.modelconverter.business.contract.BusinessContract; -import com.grydtech.msstack.modelconverter.business.communication.BusinessEvent; -import com.grydtech.msstack.modelconverter.business.communication.BusinessRequest; -import com.grydtech.msstack.modelconverter.business.communication.BusinessResponse; -import com.grydtech.msstack.modelconverter.business.entity.BusinessEntity; -import com.grydtech.msstack.modelconverter.business.server.BusinessServer; -import com.grydtech.msstack.modelconverter.common.Model; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public final class BusinessModel extends Model { - - private final List entities = new ArrayList<>(); - private final List events = new ArrayList<>(); - private final List contracts = new ArrayList<>(); - private final List requests = new ArrayList<>(); - private final List responses = new ArrayList<>(); - private final List servers = new ArrayList<>(); - - public void addEntity(BusinessEntity entity) { - this.entities.add(entity); - } - - public void addEntityCollection(Collection entities) { - this.entities.addAll(entities); - } - - public void addEvent(BusinessEvent event) { - this.events.add(event); - } - - public void addEventCollection(Collection events) { - this.events.addAll(events); - } - - public void addContract(BusinessContract contract) { - this.contracts.add(contract); - } - - public void addContractCollection(Collection contracts) { - this.contracts.addAll(contracts); - } - - public void addRequest(BusinessRequest request) { - this.requests.add(request); - } - - public void addRequestCollection(Collection requests) { - this.requests.addAll(requests); - } - - public void addResponse(BusinessResponse response) { - this.responses.add(response); - } - - public void addResponseCollection(Collection responses) { - this.responses.addAll(responses); - } - - public void addServer(BusinessServer server) { - this.servers.add(server); - } - - public void addServerCollection(Collection servers) { - this.servers.addAll(servers); - } -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/business/Field.java b/src/main/java/com/grydtech/msstack/modelconverter/business/Field.java deleted file mode 100644 index 0b1f146..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/business/Field.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.grydtech.msstack.modelconverter.business; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.grydtech.msstack.modelconverter.business.entity.BusinessEntity; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public final class Field { - private String name; - private String type; - private boolean array; - @JsonIgnore - private BusinessEntity entity; - - // ToDo: Field validation not added (eg: isIdentifier, isUnique) -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessCommunication.java b/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessCommunication.java deleted file mode 100644 index c4613d4..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessCommunication.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.grydtech.msstack.modelconverter.business.communication; - -import com.grydtech.msstack.modelconverter.business.Field; -import com.grydtech.msstack.modelconverter.common.ModelComponent; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public abstract class BusinessCommunication extends ModelComponent { - private String name; - private final List fields = new ArrayList<>(); - - public void addField(Field field) { - this.fields.add(field); - } - - public void addFieldCollection(Collection fields) { - this.fields.addAll(fields); - } -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessEvent.java b/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessEvent.java deleted file mode 100644 index ace80f0..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessEvent.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.grydtech.msstack.modelconverter.business.communication; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public final class BusinessEvent extends BusinessCommunication { - private String entityId; - @JsonIgnore - private String eventGroup; -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessRequest.java b/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessRequest.java deleted file mode 100644 index 478d8fb..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.grydtech.msstack.modelconverter.business.communication; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public final class BusinessRequest extends BusinessCommunication { - private String type; -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/business/contract/BusinessContract.java b/src/main/java/com/grydtech/msstack/modelconverter/business/contract/BusinessContract.java deleted file mode 100644 index 50c7eee..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/business/contract/BusinessContract.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.grydtech.msstack.modelconverter.business.contract; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.grydtech.msstack.modelconverter.business.communication.BusinessCommunication; -import com.grydtech.msstack.modelconverter.business.communication.BusinessEvent; -import com.grydtech.msstack.modelconverter.business.communication.BusinessRequest; -import com.grydtech.msstack.modelconverter.business.communication.BusinessResponse; -import com.grydtech.msstack.modelconverter.business.entity.BusinessEntity; -import com.grydtech.msstack.modelconverter.common.ModelComponent; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public final class BusinessContract extends ModelComponent { - private String entityId; - private BusinessContractHandler handler; - private String requestId; - private String responseId; - private final List eventIds = new ArrayList<>(); - @JsonIgnore - private BusinessCommunication request; // when the handler type is event this will be BusinessEvent - @JsonIgnore - private BusinessCommunication response; // when the handler type is event this will be null - @JsonIgnore - private BusinessEntity entity; - @JsonIgnore - private final List events = new ArrayList<>(); - - public void addEvent(BusinessEvent event) { - this.events.add(event); - } - - public void addEventCollection(Collection events) { - this.events.addAll(events); - } -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/business/contract/BusinessContractHandler.java b/src/main/java/com/grydtech/msstack/modelconverter/business/contract/BusinessContractHandler.java deleted file mode 100644 index 436d292..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/business/contract/BusinessContractHandler.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.grydtech.msstack.modelconverter.business.contract; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public final class BusinessContractHandler { - private String type; - private String name; -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/business/entity/BusinessEntity.java b/src/main/java/com/grydtech/msstack/modelconverter/business/entity/BusinessEntity.java deleted file mode 100644 index 4fd6b31..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/business/entity/BusinessEntity.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.grydtech.msstack.modelconverter.business.entity; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.grydtech.msstack.modelconverter.business.Field; -import com.grydtech.msstack.modelconverter.business.communication.BusinessEvent; -import com.grydtech.msstack.modelconverter.common.ModelComponent; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public class BusinessEntity extends ModelComponent { - private String name; - private final List fields = new ArrayList<>(); - @JsonIgnore - private final List events = new ArrayList<>(); - - public void addField(Field field) { - this.fields.add(field); - } - - public void addFieldCollection(Collection fields) { - this.fields.addAll(fields); - } - - public void addEvent(BusinessEvent event) { - this.events.add(event); - } - - public void addEventCollection(Collection events) { - this.events.addAll(events); - } -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/business/server/BusinessServer.java b/src/main/java/com/grydtech/msstack/modelconverter/business/server/BusinessServer.java deleted file mode 100644 index 549b732..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/business/server/BusinessServer.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.grydtech.msstack.modelconverter.business.server; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.grydtech.msstack.modelconverter.business.contract.BusinessContract; -import com.grydtech.msstack.modelconverter.common.ModelComponent; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public final class BusinessServer extends ModelComponent { - private String name; - private final List contractIds = new ArrayList<>(); - @JsonIgnore - private final List contracts = new ArrayList<>(); - - public void addContract(BusinessContract contract) { - this.contracts.add(contract); - } - - public void addContractCollection(Collection contracts) { - this.contracts.addAll(contracts); - } -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/common/Constants.java b/src/main/java/com/grydtech/msstack/modelconverter/common/Constants.java deleted file mode 100644 index 52a41f4..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/common/Constants.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.grydtech.msstack.modelconverter.common; - -import java.util.ArrayList; -import java.util.List; - -public class Constants { - - public final static String SERVICE_SUFFIX = "_service"; - public final static String HANDLER_CLASS_SUFFIX = "_handler"; - public final static String ENTITY_CLASS_SUFFIX = "_entity"; - public final static String EVENT_CLASS_SUFFIX = "_event"; - public final static String REQUEST_CLASS_SUFFIX = "_request"; - public final static String RESPONSE_CLASS_SUFFIX = "_response"; - public final static String COMMAND_HANDLER_TYPE = "command"; - public final static String QUERY_HANDLER_TYPE = "query"; - public final static String EVENT_HANDLER_TYPE = "event"; - public final static List BASE_TYPES = new ArrayList<>(); - - static { - BASE_TYPES.add("string"); - BASE_TYPES.add("integer"); - BASE_TYPES.add("double"); - BASE_TYPES.add("long"); - BASE_TYPES.add("float"); - BASE_TYPES.add("boolean"); - } - - private Constants() { - } -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/common/ModelConverterUtil.java b/src/main/java/com/grydtech/msstack/modelconverter/common/ModelConverterUtil.java deleted file mode 100644 index f70ad32..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/common/ModelConverterUtil.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.grydtech.msstack.modelconverter.common; - -import com.grydtech.msstack.modelconverter.business.Field; -import com.grydtech.msstack.modelconverter.business.communication.BusinessEvent; -import com.grydtech.msstack.modelconverter.business.communication.BusinessRequest; -import com.grydtech.msstack.modelconverter.business.communication.BusinessResponse; -import com.grydtech.msstack.modelconverter.business.contract.BusinessContract; -import com.grydtech.msstack.modelconverter.business.entity.BusinessEntity; -import com.grydtech.msstack.modelconverter.microservice.Attribute; -import com.grydtech.msstack.modelconverter.microservice.communication.CommunicationClass; -import com.grydtech.msstack.modelconverter.microservice.communication.EventClass; -import com.grydtech.msstack.modelconverter.microservice.communication.RequestClass; -import com.grydtech.msstack.modelconverter.microservice.communication.ResponseClass; -import com.grydtech.msstack.modelconverter.microservice.entity.EntityClass; -import com.grydtech.msstack.modelconverter.microservice.handler.HandlerClass; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public final class ModelConverterUtil { - - private ModelConverterUtil() { - } - - // recursively search for entities (sub entities) and create class schemas - public static Collection extractEntities(Collection baseEntities) { - final List entities = new ArrayList<>(baseEntities); - - for (int i = 0; i < entities.size(); i++) { - BusinessEntity entity = entities.get(i); - entity.getFields().stream().filter(field -> field.getEntity() != null).forEach(field -> entities.add(field.getEntity())); - } - - return entities; - } - - public static Collection extractEvents(Collection entities, Collection contracts) { - final List events = new ArrayList<>(); - - entities.forEach(businessEntity -> { - events.addAll(businessEntity.getEvents()); - }); - - contracts.forEach(businessContract -> { - if (businessContract.getHandler().getType().equals(Constants.EVENT_HANDLER_TYPE)) { - BusinessEvent event = (BusinessEvent) businessContract.getRequest(); - events.add(event); - } - - events.addAll(businessContract.getEvents()); - }); - - return events; - } - - public static EntityClass generateEntityClassSchema(BusinessEntity businessEntity, boolean mainEntity) { - EntityClass entityClass = new EntityClass(); - entityClass.setId(businessEntity.getId()); - entityClass.setName(businessEntity.getName() + Constants.ENTITY_CLASS_SUFFIX); - entityClass.setMainEntity(mainEntity); - businessEntity.getFields().forEach(field -> { - entityClass.addAttribute(generateClassAttribute(field)); - }); - businessEntity.getEvents().forEach(event -> { - entityClass.addEvent(generateEventClassSchema(event)); - }); - - return entityClass; - } - - public static HandlerClass generateHandlerClassSchema(BusinessContract businessContract) { - CommunicationClass requestClassSchema; - CommunicationClass responseClassSchema; - - if (businessContract.getHandler().getType().equals(Constants.EVENT_HANDLER_TYPE)) { - requestClassSchema = generateEventClassSchema((BusinessEvent) businessContract.getRequest()); - responseClassSchema = null; - } else { - requestClassSchema = generateRequestClassSchema((BusinessRequest) businessContract.getRequest()); - responseClassSchema = generateResponseClassSchema((BusinessResponse) businessContract.getResponse()); - } - - HandlerClass handlerClass = new HandlerClass(); - handlerClass.setId(businessContract.getId()); - handlerClass.setName(businessContract.getHandler().getName() + Constants.HANDLER_CLASS_SUFFIX); - handlerClass.setType(businessContract.getHandler().getType()); - handlerClass.setRequestClass(requestClassSchema); - handlerClass.setResponseClass(responseClassSchema); - handlerClass.setEndPoint(businessContract.getEntity().getName() + "/" + businessContract.getHandler().getName()); - - businessContract.getEvents().forEach(event -> { - handlerClass.addEvent(generateEventClassSchema(event)); - }); - - return handlerClass; - } - - public static RequestClass generateRequestClassSchema(BusinessRequest businessRequest) { - if (businessRequest == null) return null; - - RequestClass requestClassSchema = new RequestClass(); - requestClassSchema.setId(businessRequest.getId()); - requestClassSchema.setName(businessRequest.getName() + Constants.REQUEST_CLASS_SUFFIX); - businessRequest.getFields().forEach(field -> requestClassSchema.addAttribute(generateClassAttribute(field))); - - return requestClassSchema; - } - - public static ResponseClass generateResponseClassSchema(BusinessResponse businessResponse) { - if (businessResponse == null) return null; - - ResponseClass responseClassSchema = new ResponseClass(); - responseClassSchema.setId(businessResponse.getId()); - responseClassSchema.setName(businessResponse.getName() + Constants.RESPONSE_CLASS_SUFFIX); - businessResponse.getFields().forEach(field -> responseClassSchema.addAttribute(generateClassAttribute(field))); - - return responseClassSchema; - } - - public static EventClass generateEventClassSchema(BusinessEvent businessEvent) { - if (businessEvent == null) return null; - - EventClass eventClassSchema = new EventClass(); - eventClassSchema.setId(businessEvent.getId()); - eventClassSchema.setName(businessEvent.getName() + Constants.EVENT_CLASS_SUFFIX); - eventClassSchema.setEventGroup(businessEvent.getEventGroup()); - businessEvent.getFields().forEach(field -> eventClassSchema.addAttribute(generateClassAttribute(field))); - - return eventClassSchema; - } - - public static Attribute generateClassAttribute(Field field) { - Attribute attribute = new Attribute(); - attribute.setName(field.getName()); - attribute.setArray(field.isArray()); - if (field.getEntity() != null) { - attribute.setType(field.getEntity().getName() + Constants.ENTITY_CLASS_SUFFIX); - attribute.setEntity(true); - } else { - attribute.setType(field.getType()); - attribute.setEntity(false); - } - - return attribute; - } -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/components/Communication.java b/src/main/java/com/grydtech/msstack/modelconverter/components/Communication.java new file mode 100644 index 0000000..df4d216 --- /dev/null +++ b/src/main/java/com/grydtech/msstack/modelconverter/components/Communication.java @@ -0,0 +1,19 @@ +package com.grydtech.msstack.modelconverter.components; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public abstract class Communication extends ModelComponent { + private final List fields = new ArrayList<>(); + + public void addField(Field field) { + this.fields.add(field); + } +} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/components/Contract.java b/src/main/java/com/grydtech/msstack/modelconverter/components/Contract.java new file mode 100644 index 0000000..3e46991 --- /dev/null +++ b/src/main/java/com/grydtech/msstack/modelconverter/components/Contract.java @@ -0,0 +1,49 @@ +package com.grydtech.msstack.modelconverter.components; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.grydtech.msstack.modelconverter.utils.Constants; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.*; + +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public final class Contract extends ModelComponent { + @JsonProperty("type") + private Constants.HANDLER_TYPE type; + @JsonProperty("entity") + private String entityRef; + @JsonProperty("consumes") + private String consumesRef; + @JsonIgnore + private final List producesOnSuccessRefs = new ArrayList<>(); + @JsonIgnore + private final List producesOnErrorRefs = new ArrayList<>(); + + @JsonIgnore + private Entity entity; + @JsonIgnore + private Communication consumes; + @JsonIgnore + private final List producesOnSuccess = new ArrayList<>(); + @JsonIgnore + private final List producesOnError = new ArrayList<>(); + + @JsonProperty("produces") + public void unpackProduces(Map> produces) { + producesOnSuccessRefs.addAll(produces.get("on_success")); + producesOnErrorRefs.addAll(produces.get("on_failure")); + } + + public void addProducesOnSuccess(Communication communication) { + this.producesOnSuccess.add(communication); + } + + public void addProducesOnError(Communication communication) { + this.producesOnError.add(communication); + } +} \ No newline at end of file diff --git a/src/main/java/com/grydtech/msstack/modelconverter/components/Entity.java b/src/main/java/com/grydtech/msstack/modelconverter/components/Entity.java new file mode 100644 index 0000000..042ba68 --- /dev/null +++ b/src/main/java/com/grydtech/msstack/modelconverter/components/Entity.java @@ -0,0 +1,23 @@ +package com.grydtech.msstack.modelconverter.components; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public final class Entity extends ModelComponent { + private List fields; + + @JsonIgnore + private final List events = new ArrayList<>(); + + public void addEvent(Event event) { + this.events.add(event); + } +} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/components/Event.java b/src/main/java/com/grydtech/msstack/modelconverter/components/Event.java new file mode 100644 index 0000000..cd2aab8 --- /dev/null +++ b/src/main/java/com/grydtech/msstack/modelconverter/components/Event.java @@ -0,0 +1,14 @@ +package com.grydtech.msstack.modelconverter.components; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public final class Event extends Communication { + @JsonProperty("entity") + private String entityRef; +} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/components/Field.java b/src/main/java/com/grydtech/msstack/modelconverter/components/Field.java new file mode 100644 index 0000000..071c10d --- /dev/null +++ b/src/main/java/com/grydtech/msstack/modelconverter/components/Field.java @@ -0,0 +1,25 @@ +package com.grydtech.msstack.modelconverter.components; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.grydtech.msstack.modelconverter.utils.Constants; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +public final class Field { + private String name; + @JsonProperty("type") + private String typeRef; + private List constraints; + + @JsonIgnore + private Constants.FIELD_TYPE type; + @JsonIgnore + private Constants.FIELD_MULTIPLICITY multiplicity; + @JsonIgnore + private ModelComponent component; +} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/common/ModelComponent.java b/src/main/java/com/grydtech/msstack/modelconverter/components/ModelComponent.java similarity index 51% rename from src/main/java/com/grydtech/msstack/modelconverter/common/ModelComponent.java rename to src/main/java/com/grydtech/msstack/modelconverter/components/ModelComponent.java index a4ec4be..88d9d77 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/common/ModelComponent.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/components/ModelComponent.java @@ -1,4 +1,4 @@ -package com.grydtech.msstack.modelconverter.common; +package com.grydtech.msstack.modelconverter.components; import lombok.Data; import lombok.NoArgsConstructor; @@ -6,5 +6,6 @@ @Data @NoArgsConstructor public abstract class ModelComponent { - private String id; + private String name; + private String description; } diff --git a/src/main/java/com/grydtech/msstack/modelconverter/common/ModelComponentWrapper.java b/src/main/java/com/grydtech/msstack/modelconverter/components/ModelComponentWrapper.java similarity index 69% rename from src/main/java/com/grydtech/msstack/modelconverter/common/ModelComponentWrapper.java rename to src/main/java/com/grydtech/msstack/modelconverter/components/ModelComponentWrapper.java index b8b0251..0fb44d0 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/common/ModelComponentWrapper.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/components/ModelComponentWrapper.java @@ -1,4 +1,4 @@ -package com.grydtech.msstack.modelconverter.common; +package com.grydtech.msstack.modelconverter.components; public class ModelComponentWrapper { private final T t; @@ -14,7 +14,7 @@ public T unwrap() { @Override public boolean equals(Object ot) { if (ot instanceof ModelComponentWrapper) { - return ((ModelComponentWrapper) ot).t.getId().equals(this.t.getId()); + return ((ModelComponentWrapper) ot).t.getName().equals(this.t.getName()); } else { return false; } @@ -22,6 +22,6 @@ public boolean equals(Object ot) { @Override public int hashCode() { - return t.getId().hashCode(); + return t.getName().hashCode(); } } diff --git a/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/ResponseClass.java b/src/main/java/com/grydtech/msstack/modelconverter/components/Request.java similarity index 53% rename from src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/ResponseClass.java rename to src/main/java/com/grydtech/msstack/modelconverter/components/Request.java index 1d1c8ec..fd0edb6 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/ResponseClass.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/components/Request.java @@ -1,4 +1,4 @@ -package com.grydtech.msstack.modelconverter.microservice.communication; +package com.grydtech.msstack.modelconverter.components; import lombok.Data; import lombok.EqualsAndHashCode; @@ -7,5 +7,5 @@ @EqualsAndHashCode(callSuper = true) @Data @NoArgsConstructor -public final class ResponseClass extends CommunicationClass { +public final class Request extends Communication { } diff --git a/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessResponse.java b/src/main/java/com/grydtech/msstack/modelconverter/components/Response.java similarity index 52% rename from src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessResponse.java rename to src/main/java/com/grydtech/msstack/modelconverter/components/Response.java index 1a3c281..6f69fa8 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/business/communication/BusinessResponse.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/components/Response.java @@ -1,4 +1,4 @@ -package com.grydtech.msstack.modelconverter.business.communication; +package com.grydtech.msstack.modelconverter.components; import lombok.Data; import lombok.EqualsAndHashCode; @@ -7,5 +7,5 @@ @EqualsAndHashCode(callSuper = true) @Data @NoArgsConstructor -public final class BusinessResponse extends BusinessCommunication { +public final class Response extends Communication { } diff --git a/src/main/java/com/grydtech/msstack/modelconverter/microservice/Attribute.java b/src/main/java/com/grydtech/msstack/modelconverter/microservice/Attribute.java deleted file mode 100644 index 43b9e5f..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/microservice/Attribute.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.grydtech.msstack.modelconverter.microservice; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public final class Attribute { - private String name; - private String type; - private boolean entity; - private boolean array; -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/microservice/ClassSchema.java b/src/main/java/com/grydtech/msstack/modelconverter/microservice/ClassSchema.java deleted file mode 100644 index 7debe94..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/microservice/ClassSchema.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.grydtech.msstack.modelconverter.microservice; - -import com.grydtech.msstack.modelconverter.common.ModelComponent; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public abstract class ClassSchema extends ModelComponent { - private String name; -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/microservice/MicroServiceModel.java b/src/main/java/com/grydtech/msstack/modelconverter/microservice/MicroServiceModel.java deleted file mode 100644 index 6eb0819..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/microservice/MicroServiceModel.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.grydtech.msstack.modelconverter.microservice; - -import com.grydtech.msstack.modelconverter.common.Model; -import com.grydtech.msstack.modelconverter.microservice.communication.RequestClass; -import com.grydtech.msstack.modelconverter.microservice.communication.ResponseClass; -import com.grydtech.msstack.modelconverter.microservice.entity.EntityClass; -import com.grydtech.msstack.modelconverter.microservice.communication.EventClass; -import com.grydtech.msstack.modelconverter.microservice.handler.HandlerClass; -import lombok.*; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public class MicroServiceModel extends Model { - private String serviceName; - private final List entityClasses = new ArrayList<>(); - private final List requestClasses = new ArrayList<>(); - private final List responseClasses = new ArrayList<>(); - private final List eventClasses = new ArrayList<>(); - private final List handlerClasses = new ArrayList<>(); - - public void addEntityClass(EntityClass entityClass) { - this.entityClasses.add(entityClass); - } - - public void addEntityClassCollection(Collection entityClasses) { - this.entityClasses.addAll(entityClasses); - } - - public void addRequestClass(RequestClass requestClass) { - this.requestClasses.add(requestClass); - } - - public void addRequestClassCollection(Collection requestClasses) { - this.requestClasses.addAll(requestClasses); - } - - public void addResponseClass(ResponseClass responseClass) { - this.responseClasses.add(responseClass); - } - - public void addResponseClassCollection(Collection responseClasses) { - this.responseClasses.addAll(responseClasses); - } - - public void addEventClass(EventClass eventClass) { - this.eventClasses.add(eventClass); - } - - public void addEventClassCollection(Collection eventClasses) { - this.eventClasses.addAll(eventClasses); - } - - public void addHandlerClass(HandlerClass handler) { - this.handlerClasses.add(handler); - } - - public void addHandlerClassCollection(Collection handlers) { - this.handlerClasses.addAll(handlers); - } -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/CommunicationClass.java b/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/CommunicationClass.java deleted file mode 100644 index 32a623c..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/CommunicationClass.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.grydtech.msstack.modelconverter.microservice.communication; - -import com.grydtech.msstack.modelconverter.microservice.Attribute; -import com.grydtech.msstack.modelconverter.microservice.ClassSchema; -import lombok.*; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public abstract class CommunicationClass extends ClassSchema { - private final List attributes = new ArrayList<>(); - - public void addAttribute(Attribute attribute) { - this.attributes.add(attribute); - } - - public void addAttributeCollection(Collection attributes) { - this.attributes.addAll(attributes); - } -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/EventClass.java b/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/EventClass.java deleted file mode 100644 index bc918d0..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/EventClass.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.grydtech.msstack.modelconverter.microservice.communication; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public final class EventClass extends CommunicationClass { - private String eventGroup; -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/RequestClass.java b/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/RequestClass.java deleted file mode 100644 index 620cc14..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/microservice/communication/RequestClass.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.grydtech.msstack.modelconverter.microservice.communication; - -import lombok.*; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public final class RequestClass extends CommunicationClass { -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/microservice/entity/EntityClass.java b/src/main/java/com/grydtech/msstack/modelconverter/microservice/entity/EntityClass.java deleted file mode 100644 index 509d67d..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/microservice/entity/EntityClass.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.grydtech.msstack.modelconverter.microservice.entity; - -import com.grydtech.msstack.modelconverter.microservice.Attribute; -import com.grydtech.msstack.modelconverter.microservice.ClassSchema; -import com.grydtech.msstack.modelconverter.microservice.communication.EventClass; -import lombok.*; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -public class EntityClass extends ClassSchema { - private boolean mainEntity; - private final List attributes = new ArrayList<>(); - private final List eventClasses = new ArrayList<>(); - - public void addAttribute(Attribute attribute) { - this.attributes.add(attribute); - } - - public void addAttributeCollection(Collection attributes) { - this.attributes.addAll(attributes); - } - - public void addEvent(EventClass event) { - this.eventClasses.add(event); - } - - public void addEventCollection(Collection events) { - this.eventClasses.addAll(events); - } - -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/microservice/handler/HandlerClass.java b/src/main/java/com/grydtech/msstack/modelconverter/microservice/handler/HandlerClass.java deleted file mode 100644 index 9b43331..0000000 --- a/src/main/java/com/grydtech/msstack/modelconverter/microservice/handler/HandlerClass.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.grydtech.msstack.modelconverter.microservice.handler; - -import com.grydtech.msstack.modelconverter.microservice.ClassSchema; -import com.grydtech.msstack.modelconverter.microservice.communication.CommunicationClass; -import com.grydtech.msstack.modelconverter.microservice.communication.EventClass; -import com.grydtech.msstack.modelconverter.microservice.communication.RequestClass; -import com.grydtech.msstack.modelconverter.microservice.communication.ResponseClass; -import lombok.*; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public class HandlerClass extends ClassSchema { - - private String type; - private String endPoint; // when the handler type is event this will be null - private CommunicationClass requestClass; // when the handler type is event this will be EventClass - private CommunicationClass responseClass; // when the handler type is event this will be null - private final List eventClasses = new ArrayList<>(); - - public void addEvent(EventClass event) { - this.eventClasses.add(event); - } - - public void addEventCollection(Collection events) { - this.eventClasses.addAll(events); - } -} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/models/BusinessModel.java b/src/main/java/com/grydtech/msstack/modelconverter/models/BusinessModel.java new file mode 100644 index 0000000..17db9a8 --- /dev/null +++ b/src/main/java/com/grydtech/msstack/modelconverter/models/BusinessModel.java @@ -0,0 +1,42 @@ +package com.grydtech.msstack.modelconverter.models; + +import com.grydtech.msstack.modelconverter.components.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + + +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public final class BusinessModel extends Model { + + private final List entities = new ArrayList<>(); + private final List events = new ArrayList<>(); + private final List requests = new ArrayList<>(); + private final List responses = new ArrayList<>(); + private final List contracts = new ArrayList<>(); + + public void addEntity(Entity entity) { + this.entities.add(entity); + } + + public void addEvent(Event event) { + this.events.add(event); + } + + public void addRequest(Request request) { + this.requests.add(request); + } + + public void addResponse(Response response) { + this.responses.add(response); + } + + public void addContract(Contract contract) { + this.contracts.add(contract); + } +} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/models/MicroServiceModel.java b/src/main/java/com/grydtech/msstack/modelconverter/models/MicroServiceModel.java new file mode 100644 index 0000000..7c34347 --- /dev/null +++ b/src/main/java/com/grydtech/msstack/modelconverter/models/MicroServiceModel.java @@ -0,0 +1,39 @@ +package com.grydtech.msstack.modelconverter.models; + +import com.grydtech.msstack.modelconverter.components.*; +import lombok.*; + +import java.util.ArrayList; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public class MicroServiceModel extends Model { + private String serviceName; + private final List entities = new ArrayList<>(); + private final List events = new ArrayList<>(); + private final List requests = new ArrayList<>(); + private final List responses = new ArrayList<>(); + private final List contracts = new ArrayList<>(); + + public void addEntity(Entity entity) { + this.entities.add(entity); + } + + public void addRequest(Request request) { + this.requests.add(request); + } + + public void addResponse(Response response) { + this.responses.add(response); + } + + public void addEvent(Event event) { + this.events.add(event); + } + + public void addContract(Contract contract) { + this.contracts.add(contract); + } +} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/common/Model.java b/src/main/java/com/grydtech/msstack/modelconverter/models/Model.java similarity index 56% rename from src/main/java/com/grydtech/msstack/modelconverter/common/Model.java rename to src/main/java/com/grydtech/msstack/modelconverter/models/Model.java index e7878cc..8ac2b85 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/common/Model.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/models/Model.java @@ -1,4 +1,4 @@ -package com.grydtech.msstack.modelconverter.common; +package com.grydtech.msstack.modelconverter.models; import lombok.Data; import lombok.NoArgsConstructor; @@ -6,5 +6,5 @@ @Data @NoArgsConstructor public abstract class Model { - private String version; + private String schemaVersion; } diff --git a/src/main/java/com/grydtech/msstack/modelconverter/services/ModelConverter.java b/src/main/java/com/grydtech/msstack/modelconverter/services/ModelConverter.java index 0368870..9e61b05 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/services/ModelConverter.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/services/ModelConverter.java @@ -1,7 +1,7 @@ package com.grydtech.msstack.modelconverter.services; -import com.grydtech.msstack.modelconverter.business.BusinessModel; -import com.grydtech.msstack.modelconverter.microservice.MicroServiceModel; +import com.grydtech.msstack.modelconverter.models.BusinessModel; +import com.grydtech.msstack.modelconverter.models.MicroServiceModel; import java.util.List; diff --git a/src/main/java/com/grydtech/msstack/modelconverter/services/ModelReader.java b/src/main/java/com/grydtech/msstack/modelconverter/services/ModelReader.java index dc3099b..189ebc6 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/services/ModelReader.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/services/ModelReader.java @@ -1,7 +1,7 @@ package com.grydtech.msstack.modelconverter.services; -import com.grydtech.msstack.modelconverter.business.BusinessModel; -import com.grydtech.msstack.modelconverter.microservice.MicroServiceModel; +import com.grydtech.msstack.modelconverter.models.BusinessModel; +import com.grydtech.msstack.modelconverter.models.MicroServiceModel; import java.io.File; diff --git a/src/main/java/com/grydtech/msstack/modelconverter/services/ModelWriter.java b/src/main/java/com/grydtech/msstack/modelconverter/services/ModelWriter.java index 15d466c..e82e54d 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/services/ModelWriter.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/services/ModelWriter.java @@ -1,6 +1,6 @@ package com.grydtech.msstack.modelconverter.services; -import com.grydtech.msstack.modelconverter.common.Model; +import com.grydtech.msstack.modelconverter.models.Model; import java.io.File; diff --git a/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelConverter.java b/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelConverter.java index 7897d8c..22023ba 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelConverter.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelConverter.java @@ -1,17 +1,15 @@ package com.grydtech.msstack.modelconverter.services.impl; -import com.grydtech.msstack.modelconverter.business.BusinessModel; -import com.grydtech.msstack.modelconverter.business.communication.BusinessEvent; -import com.grydtech.msstack.modelconverter.business.communication.BusinessRequest; -import com.grydtech.msstack.modelconverter.business.communication.BusinessResponse; -import com.grydtech.msstack.modelconverter.business.contract.BusinessContract; -import com.grydtech.msstack.modelconverter.business.entity.BusinessEntity; -import com.grydtech.msstack.modelconverter.business.server.BusinessServer; -import com.grydtech.msstack.modelconverter.common.Constants; -import com.grydtech.msstack.modelconverter.common.ModelComponentWrapper; -import com.grydtech.msstack.modelconverter.microservice.MicroServiceModel; +import com.grydtech.msstack.modelconverter.models.BusinessModel; +import com.grydtech.msstack.modelconverter.components.Event; +import com.grydtech.msstack.modelconverter.components.Request; +import com.grydtech.msstack.modelconverter.components.Response; +import com.grydtech.msstack.modelconverter.components.Contract; +import com.grydtech.msstack.modelconverter.components.Entity; +import com.grydtech.msstack.modelconverter.components.ModelComponentWrapper; +import com.grydtech.msstack.modelconverter.models.MicroServiceModel; import com.grydtech.msstack.modelconverter.services.ModelConverter; -import com.grydtech.msstack.modelconverter.common.ModelConverterUtil; +import com.grydtech.msstack.modelconverter.utils.Helpers; import java.util.*; @@ -20,79 +18,72 @@ public class DefaultModelConverter implements ModelConverter { @Override public List convertToMicroServiceModel(BusinessModel businessModel) { final List microServiceModels = new ArrayList<>(); - businessModel.getServers().forEach(businessServer -> { - microServiceModels.add(generateMicroServiceModel(businessServer, businessModel.getVersion())); + groupContractsByEntity(businessModel.getContracts()).forEach((name, contracts) -> { + microServiceModels.add(generateMicroServiceModel(contracts, businessModel.getSchemaVersion())); }); return microServiceModels; } - private MicroServiceModel generateMicroServiceModel(BusinessServer businessServer, String version) { + private MicroServiceModel generateMicroServiceModel(List contracts, String schemaVersion) { final MicroServiceModel microServiceModel = new MicroServiceModel(); - microServiceModel.setServiceName(businessServer.getName() + Constants.SERVICE_SUFFIX); - microServiceModel.setVersion(version); + microServiceModel.setServiceName(contracts.get(0).getEntity().getName()); + microServiceModel.setSchemaVersion(schemaVersion); - final Collection contracts = new ArrayList<>(); - final Collection entities = new ArrayList<>(); - final Collection requests = new ArrayList<>(); - final Collection responses = new ArrayList<>(); + final Collection baseEntities = new ArrayList<>(); + baseEntities.add(contracts.get(0).getEntity()); - businessServer.getContracts().forEach(businessContract -> { - contracts.add(businessContract); - entities.add(businessContract.getEntity()); + final Collection entities = Helpers.extractEntities(baseEntities); + final Collection events = Helpers.extractEvents(entities, contracts); + final Collection requests = Helpers.extractRequests(contracts); + final Collection responses = Helpers.extractResponses(contracts); - if (!businessContract.getHandler().getType().equals(Constants.EVENT_HANDLER_TYPE)) { - requests.add((BusinessRequest) businessContract.getRequest()); - responses.add((BusinessResponse) businessContract.getResponse()); - } - }); - - final Collection extractedEntities = ModelConverterUtil.extractEntities(entities); - final Collection extractedEvents = ModelConverterUtil.extractEvents(entities, contracts); - - contracts.stream() + entities.stream() .map(ModelComponentWrapper::new) .distinct() .map(ModelComponentWrapper::unwrap) - .forEach(businessContract -> { - microServiceModel.addHandlerClass(ModelConverterUtil.generateHandlerClassSchema(businessContract)); - }); + .forEach(microServiceModel::addEntity); - requests.stream() + events.stream() .map(ModelComponentWrapper::new) .distinct() .map(ModelComponentWrapper::unwrap) - .forEach(request -> { - microServiceModel.addRequestClass(ModelConverterUtil.generateRequestClassSchema(request)); - }); + .forEach(microServiceModel::addEvent); - responses.stream() + requests.stream() .map(ModelComponentWrapper::new) .distinct() .map(ModelComponentWrapper::unwrap) - .forEach(response -> { - microServiceModel.addResponseClass(ModelConverterUtil.generateResponseClassSchema(response)); - }); + .forEach(microServiceModel::addRequest); - extractedEntities.stream() + responses.stream() .map(ModelComponentWrapper::new) .distinct() .map(ModelComponentWrapper::unwrap) - .forEach(businessEntity -> { - if (entities.contains(businessEntity)) { - microServiceModel.addEntityClass(ModelConverterUtil.generateEntityClassSchema(businessEntity, true)); - } else { - microServiceModel.addEntityClass(ModelConverterUtil.generateEntityClassSchema(businessEntity, false)); - } - }); - - extractedEvents.stream() + .forEach(microServiceModel::addResponse); + + contracts.stream() .map(ModelComponentWrapper::new) .distinct() .map(ModelComponentWrapper::unwrap) - .forEach(event -> { - microServiceModel.addEventClass(ModelConverterUtil.generateEventClassSchema(event)); - }); + .forEach(microServiceModel::addContract); + return microServiceModel; } + + private static Map> groupContractsByEntity(List contracts) { + final Map> groups = new HashMap<>(); + + contracts.forEach(contract -> { + if (groups.containsKey(contract.getEntity().getName())) { + groups.get(contract.getEntity().getName()).add(contract); + } else { + List cs = new ArrayList<>(); + cs.add(contract); + groups.put(contract.getEntity().getName(), cs); + } + }); + + return groups; + } } diff --git a/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelReader.java b/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelReader.java index 214012d..38e8c9c 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelReader.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelReader.java @@ -3,15 +3,11 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; -import com.grydtech.msstack.modelconverter.business.contract.BusinessContract; -import com.grydtech.msstack.modelconverter.business.communication.BusinessEvent; -import com.grydtech.msstack.modelconverter.business.entity.BusinessEntity; -import com.grydtech.msstack.modelconverter.business.BusinessModel; -import com.grydtech.msstack.modelconverter.business.communication.BusinessRequest; -import com.grydtech.msstack.modelconverter.business.communication.BusinessResponse; -import com.grydtech.msstack.modelconverter.common.Constants; -import com.grydtech.msstack.modelconverter.microservice.MicroServiceModel; +import com.grydtech.msstack.modelconverter.components.*; +import com.grydtech.msstack.modelconverter.models.BusinessModel; +import com.grydtech.msstack.modelconverter.models.MicroServiceModel; import com.grydtech.msstack.modelconverter.services.ModelReader; +import com.grydtech.msstack.modelconverter.utils.Helpers; import java.io.File; import java.io.IOException; @@ -36,60 +32,42 @@ public BusinessModel readBusinessModel(File file) { e.printStackTrace(); } - final Map entityMap = new HashMap<>(); - final Map requestMap = new HashMap<>(); - final Map responseMap = new HashMap<>(); - final Map contractMap = new HashMap<>(); - final Map eventMap = new HashMap<>(); + final Map entityMap = new HashMap<>(); + final Map requestMap = new HashMap<>(); + final Map responseMap = new HashMap<>(); + final Map eventMap = new HashMap<>(); assert businessModel != null; - businessModel.getEntities().forEach(businessEntity -> { - entityMap.put(businessEntity.getId(), businessEntity); - }); + // add all components to hash maps (support further mappings) + businessModel.getEntities().forEach(entity -> entityMap.put(entity.getName(), entity)); + businessModel.getRequests().forEach(request -> requestMap.put(request.getName(), request)); + businessModel.getResponses().forEach(response -> responseMap.put(response.getName(), response)); + businessModel.getEvents().forEach(event -> eventMap.put(event.getName(), event)); - entityMap.values().forEach(businessEntity -> { - businessEntity.getFields().stream().filter(field -> !Constants.BASE_TYPES.contains(field.getType())).forEach(field -> field.setEntity(entityMap.get(field.getType()))); + // inject field properties + entityMap.values().forEach(entity -> { + entity.getFields().forEach(field -> Helpers.fillFieldProperties(entityMap, requestMap, responseMap, eventMap, field)); }); - - businessModel.getRequests().forEach(request -> { - request.getFields().stream().filter(field -> !Constants.BASE_TYPES.contains(field.getType())).forEach(field -> field.setEntity(entityMap.get(field.getType()))); - requestMap.put(request.getId(), request); + eventMap.values().forEach(event -> { + event.getFields().forEach(field -> Helpers.fillFieldProperties(entityMap, requestMap, responseMap, eventMap, field)); }); - - businessModel.getResponses().forEach(response -> { - response.getFields().stream().filter(field -> !Constants.BASE_TYPES.contains(field.getType())).forEach(field -> field.setEntity(entityMap.get(field.getType()))); - responseMap.put(response.getId(), response); + requestMap.values().forEach(request -> { + request.getFields().forEach(field -> Helpers.fillFieldProperties(entityMap, requestMap, responseMap, eventMap, field)); }); - - businessModel.getEvents().forEach(event -> { - event.getFields().stream().filter(field -> !Constants.BASE_TYPES.contains(field.getType())).forEach(field -> field.setEntity(entityMap.get(field.getType()))); - BusinessEntity entity = entityMap.get(event.getEntityId()); - event.setEventGroup(entity.getName()); - entity.addEvent(event); - eventMap.put(event.getId(), event); + responseMap.values().forEach(response -> { + response.getFields().forEach(field -> Helpers.fillFieldProperties(entityMap, requestMap, responseMap, eventMap, field)); }); - businessModel.getContracts().forEach(businessContract -> { - businessContract.setEntity(entityMap.get(businessContract.getEntityId())); - - if (businessContract.getHandler().getType().equals(Constants.EVENT_HANDLER_TYPE)) { - businessContract.setRequest(eventMap.get(businessContract.getRequestId())); - } else { - businessContract.setRequest(requestMap.get(businessContract.getRequestId())); - businessContract.setResponse(responseMap.get(businessContract.getResponseId())); - } - - businessContract.getEventIds().forEach(id -> { - businessContract.addEvent(eventMap.get(id)); - }); - contractMap.put(businessContract.getId(), businessContract); - }); + // add events inside entity + eventMap.values().forEach(event -> entityMap.get(Helpers.extractName(event.getEntityRef())).addEvent(event)); - businessModel.getServers().forEach(businessServer -> { - businessServer.getContractIds().forEach(id -> { - businessServer.addContract(contractMap.get(id)); - }); + // inject contract properties + businessModel.getContracts().forEach(contract -> { + contract.setEntity(entityMap.get(Helpers.extractName(contract.getEntityRef()))); + contract.setConsumes(Helpers.getCommunicationObject(requestMap, responseMap, eventMap, contract.getConsumesRef())); + contract.getProducesOnSuccessRefs().forEach(ref -> contract.addProducesOnSuccess(Helpers.getCommunicationObject(requestMap, responseMap, eventMap, ref))); + contract.getProducesOnErrorRefs().forEach(ref -> contract.addProducesOnError(Helpers.getCommunicationObject(requestMap, responseMap, eventMap, ref))); }); return businessModel; diff --git a/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelWriter.java b/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelWriter.java index e6eb04c..75503a6 100644 --- a/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelWriter.java +++ b/src/main/java/com/grydtech/msstack/modelconverter/services/impl/DefaultModelWriter.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; -import com.grydtech.msstack.modelconverter.common.Model; +import com.grydtech.msstack.modelconverter.models.Model; import com.grydtech.msstack.modelconverter.services.ModelWriter; import java.io.File; diff --git a/src/main/java/com/grydtech/msstack/modelconverter/utils/Constants.java b/src/main/java/com/grydtech/msstack/modelconverter/utils/Constants.java new file mode 100644 index 0000000..dfc8a55 --- /dev/null +++ b/src/main/java/com/grydtech/msstack/modelconverter/utils/Constants.java @@ -0,0 +1,29 @@ +package com.grydtech.msstack.modelconverter.utils; + +public class Constants { + public enum HANDLER_TYPE { + COMMAND, + QUERY, + EVENT + } + + public enum FIELD_TYPE { + PRIMARY, + ENTITY, + EVENT, + REQUEST, + RESPONSE + } + + public enum FIELD_MULTIPLICITY { + ONE, + MANY + } + + public enum CONSTRAINT { + PRIMARY_KEY, + AUTO_GENERATED, + UNIQUE, + NOT_NULL + } +} diff --git a/src/main/java/com/grydtech/msstack/modelconverter/utils/Helpers.java b/src/main/java/com/grydtech/msstack/modelconverter/utils/Helpers.java new file mode 100644 index 0000000..df862e9 --- /dev/null +++ b/src/main/java/com/grydtech/msstack/modelconverter/utils/Helpers.java @@ -0,0 +1,136 @@ +package com.grydtech.msstack.modelconverter.utils; + +import com.grydtech.msstack.modelconverter.components.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class Helpers { + + private Helpers() { + } + + public static Collection extractEntities(Collection baseEntities) { + final List entities = new ArrayList<>(baseEntities); + + for (int i = 0; i < entities.size(); i++) { + Entity entity = entities.get(i); + entity.getFields().stream().filter(field -> field.getType() == Constants.FIELD_TYPE.ENTITY).forEach(field -> entities.add((Entity) field.getComponent())); + } + + return entities; + } + + public static Collection extractEvents(Collection entities, Collection contracts) { + final List events = new ArrayList<>(); + + entities.forEach(businessEntity -> { + events.addAll(businessEntity.getEvents()); + }); + + contracts.forEach(contract -> { + if (contract.getConsumes() instanceof Event) events.add((Event) contract.getConsumes()); + contract.getProducesOnSuccess().stream().filter(p -> p instanceof Event).forEach(p -> events.add((Event) p)); + contract.getProducesOnError().stream().filter(p -> p instanceof Event).forEach(p -> events.add((Event) p)); + }); + + return events; + } + + public static Collection extractRequests(Collection contracts) { + final List requests = new ArrayList<>(); + + contracts + .stream() + .filter(contract -> contract.getConsumes() instanceof Request) + .map(Contract::getConsumes) + .forEach(request -> requests.add((Request) request)); + + return requests; + } + + public static Collection extractResponses(Collection contracts) { + final List responses = new ArrayList<>(); + + contracts.forEach(contract -> { + contract.getProducesOnSuccess() + .stream() + .filter(produces -> produces instanceof Response) + .forEach(response -> responses.add((Response) response)); + + contract.getProducesOnError() + .stream() + .filter(produces -> produces instanceof Response) + .forEach(response -> responses.add((Response) response)); + }); + + return responses; + } + + public static Constants.FIELD_MULTIPLICITY extractMultiplicity(String ref) { + if (ref.contains("list")) { + return Constants.FIELD_MULTIPLICITY.MANY; + } else { + return Constants.FIELD_MULTIPLICITY.ONE; + } + } + + public static Constants.FIELD_TYPE extractType(String ref) { + Pattern pattern = Pattern.compile(":(.*?)#"); + Matcher matcher = pattern.matcher(ref); + + if (!matcher.find()) return Constants.FIELD_TYPE.PRIMARY; + + if ("entities".equals(matcher.group(1))) { + return Constants.FIELD_TYPE.ENTITY; + } else if ("events".equals(matcher.group(1))) { + return Constants.FIELD_TYPE.EVENT; + } else if ("requests".equals(matcher.group(1))) { + return Constants.FIELD_TYPE.REQUEST; + } else if ("responses".equals(matcher.group(1))) { + return Constants.FIELD_TYPE.RESPONSE; + } else { + return Constants.FIELD_TYPE.PRIMARY; + } + } + + public static String extractName(String ref) { + Pattern pattern = Pattern.compile("#(.*?)}"); + Matcher matcher = pattern.matcher(ref); + + if (matcher.find()) { + return matcher.group(1); + } else { + return ref; + } + } + + public static Communication getCommunicationObject(Map requestMap, Map responseMap, Map eventMap, String ref) { + Constants.FIELD_TYPE type = extractType(ref); + + switch (type) { + case REQUEST: return requestMap.get(extractName(ref)); + case RESPONSE: return responseMap.get(extractName(ref)); + case EVENT: return eventMap.get(extractName(ref)); + default: return null; + } + } + + public static void fillFieldProperties(Map entityMap ,Map requestMap, Map responseMap, Map eventMap, Field field) { + field.setType(extractType(field.getTypeRef())); + field.setMultiplicity(extractMultiplicity(field.getTypeRef())); + String componentName = extractName(field.getTypeRef()); + + switch (field.getType()) { + case ENTITY: field.setComponent(entityMap.get(componentName)); break; + case REQUEST: field.setComponent(requestMap.get(componentName)); break; + case RESPONSE: field.setComponent(responseMap.get(componentName)); break; + case EVENT: field.setComponent(eventMap.get(componentName)); break; + default: field.setComponent(null); + } + } +} diff --git a/src/test/java/com/grydtech/msstack/modelconverter/services/DefaultModelReaderTest.java b/src/test/java/com/grydtech/msstack/modelconverter/services/DefaultModelReaderTest.java index 09ae853..9d5b5c9 100644 --- a/src/test/java/com/grydtech/msstack/modelconverter/services/DefaultModelReaderTest.java +++ b/src/test/java/com/grydtech/msstack/modelconverter/services/DefaultModelReaderTest.java @@ -1,7 +1,7 @@ package com.grydtech.msstack.modelconverter.services; -import com.grydtech.msstack.modelconverter.business.BusinessModel; -import com.grydtech.msstack.modelconverter.microservice.MicroServiceModel; +import com.grydtech.msstack.modelconverter.models.BusinessModel; +import com.grydtech.msstack.modelconverter.models.MicroServiceModel; import com.grydtech.msstack.modelconverter.services.impl.DefaultModelConverter; import com.grydtech.msstack.modelconverter.services.impl.DefaultModelReader; import org.junit.Assert; diff --git a/src/test/resources/sample-business-model.json b/src/test/resources/sample-business-model.json index 7a5785a..4a3355d 100644 --- a/src/test/resources/sample-business-model.json +++ b/src/test/resources/sample-business-model.json @@ -1,186 +1,155 @@ { - "version": "0.0.1", + "schema_version": "0.0.3", "entities": [ { - "id": "en1", "name": "item", "fields": [ { "name": "item_code", - "type": "string" + "type": "string", + "constraints": ["NOT_NULL"] }, { "name": "name", - "type": "string" - }, - { - "name": "quantity", - "type": "integer" - }, - { - "name": "unit_price", - "type": "double" - }, - { - "name": "price", - "type": "double" + "type": "string", + "constraints": ["NOT_NULL"] } ] }, { - "id": "en2", "name": "order", "fields": [ { "name": "order_id", - "type": "string" - }, - { - "name": "customer_id", - "type": "string" - }, - { - "name": "payment", - "type": "double" + "type": "string", + "constraints": ["NOT_NULL"] }, { "name": "items", - "type": "en1", - "array": true + "type": "list<{ref:entities#item}>", + "constraints": ["NOT_NULL"] } ] } ], "events": [ { - "id": "ev1", "name": "order_created", - "entity_id": "en2" - }, - { - "id": "ev2", - "name": "order_item_added", - "entity_id": "en2" - }, - { - "id": "ev3", - "name": "order_finalized", - "entity_id": "en2" - }, - { - "id": "ev4", - "name": "item_created", - "entity_id": "en1" - } - ], - "contracts": [ - { - "id": "cn1", - "entity_id": "en2", - "handler": { - "type": "command", - "name": "create_order" - }, - "request_id": "req1", - "response_id": "res1", - "event_ids": [ - "ev1" + "entity": "{ref:entities#order}", + "fields": [ + { + "name": "order_id", + "type": "string" + }, + { + "name": "customer_id", + "type": "string" + } ] }, { - "id": "cn2", - "entity_id": "en2", - "handler": { - "type": "command", - "name": "add_order_item" - }, - "request_id": "req1", - "response_id": "res1", - "event_ids": [ - "ev2" + "name": "order_validated", + "entity": "{ref:entities#order}", + "fields": [ + { + "name": "order_id", + "type": "string" + }, + { + "name": "status", + "type": "string" + } ] }, { - "id": "cn3", - "entity_id": "en2", - "handler": { - "type": "command", - "name": "finalize_order" - }, - "request_id": "req1", - "response_id": "res1", - "event_ids": [ - "ev3" + "name": "order_accepted", + "entity": "{ref:entities#order}", + "fields": [ + { + "name": "order_id", + "type": "string" + } ] }, { - "id": "cn4", - "entity_id": "en1", - "handler": { - "type": "command", - "name": "create_item" - }, - "request_id": "req1", - "response_id": "res1", - "event_ids": [ - "ev4" + "name": "order_rejected", + "entity": "{ref:entities#order}", + "fields": [ + { + "name": "order_id", + "type": "string" + } ] - }, - { - "id": "cn5", - "entity_id": "en2", - "handler": { - "type": "event", - "name": "order_finalized" - }, - "request_id": "ev3", - "event_ids": [] } ], "requests": [ { - "id": "req1", - "name": "generic_command", - "type": "command", - "fields": [] - }, - { - "id": "req2", - "name": "generic_query", - "type": "query", - "fields": [] + "name": "create_order", + "fields": [ + { + "name": "customer_id", + "type": "string" + } + ] } ], "responses": [ { - "id": "res1", - "name": "generic_command", - "fields": [] + "name": "order_accepted", + "fields": [ + { + "name": "order_id", + "type": "string" + } + ] }, { - "id": "res2", - "name": "generic_query", - "fields": [] + "name": "order_rejected", + "fields": [ + { + "name": "order_id", + "type": "string" + }, + { + "name": "message", + "type": "string" + } + ] } ], - "servers": [ + "contracts": [ { - "id": "sv1", - "name": "order", - "contract_ids": [ - "cn1", - "cn2", - "cn3", - "cn5" - ] + "name": "create_order", + "description": "creates an order in pending state", + "entity": "{ref:entities#order}", + "type": "COMMAND", + "consumes": "{ref:requests#create_order}", + "produces": { + "on_success": ["{ref:events#order_created}"], + "on_failure": [] + } }, { - "id": "sv2", - "name": "item", - "contract_ids": [ - "cn4", - "cn5" - ] + "name": "validate_order", + "description": "check if the order is valid", + "entity": "{ref:entities#order}", + "type": "EVENT", + "consumes": "{ref:events#order_created}", + "produces": { + "on_success": ["{ref:events#order_validated}"], + "on_failure": [] + } + }, + { + "name": "finalize_order", + "description": "complete creation of order", + "entity": "{ref:entities#order}", + "type": "EVENT", + "consumes": "{ref:events#order_validated}", + "produces": { + "on_success": ["{ref:events#order_accepted}", "{ref:responses#order_accepted}"], + "on_failure": ["{ref:events#order_rejected}", "{ref:responses#order_rejected}"] + } } ] } \ No newline at end of file