diff options
author | Christof Rabensteiner <christof.rabensteiner@iaik.tugraz.at> | 2019-05-08 09:41:37 +0200 |
---|---|---|
committer | Christof Rabensteiner <christof.rabensteiner@iaik.tugraz.at> | 2019-05-08 09:41:37 +0200 |
commit | 1aaec2e6127b9b2261a97749daa15c23f0af7be1 (patch) | |
tree | 1f52ca9d17ae9ff7853a7fbbafa3c179ec022081 /src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java | |
parent | fefde1ad7592412007b9efed2b62cb403d3f6cac (diff) | |
download | moa-zs-1aaec2e6127b9b2261a97749daa15c23f0af7be1.tar.gz moa-zs-1aaec2e6127b9b2261a97749daa15c23f0af7be1.tar.bz2 moa-zs-1aaec2e6127b9b2261a97749daa15c23f0af7be1.zip |
Implement Pipeline Flow and mzs2msg Conversion
- Implement and test conversion from mzs:DeliveryRequest to
msg:DeliveryRequest with the "convert-pojos-by-hand"-strategy.
Reason: The chosen strategy benefits from JAXB's strong typing,
which is useful in this scenario: Differences between msg and mzs
are nuanced and easy to overlook. The chosen strategy is,
unfortunately, verbose and could become expensive to maintain.
- Update SameThreadDeliveryPipeline: Integrate tnvz query, conversion,
and msg query.
- Add MsgClient stub.
tnvz:
- Change TnvzClient stub interface.
- Implement mimetype mismatch check from tnvz Response.
- Put p:Identification from tnvz response into msg:DeliveryRequest.
MZS Schema changes:
- Replace DeliveryRequest/Sender/Person with CorporateBody (because
thats the only sender that is allowed by zusemsg) and add a
SenderProfile choice.
- Add ID Attribute to DeliveryRequest/Sender because
msg/DeliveryRequest/Sender/AbstractSenderPersonType also has an id
attribute.
- Remove PersonDataType because it's dead code.
Diffstat (limited to 'src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java')
-rw-r--r-- | src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java | 76 |
1 files changed, 67 insertions, 9 deletions
diff --git a/src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java b/src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java index b309434..e2b219a 100644 --- a/src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java +++ b/src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java @@ -1,40 +1,98 @@ package at.gv.egiz.moazs.pipeline; +import at.gv.egiz.moazs.MsgClient; +import at.gv.egiz.moazs.Mzs2MsgConverter; import at.gv.egiz.moazs.TnvzClient; import at.gv.egiz.moazs.repository.DeliveryRepository; import at.gv.zustellung.app2mzs.xsd.DeliveryRequestType; +import at.gv.zustellung.msg.xsd.persondata.IdentificationType; +import at.gv.zustellung.tnvz.xsd.PersonResultType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; +import java.util.Collection; +import java.util.List; + +import static java.lang.String.format; +import static java.lang.String.join; +import static java.util.stream.Collectors.toSet; + @Component @Profile("!cluster") public class SameThreadDeliveryPipeline implements DeliveryPipeline { private final DeliveryRepository repository; private final TnvzClient tnvzClient; + private final Mzs2MsgConverter converter; + private final MsgClient msgClient; - public SameThreadDeliveryPipeline(@Autowired DeliveryRepository repository, TnvzClient tnvzClient) { + public SameThreadDeliveryPipeline(@Autowired DeliveryRepository repository, + @Autowired TnvzClient tnvzClient, + @Autowired Mzs2MsgConverter converter, + @Autowired MsgClient msgClient) { this.repository = repository; this.tnvzClient = tnvzClient; + this.converter = converter; + this.msgClient = msgClient; } @Override public void processRequest(String appDeliveryId) { - var request = repository.getDeliveryRequest(appDeliveryId).orElseThrow(); - checkAddressability(request); + var mzsRequest = repository.getDeliveryRequest(appDeliveryId).orElseThrow(); + var msgRequest = (mzsRequest.getConfig().isPerformQueryPersonRequest()) + ? converter.convert(mzsRequest, queryPerson(mzsRequest)) + : converter.convert(mzsRequest); + + var status = msgClient.send(msgRequest); + repository.add(status); + } + + private IdentificationType queryPerson(DeliveryRequestType request) { + var result = tnvzClient.queryPerson(request.getSender(), request.getReceiver()); + + if (result.getError() != null) { + var error = result.getError(); + var info = error.getErrorInfo(); + var noteSent = format("Preadvice note was {0}sent", (error.getPreAdviceNoteSent() != null) ? "" : "not "); + var message = format("Receiver is not addressable. Code: {0} ; Text: {1}; {2}", + info.getCode(), info.getText(), noteSent); + throw new RuntimeException(message); + } + + var mismatchedTypes = findMimeTypeMismatches(result, request); - //store response to repository + if (!mismatchedTypes.isEmpty()) { + var template = "Request contains attachment of type(s) {0}, but receiver only accepts attachments of type(s) {1}"; + var acceptedTypesString = join(",", getAcceptedTypes(result)); + var mismatchedTypesString = join(",", mismatchedTypes); + var message = format(template, mismatchedTypesString, acceptedTypesString); + throw new RuntimeException(message); + } + + return result.getSuccess().getIdentification(); } - private void checkAddressability(DeliveryRequestType request) { - if (request.getConfig().isPerformQueryPersonRequest()) { - if (!tnvzClient.queryPerson(request.getReceiver())) { - throw new RuntimeException("Receiver is not addressable."); - } + private Collection<String> findMimeTypeMismatches(PersonResultType result, DeliveryRequestType request) { + var acceptedTypes = getAcceptedTypes(result); + + if (acceptedTypes.contains("*/*")) { + return List.of(); } + + var typesInRequest = request.getPayload().stream() + .map(payload -> payload.getMIMEType()) + .collect(toSet()); + + typesInRequest.removeAll(acceptedTypes); + + return typesInRequest; + } + + private List<String> getAcceptedTypes(PersonResultType result) { + return result.getSuccess().getMimeTypeList().getMimeType(); } } |