Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions postman_collection.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
import org.dcsa.tnt.transferobjects.EventTO;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import jakarta.transaction.Transactional;

@Service
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,90 @@
package org.dcsa.tnt.service.mapping;

import org.dcsa.tnt.domain.valueobjects.DomainEvent;
import org.dcsa.tnt.domain.valueobjects.EquipmentEvent;
import org.dcsa.tnt.domain.valueobjects.ShipmentEvent;
import org.dcsa.tnt.domain.valueobjects.TransportEvent;
import org.dcsa.tnt.transferobjects.EquipmentEventPayloadTO;
import org.dcsa.tnt.transferobjects.EventMetadataTO;
import org.dcsa.tnt.transferobjects.EventTO;
import org.dcsa.tnt.transferobjects.ShipmentEventPayloadTO;
import org.dcsa.tnt.transferobjects.TransportEventPayloadTO;
import org.dcsa.skernel.infrastructure.transferobject.AddressTO;
import org.dcsa.tnt.domain.valueobjects.*;
import org.dcsa.tnt.transferobjects.*;
import org.dcsa.tnt.transferobjects.enums.LocationType;
import org.mapstruct.Mapper;

@Mapper(componentModel = "spring")
public abstract class EventMapper {
public EventTO toDTO(DomainEvent event) {
return EventTO.builder()
.metadata(toMetadataTO(event))
.payload(switch (event.getEventType()) {
case EQUIPMENT -> toEquipmentEventPayloadTO((EquipmentEvent) event);
case SHIPMENT -> toShipmentEventPayloadTO((ShipmentEvent) event);
case TRANSPORT -> toTransportEventPayloadTO((TransportEvent) event);
})
.build();
.metadata(toMetadataTO(event))
.payload(
switch (event.getEventType()) {
case EQUIPMENT -> toEquipmentEventPayloadTO((EquipmentEvent) event);
case SHIPMENT -> toShipmentEventPayloadTO((ShipmentEvent) event);
case TRANSPORT -> toTransportEventPayloadTO((TransportEvent) event);
})
.build();
}

protected abstract EventMetadataTO toMetadataTO(DomainEvent event);

protected abstract EquipmentEventPayloadTO toEquipmentEventPayloadTO(EquipmentEvent event);

protected abstract ShipmentEventPayloadTO toShipmentEventPayloadTO(ShipmentEvent event);

protected abstract TransportEventPayloadTO toTransportEventPayloadTO(TransportEvent event);

protected LocationTO locationToLocationTO(Location location) {

LocationTO loc = null;

if (null != location) {

if (null != location.facilityCode()) {
loc =
FacilityLocationTO.builder()
.locationName(location.locationName())
.locationType(LocationType.FACI)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use the locationType to switch on? The purpose of the locationType is to be used as a discriminator..

.unLocationCode(location.UNLocationCode())
.facilityCode(location.facilityCode())
.facilityCodeListProvider(location.facilityCodeListProvider())
.build();

} else if (null != location.address()) {

Address address = location.address();

return AddressLocationTO.builder()
.locationName(location.locationName())
.locationType(LocationType.ADDR)
.address(
AddressTO.builder()
.name(address.name())
.street(address.street())
.streetNumber(address.streetNumber())
.floor(address.floor())
.postCode(address.postCode())
.city(address.city())
.stateRegion(address.stateRegion())
.country(address.country())
.build())
.build();

} else if (null != location.latitude() && null != location.longitude()) {

loc =
GeoLocationTO.builder()
.locationName(location.locationName())
.locationType(LocationType.GEOL)
.latitude(location.latitude())
.longitude(location.longitude())
.build();

} else {

loc =
UnLocationLocationTO.builder()
.locationName(location.locationName())
.locationType(LocationType.UNLO)
.unLocationCode(location.UNLocationCode())
.build();
}
}

return loc;
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
package org.dcsa.tnt.service.unofficial;

import org.dcsa.skernel.errors.exceptions.ConcreteRequestErrorMessageException;
import org.dcsa.tnt.domain.valueobjects.DomainEvent;
import org.dcsa.tnt.domain.valueobjects.EquipmentEvent;
import org.dcsa.tnt.domain.valueobjects.RetractedEvent;
import org.dcsa.tnt.domain.valueobjects.ShipmentEvent;
import org.dcsa.tnt.domain.valueobjects.TransportEvent;
import org.dcsa.tnt.transferobjects.EquipmentEventPayloadTO;
import org.dcsa.tnt.transferobjects.EventMetadataTO;
import org.dcsa.tnt.transferobjects.EventTO;
import org.dcsa.tnt.transferobjects.ShipmentEventPayloadTO;
import org.dcsa.tnt.transferobjects.TransportEventPayloadTO;
import org.dcsa.skernel.infrastructure.transferobject.AddressTO;
import org.dcsa.tnt.domain.valueobjects.*;
import org.dcsa.tnt.transferobjects.*;
import org.mapstruct.Mapper;

@Mapper(componentModel = "spring")
Expand All @@ -29,8 +22,59 @@ public DomainEvent toDomain(EventTO eventTO) {
}
}

protected abstract EquipmentEvent toEquipmentEvent(EventMetadataTO metadata, EquipmentEventPayloadTO payload);
protected abstract TransportEvent toTransportEvent(EventMetadataTO metadata, TransportEventPayloadTO payload);
protected abstract ShipmentEvent toShipmentEvent(EventMetadataTO metadata, ShipmentEventPayloadTO payload);
protected abstract EquipmentEvent toEquipmentEvent(
EventMetadataTO metadata, EquipmentEventPayloadTO payload);

protected abstract TransportEvent toTransportEvent(
EventMetadataTO metadata, TransportEventPayloadTO payload);

protected abstract ShipmentEvent toShipmentEvent(
EventMetadataTO metadata, ShipmentEventPayloadTO payload);

protected abstract RetractedEvent toRetractedEvent(EventMetadataTO metadata);

protected Location locationTOToLocation(LocationTO locationTO) {

if (locationTO == null) {
return null;
}

Location.LocationBuilder location = Location.builder();

location.locationName(locationTO.getLocationName());

if (locationTO instanceof UnLocationLocationTO unLocationLocationTO) {

location.UNLocationCode(unLocationLocationTO.getUnLocationCode());

} else if (locationTO instanceof FacilityLocationTO facilityLocationTO) {

location.UNLocationCode(facilityLocationTO.getUnLocationCode())
.facilityCode(facilityLocationTO.getFacilityCode())
.facilityCodeListProvider(facilityLocationTO.getFacilityCodeListProvider());
} else if (locationTO instanceof AddressLocationTO addressLocationTO) {

AddressTO address = addressLocationTO.getAddress();
location.address(
Address.builder()
.name(address.name())
.street(address.street())
.streetNumber(address.streetNumber())
.floor(address.floor())
.postCode(address.postCode())
.city(address.city())
.stateRegion(address.stateRegion())
.country(address.country())
.build());

} else if (locationTO instanceof GeoLocationTO geoLocationTO) {

location.latitude(geoLocationTO.getLatitude()).longitude(geoLocationTO.getLongitude());
} else {

throw new RuntimeException("Invalid location instance.");
}

return location.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
import org.dcsa.tnt.transferobjects.EventPayloadTO;
import org.dcsa.tnt.transferobjects.EventTO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import jakarta.transaction.Transactional;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Objects;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.dcsa.tnt.transferobjects;

import lombok.*;
import lombok.experimental.SuperBuilder;
import org.dcsa.skernel.infrastructure.transferobject.AddressTO;

@Data
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public final class AddressLocationTO extends LocationTO {
private AddressTO address;
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.SuperBuilder;
import org.dcsa.skernel.infrastructure.transferobject.LocationTO;
import org.dcsa.tnt.transferobjects.EventPayloadTO.EventPayloadTOWithTransportCall;
import org.dcsa.tnt.transferobjects.enums.EmptyIndicatorCode;
import org.dcsa.tnt.transferobjects.enums.EquipmentEventTypeCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.dcsa.tnt.transferobjects;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Size;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.dcsa.skernel.infrastructure.transferobject.enums.FacilityCodeListProvider;

@Data
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public final class FacilityLocationTO extends LocationTO {
@JsonProperty("UNLocationCode")
@Size(max = 5)
private String unLocationCode;

@Size(max = 6)
private String facilityCode;

private FacilityCodeListProvider facilityCodeListProvider;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.dcsa.tnt.transferobjects;

import jakarta.validation.constraints.Size;
import lombok.*;
import lombok.experimental.SuperBuilder;

@Data
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public final class GeoLocationTO extends LocationTO {
@Size(max = 11)
private String latitude;

@Size(max = 11)
private String longitude;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.dcsa.tnt.transferobjects;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.dcsa.tnt.transferobjects.enums.LocationType;

@JsonDeserialize(using = LocationTODeserializer.class)
@Data
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public abstract sealed class LocationTO
permits UnLocationLocationTO, FacilityLocationTO, AddressLocationTO, GeoLocationTO {
@Size(max = 100)
private String locationName;

private LocationType locationType;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.dcsa.tnt.transferobjects;

import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
import org.dcsa.skernel.infrastructure.transferobject.AddressTO;
import org.dcsa.skernel.infrastructure.transferobject.enums.FacilityCodeListProvider;
import org.dcsa.tnt.transferobjects.enums.LocationType;


// Had to use a custom deserializer as the @JsonTypeInfo(use = Id.DEDUCTION) did not work.
public class LocationTODeserializer extends JsonDeserializer<LocationTO> {
@Override
public LocationTO deserialize(
JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JacksonException {
JsonNode node = jsonParser.readValueAsTree();
String locationType = node.get("locationType").asText();
String locationName = node.get("locationName").asText("");

return switch (locationType) {
case "UNLO" -> UnLocationLocationTO.builder()
.locationName(locationName)
.locationType(LocationType.UNLO)
.unLocationCode(node.get("UNLocationCode").asText(""))
.build();
case "FACI" -> FacilityLocationTO.builder()
.locationName(locationName)
.locationType(LocationType.FACI)
.unLocationCode(node.get("UNLocationCode").asText(""))
.facilityCode(node.get("facilityCode").asText(""))
.facilityCodeListProvider(
FacilityCodeListProvider.valueOf(node.get("facilityCodeListProvider").asText("")))
.build();
case "ADDR" -> {
AddressLocationTO addressLocationTO =
AddressLocationTO.builder()
.locationName(locationName)
.locationType(LocationType.ADDR)
.build();

if (node.hasNonNull("address")) {
JsonNode aNode = node.get("address");
yield addressLocationTO.toBuilder()
.address(
AddressTO.builder()
.name(aNode.get("name").asText(""))
.street(aNode.get("street").asText(""))
.streetNumber(aNode.get("streetNumber").asText(""))
.floor(aNode.get("floor").asText(""))
.postCode(aNode.get("postCode").asText(""))
.city(aNode.get("city").asText(""))
.stateRegion(aNode.get("stateRegion").asText(""))
.country(aNode.get("country").asText(""))
.build())
.build();
} else {
yield addressLocationTO;
}
}
case "GEOL" -> GeoLocationTO.builder()
.locationName(locationName)
.locationType(LocationType.GEOL)
.latitude(node.get("latitude").asText(""))
.longitude(node.get("longitude").asText(""))
.build();
default -> throw new RuntimeException("Invalid location instance.");
};
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.dcsa.tnt.transferobjects;

import lombok.Builder;
import org.dcsa.skernel.infrastructure.transferobject.LocationTO;

import org.dcsa.tnt.transferobjects.enums.FacilityTypeCode;

public record TransportCallTO(
Expand Down
Loading