summaryrefslogtreecommitdiffstats
path: root/dcae-analytics/dcae-analytics-tca-web/src/main/java/org/onap/dcae/analytics/tca/web/validation/TcaAppPropertiesValidator.java
diff options
context:
space:
mode:
Diffstat (limited to 'dcae-analytics/dcae-analytics-tca-web/src/main/java/org/onap/dcae/analytics/tca/web/validation/TcaAppPropertiesValidator.java')
-rw-r--r--dcae-analytics/dcae-analytics-tca-web/src/main/java/org/onap/dcae/analytics/tca/web/validation/TcaAppPropertiesValidator.java186
1 files changed, 186 insertions, 0 deletions
diff --git a/dcae-analytics/dcae-analytics-tca-web/src/main/java/org/onap/dcae/analytics/tca/web/validation/TcaAppPropertiesValidator.java b/dcae-analytics/dcae-analytics-tca-web/src/main/java/org/onap/dcae/analytics/tca/web/validation/TcaAppPropertiesValidator.java
new file mode 100644
index 0000000..4204e41
--- /dev/null
+++ b/dcae-analytics/dcae-analytics-tca-web/src/main/java/org/onap/dcae/analytics/tca/web/validation/TcaAppPropertiesValidator.java
@@ -0,0 +1,186 @@
+/*
+ * ================================================================================
+ * Copyright (c) 2018 AT&T Intellectual Property. 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.analytics.tca.web.validation;
+
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.onap.dcae.analytics.model.configbindingservice.BaseConfigBindingServiceProperties.PubSubCommonDetails;
+import org.onap.dcae.analytics.model.configbindingservice.BaseConfigBindingServiceProperties.PublisherDetails;
+import org.onap.dcae.analytics.model.configbindingservice.BaseConfigBindingServiceProperties.SubscriberDetails;
+import org.onap.dcae.analytics.model.configbindingservice.ConfigBindingServiceConstants;
+import org.onap.dcae.analytics.tca.web.TcaAppProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.lang.Nullable;
+import org.springframework.validation.Errors;
+import org.springframework.validation.Validator;
+
+/**
+ * Validator for {@link TcaAppProperties}. This validator is used by spring at start up time to validate
+ * TCA Application properties
+ *
+ * @author Rajiv Singla
+ */
+public class TcaAppPropertiesValidator implements Validator {
+
+ private static final Logger logger = LoggerFactory.getLogger(TcaAppPropertiesValidator.class);
+
+ @Override
+ public boolean supports(final Class<?> type) {
+ return type == TcaAppProperties.class;
+ }
+
+ @Override
+ public void validate(@Nullable final Object props, final Errors errors) {
+
+ if (props == null) {
+ errors.rejectValue(ConfigBindingServiceConstants.CONFIG_BINDING_SERVICE_PROPERTIES_KEY,
+ "TCA App Properties are not present");
+ return;
+ }
+
+ final TcaAppProperties tcaAppProperties = (TcaAppProperties) props;
+
+ logger.info("Validating TCA App Properties: {}", tcaAppProperties);
+
+ final Map<String, PublisherDetails> streamsPublishes = tcaAppProperties.getStreamsPublishes();
+ final Map<String, SubscriberDetails> streamsSubscribes = tcaAppProperties.getStreamsSubscribes();
+
+ // Validate that stream publishes has at least 1 publisher and subscriber
+ if (!validatePubSubArePresent(errors, streamsPublishes, streamsSubscribes)) {
+ return;
+ }
+
+ // Validate that streams publishes and subscribes has at least one message router
+ List<? super PubSubCommonDetails> pubSubMRCommonDetails =
+ validatePubSubHasMRDetails(errors, streamsPublishes, streamsSubscribes);
+ if (pubSubMRCommonDetails.isEmpty()) {
+ return;
+ }
+
+ //Confirm each message router has dmaap info and their url is present and valid
+ validateMRProperties(errors, pubSubMRCommonDetails);
+
+ // validated aai properties
+ validateAAIProperties(errors, tcaAppProperties.getTca().getAai());
+
+ logger.info("Validation of TCA App Properties completed successfully");
+
+ }
+
+
+ private void validateAAIProperties(final Errors errors, final TcaAppProperties.Aai aai) {
+ new ConfigPropertiesAaiValidator().validate(aai, errors);
+ }
+
+ private void validateMRProperties(final Errors errors,
+ final List<? super PubSubCommonDetails> pubSubMRCommonDetails) {
+
+ for (Object pubSubMRCommonDetail : pubSubMRCommonDetails) {
+ final PubSubCommonDetails mrDetails = (PubSubCommonDetails) pubSubMRCommonDetail;
+
+ if (mrDetails.getDmaapInfo() == null || mrDetails.getDmaapInfo().getTopicUrl() == null) {
+ errors.rejectValue("dmaap_info",
+ "dmaap_info url not present for MR configuration properties: " + mrDetails);
+ }
+
+ if (mrDetails.getDmaapInfo() != null && mrDetails.getDmaapInfo().getTopicUrl() != null
+ && !isURLValid(mrDetails.getDmaapInfo().getTopicUrl())) {
+ errors.rejectValue("topic_url",
+ "Invalid MR Topic URL in configuration properties:" + mrDetails);
+
+ }
+
+ if (mrDetails.getProxyUrl() != null && !mrDetails.getProxyUrl().trim().isEmpty()
+ && !isURLValid(mrDetails.getProxyUrl())) {
+ errors.rejectValue("proxy_url",
+ "Invalid Proxy url in configuration properties:" + mrDetails);
+ }
+ }
+
+ }
+
+ private List<? super PubSubCommonDetails> validatePubSubHasMRDetails(
+ final Errors errors,
+ final Map<String, PublisherDetails> streamsPublishes,
+ final Map<String, SubscriberDetails> streamsSubscribes) {
+
+ final List<Map.Entry<String, PublisherDetails>> messageRouterPublishers =
+ streamsPublishes.entrySet().stream()
+ .filter(ConfigBindingServiceConstants.MESSAGE_ROUTER_PREDICATE)
+ .collect(Collectors.toList());
+ if (messageRouterPublishers.isEmpty()) {
+ errors.rejectValue("stream_publishes",
+ "Stream publishes must contain at least 1 message router publisher");
+ }
+
+ final List<Map.Entry<String, SubscriberDetails>> messageRouterSubscribers =
+ streamsSubscribes.entrySet().stream()
+ .filter(ConfigBindingServiceConstants.MESSAGE_ROUTER_PREDICATE)
+ .collect(Collectors.toList());
+ if (messageRouterSubscribers.isEmpty()) {
+ errors.rejectValue("stream_subscribes",
+ "Stream subscriber must contain at least 1 message router subscriber");
+ }
+
+ // create common pub sub MR list
+ final List<? super PubSubCommonDetails> pubSubMRCommonDetails = new LinkedList<>();
+ pubSubMRCommonDetails.addAll(messageRouterPublishers.stream()
+ .map(Map.Entry::getValue).collect(Collectors.toList()));
+ pubSubMRCommonDetails.addAll(messageRouterSubscribers.stream()
+ .map(Map.Entry::getValue).collect(Collectors.toList())
+ );
+
+ return pubSubMRCommonDetails;
+ }
+
+ private boolean validatePubSubArePresent(final Errors errors,
+ final Map<String, PublisherDetails> streamsPublishes,
+ final Map<String, SubscriberDetails>
+ streamsSubscribes) {
+ if (streamsPublishes.isEmpty()) {
+ errors.rejectValue("streams_publishes", "Streams publishes must define at least 1 publisher");
+ return false;
+ }
+ if (streamsSubscribes.isEmpty()) {
+ errors.rejectValue("streams_subscribes", "Streams subscribes must define at least 1 subscriber");
+ return false;
+ }
+
+ return true;
+ }
+
+ private static boolean isURLValid(final String urlString) {
+ try {
+ new URL(urlString);
+ return true;
+ } catch (MalformedURLException ex) {
+ return false;
+ }
+ }
+
+
+}