aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristof Rabensteiner <christof.rabensteiner@iaik.tugraz.at>2019-07-16 16:53:41 +0200
committerChristof Rabensteiner <christof.rabensteiner@iaik.tugraz.at>2019-07-16 16:53:41 +0200
commit896195cc9b287a3f41008cc85997b9c2209120b8 (patch)
tree09d4e4f0ef965a369c2dce03363e09593ca5bbc7 /src
parent8f3b805a558c4ed454db2b691032cea800d7b6dd (diff)
downloadmoa-zs-896195cc9b287a3f41008cc85997b9c2209120b8.tar.gz
moa-zs-896195cc9b287a3f41008cc85997b9c2209120b8.tar.bz2
moa-zs-896195cc9b287a3f41008cc85997b9c2209120b8.zip
DeliveryNotification: Change Mzs Schema, Convert From Msg to Mzs
Mzs Schema Changes: - Formerly: The mzs:DeliveryNotificationType is a choice between Success And Error; Change: Wrap choice in a sequence. Reason: msg 2.0.0 adds fields that fit best in this sequence. Adding new fields to Success or Error duplicates code, whereas adding it to the base type (which is MessageType) also affects mzs:DeliveryRequestStatus. - Add msg:SenderDetails, ReceiverDetails, user, AdditionalFormat, NotificationsPerformed; Reason: It was added to zusemsg 2.0.0.
Diffstat (limited to 'src')
-rw-r--r--src/main/java/at/gv/egiz/moazs/scheme/Msg2MzsConverter.java102
-rw-r--r--src/main/resources/mzs/app2mzs.xsd23
2 files changed, 113 insertions, 12 deletions
diff --git a/src/main/java/at/gv/egiz/moazs/scheme/Msg2MzsConverter.java b/src/main/java/at/gv/egiz/moazs/scheme/Msg2MzsConverter.java
index 271cf67..65b6425 100644
--- a/src/main/java/at/gv/egiz/moazs/scheme/Msg2MzsConverter.java
+++ b/src/main/java/at/gv/egiz/moazs/scheme/Msg2MzsConverter.java
@@ -1,21 +1,38 @@
package at.gv.egiz.moazs.scheme;
+import at.gv.zustellung.app2mzs.xsd.DeliveryNotificationType;
import at.gv.zustellung.app2mzs.xsd.*;
-import at.gv.zustellung.msg.xsd.DeliveryAnswerType;
-import at.gv.zustellung.msg.xsd.DeliveryRequestStatusType;
+import at.gv.zustellung.msg.xsd.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
+import javax.xml.bind.JAXBElement;
import java.math.BigInteger;
+import java.util.List;
import java.util.Optional;
+import static at.gv.egiz.moazs.MoaZSException.moaZSException;
+import static at.gv.zustellung.app2mzs.xsd.DeliveryNotificationType.AdditionalFormat.additionalFormatBuilder;
+import static at.gv.zustellung.app2mzs.xsd.DeliveryNotificationType.deliveryNotificationTypeBuilder;
import static at.gv.zustellung.app2mzs.xsd.DeliveryResponseType.deliveryResponseTypeBuilder;
import static at.gv.zustellung.app2mzs.xsd.ErrorType.errorTypeBuilder;
import static at.gv.zustellung.app2mzs.xsd.PartialSuccessType.partialSuccessTypeBuilder;
import static at.gv.zustellung.app2mzs.xsd.SuccessType.successTypeBuilder;
+import static java.util.stream.Collectors.toList;
@Component
public class Msg2MzsConverter {
+ private static final Logger log = LoggerFactory.getLogger(Msg2MzsConverter.class);
+
+ private static final String ANSWERS_MISSING_ERROR_MSG = "msg:DeliveryNotification contains no msg:Answer elements" +
+ " and cannot be converted to mzs:DeliveryNotification.";
+ private static final String UNKNOWN_ANSWER_ERROR_MSG = "msg:DeliveryNotification/msg:Answer is of unknown type" +
+ " and cannot be converted.";
+ private static final String TOO_MANY_ANSWERS_MSG = "msg:DeliveryNotification contains more msg:Answer elements than" +
+ " expected. All answers except the first one will be ignored.";
+
public DeliveryResponseType convert(DeliveryRequestStatusType status, Optional<byte[]> signedStatus) {
var responseBuilder = deliveryResponseTypeBuilder();
@@ -31,12 +48,6 @@ public class Msg2MzsConverter {
return responseBuilder.build();
}
- public DeliveryNotificationType convert(at.gv.zustellung.msg.xsd.DeliveryNotificationType notificatione, Optional<byte[]> signedStatus) {
- //TODO
- return null;
- }
-
-
private SuccessType convert(DeliveryRequestStatusType.Success success, Optional<byte[]> signedStatus) {
return successTypeBuilder()
.withAppDeliveryID(success.getAppDeliveryID())
@@ -74,5 +85,80 @@ public class Msg2MzsConverter {
return builder.build();
}
+ public DeliveryNotificationType convert(at.gv.zustellung.msg.xsd.DeliveryNotificationType msgNotification,
+ Optional<byte[]> signedNotification) {
+
+ var builder = deliveryNotificationTypeBuilder();
+
+ if (msgNotification.getAnswer().isEmpty()) {
+ throw moaZSException(ANSWERS_MISSING_ERROR_MSG);
+ }
+
+ if (msgNotification.getAnswer().size() > 1) {
+ log.warn(TOO_MANY_ANSWERS_MSG);
+ }
+
+ JAXBElement<? extends AbstractOperationType> answer = msgNotification.getAnswer().get(0);
+
+ if(answer.getValue() instanceof AcceptedType) {
+ var accepted = (AcceptedType) answer.getValue();
+ builder.withSuccess(extractSuccess(msgNotification, signedNotification))
+ .withNotificationsPerformed(accepted.getNotificationsPerformed());
+ } else if(answer.getValue() instanceof DeliveryErrorType) {
+ var error = (DeliveryErrorType) answer.getValue();
+ builder.withError(extractError(msgNotification, error, signedNotification))
+ .withNotificationsPerformed(error.getNotificationsPerformed());
+ } else {
+ throw moaZSException(UNKNOWN_ANSWER_ERROR_MSG);
+ }
+
+ return builder
+ .withSenderDetails(msgNotification.getSenderDetails())
+ .withReceiverDetails(msgNotification.getReceiverDetails())
+ .withUser(msgNotification.getUser())
+ .withAdditionalFormat(convert(msgNotification.getAdditionalFormat()))
+ .build();
+ }
+
+ private ErrorType extractError(at.gv.zustellung.msg.xsd.DeliveryNotificationType msgNotification,
+ DeliveryErrorType error, Optional<byte[]> signedNotification) {
+ return errorTypeBuilder()
+ .withAppDeliveryID(msgNotification.getAppDeliveryID())
+ .withDeliverySystem(msgNotification.getDeliverySystem())
+ .withZSDeliveryID(msgNotification.getZSDeliveryID())
+ .withGZ(msgNotification.getGZ())
+ .withSignedDeliveryRequestStatus(signedNotification.orElse(null))
+ .withCode(new BigInteger(error.getErrorInfo().getCode()))
+ .withText(error.getErrorInfo().getText())
+ .build();
+ }
+
+ private SuccessType extractSuccess(at.gv.zustellung.msg.xsd.DeliveryNotificationType msgNotification,
+ Optional<byte[]> signedNotification) {
+ return successTypeBuilder()
+ .withAppDeliveryID(msgNotification.getAppDeliveryID())
+ .withDeliverySystem(msgNotification.getDeliverySystem())
+ .withZSDeliveryID(msgNotification.getZSDeliveryID())
+ .withGZ(msgNotification.getGZ())
+ .withSignedDeliveryRequestStatus(signedNotification.orElse(null))
+ .withRelayedViaERV(msgNotification.isRelayedViaERV())
+ .withDeliveryTimestamp(msgNotification.getTimestamp())
+ .build();
+ }
+
+ private List<DeliveryNotificationType.AdditionalFormat> convert(
+ List<at.gv.zustellung.msg.xsd.DeliveryNotificationType.AdditionalFormat> additionalFormat) {
+ return additionalFormat.stream()
+ .map(this::convert)
+ .collect(toList());
+ }
+
+ private DeliveryNotificationType.AdditionalFormat convert(
+ at.gv.zustellung.msg.xsd.DeliveryNotificationType.AdditionalFormat format) {
+ return additionalFormatBuilder()
+ .withType(format.getType())
+ .withValue(format.getValue())
+ .build();
+ }
}
diff --git a/src/main/resources/mzs/app2mzs.xsd b/src/main/resources/mzs/app2mzs.xsd
index a2d1bde..da49631 100644
--- a/src/main/resources/mzs/app2mzs.xsd
+++ b/src/main/resources/mzs/app2mzs.xsd
@@ -166,10 +166,25 @@
</xs:annotation>
</xs:element>
<xs:complexType name="DeliveryNotificationType">
- <xs:choice>
- <xs:element ref="Success"/>
- <xs:element ref="Error"/>
- </xs:choice>
+ <xs:sequence>
+ <xs:choice>
+ <xs:element ref="Success"/>
+ <xs:element ref="Error"/>
+ </xs:choice>
+ <xs:element ref="msg:SenderDetails"/>
+ <xs:element ref="msg:ReceiverDetails"/>
+ <xs:element ref="msg:User" minOccurs="0" />
+ <xs:element name="AdditionalFormat" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:base64Binary">
+ <xs:attribute name="Type" type="xs:token" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element ref="msg:NotificationsPerformed" minOccurs="0"/>
+ </xs:sequence>
</xs:complexType>
<xs:element name="DeliveryRequestStatusACK" type="DeliveryNotificationACKType" />
<xs:element name="DeliveryNotificationACK" type="DeliveryNotificationACKType">