diff options
-rw-r--r-- | pom.xml | 2 | ||||
-rw-r--r-- | src/main/java/org/onap/aai/validation/ruledriven/rule/builtin/DataDictionary.java | 156 | ||||
-rw-r--r-- | src/main/resources/validation-service-beans.xml | 15 |
3 files changed, 171 insertions, 2 deletions
@@ -43,7 +43,7 @@ limitations under the License. </dependencyManagement> <properties> - <spring-boot.version>1.5.17.RELEASE</spring-boot.version> + <spring-boot.version>1.5.18.RELEASE</spring-boot.version> <start-class>org.onap.aai.validation.ValidationServiceApplication</start-class> <serverPort>9500</serverPort> <sslport>9501</sslport> diff --git a/src/main/java/org/onap/aai/validation/ruledriven/rule/builtin/DataDictionary.java b/src/main/java/org/onap/aai/validation/ruledriven/rule/builtin/DataDictionary.java new file mode 100644 index 0000000..cddeb85 --- /dev/null +++ b/src/main/java/org/onap/aai/validation/ruledriven/rule/builtin/DataDictionary.java @@ -0,0 +1,156 @@ +/* + * ============LICENSE_START=================================================== + * Copyright (c) 2018 Amdocs + * ============================================================================ + * 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.aai.validation.ruledriven.rule.builtin; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; +import com.sun.jersey.core.util.MultivaluedMapImpl; +import groovy.lang.GString; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import org.onap.aai.cl.api.Logger; +import org.onap.aai.restclient.client.OperationResult; +import org.onap.aai.validation.exception.ValidationServiceError; +import org.onap.aai.validation.logging.ApplicationMsgs; +import org.onap.aai.validation.logging.LogHelper; + +public class DataDictionary { + + private static final Logger logger = LogHelper.INSTANCE; + + private static String credentials; + private static String urlTemplate; + private static org.onap.aai.restclient.client.RestClient restClient; + + + private DataDictionary() { + // intentionally empty + } + + /** + * Initializes this class' static variables using MethodInvokingFactoryBean + * @param props + */ + public static void setProperties(Properties props) { + + String hostport = props.getProperty("rule.datadictionary.hostport"); + String connectTimeout = props.getProperty("rule.datadictionary.connect.timeout"); + String readTimeout = props.getProperty("rule.datadictionary.read.timeout"); + String uriTemplate = props.getProperty("rule.datadictionary.uri"); + + credentials = "Basic " + props.getProperty("rule.datadictionary.credentials"); + urlTemplate = hostport + uriTemplate; + restClient = new org.onap.aai.restclient.client.RestClient() + .validateServerHostname(false) + .connectTimeoutMs(Integer.parseInt(connectTimeout)) + .readTimeoutMs(Integer.parseInt(readTimeout)); + } + + + /** + * Generates a REST request to data-dictionary to validate the given entities. + * URI: /commonModelElements/[entityType]~[entityName]~1.0/validateInstance + * Currently only "instance" is supported for entityType. + * + * @param entityType + * @param entityName + * @param entities + * @return + */ + public static String validate(String entityType, String entityName, List<Map<GString, GString>> entities) { + + logger.debug("Executing built-in rule with..."); + for(Map<GString, GString> attributes : entities) { + logger.debug(" " + attributes.toString()); + } + + if(entities == null || entities.isEmpty()) { + final String error = "list of instances missing"; + logger.error(ApplicationMsgs.CANNOT_VALIDATE_ERROR, error); + return error; + } + + String url = MessageFormat.format(urlTemplate, entityType, entityName); + Gson gson = new GsonBuilder().create(); + String payload = gson.toJson(new Request(entities)); + OperationResult result = post(url, payload); + + if(result.getResultCode() != 200 && result.getResultCode() != 204) { + String error = ValidationServiceError.REST_CLIENT_RESPONSE_ERROR.getMessage(result.getResultCode(), result.getFailureCause()); + logger.error(ApplicationMsgs.CANNOT_VALIDATE_ERROR, error); + return result.getFailureCause(); + } + return ""; + } + + + /** + * Posts the payload to the URL + * @param url + * @param payload + * @return + */ + private static OperationResult post(String url, String payload) { + MultivaluedMap<String, String> headers = new MultivaluedMapImpl(); + headers.put("x-authorization", Arrays.asList(credentials)); + return restClient.post(url, payload, headers, MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE); + } + + + /** + * JSON serializable class representing an instance sent to data-dictionary. + */ + public static class Request { + @Expose + @SerializedName("instance") + private List<Object> instances; + + public Request(List<Map<GString, GString>> groovyInstances) { + instances = new ArrayList<>(); + for(Map<GString, GString> groovyEntry : groovyInstances) { + instances.add(createInstance(groovyEntry)); + } + } + + public List<Object> getInstance() { + return instances; + } + + /** + * Creates an instance entry; converts Groovy's GString into a java String + * @param groovyMap + * @return + */ + private Map<String, String> createInstance(Map<GString, GString> groovyMap) { + Map<String, String> newMap = new HashMap<>(); + for(Map.Entry<GString, GString> groovyEntry : groovyMap.entrySet()) { + newMap.put(groovyEntry.getKey().toString(), groovyEntry.getValue().toString()); + } + return newMap; + } + } +} diff --git a/src/main/resources/validation-service-beans.xml b/src/main/resources/validation-service-beans.xml index 4482c6e..862fd13 100644 --- a/src/main/resources/validation-service-beans.xml +++ b/src/main/resources/validation-service-beans.xml @@ -17,9 +17,11 @@ limitations under the License. ============LICENSE_END===================================================== --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" /> @@ -37,6 +39,8 @@ limitations under the License. <constructor-arg value="file:${APP_HOME}/bundleconfig/etc/appprops/model-instance-mapping.json_conf" type="java.io.InputStream" /> </bean> + <util:properties id="dataDictionaryProperties" location="file:${CONFIG_HOME}/rule-data-dictionary.properties" /> + <!-- ////////////////////////////////////////////////////////////////// --> <!-- CONFIG BEANS --> <!-- ////////////////////////////////////////////////////////////////// --> @@ -100,6 +104,15 @@ limitations under the License. <property name="authPolicyFile" value="${auth.policy.file}" /> </bean> + <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> + <property name="staticMethod" value="org.onap.aai.validation.ruledriven.rule.builtin.DataDictionary.setProperties" /> + <property name="arguments"> + <list> + <ref bean="dataDictionaryProperties" /> + </list> + </property> + </bean> + <!-- ////////////////////////////////////////////////////////////////// --> <!-- READER BEANS --> <!-- ////////////////////////////////////////////////////////////////// --> |