diff options
author | Bogumil Zebek <bogumil.zebek@nokia.com> | 2020-07-22 08:19:51 +0200 |
---|---|---|
committer | Bartosz Gardziejewski <bartosz.gardziejewski@nokia.com> | 2020-08-06 08:07:39 +0200 |
commit | f6260a26de44a9338ca998626a93c0d0fa56abc3 (patch) | |
tree | 2a3dffaf850a7a934861c0fd10003168324c9f69 /src/main/java | |
parent | dc29687c2c83b387718c6a26b227170b17dcf08d (diff) |
StndDefined event routing
Route stndDefined events to streams defined in namespace event field.
Change-Id: I3963e220095665f8ca3fd1b21c5c20b44057cf76
Issue-ID: DCAEGEN2-1771
Signed-off-by: Zebek Bogumil <bogumil.zebek@nokia.com>
Diffstat (limited to 'src/main/java')
12 files changed, 336 insertions, 98 deletions
diff --git a/src/main/java/org/onap/dcae/ApplicationSettings.java b/src/main/java/org/onap/dcae/ApplicationSettings.java index 8458df8d..33ad5bc7 100644 --- a/src/main/java/org/onap/dcae/ApplicationSettings.java +++ b/src/main/java/org/onap/dcae/ApplicationSettings.java @@ -161,7 +161,7 @@ public class ApplicationSettings { return properties.getString("auth.method", AuthMethodType.NO_AUTH.value()); } - public Map<String, String[]> dMaaPStreamsMapping() { + public Map<String, String[]> getDmaapStreamIds() { String streamIdsProperty = properties.getString("collector.dmaap.streamid", null); if (streamIdsProperty == null) { return HashMap.empty(); diff --git a/src/main/java/org/onap/dcae/JSonSchemasSupplier.java b/src/main/java/org/onap/dcae/JSonSchemasSupplier.java index d7cd5663..10e74ee5 100644 --- a/src/main/java/org/onap/dcae/JSonSchemasSupplier.java +++ b/src/main/java/org/onap/dcae/JSonSchemasSupplier.java @@ -3,7 +3,7 @@ * PROJECT
* ================================================================================
* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
- * Copyright (C) 2019 Nokia. All rights reserved.s
+ * Copyright (C) 2020 Nokia. All rights reserved.s
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@ import java.nio.file.Paths; import static io.vavr.API.Tuple;
import static java.nio.file.Files.readAllBytes;
-class JSonSchemasSupplier {
+public class JSonSchemasSupplier {
public Map<String, JsonSchema> loadJsonSchemas(String collectorSchemaFile) {
JSONObject jsonObject = new JSONObject(collectorSchemaFile);
diff --git a/src/main/java/org/onap/dcae/VesApplication.java b/src/main/java/org/onap/dcae/VesApplication.java index bc5b1a8f..9f628b5c 100644 --- a/src/main/java/org/onap/dcae/VesApplication.java +++ b/src/main/java/org/onap/dcae/VesApplication.java @@ -133,7 +133,7 @@ public class VesApplication { @Bean @Qualifier("eventSender") public EventSender eventSender() { - return new EventSender(eventPublisher, applicationSettings); + return new EventSender(eventPublisher, applicationSettings.getDmaapStreamIds()); } } diff --git a/src/main/java/org/onap/dcae/common/EventSender.java b/src/main/java/org/onap/dcae/common/EventSender.java index c1002af6..63be9106 100644 --- a/src/main/java/org/onap/dcae/common/EventSender.java +++ b/src/main/java/org/onap/dcae/common/EventSender.java @@ -1,9 +1,9 @@ /* * ============LICENSE_START======================================================= - * PROJECT + * VES Collector * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * Copyright (C) 2018 Nokia. All rights reserved.s + * Copyright (C) 2020 Nokia. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,56 +24,48 @@ import com.att.nsa.clock.SaClock; import com.att.nsa.logging.LoggingContext; import com.att.nsa.logging.log4j.EcompFields; import io.vavr.collection.Map; -import org.json.JSONArray; -import org.json.JSONObject; -import org.onap.dcae.ApplicationSettings; +import org.onap.dcae.common.model.VesEvent; import org.onap.dcae.common.publishing.EventPublisher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + public class EventSender { private static final Logger metriclog = LoggerFactory.getLogger("com.att.ecomp.metrics"); - private Map<String, String[]> streamidHash; + private Map<String, String[]> streamIdToDmaapIds; private EventPublisher eventPublisher; - private static final String VES_UNIQUE_ID = "VESuniqueId"; private static final Logger log = LoggerFactory.getLogger(EventSender.class); - private static final String EVENT_LITERAL = "event"; - private static final String COMMON_EVENT_HEADER = "commonEventHeader"; - public EventSender( EventPublisher eventPublisher, ApplicationSettings properties) { + public EventSender(EventPublisher eventPublisher, Map<String, String[]> streamIdToDmaapIds) { this.eventPublisher = eventPublisher; - this.streamidHash = properties.dMaaPStreamsMapping(); + this.streamIdToDmaapIds = streamIdToDmaapIds; } - public void send(JSONArray arrayOfEvents) { - for (int i = 0; i < arrayOfEvents.length(); i++) { + public void send(List<VesEvent> vesEvents) { + for (VesEvent vesEvent : vesEvents) { metriclog.info("EVENT_PUBLISH_START"); - JSONObject object = (JSONObject) arrayOfEvents.get(i); - setLoggingContext(object); - streamidHash.get(getDomain(object)) - .onEmpty(() -> log.error("No StreamID defined for publish - Message dropped" + object)) - .forEach(streamIds -> sendEventsToStreams(object, streamIds)); - log.debug("Message published" + object); + setLoggingContext(vesEvent); + streamIdToDmaapIds.get(vesEvent.getStreamId()) + .onEmpty(() -> log.error("No StreamID defined for publish - Message dropped" + vesEvent.asJsonObject())) + .forEach(streamIds -> sendEventsToStreams(vesEvent, streamIds)); + log.debug("Message published" + vesEvent.asJsonObject()); } log.debug("CommonStartup.handleEvents:EVENTS has been published successfully!"); metriclog.info("EVENT_PUBLISH_END"); } - private static String getDomain(JSONObject event) { - return event.getJSONObject(EVENT_LITERAL).getJSONObject(COMMON_EVENT_HEADER).getString("domain"); - } - - private void sendEventsToStreams(JSONObject event, String[] streamIdList) { - for (String aStreamIdList : streamIdList) { - log.info("Invoking publisher for streamId:" + aStreamIdList); - eventPublisher.sendEvent(event, aStreamIdList); + private void sendEventsToStreams(VesEvent vesEvent, String[] streamIdList) { + for (String streamId : streamIdList) { + log.info("Invoking publisher for streamId/domain:" + streamId); + eventPublisher.sendEvent(vesEvent.asJsonObject(), streamId); } } - private void setLoggingContext(JSONObject event) { - LoggingContext localLC = VESLogger.getLoggingContextForThread(event.get(VES_UNIQUE_ID).toString()); + private void setLoggingContext(VesEvent vesEvent) { + LoggingContext localLC = VESLogger.getLoggingContextForThread(vesEvent.getUniqueId().toString()); localLC.put(EcompFields.kBeginTimestampMs, SaClock.now()); - log.debug("event.VESuniqueId" + event.get(VES_UNIQUE_ID) + "event.commonEventHeader.domain:" + getDomain(event)); + log.debug("event.VESuniqueId" + vesEvent.getUniqueId() + "event.commonEventHeader.domain:" + vesEvent.getDomain()); } } diff --git a/src/main/java/org/onap/dcae/common/EventUpdater.java b/src/main/java/org/onap/dcae/common/EventUpdater.java index 1469d47e..954e4b6e 100644 --- a/src/main/java/org/onap/dcae/common/EventUpdater.java +++ b/src/main/java/org/onap/dcae/common/EventUpdater.java @@ -22,12 +22,14 @@ package org.onap.dcae.common; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; import org.json.JSONArray; import org.json.JSONObject; import org.onap.dcae.ApplicationSettings; +import org.onap.dcae.common.model.VesEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,33 +49,33 @@ public class EventUpdater { this.settings = settings; } - public JSONArray convert(JSONObject jsonObject, String version, UUID uuid, String type){ + public List<VesEvent> convert(VesEvent vesEvent, String version, UUID uuid, String type){ if(type.equalsIgnoreCase(EVENT_LIST)){ - return convertEvents(jsonObject, uuid.toString(), version); + return convertEvents(vesEvent, uuid.toString(), version); } else { - return convertEvent(jsonObject, uuid.toString(), version); + return convertEvent(vesEvent, uuid.toString(), version); } } - private JSONArray convertEvents(JSONObject jsonObject, - String uuid, String version) { - JSONArray asArrayEvents = new JSONArray(); + private List<VesEvent> convertEvents(VesEvent vesEvent, String uuid, String version) { + List<VesEvent> asArrayEvents = new ArrayList<>(); - JSONArray events = jsonObject.getJSONArray(EVENT_LIST); + JSONArray events = vesEvent.asJsonObject().getJSONArray(EVENT_LIST); for (int i = 0; i < events.length(); i++) { JSONObject event = new JSONObject().put(EVENT, events.getJSONObject(i)); event.put(VES_UNIQUE_ID, uuid + "-" + i); event.put(VES_VERSION, version); - asArrayEvents.put(overrideEvent(event)); + asArrayEvents.add(new VesEvent(overrideEvent(event))); } return asArrayEvents; } - private JSONArray convertEvent(JSONObject jsonObject, String uuid, String version) { + private List<VesEvent> convertEvent(VesEvent vesEvent, String uuid, String version) { + JSONObject jsonObject = vesEvent.asJsonObject(); jsonObject.put(VES_UNIQUE_ID, uuid); jsonObject.put(VES_VERSION, version); - return new JSONArray().put(overrideEvent(jsonObject)); + return List.of(new VesEvent(overrideEvent(jsonObject))); } private JSONObject overrideEvent(JSONObject event) { diff --git a/src/main/java/org/onap/dcae/common/model/StndDefinedNamespaceParameterHasEmptyValueException.java b/src/main/java/org/onap/dcae/common/model/StndDefinedNamespaceParameterHasEmptyValueException.java new file mode 100644 index 00000000..22ec23a3 --- /dev/null +++ b/src/main/java/org/onap/dcae/common/model/StndDefinedNamespaceParameterHasEmptyValueException.java @@ -0,0 +1,23 @@ +/* + * ============LICENSE_START======================================================= + * VES Collector + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.common.model; + +public class StndDefinedNamespaceParameterHasEmptyValueException extends RuntimeException{ +} diff --git a/src/main/java/org/onap/dcae/common/model/StndDefinedNamespaceParameterNotDefinedException.java b/src/main/java/org/onap/dcae/common/model/StndDefinedNamespaceParameterNotDefinedException.java new file mode 100644 index 00000000..69ee68fa --- /dev/null +++ b/src/main/java/org/onap/dcae/common/model/StndDefinedNamespaceParameterNotDefinedException.java @@ -0,0 +1,24 @@ +/* + * ============LICENSE_START======================================================= + * VES Collector + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved.s + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.common.model; + + +public class StndDefinedNamespaceParameterNotDefinedException extends RuntimeException { +} diff --git a/src/main/java/org/onap/dcae/common/model/VesEvent.java b/src/main/java/org/onap/dcae/common/model/VesEvent.java new file mode 100644 index 00000000..ce709d1c --- /dev/null +++ b/src/main/java/org/onap/dcae/common/model/VesEvent.java @@ -0,0 +1,120 @@ +/* + * ============LICENSE_START======================================================= + * VES Collector + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved.s + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.common.model; + +import org.json.JSONObject; + +/** + * This class is a wrapper for JSONObject, that represents VES event. + * It contains Strings that represents key, that can be found in VES event. + * + * @author Zebek + */ +public class VesEvent { + + private static final String EVENT_LITERAL = "event"; + private static final String COMMON_EVENT_HEADER = "commonEventHeader"; + private static final String VES_UNIQUE_ID = "VESuniqueId"; + private static final String DOMAIN = "domain"; + private static final String STND_DEFINED_NAMESPACE = "stndDefinedNamespace"; + private static final String STND_DEFINED_DOMAIN = "stndDefined"; + + private final JSONObject event; + + public VesEvent(JSONObject event) { + this.event = event; + } + + /** + * Returns stream ID from VES event. + * + * @return stream ID + */ + public String getStreamId() { + String retVal = getDomain(); + + if (isStdDefinedDomain(retVal)) { + retVal = resolveDomainForStndDefinedEvent(); + } + + return retVal; + } + + /** + * Returns Domain name from VES event. + * + * @return domain + */ + public String getDomain() { + return getEventHeader().getString(DOMAIN); + } + + private String resolveDomainForStndDefinedEvent() { + final JSONObject eventHeader = getEventHeader(); + if(eventHeader.has(STND_DEFINED_NAMESPACE)) { + final String domain = eventHeader + .getString(STND_DEFINED_NAMESPACE); + if(domain.isEmpty()) { + throw new StndDefinedNamespaceParameterHasEmptyValueException(); + } + return domain; + } else { + throw new StndDefinedNamespaceParameterNotDefinedException(); + } + } + + private JSONObject getEventHeader() { + return event + .getJSONObject(EVENT_LITERAL) + .getJSONObject(COMMON_EVENT_HEADER); + } + + private boolean isStdDefinedDomain(String domain) { + return domain.equals(STND_DEFINED_DOMAIN); + } + + /** + * Returns unique ID of VES event. + * + * @return unique ID + */ + public Object getUniqueId() { + return event.get(VES_UNIQUE_ID); + } + + /** + * Returns VES event in form of JSON object. + * + * @return event in form of json Object + */ + public JSONObject asJsonObject() { + return new JSONObject(event.toString()); + } + + /** + * Checks if type of event is same as given in paramaters. + * + * @param type name that will be compared with event type + * @return true or false depending if type given in parameter is same as VES event type + */ + public boolean hasType(String type) { + return this.event.has(type); + } +} diff --git a/src/main/java/org/onap/dcae/restapi/ApiException.java b/src/main/java/org/onap/dcae/restapi/ApiException.java index 5867e52b..255999a6 100644 --- a/src/main/java/org/onap/dcae/restapi/ApiException.java +++ b/src/main/java/org/onap/dcae/restapi/ApiException.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * org.onap.dcaegen2.collectors.ves * ================================================================================ - * Copyright (C) 2018 Nokia. All rights reserved. + * Copyright (C) 2020 Nokia. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,8 @@ public enum ApiException { INVALID_CONTENT_TYPE(ExceptionType.SERVICE_EXCEPTION, "SVC0002", "Bad Parameter (Incorrect request Content-Type)", 400), UNAUTHORIZED_USER(ExceptionType.POLICY_EXCEPTION, "POL2000", "Unauthorized user", 401), INVALID_CUSTOM_HEADER(ExceptionType.SERVICE_EXCEPTION, "SVC0002", "Bad Parameter (Incorrect request api version)", 400), + MISSING_NAMESPACE_PARAMETER(ExceptionType.SERVICE_EXCEPTION, "SVC2006", "Mandatory input attribute event.commonEventHeader.stndDefinedNamespace is missing from request", 400), + EMPTY_NAMESPACE_PARAMETER(ExceptionType.SERVICE_EXCEPTION, "SVC2006", "Mandatory input attribute event.commonEventHeader.stndDefinedNamespace is empty in request", 400), NO_SERVER_RESOURCES(ExceptionType.SERVICE_EXCEPTION, "SVC1000", "No server resources (internal processing queue full)", 503); public final int httpStatusCode; diff --git a/src/main/java/org/onap/dcae/restapi/EventValidator.java b/src/main/java/org/onap/dcae/restapi/EventValidator.java index 3261c3b3..0eb0967a 100644 --- a/src/main/java/org/onap/dcae/restapi/EventValidator.java +++ b/src/main/java/org/onap/dcae/restapi/EventValidator.java @@ -20,34 +20,54 @@ */ package org.onap.dcae.restapi; -import java.util.Optional; -import org.json.JSONObject; +import com.networknt.schema.JsonSchema; import org.onap.dcae.ApplicationSettings; -import org.springframework.http.ResponseEntity; +import org.onap.dcae.common.model.VesEvent; + +/** + * This class is using ApplicationSetting and SchemaValidator to validate VES event. + * + * @author Zebek + */ public class EventValidator { - private final SchemaValidator schemaValidator = new SchemaValidator(); - private ApplicationSettings applicationSettings; + private final SchemaValidator schemaValidator; + private final ApplicationSettings applicationSettings; public EventValidator(ApplicationSettings applicationSettings) { + this(applicationSettings, new SchemaValidator()); + } + + EventValidator(ApplicationSettings applicationSettings, SchemaValidator schemaValidator) { this.applicationSettings = applicationSettings; + this.schemaValidator = schemaValidator; } - public Optional<ResponseEntity<String>> validate(JSONObject jsonObject, String type, String version){ + /** + * This method is validating given event using schema adn throws exception if event is not valid + * + * @param vesEvent event that will be validate + * @param type expected type of event + * @param version json schema version that will be used + * @throws EventValidatorException when event is not valid or have wrong type + */ + public void validate(VesEvent vesEvent, String type, String version) throws EventValidatorException { if (applicationSettings.eventSchemaValidationEnabled()) { - if (jsonObject.has(type)) { - if (!schemaValidator.conformsToSchema(jsonObject, applicationSettings.jsonSchema(version))) { - return errorResponse(ApiException.SCHEMA_VALIDATION_FAILED); - } - } else { - return errorResponse(ApiException.INVALID_JSON_INPUT); + doValidation(vesEvent, type, version); + } + } + + private void doValidation(VesEvent vesEvent, String type, String version) throws EventValidatorException { + if (vesEvent.hasType(type)) { + if (!isEventMatchToSchema(vesEvent, applicationSettings.jsonSchema(version))) { + throw new EventValidatorException(ApiException.SCHEMA_VALIDATION_FAILED); } + } else { + throw new EventValidatorException(ApiException.INVALID_JSON_INPUT); } - return Optional.empty(); } - private Optional<ResponseEntity<String>> errorResponse(ApiException noServerResources) { - return Optional.of(ResponseEntity.status(noServerResources.httpStatusCode) - .body(noServerResources.toJSON().toString())); + private boolean isEventMatchToSchema(VesEvent vesEvent, JsonSchema schema) { + return schemaValidator.conformsToSchema(vesEvent.asJsonObject(), schema); } } diff --git a/src/main/java/org/onap/dcae/restapi/EventValidatorException.java b/src/main/java/org/onap/dcae/restapi/EventValidatorException.java new file mode 100644 index 00000000..65ad457f --- /dev/null +++ b/src/main/java/org/onap/dcae/restapi/EventValidatorException.java @@ -0,0 +1,32 @@ +/* + * ============LICENSE_START======================================================= + * VES Collector + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.dcae.restapi; + +public class EventValidatorException extends Exception { + private final ApiException apiException; + + public EventValidatorException(ApiException apiException) { + this.apiException = apiException; + } + + public ApiException getApiException() { + return apiException; + } +} diff --git a/src/main/java/org/onap/dcae/restapi/VesRestController.java b/src/main/java/org/onap/dcae/restapi/VesRestController.java index b07b58df..f6dde6d2 100644 --- a/src/main/java/org/onap/dcae/restapi/VesRestController.java +++ b/src/main/java/org/onap/dcae/restapi/VesRestController.java @@ -1,9 +1,9 @@ /* * ============LICENSE_START======================================================= - * PROJECT + * VES Collector * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * Copyright (C) 2018 Nokia. All rights reserved.s + * Copyright (C) 2020 Nokia. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,22 +21,18 @@ package org.onap.dcae.restapi; -import static org.springframework.http.ResponseEntity.accepted; -import static org.springframework.http.ResponseEntity.badRequest; - import com.att.nsa.clock.SaClock; import com.att.nsa.logging.LoggingContext; import com.att.nsa.logging.log4j.EcompFields; -import java.util.Optional; -import java.util.UUID; -import javax.servlet.http.HttpServletRequest; -import org.json.JSONArray; import org.json.JSONObject; import org.onap.dcae.ApplicationSettings; import org.onap.dcae.common.EventSender; -import org.onap.dcae.common.VESLogger; import org.onap.dcae.common.EventUpdater; import org.onap.dcae.common.HeaderUtils; +import org.onap.dcae.common.VESLogger; +import org.onap.dcae.common.model.StndDefinedNamespaceParameterHasEmptyValueException; +import org.onap.dcae.common.model.StndDefinedNamespaceParameterNotDefinedException; +import org.onap.dcae.common.model.VesEvent; import org.onap.dcaegen2.services.sdk.standardization.header.CustomHeaderUtils; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -48,6 +44,13 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.UUID; + +import static org.springframework.http.ResponseEntity.accepted; +import static org.springframework.http.ResponseEntity.badRequest; + @RestController public class VesRestController { @@ -58,15 +61,19 @@ public class VesRestController { private final Logger requestLogger; private EventSender eventSender; private final HeaderUtils headerUtils; + private final EventValidator eventValidator; + private final EventUpdater eventUpdater; - @Autowired - VesRestController(ApplicationSettings settings, - @Qualifier("incomingRequestsLogger") Logger incomingRequestsLogger, - @Qualifier("eventSender") EventSender eventSender, HeaderUtils headerUtils) { + @Autowired + VesRestController(ApplicationSettings settings, + @Qualifier("incomingRequestsLogger") Logger incomingRequestsLogger, + @Qualifier("eventSender") EventSender eventSender, HeaderUtils headerUtils) { this.settings = settings; this.requestLogger = incomingRequestsLogger; this.eventSender = eventSender; this.headerUtils = headerUtils; + this.eventValidator = new EventValidator(settings); + this.eventUpdater = new EventUpdater(settings); } @PostMapping(value = {"/eventListener/{version}"}, consumes = "application/json") @@ -86,38 +93,54 @@ public class VesRestController { return badRequest().contentType(MediaType.APPLICATION_JSON).body(String.format("API version %s is not supported", version)); } - private ResponseEntity<String> process(String events, String version, HttpServletRequest request, String type) { + private ResponseEntity<String> process(String payload, String version, HttpServletRequest request, String type) { CustomHeaderUtils headerUtils = createHeaderUtils(version, request); - if(headerUtils.isOkCustomHeaders()){ - JSONObject jsonObject = new JSONObject(events); - - EventValidator eventValidator = new EventValidator(settings); - Optional<ResponseEntity<String>> validationResult = eventValidator.validate(jsonObject, type, version); - - if (validationResult.isPresent()){ - return validationResult.get(); - } - JSONArray arrayOfEvents = new EventUpdater(settings).convert(jsonObject,version, generateUUID(version, request.getRequestURI(), jsonObject), type); - eventSender.send(arrayOfEvents); - // TODO call service and return status, replace CambriaClient, split event to single object and list of them - return accepted().headers(this.headerUtils.fillHeaders(headerUtils.getRspCustomHeader())) - .contentType(MediaType.APPLICATION_JSON).body("Accepted"); + if (headerUtils.isOkCustomHeaders()) { + final VesEvent vesEvent = new VesEvent(new JSONObject(payload)); + final String requestURI = request.getRequestURI(); + return handleEvent(vesEvent, version, type, headerUtils, requestURI); } return badRequest().body(String.format(ApiException.INVALID_CUSTOM_HEADER.toString())); } - private CustomHeaderUtils createHeaderUtils(String version, HttpServletRequest request){ - return new CustomHeaderUtils(version.toLowerCase().replace("v", ""), - headerUtils.extractHeaders(request), - headerUtils.getApiVerFilePath("api_version_config.json"), - headerUtils.getRestApiIdentify(request.getRequestURI())); + private ResponseEntity<String> handleEvent(VesEvent vesEvent, String version, String type, CustomHeaderUtils headerUtils, String requestURI) { + try { + eventValidator.validate(vesEvent, type, version); + List<VesEvent> vesEvents = transformEvent(vesEvent, type, version, requestURI); + eventSender.send(vesEvents); + } catch (EventValidatorException e) { + return ResponseEntity.status(e.getApiException().httpStatusCode) + .body(e.getApiException().toJSON().toString()); + } catch (StndDefinedNamespaceParameterNotDefinedException e) { + return ResponseEntity.status(ApiException.MISSING_NAMESPACE_PARAMETER.httpStatusCode) + .body(ApiException.MISSING_NAMESPACE_PARAMETER.toJSON().toString()); + } catch (StndDefinedNamespaceParameterHasEmptyValueException e) { + return ResponseEntity.status(ApiException.MISSING_NAMESPACE_PARAMETER.httpStatusCode) + .body(ApiException.EMPTY_NAMESPACE_PARAMETER.toJSON().toString()); + } + + // TODO call service and return status, replace CambriaClient, split event to single object and list of them + return accepted().headers(this.headerUtils.fillHeaders(headerUtils.getRspCustomHeader())) + .contentType(MediaType.APPLICATION_JSON).body("Accepted"); + } + + private CustomHeaderUtils createHeaderUtils(String version, HttpServletRequest request) { + return new CustomHeaderUtils(version.toLowerCase().replace("v", ""), + headerUtils.extractHeaders(request), + headerUtils.getApiVerFilePath("api_version_config.json"), + headerUtils.getRestApiIdentify(request.getRequestURI())); + + } + private List<VesEvent> transformEvent(VesEvent vesEvent, String type, String version, String requestURI) { + return this.eventUpdater.convert( + vesEvent, version, generateUUID(vesEvent, version, requestURI), type); } - private UUID generateUUID(String version, String uri, JSONObject jsonObject) { + private UUID generateUUID(VesEvent vesEvent, String version, String uri) { UUID uuid = UUID.randomUUID(); setUpECOMPLoggingForRequest(uuid); - requestLogger.info(String.format(VES_EVENT_MESSAGE, jsonObject, uuid, version, uri)); + requestLogger.info(String.format(VES_EVENT_MESSAGE, vesEvent.asJsonObject(), uuid, version, uri)); return uuid; } @@ -125,4 +148,4 @@ public class VesRestController { LoggingContext localLC = VESLogger.getLoggingContextForThread(uuid); localLC.put(EcompFields.kBeginTimestampMs, SaClock.now()); } -}
\ No newline at end of file +} |