From d9e5864f48d261c06de1f1d34000ff6156155569 Mon Sep 17 00:00:00 2001 From: Christof Rabensteiner Date: Mon, 15 Jul 2019 12:04:26 +0200 Subject: Save Response To File Sink: Add Path to Configuration + Fix - Fix in ConfigUtil: SaveResponseToFile boolean would override LogResponse configuration (Copy Paste Error). --- .../gv/egiz/moazs/backend/MsgResponseBackend.java | 4 +- .../egiz/moazs/backend/SaveResponseToFileSink.java | 14 +++---- .../at/gv/egiz/moazs/preprocess/ConfigUtil.java | 44 +++++++++++++++++++--- src/main/resources/application.yaml | 6 ++- src/main/resources/mzs/app2mzs.xsd | 9 ++++- .../gv/egiz/moazs/SaveResponseToFileSinkTest.java | 4 +- 6 files changed, 61 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java b/src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java index 1b17f34..59db396 100644 --- a/src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java +++ b/src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java @@ -84,8 +84,8 @@ public class MsgResponseBackend implements Consumer { var sinkParams = getSinkParams(msgResponse); - if (sinkParams.isSafeResponseToFile()) { - supplyAsync(() -> saveResponseToFileSink.save(msgResponse)); + if (sinkParams.getSafeResponseToFile().isActive()) { + supplyAsync(() -> saveResponseToFileSink.save(msgResponse, sinkParams.getSafeResponseToFile().getPath())); } if (sinkParams.isLogResponse()) { diff --git a/src/main/java/at/gv/egiz/moazs/backend/SaveResponseToFileSink.java b/src/main/java/at/gv/egiz/moazs/backend/SaveResponseToFileSink.java index 7da76ef..2468ca9 100644 --- a/src/main/java/at/gv/egiz/moazs/backend/SaveResponseToFileSink.java +++ b/src/main/java/at/gv/egiz/moazs/backend/SaveResponseToFileSink.java @@ -31,13 +31,11 @@ public class SaveResponseToFileSink { private final SimpleDateFormat isoFormatter; private final Marshaller msgMarshaller; private final DeliveryRepository repository; - private final String root; @Autowired - public SaveResponseToFileSink(Marshaller msgMarshaller, DeliveryRepository repository, String root) { + public SaveResponseToFileSink(Marshaller msgMarshaller, DeliveryRepository repository) { this.msgMarshaller = msgMarshaller; this.repository = repository; - this.root = root; this.isoFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); } @@ -47,17 +45,17 @@ public class SaveResponseToFileSink { * @param response * @return Future that completes when both responses have been written to the file system. */ - public CompletableFuture save(MsgResponse response) { + public CompletableFuture save(MsgResponse response, String rootPath) { var responseID = response.getResponseID(); - var responsePath = generatePath(responseID, "xml"); + var responsePath = generatePath(rootPath, responseID, "xml"); var storeResponseToFileSystemFuture = supplyAsync(() -> msgMarshaller.marshallXml(response.getResponse())) .thenApply(responseString -> responseString.getBytes(StandardCharsets.UTF_8)) .thenAccept(responseByteArray -> storeToFile(responsePath, responseByteArray)) .exceptionally(ex -> logException(ex, responseID)); - var binaryResponsePath = generatePath(responseID, "binary.xml"); + var binaryResponsePath = generatePath(rootPath, responseID, "binary.xml"); var storeBinaryResponseToFileSystemFuture = supplyAsync(() -> repository.retrieveBinaryResponse(responseID).get()) .thenAccept(binaryResponseByteArray -> storeToFile(binaryResponsePath, binaryResponseByteArray)) .exceptionally(ex -> logException(ex, responseID)); @@ -66,10 +64,10 @@ public class SaveResponseToFileSink { } - private String generatePath(String id, String suffix) { + private String generatePath(String rootPath, String id, String suffix) { var folder = sanitizeFileString(id); var nowInIso8601 = isoFormatter.format(new Date()); - return format("%s/%s/%s.%s", root, folder, nowInIso8601, suffix); + return format("%s/%s/%s.%s", rootPath, folder, nowInIso8601, suffix); } private String sanitizeFileString(String fileString) { diff --git a/src/main/java/at/gv/egiz/moazs/preprocess/ConfigUtil.java b/src/main/java/at/gv/egiz/moazs/preprocess/ConfigUtil.java index 9cdc07a..b69b828 100644 --- a/src/main/java/at/gv/egiz/moazs/preprocess/ConfigUtil.java +++ b/src/main/java/at/gv/egiz/moazs/preprocess/ConfigUtil.java @@ -12,6 +12,7 @@ import static at.gv.zustellung.app2mzs.xsd.ConfigType.configTypeBuilder; import static at.gv.zustellung.app2mzs.xsd.KeyStoreType.keyStoreTypeBuilder; import static at.gv.zustellung.app2mzs.xsd.MsgResponseSinksType.msgResponseSinksTypeBuilder; import static at.gv.zustellung.app2mzs.xsd.SSLType.SSLTypeBuilder; +import static at.gv.zustellung.app2mzs.xsd.SaveResponseToFileType.saveResponseToFileTypeBuilder; import static java.util.stream.Collectors.toMap; @Component @@ -34,11 +35,14 @@ public class ConfigUtil { public static final String MSG_RESPONSE_SINKS_KEY = "msg-response-sinks"; public static final String LOG_RESPONSE_KEY = "log-response"; public static final String SAVE_RESPONSE_TO_FILE_KEY = "save-response-to-file"; + public static final String SAVE_RESPONSE_TO_FILE_ACTIVE_KEY = "active"; + public static final String SAVE_RESPONSE_TO_FILE_PATH_KEY = "path"; + /** * Convert a map into a Config object. * - * @param map with well-defined indexes and values + * @param values: Map with well-defined indexes and values * @return Config */ public ConfigType convert(Map values) { @@ -131,11 +135,24 @@ public class ConfigUtil { private MsgResponseSinksType buildMsgResponseSinks(Map params) { var logResponse = booleanOrNull(params.get(LOG_RESPONSE_KEY)); - var saveResponse = booleanOrNull(params.get(SAVE_RESPONSE_TO_FILE_KEY)); + + var saveResponseParams = filterMapByPrefix(params, SAVE_RESPONSE_TO_FILE_KEY); + var saveResponse = buildSaveResponse(saveResponseParams); return msgResponseSinksTypeBuilder() .withLogResponse(logResponse) - .withLogResponse(saveResponse) + .withSaveResponseToFile(saveResponse) + .build(); + } + + private SaveResponseToFileType buildSaveResponse(Map params) { + + var isActive = booleanOrNull(params.get(SAVE_RESPONSE_TO_FILE_ACTIVE_KEY)); + var path = params.get(SAVE_RESPONSE_TO_FILE_PATH_KEY); + + return saveResponseToFileTypeBuilder() + .withActive(isActive) + .withPath(path) .build(); } @@ -248,12 +265,29 @@ public class ConfigUtil { builder.withLogResponse(primary.isLogResponse()); } - if (primary.isSafeResponseToFile() != null) { - builder.withLogResponse(primary.isSafeResponseToFile()); + if (primary.getSaveResponseToFile() != null) { + builder.withSaveResponseToFile(merge(primary.getSaveResponseToFile(), fallback.getSaveResponseToFile())); } return builder.build(); } + private SaveResponseToFileType merge(SaveResponseToFileType primary, SaveResponseToFileType fallback) { + + if (fallback == null) return primary; + + var builder = saveResponseToFileTypeBuilder(fallback); + + if (primary.isActive() != null) { + builder.withActive(primary.isActive()); + } + + if (primary.getPath() != null) { + builder.withPath(primary.getPath()); + } + + return builder.build(); + + } } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index a04a903..2d0bed3 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -30,9 +30,11 @@ delivery-request-configuration-profiles: # 0 means indefinitely. receive-timeout: 0 - # Specifies how MoaZS should + # Specifies how MoaZS should a synchronous responses from msg. msg-response-sinks: - save-response-to-file: false + save-response-to-file: + active: false + path: /msg-responses/ log-response: true ssl-profile: diff --git a/src/main/resources/mzs/app2mzs.xsd b/src/main/resources/mzs/app2mzs.xsd index ba99eab..5733a00 100644 --- a/src/main/resources/mzs/app2mzs.xsd +++ b/src/main/resources/mzs/app2mzs.xsd @@ -132,10 +132,17 @@ - + + + + + + + + diff --git a/src/test/java/at/gv/egiz/moazs/SaveResponseToFileSinkTest.java b/src/test/java/at/gv/egiz/moazs/SaveResponseToFileSinkTest.java index 58efe6a..1fa3997 100644 --- a/src/test/java/at/gv/egiz/moazs/SaveResponseToFileSinkTest.java +++ b/src/test/java/at/gv/egiz/moazs/SaveResponseToFileSinkTest.java @@ -44,7 +44,7 @@ public class SaveResponseToFileSinkTest { @Before public void setup() { - sink = new SaveResponseToFileSink(marshaller, repository, root); + sink = new SaveResponseToFileSink(marshaller, repository); deleteRoot(); } @@ -63,7 +63,7 @@ public class SaveResponseToFileSinkTest { var fileContent = "some content"; var status = setupMocks(fileContent); - sink.save(status) + sink.save(status, root) .thenRun(() -> assertFilesCreatedAndContentMatches(fileContent)); } -- cgit v1.2.3