From 8e2c338d0195f31269811ba4ff3f1214a60907d1 Mon Sep 17 00:00:00 2001 From: JoeOLeary Date: Mon, 18 Feb 2019 15:13:16 +0000 Subject: Fix DataRouter Subscriber NPE on No Metadata Issue-ID: DCAEGEN2-1232 Change-Id: I692d65c460f2974535d5b9addc4d889c530cf951 Signed-off-by: JoeOLeary --- .../pmmapper/datarouter/DataRouterSubscriber.java | 21 +++++++++++++-------- .../datarouter/DataRouterSubscriberTest.java | 4 ++++ 2 files changed, 17 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/main/java/org/onap/dcaegen2/services/pmmapper/datarouter/DataRouterSubscriber.java b/src/main/java/org/onap/dcaegen2/services/pmmapper/datarouter/DataRouterSubscriber.java index fc623bd..40efde5 100644 --- a/src/main/java/org/onap/dcaegen2/services/pmmapper/datarouter/DataRouterSubscriber.java +++ b/src/main/java/org/onap/dcaegen2/services/pmmapper/datarouter/DataRouterSubscriber.java @@ -155,6 +155,14 @@ public class DataRouterSubscriber implements HttpHandler { } } + private EventMetadata getMetadata(HttpServerExchange httpServerExchange) throws NoMetadataException { + String metadata = Optional.ofNullable(httpServerExchange.getRequestHeaders() + .get(METADATA_HEADER)) + .map((HeaderValues headerValues) -> headerValues.get(0)) + .orElseThrow(() -> new NoMetadataException("Metadata Not found")); + return metadataBuilder.fromJson(metadata, EventMetadata.class); + } + /** * Receives inbound requests, verifies that required headers are valid * and passes an Event onto the eventReceiver. @@ -172,16 +180,13 @@ public class DataRouterSubscriber implements HttpHandler { .send(StatusCodes.SERVICE_UNAVAILABLE_STRING); } else { try { - String metadataAsString = Optional.of(httpServerExchange.getRequestHeaders() - .get(METADATA_HEADER)) - .map((HeaderValues headerValues) -> headerValues.get(0)) - .orElseThrow(() -> new NoMetadataException("Metadata Not found")); + Map mdc = MDC.getCopyOfContextMap(); - EventMetadata metadata = metadataBuilder.fromJson(metadataAsString, EventMetadata.class); + EventMetadata metadata = getMetadata(httpServerExchange); httpServerExchange.getRequestReceiver() - .receiveFullString((callbackExchange, body) -> { - httpServerExchange.dispatch(() -> eventReceiver.receive(new Event(callbackExchange, body, metadata, mdc))); - }); + .receiveFullString((callbackExchange, body) -> + httpServerExchange.dispatch(() -> eventReceiver.receive(new Event(callbackExchange, body, metadata, mdc))) + ); } catch (NoMetadataException exception) { logger.unwrap().info("Bad Request: no metadata found under '{}' header.", METADATA_HEADER, exception); httpServerExchange.setStatusCode(StatusCodes.BAD_REQUEST) diff --git a/src/test/java/org/onap/dcaegen2/services/pmmapper/datarouter/DataRouterSubscriberTest.java b/src/test/java/org/onap/dcaegen2/services/pmmapper/datarouter/DataRouterSubscriberTest.java index a40e28b..ad73b63 100644 --- a/src/test/java/org/onap/dcaegen2/services/pmmapper/datarouter/DataRouterSubscriberTest.java +++ b/src/test/java/org/onap/dcaegen2/services/pmmapper/datarouter/DataRouterSubscriberTest.java @@ -39,6 +39,7 @@ import ch.qos.logback.core.read.ListAppender; import io.undertow.io.Receiver; import io.undertow.io.Sender; import io.undertow.server.HttpServerExchange; +import io.undertow.util.HeaderMap; import io.undertow.util.StatusCodes; import utils.LoggingUtils; @@ -186,8 +187,11 @@ public class DataRouterSubscriberTest { public void testRequestInboundNoMetadata() throws Exception { HttpServerExchange httpServerExchange = mock(HttpServerExchange.class, RETURNS_DEEP_STUBS); Receiver receiver = mock(Receiver.class); + HeaderMap headers = mock(HeaderMap.class); when(httpServerExchange.getRequestReceiver()).thenReturn(receiver); when(httpServerExchange.setStatusCode(anyInt())).thenReturn(httpServerExchange); + when(httpServerExchange.getRequestHeaders()).thenReturn(headers); + when(headers.get(any(String.class))).thenReturn(null); doAnswer((Answer) invocationOnMock -> { Receiver.FullStringCallback callback = invocationOnMock.getArgument(0); -- cgit 1.2.3-korg