From 2a93b9ddf308b6bdd135be182c1b3fa779891840 Mon Sep 17 00:00:00 2001 From: Dan Timoney Date: Tue, 18 Jul 2017 19:40:01 -0400 Subject: Populate seed code Add seed code for sli/core repository Issue: CCSDK-6 Change-Id: Iaeb54c6135a94a6ffec0c7fd96505d72d18aeb00 Signed-off-by: Dan Timoney --- .../openecomp/sdnc/sli/SliPluginUtils/DME2.java | 111 +++ .../sdnc/sli/SliPluginUtils/SliPluginUtils.java | 754 +++++++++++++++++++++ .../SliPluginUtils/SliPluginUtilsActivator.java | 95 +++ .../sdnc/sli/SliPluginUtils/SliStringUtils.java | 396 +++++++++++ .../sli/SliPluginUtils/SvcLogicContextList.java | 210 ++++++ .../sli/SliPluginUtils/SvcLogicContextObject.java | 28 + .../SliPluginUtils/commondatastructures/YesNo.java | 51 ++ .../commondatastructures/package-info.java | 28 + 8 files changed, 1673 insertions(+) create mode 100644 sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java create mode 100644 sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils.java create mode 100644 sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtilsActivator.java create mode 100644 sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliStringUtils.java create mode 100644 sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextList.java create mode 100644 sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextObject.java create mode 100644 sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/YesNo.java create mode 100644 sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/package-info.java (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java new file mode 100644 index 000000000..39612716e --- /dev/null +++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java @@ -0,0 +1,111 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 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.openecomp.sdnc.sli.SliPluginUtils; + +import java.util.Map; + +import org.openecomp.sdnc.sli.SvcLogicContext; +import org.openecomp.sdnc.sli.SvcLogicException; +import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + +/** + * A SvcLogicJavaPlugin that generates DME2 proxy urls using parameters from context memory. + */ +public class DME2 implements SvcLogicJavaPlugin { + String aafUserName; + String aafPassword; + String envContext; + String routeOffer; + String[] proxyUrls; + Integer index; + String commonServiceVersion; + String partner; + + private static final Logger LOG = LoggerFactory.getLogger(DME2.class); + + public void setPartner(String partner) { + if (partner != null && partner.length() > 0) { + this.partner = partner; + } + } + + public DME2(String aafUserName, String aafPassword, String envContext, String routeOffer, String[] proxyUrls, String commonServiceVersion) { + this.aafUserName = aafUserName; + this.aafPassword = aafPassword; + this.envContext = envContext; + this.routeOffer = routeOffer; + this.proxyUrls = proxyUrls; + this.index = 0; + this.commonServiceVersion = commonServiceVersion; + } + + // constructs a URL to contact the proxy which contacts a DME2 service + public String constructUrl(String service, String version, String subContext) { + StringBuilder sb = new StringBuilder(); + + // The hostname is assigned in a round robin fashion + sb.append(acquireHostName()); + sb.append("/service=" + service); + + //If the directedGraph passes an explicit version use that, if not use the commonServiceVersion found in the properties file + if (version == null) { + version = this.commonServiceVersion; + } + sb.append("/version=" + version); + + sb.append("/envContext=" + this.envContext); + if (this.routeOffer != null && this.routeOffer.length() > 0) { + sb.append("/routeOffer=" + this.routeOffer); + } + if (subContext != null && subContext.length() > 0) { + sb.append("/subContext=" + subContext); + } + sb.append("?dme2.password=" + this.aafPassword); + sb.append("&dme2.username=" + this.aafUserName); + if (this.partner != null) { + sb.append("&dme2.partner=" + this.partner); + } + sb.append("&dme2.allowhttpcode=true"); + return (sb.toString()); + } + + public synchronized String acquireHostName() { + String retVal = proxyUrls[index]; + index++; + if (index == this.proxyUrls.length) { + index = 0; + } + return retVal; + } + + // Node entry point + public void constructUrl(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[] { "service", "outputPath" }, LOG); + String completeProxyUrl = constructUrl(parameters.get("service"), parameters.get("version"), parameters.get("subContext")); + ctx.setAttribute(parameters.get("outputPath"), completeProxyUrl); + } + +} diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils.java new file mode 100644 index 000000000..c73315f4f --- /dev/null +++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils.java @@ -0,0 +1,754 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 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.openecomp.sdnc.sli.SliPluginUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.PrintStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Properties; +import java.util.Set; +import java.util.UUID; + +import org.apache.commons.lang3.StringUtils; +import org.openecomp.sdnc.sli.SvcLogicContext; +import org.openecomp.sdnc.sli.SvcLogicException; +import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A utility class used to streamline the interface between Java plugins, + * the Service Logic Context, and Directed Graphs. + * @version 7.0.1 + * @see org.openecomp.sdnc.sli.SvcLogicContext + */ +public class SliPluginUtils implements SvcLogicJavaPlugin { + public enum LogLevel { + TRACE, DEBUG, INFO, WARN, ERROR; + } + + private static final Logger LOG = LoggerFactory.getLogger(SliPluginUtils.class); + + + // ========== CONSTRUCTORS ========== + + public SliPluginUtils() {} + + public SliPluginUtils( Properties props ) {} + + + + // ========== CONTEXT MEMORY FUNCTIONS ========== + + /** + * Removes 1 or more elements from a list in context memory. + *

+ * Values are removed based on either the index in the list, a key-value + * pair, or a list of key-value pairs that all must match in the element. + * @param parameters + * @param ctx Reference to context memory + * @throws SvcLogicException All exceptions are wrapped in + * SvcLogicException for compatibility with SLI. + * @since 7.0.1 + */ + public void ctxListRemove( Map parameters, SvcLogicContext ctx ) throws SvcLogicException { + try{ + LOG.debug( "ENTERING Execute Node \"ctxListRemove\"" ); + + // Validate, Log, & read parameters + checkParameters(parameters, new String[]{"list_pfx"}, LOG); + logExecuteNodeParameters(parameters, LOG, LogLevel.DEBUG); + String list_pfx = parameters.get("list_pfx"); + String param_index = parameters.get("index"); + String param_key = parameters.get("key"); + String param_value = parameters.get("value"); + String param_keys_length = parameters.get("keys_length"); + + // Initialize context memory list mimic + SvcLogicContextList list; + + // Process based on input parameters: + // index: remove object at specific index + // key & value: remove all objects with key-value pair + // keys_length: remove all objects that match all key-value pairs + // in list + if( param_index != null ) { + // Parse index + LOG.trace("executing remove by index logic"); + int index; + try { + index = Integer.parseInt(param_index); + } + catch( NumberFormatException e ) { + throw new IllegalArgumentException("\"index\" parameter is not a number. index = " + param_index, e); + } + + // Extract list from context memory & remove object @ index + LOG.trace("extracting list from context memory"); + list = SvcLogicContextList.extract(ctx, list_pfx); + LOG.trace("removing elements from list"); + list.remove(index); + } + else if( param_value != null ) { + if( param_key == null ) { param_key = ""; } + + // Extract list from context memory & remove objects with + // key-value pair + LOG.trace("executing remove by key-value pair logic"); + LOG.trace("extracting list from context memory"); + list = SvcLogicContextList.extract(ctx, list_pfx); + LOG.trace("removing elements from list"); + list.remove( param_key, param_value ); + } + else if( param_keys_length != null ) { + // Parse keys_length + LOG.trace("executing remove by key-value pair list logic"); + int keys_length; + try { + keys_length = Integer.parseInt(param_keys_length); + } + catch( NumberFormatException e ) { + throw new IllegalArgumentException("\"keys_length\" parameters is not a number. keys_length = " + param_keys_length, e); + } + + // Obtain key-value pairs to check from parameters + LOG.trace("reading keys parameter list"); + HashMap keys_values = new HashMap(); + for( int i = 0; i < keys_length; i++ ) { + keys_values.put(parameters.get("keys[" + i + "].key"), parameters.get("keys[" + i + "].value")); + } + + // Extract list from context memory & remove objects with all + // key-value pairs matching + LOG.trace("extracting list from context memory"); + list = SvcLogicContextList.extract(ctx, list_pfx); + LOG.trace("removing elements from list"); + list.remove(keys_values); + } + else { + throw new IllegalArgumentException("Required parameters missing. Requires one of: index, key & value, or keys_length array"); + } + + // Remove index from list + LOG.trace("writing list back into context memory"); + list.writeToContext(ctx); + } + catch( Exception e ) { + throw new SvcLogicException( "An error occurred in the ctxListRemove Execute node", e ); + } + finally { + LOG.debug( "EXITING Execute Node \"ctxListRemove\"" ); + } + } + + /** + * ctxSortList + * @param parameters - the set of required parameters must contain list and delimiter. + * @param ctx Reference to context memory + * @throws SvcLogicException if a required parameter is missing an exception is thrown + */ + public void ctxSortList( Map parameters, SvcLogicContext ctx ) throws SvcLogicException { + checkParameters(parameters, new String[]{"list","delimiter"}, LOG); + ArrayList list = new ArrayList(); + + String[] sort_fields = null; + if( parameters.containsKey("sort-fields") ) { + sort_fields = parameters.get("sort-fields").split(parameters.get("delimiter"), 0); + } + + String ctx_list_str = parameters.get("list"); + int listSz = getArrayLength(ctx, ctx_list_str); + + + + for( int i = 0; i < listSz; i++ ) { + list.add( new SortableCtxListElement(ctx, ctx_list_str + '[' + i + ']', sort_fields) ); + } + Collections.sort(list); + + ctxBulkErase(ctx, ctx_list_str); + int i = 0; + for( SortableCtxListElement list_element : list ) { + for( Map.Entry entry : list_element.child_elements.entrySet() ) { + if( sort_fields == null ) { + ctx.setAttribute(ctx_list_str + '[' + i + ']', entry.getValue()); + } + else { + ctx.setAttribute(ctx_list_str + '[' + i + "]." + entry.getKey(), entry.getValue()); + } + } + i++; + } + // Reset list length (removed by ctxBulkErase above) + ctx.setAttribute(ctx_list_str+"_length", ""+listSz); + } + + /** + * generates a UUID and writes it to context memory + * @param parameters - ctx-destination is a required parameter + * @param ctx Reference to context memory + * @throws SvcLogicException thrown if a UUID cannot be generated or if ctx-destination is missing or null + */ + public void generateUUID( Map parameters, SvcLogicContext ctx ) throws SvcLogicException { + checkParameters(parameters, new String[]{"ctx-destination"}, LOG); + ctx.setAttribute(parameters.get("ctx-destination"), UUID.randomUUID().toString() ); + } + + /** + * Provides substring functionality to Directed Graphs. + *

+ * Calls either String.substring(String beginIndex) or + * String.substring(String beginInded, String endIndex) if the end-index + * is present or not. + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
stringMandatoryString to perform substring on
resultMandatoryKey in context memory to populate the resulting string in
begin-indexMandatoryBeginning index to pass to Java substring function
end-indexOptionalEnding index to pass to Java substring function. If not included, String.substring(begin) will be called.
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 8.0.1 + * @see SliPluginUtils#substring(Map, SvcLogicContext) + */ + @Deprecated + public void substring( Map parameters, SvcLogicContext ctx ) throws SvcLogicException { + try { + checkParameters( parameters, new String[]{"string","begin-index","result"}, LOG ); + final String string = parameters.get("string"); + final String result = parameters.get("result"); + final String begin = parameters.get("begin-index"); + final String end = parameters.get("end-index"); + + if( StringUtils.isEmpty(end) ) { + ctx.setAttribute( result, string.substring(Integer.parseInt(begin)) ); + } + else { + ctx.setAttribute( result, string.substring(Integer.parseInt(begin), Integer.parseInt(end)) ); + } + } + catch( Exception e ) { + throw new SvcLogicException( "An error occurred while the Directed Graph was performing a substring", e ); + } + } + + + + // ========== PUBLIC STATIC UTILITY FUNCTIONS ========== + + /** + * Throws an exception and writes an error to the log file if a required + * parameters is not found in the parametersMap. + *

+ * Use at the beginning of functions that can be called by Directed Graphs + * and can take parameters to verify that all parameters have been provided + * by the Directed Graph. + * @param parametersMap parameters Map passed to this node + * @param requiredParams Array of parameters required by the calling function + * @param log Reference to Logger to log to + * @throws SvcLogicException if a String in the requiredParams array is + * not a key in parametersMap. + * @since 1.0 + */ + public static final void checkParameters(Map parametersMap, String[] requiredParams, Logger log) throws SvcLogicException { + if( requiredParams == null || requiredParams.length < 1){ + log.debug("required parameters was empty, exiting early."); + return; + } + if (parametersMap == null || parametersMap.keySet().size() < 1){ + String errorMessage = "This method requires the parameters [" + StringUtils.join(requiredParams,",") + "], but no parameters were passed in."; + log.error(errorMessage); + throw new SvcLogicException(errorMessage); + } + + for (String param : requiredParams) { + if (!parametersMap.containsKey(param)) { + String errorMessage = "Required parameter \"" + param + "\" was not found in parameter list."; + log.error(errorMessage); + log.error("Total list of required parameters is [" + StringUtils.join(requiredParams, ",") + "]."); + throw new SvcLogicException(errorMessage); + } + } + } + + /** + * Removes all key-value pairs with keys that begin with pfx + * @param ctx Reference to context memory + * @param pfx Prefix of key-value pairs to remove + * @since 1.0 + */ + public static final void ctxBulkErase( SvcLogicContext ctx, String pfx ) { + ArrayList Keys = new ArrayList( ctx.getAttributeKeySet() ); + for( String key : Keys ) { + if( key.startsWith( pfx ) ) { + ctx.setAttribute( pfx + key.substring(pfx.length()) , null); + } + } + } + + /** + * Copies all context memory key-value pairs that start with src_pfx to + * the keys that start with dest_pfx + suffix, where suffix is the result + * of {@code key.substring(src_pfx.length())}. + *

+ * Does NOT guarantee removal of all keys at the destination before + * copying, but will overwrite any destination keys that have a + * corresponding source key. Use {@link #ctxBulkErase(SvcLogicContext, String) ctxBulkErase} + * before copy to erase destination root before copying from source. + * @param ctx Reference to context memory. + * @param src_pfx Prefix of the keys to copy values from. + * @param dest_pfx Prefix of the keys to copy values to. + * @since 1.0 + */ + public static final void ctxBulkCopy( SvcLogicContext ctx, String src_pfx, String dest_pfx ) { + // Remove trailing period from dest_pfx + if( dest_pfx.charAt(dest_pfx.length()-1) == '.' ) { + dest_pfx = dest_pfx.substring(0,dest_pfx.length()-1); + } + + // For each context key that begins with src_pfx, set the value of the + // key dest_pfx + the suffix of the key to the key's value + ArrayList Keys = new ArrayList(ctx.getAttributeKeySet()); + for( String key : Keys ) { + if( key.startsWith(src_pfx) ) { + // Get suffix (no leading period) + String suffix = key.substring(src_pfx.length()); + if( suffix.charAt(0) == '.') { + suffix = suffix.substring(1); + } + + // Set destination's value to key's value + ctx.setAttribute(dest_pfx + '.' + suffix, ctx.getAttribute(key)); + } + } + } + + /** + * Creates and returns a {@code Map} that is a subset of + * context memory where all keys begin with the prefix. + * @param ctx Reference to context memory. + * @param prefix Returned map's keys should all begin with this value. + * @return A {@code Map} containing all the key-value pairs + * in ctx whose key begins with prefix. + */ + public static final Map ctxGetBeginsWith( SvcLogicContext ctx, String prefix ) { + Map prefixMap = new HashMap(); + + for( String key : ctx.getAttributeKeySet() ) { + if( key.startsWith(prefix) ) { + prefixMap.put( key, ctx.getAttribute(key) ); + } + } + + return prefixMap; + } + + /** + * Returns true if key's value in context memory is "" or if it doesn't + * exist in context memory. + * @param ctx Reference to context memory. + * @param key Key to search for. + * @return true if key's value in context memory is "" or if it doesn't + * exist in context memory. + * @since 1.0 + */ + public static final boolean ctxKeyEmpty( SvcLogicContext ctx, String key ) { + String value = ctx.getAttribute(key); + return value == null || value.isEmpty(); + } + + /** + * Adds all key-value pairs in the entries Map to context memory. + * @param ctx Reference to context memory. Value's {@code toString()} + * function is used to add it. + * @param entries {@code Map} of key-value pairs to add to + * context memory. Value's {@code toString()} function is used to add it. + * @return Reference to context memory to be used for function chaining. + */ + public static final SvcLogicContext ctxPutAll( SvcLogicContext ctx, Map entries ) { + for( Map.Entry entry : entries.entrySet() ) { + ctxSetAttribute( ctx, entry.getKey(), entry.getValue() ); + //ctx.setAttribute(entry.getKey(), entry.getValue().toString()); + } + + return ctx; + } + + /** + * Sets a key in context memory to the output of object's toString(). The + * key is deleted from context memory if object is null. + * @param ctx Reference to context memory. + * @param key Key to set. + * @param object Object whose toString() will be the value set + */ + public static final void ctxSetAttribute( SvcLogicContext ctx, String key, Object object ) { + if( object == null ) { + ctx.setAttribute(key, null); + } + else { + ctx.setAttribute(key, object.toString()); + } + } + + /** + * Sets a key in context memory to the output of object's toString(). + *

+ * The key is deleted from context memory if object is null. The key and + * value set in context memory are logged to the Logger at the provided + * logLevel level. + * @param Any Java object + * @param ctx Reference to context memory. + * @param key Key to set. + * @param obj Object whose toString() will be the value set + * @param LOG Logger to log to + * @param logLevel level to log at in Logger + */ + public static final void ctxSetAttribute( SvcLogicContext ctx, String key, O obj, Logger LOG, LogLevel logLevel ) { + String value = Objects.toString( obj, null ); + ctx.setAttribute( key, value ); + if( logLevelIsEnabled(LOG, logLevel ) ) { + if( value == null ) { + logMessageAtLevel( LOG, logLevel, "Deleting " + key ); + } + else { + logMessageAtLevel( LOG, logLevel, "Setting " + key + " = " + value ); + } + } + } + + /** + * Utility function used to get an array's length from context memory. + * Will return 0 if key doesn't exist in context memory or isn't numeric. + *

+ * Use to obtain a context memory array length without having to worry + * about throwing a NumberFormatException. + * @param ctx Reference to context memory + * @param key Key in context memory whose value is the array's length. If + * the key doesn't end in "_length", then "_length is appended. + * @param log Reference to Logger to log to + * @return The array length or 0 if the key is not found in context memory. + * @since 1.0 + */ + public static final int getArrayLength( SvcLogicContext ctx, String key ) { + return getArrayLength(ctx, key, null, null, null); + } + + /** + * Utility function used to get an array's length from context memory. + * Will return 0 if key doesn't exist in context memory or isn't numeric + * and print the provided log message to the configured log file. + *

+ * Use to obtain a context memory array length without having to worry + * about throwing a NumberFormatException. + * @param ctx Reference to context memory. + * @param key Key in context memory whose value is the array's length. If + * the key doesn't end in "_length", then "_length is appended. + * @param log Reference to Logger to log to. Doesn't log if null. + * @param logLevel Logging level to log the message at if the context + * memory key isn't found. Doesn't log if null. + * @param log_message Message to log if the context memory key isn't found. + * Doesn't log if null. + * @return The array length or 0 if the key is not found in context memory. + * @since 1.0 + */ + public static final int getArrayLength( SvcLogicContext ctx, String key, Logger log, LogLevel logLevel, String log_message ) { + String ctxKey = ( key.endsWith("_length") ) ? key : key + "_length"; + try { + return Integer.parseInt(ctx.getAttribute(ctxKey)); + } + catch( NumberFormatException e ) { + if( log != null && logLevel != null && log_message != null ) { + switch( logLevel ) { + case TRACE: + log.trace(log_message); + case DEBUG: + log.debug(log_message); + break; + case INFO: + log.info(log_message); + break; + case WARN: + log.warn(log_message); + break; + case ERROR: + log.error(log_message); + break; + } + } + } + + return 0; + } + + /** + * Prints sorted context memory key-value pairs to the log file at the log + * level. Returns immediately if the log level isn't enabled. + *

+ * O(n log(n)) time where n = size of context memory + * @param ctx Reference to context memory + * @param log Reference to Logger to log to + * @param logLevel Logging level to log the context memory key-value pairs + * at. + * @since 1.0 + */ + public static final void logContextMemory( SvcLogicContext ctx, Logger log, LogLevel logLevel ) { + logLevelIsEnabled( log, logLevel ); + + // Print sorted context memory key-value pairs to the log + ArrayList keys = new ArrayList(ctx.getAttributeKeySet()); + Collections.sort(keys); + for( String key : keys ) { + logMessageAtLevel( log, logLevel, key + " = " + ctx.getAttribute(key) ); + } + } + + + + // ========== PRIVATE FUNCTIONS ========== + + // TODO: javadoc + /** + * + * @param parameters + * @param log + * @param loglevel + * @since 7.0.1 + */ + public static final void logExecuteNodeParameters( Map parameters, Logger log, LogLevel loglevel ) { + logLevelIsEnabled( log, loglevel ); + + for( Map.Entry param : parameters.entrySet() ) { + logMessageAtLevel( log, loglevel, "PARAM: " + param.getKey() + " = " + param.getValue() ); + } + } + + // TODO: javadoc + /** + * Returns true if the loglevel is enabled. Otherwise, returns false. + * @param log Reference to logger + * @param loglevel Log level to check if enabled + * @return True if the loglevel is enabled. Otherwise, false + * @since 7.0.1 + */ + private static final boolean logLevelIsEnabled( Logger log, LogLevel loglevel ) { + // Return immediately if logging level isn't enabled + switch( loglevel ) { + case TRACE: + if( log.isTraceEnabled() ) { return true; } + return false; + case DEBUG: + if( log.isDebugEnabled() ) { return true; } + return false; + case INFO: + if( log.isInfoEnabled() ) { return true; } + return false; + case WARN: + if( log.isWarnEnabled() ) { return true; } + return false; + case ERROR: + if( log.isErrorEnabled() ) { return true; } + return false; + default: + throw new IllegalArgumentException("Unknown LogLevel: " + loglevel.toString()); + } + } + + // TODO: javadoc + /** + * + * @param log + * @param loglevel + * @param msg + * @since 7.0.1 + */ + private static final void logMessageAtLevel( Logger log, LogLevel loglevel, String msg ) { + switch( loglevel ) { + case TRACE: + log.trace(msg); + return; + case DEBUG: + log.debug(msg); + return; + case INFO: + log.info(msg); + return; + case WARN: + log.warn(msg); + return; + case ERROR: + log.error(msg); + return; + } + } + + + + // ========== LOCAL CLASSES ========== + + private class SortableCtxListElement implements Comparable { + HashMap child_elements = new HashMap(); + String[] sort_fields; + + public SortableCtxListElement( SvcLogicContext ctx, String root, String[] sort_fields ) { + this.sort_fields = sort_fields; + + for( String key : ctx.getAttributeKeySet() ) { + if( key.startsWith(root) ) { + if( key.length() == root.length() ) { + child_elements.put("", ctx.getAttribute(key)); + break; + } + else { + child_elements.put(key.substring(root.length()+1), ctx.getAttribute(key)); + } + } + } + } + + @Override + public int compareTo(SortableCtxListElement arg0) { + if( sort_fields == null ) { + return this.child_elements.get("").compareTo(arg0.child_elements.get("")); + } + + for( String field : this.sort_fields ) { + int result = this.child_elements.get(field).compareTo(arg0.child_elements.get(field)); + if( result != 0 ) { + return result; + } + } + + return 0; + } + } + + /** + * Creates a file that contains the content of context memory. + * @param parameters - must contain the parameter filename + * @param ctx Reference to context memory + * @throws SvcLogicException thrown if file cannot be created or if parameters are missing + */ + public static void printContext(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + if (parameters == null || parameters.isEmpty()) { + throw new SvcLogicException("no parameters passed"); + } + + checkParameters(parameters, new String[]{"filename"}, LOG); + + String fileName = parameters.get("filename"); + + + try (FileOutputStream fstr = new FileOutputStream(new File(fileName)); + PrintStream pstr = new PrintStream(fstr, true);) + { + pstr.println("#######################################"); + for (String attr : ctx.getAttributeKeySet()) { + pstr.println(attr + " = " + ctx.getAttribute(attr)); + } + } catch (Exception e) { + throw new SvcLogicException("Cannot write context to file " + fileName, e); + } + + + } + + /** + * Checks context memory for a set of required parameters + * Every parameter aside from prefix will be treated as mandatory + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + *
parameterMandatory/Optionaldescription
prefixOptionalthe prefix will be added to each parameter
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static void requiredParameters(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + if (parameters == null || parameters.keySet().size() < 1) { + String errorMessage = "requiredParameters should not be called if the parameters hashmap is null or empty!"; + LOG.error(errorMessage); + throw new SvcLogicException(errorMessage); + } + String prefixValue = null; + String prefix = "prefix"; + if(parameters.containsKey(prefix)){ + prefixValue = parameters.get(prefix); + parameters.remove(prefix); + } + checkParameters(prefixValue, ctx.getAttributeKeySet(), parameters.keySet(), LOG); + } + + private static void checkParameters(String prefixValue, Set ctx, Set parameters, Logger log) throws SvcLogicException { + for (String param : parameters) { + if (prefixValue != null) { + param = prefixValue + param; + } + if (!ctx.contains(param)) { + String errorMessage = "This method requires the parameters [" + StringUtils.join(parameters, ",") + + "], but " + param + " was not passed in."; + log.error(errorMessage); + throw new SvcLogicException(errorMessage); + } + } + } + + /** + * is in a different DG invocation just before/after we call NCS and set the state to InProgress + */ + /** + * setTime write the current date time to a string located at outputPath + * @param parameters - requires outputPath to not be null + * @param ctx Reference to context memory + * @throws SvcLogicException if a required parameter is missing an exception is thrown + */ + public static void setTime(Map parameters, SvcLogicContext ctx) throws SvcLogicException + { + checkParameters(parameters, new String[] { "outputPath" }, LOG); + + // Set the DateFormat + // "2015-03-16T12:18:35.138Z" + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + + // Parse the date + String ctxVariable = parameters.get("outputPath"); + try { + String dateTime = format.format(new Date()); + ctx.setAttribute(ctxVariable, dateTime); + } catch (Exception ex) { + throw new SvcLogicException("problem with setTime", ex); + } + } +} diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtilsActivator.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtilsActivator.java new file mode 100644 index 000000000..e0568ab77 --- /dev/null +++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtilsActivator.java @@ -0,0 +1,95 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 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.openecomp.sdnc.sli.SliPluginUtils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SliPluginUtilsActivator implements BundleActivator { + @SuppressWarnings("rawtypes") private List registrations = new LinkedList(); + + private static final Logger LOG = LoggerFactory.getLogger(SliPluginUtilsActivator.class); + private static final String SDNC_ROOT_DIR = "SDNC_CONFIG_DIR"; + private static final String DME2_PROPERTIES_FILE_NAME = "dme2.properties"; + + @Override + public void start(BundleContext ctx) throws Exception { + SliPluginUtils plugin = new SliPluginUtils(new Properties()); + LOG.info("Registering service " + plugin.getClass().getName()); + registrations.add(ctx.registerService(plugin.getClass().getName(), plugin, null)); + + SliStringUtils sliStringUtils_Plugin = new SliStringUtils(); + LOG.info("Registering service " + sliStringUtils_Plugin.getClass().getName()); + registrations.add(ctx.registerService(sliStringUtils_Plugin.getClass().getName(), sliStringUtils_Plugin, null)); + + try { + String path = System.getenv(SDNC_ROOT_DIR) + File.separator + DME2_PROPERTIES_FILE_NAME; + DME2 dmePlugin = initDme2(path); + if (dmePlugin != null) { + LOG.info("Registering service " + dmePlugin.getClass().getName()); + registrations.add(ctx.registerService(dmePlugin.getClass().getName(), dmePlugin, null)); + } + } catch (Exception e) { + LOG.error("DME2 plugin could not be started", e); + } + } + + public DME2 initDme2(String pathToDmeProperties) { + Properties dme2properties = new Properties(); + String loadPropertiesErrorMessage = "Couldn't load DME2 properties at path " + pathToDmeProperties; + File dme2propertiesFile = new File(pathToDmeProperties); + + try { + dme2properties.load(new FileReader(dme2propertiesFile)); + String proxyUrlProperty = dme2properties.getProperty("proxyUrl"); + String[] proxyUrls = proxyUrlProperty.split(","); + DME2 dmePlugin = new DME2(dme2properties.getProperty("aafUserName"), dme2properties.getProperty("aafPassword"), dme2properties.getProperty("envContext"), dme2properties.getProperty("routeOffer"), proxyUrls, dme2properties.getProperty("commonServiceVersion")); + dmePlugin.setPartner(dme2properties.getProperty("partner")); + return dmePlugin; + } catch (FileNotFoundException e) { + LOG.error(loadPropertiesErrorMessage); + } catch (IOException e) { + LOG.error(loadPropertiesErrorMessage); + } + LOG.error("Couldn't create DME2 plugin"); + return null; + } + + @Override + public void stop(BundleContext ctx) throws Exception { + for (@SuppressWarnings("rawtypes") ServiceRegistration registration : registrations) { + registration.unregister(); + registration = null; + } + } +} diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliStringUtils.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliStringUtils.java new file mode 100644 index 000000000..43af6f59a --- /dev/null +++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliStringUtils.java @@ -0,0 +1,396 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 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.openecomp.sdnc.sli.SliPluginUtils; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.openecomp.sdnc.sli.SvcLogicContext; +import org.openecomp.sdnc.sli.SvcLogicException; +import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A SvcLogicJavaPlugin that exposes java.lang.String functions to DirectedGraph + */ +public class SliStringUtils implements SvcLogicJavaPlugin { + private static final Logger LOG = LoggerFactory.getLogger(SliStringUtils.class); + + public SliStringUtils() {} + + /** + * Provides split functionality to Directed Graphs. + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
original_stringMandatoryString to perform split on
regexMandatorythe delimiting regular expression
limitOptionalresult threshold. See String.split method for further description. Defaults to 0
ctx_memory_result_keyMandatoryKey in context memory to populate the resulting array of strings under
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + * @see String#split(String, int) + */ + public void split( Map parameters, SvcLogicContext ctx ) throws SvcLogicException { + final String original_string = parameters.get("original_string"); + LOG.trace("original_string = " + original_string); + final String regex = parameters.get("regex"); + LOG.trace("regex = " + regex); + final String limit_str = parameters.get("limit"); + LOG.trace("limit_str = " + limit_str); + final String ctx_memory_result_key = parameters.get("ctx_memory_result_key"); + LOG.trace("ctx_memory_result_key = " + ctx_memory_result_key); + + try { + // Validation that parameters are not null + SliPluginUtils.checkParameters( parameters, new String[]{"original_string","regex","ctx_memory_result_key"}, LOG ); + + // Read limit from context memory. Default to 0 if null/empty + int limit = 0; + if( StringUtils.isNotEmpty(limit_str) ) { + try { + limit = Integer.parseInt(limit_str); + } + catch( NumberFormatException e ) { + throw new IllegalArgumentException( "The limit parameter of the SliStringUtils.split() function must be a number, empty string, or null", e ); + } + } + + // Call String.split(regex,limit) on string passed in + String[] split_string = original_string.split(regex, limit); + + // Populate context memory with results + for( int i = 0; i < split_string.length; i++ ) { + SliPluginUtils.ctxSetAttribute(ctx, ctx_memory_result_key + '[' + i + ']', split_string[i], LOG, SliPluginUtils.LogLevel.DEBUG); + } + SliPluginUtils.ctxSetAttribute(ctx, ctx_memory_result_key + "_length", new Integer(split_string.length), LOG, SliPluginUtils.LogLevel.DEBUG); + } + catch( Exception e ) { + // Have error message print parameters + throw new SvcLogicException( "An error occurred during SliStringUtils.split() where original_string = " + quotedOrNULL(regex) + + " regex = " + quotedOrNULL(regex) + + " limit = " + quotedOrNULL(regex) + + " ctx_memory_result_key = " + quotedOrNULL(regex), e ); + } + } + + private static String quotedOrNULL( String str ) { + return (str == null) ? "NULL" : '"' + str + '"'; + } + + /** + * exposes equalsIgnoreCase to directed graph + * @param parameters HashMap of parameters passed by the DG to this function + * emits a true or false outcome + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
targetMandatorytarget string
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static String equalsIgnoreCase(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG); + if(parameters.get("source").equalsIgnoreCase(parameters.get("target"))){ + return "true"; + } + return "false"; + } + + /** + * exposes toUpperCase to directed graph + * writes an upperCase version of source to outputPath + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
outputPathMandatorythe location in context memory the result is written to
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static void toUpper(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").toUpperCase()); + } + + /** + * exposes toLowerCase to directed graph + * writes a lowerCase version of source to outputPath + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
outputPathMandatorythe location in context memory the result is written to
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static void toLower(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").toLowerCase()); + } + + /** + * exposes contains to directed graph to test if one string contains another + * tests if the source contains the target + * @param parameters HashMap of parameters passed by the DG to this function + * emits a true or false outcome + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
targetMandatorytarget string
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static String contains(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG); + if(parameters.get("source").contains(parameters.get("target"))){ + return "true"; + } + return "false"; + } + + /** + * exposes endsWith to directed graph to test if one string endsWith another string + * tests if the source ends with the target + * @param parameters HashMap of parameters passed by the DG to this function + * emits a true or false outcome + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
targetMandatorytarget string
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static String endsWith(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG); + if(parameters.get("source").endsWith(parameters.get("target"))){ + return "true"; + } + return "false"; + } + + /** + * exposes startsWith to directed graph to test if one string endsWith another string + * tests if the source ends with the target + * @param parameters HashMap of parameters passed by the DG to this function + * emits a true or false outcome + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
targetMandatorytarget string
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static String startsWith(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG); + if(parameters.get("source").startsWith(parameters.get("target"))){ + return "true"; + } + return "false"; + } + + /** + * exposes trim to directed graph + * writes a trimmed version of the string to the outputPath + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
outputPathMandatorythe location in context memory the result is written to
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static void trim(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").trim()); + } + + /** + * exposes String.length() to directed graph + * writes the length of source to outputPath + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
outputPathMandatorythe location in context memory the result is written to
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static void getLength(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), String.valueOf(parameters.get("source").length())); + } + + /** + * exposes replace to directed graph + * writes the length of source to outputPath + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
targetMandatoryThe sequence of char values to be replaced
replacementMandatoryThe replacement sequence of char values
outputPathMandatorythe location in context memory the result is written to
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static void replace(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath","target","replacement"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), (parameters.get("source").replace(parameters.get("target"), parameters.get("replacement")))); + } + + /** + * Provides substring functionality to Directed Graphs. + *

+ * Calls either String.substring(String beginIndex) or + * String.substring(String beginInded, String endIndex) if the end-index + * is present or not. + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
stringMandatoryString to perform substring on
resultMandatoryKey in context memory to populate the resulting string in
begin-indexMandatoryBeginning index to pass to Java substring function
end-indexOptionalEnding index to pass to Java substring function. If not included, String.substring(begin) will be called.
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public void substring( Map parameters, SvcLogicContext ctx ) throws SvcLogicException { + try { + SliPluginUtils.checkParameters( parameters, new String[]{"string","begin-index","result"}, LOG ); + final String string = parameters.get("string"); + final String result = parameters.get("result"); + final String begin = parameters.get("begin-index"); + final String end = parameters.get("end-index"); + if( StringUtils.isEmpty(end) ) { + ctx.setAttribute( result, string.substring(Integer.parseInt(begin)) ); + } + else { + ctx.setAttribute( result, string.substring(Integer.parseInt(begin), Integer.parseInt(end)) ); + } + } + catch( Exception e ) { + throw new SvcLogicException( "An error occurred while the Directed Graph was performing a substring", e ); + } + } + + /** + * Provides concat functionality to Directed Graphs. + *

+ * Will concat target to source and write the result to outputPath + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
targetMandatoryThe sequence of char values to be replaced
outputPathMandatorythe location in context memory the result is written to
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static void concat( Map parameters, SvcLogicContext ctx ) throws SvcLogicException { + SliPluginUtils.checkParameters( parameters, new String[]{"source","target","outputPath"}, LOG ); + String result = parameters.get("source").concat(parameters.get("target")); + ctx.setAttribute(parameters.get("outputPath"), result); + } + + /** + * Provides url encoding functionality to Directed Graphs. + *

+ * Will url encode the source and write the result to outputPath + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
encodingOptionalthe name of a supported character encoding, defaulted to UTF-8 if not supplied
outputPathMandatorythe location in context memory the result is written to
+ * @param ctx Reference to context memory + * @throws SvcLogicException + */ + public static void urlEncode(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[] { "source", "outputPath" }, LOG); + String encoding = parameters.get("encoding"); + if (encoding == null) { + encoding = "UTF-8"; + } + try { + String result = URLEncoder.encode(parameters.get("source"), encoding); + ctx.setAttribute(parameters.get("outputPath"), result); + } catch (UnsupportedEncodingException e) { + throw new SvcLogicException("Url encode failed.", e); + } + } + +} diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextList.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextList.java new file mode 100644 index 000000000..89a4a98ff --- /dev/null +++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextList.java @@ -0,0 +1,210 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 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.openecomp.sdnc.sli.SliPluginUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.ListIterator; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.openecomp.sdnc.sli.SvcLogicContext; + +/** + * A utility class used to manage list manipulation in the context memory. + * @see org.openecomp.sdnc.sli.SvcLogicContext + */ +public class SvcLogicContextList { + /** + * Internal flag indicating if list should be deleted from context memory + * when it is copied into the SvcLogicContextList object. + */ + private enum OperType { + COPY, EXTRACT + } + + // TODO: javadoc + protected final String prefix; + // TODO: javadoc + protected final ArrayList> list; + + + // TODO: javadoc + public SvcLogicContextList( SvcLogicContext ctx, String list_prefix ) { + this(ctx, list_prefix, OperType.COPY); + } + + // TODO: javadoc + private SvcLogicContextList( SvcLogicContext ctx, String list_prefix, OperType operation ) { + this.prefix = list_prefix; + + // Initialize list + int capacity = getCtxListLength(ctx, prefix); + this.list = new ArrayList>(capacity); + for( int i = 0; i < capacity; i++ ) { + this.list.add(i, new HashMap()); + } + + // Populate "elements" in list + String prefix_bracket = this.prefix + '['; + for (String key : new HashSet(ctx.getAttributeKeySet())) { + if( key.startsWith(prefix_bracket) ) { + // Extract the index of the list + int index = getCtxListIndex(key, this.prefix, capacity); + + // Store the + String suffix = key.substring((prefix_bracket + index + ']').length()); + suffix = suffix.isEmpty() ? suffix : suffix.substring(1); + this.list.get(index).put( suffix, ctx.getAttribute(key)); + + // If flag to extract set, remove data from context memory as + // it is read into this list + if( operation == OperType.EXTRACT ) { + ctx.setAttribute(key, null); + } + } + } + + // If flag to extract set, remove list _length value from cxt mem + if( operation == OperType.EXTRACT ) { + ctx.setAttribute(this.prefix + "_length", null); + } + } + + // TODO: javadoc + public static SvcLogicContextList extract( SvcLogicContext ctx, String list_prefix ) { + return new SvcLogicContextList(ctx, list_prefix, OperType.EXTRACT); + } + + + // ========== PUBLIC FUNCTIONS ========== + + // TODO: javadoc + public HashMap get( int index ) { + return this.list.get(index); + } + + // TODO: javadoc + public HashMap remove( int index ) { + return this.list.remove(index); + } + + // TODO: javadoc + public void remove( String value ) { + remove( "", value ); + } + + // TODO: javadoc + public void remove( String key, String value ) { + if( value == null ) { + throw new IllegalArgumentException("value cannot be null"); + } + + ListIterator> itr = this.list.listIterator(); + while( itr.hasNext() ) { + if( value.equals(itr.next().get(key)) ) { + itr.remove(); + } + } + } + + // TODO javadoc + public void remove( Map primary_key ) { + ListIterator> itr = this.list.listIterator(); + while( itr.hasNext() ) { + boolean found = true; + HashMap list_element = itr.next(); + for( Map.Entry key : primary_key.entrySet() ) { + if( !key.getValue().equals(list_element.get(key.getKey())) ) { + found = false; + break; + } + } + + if( found ) { + itr.remove(); + } + } + } + + // TODO: javadoc + public int size() { + return list.size(); + } + + // TODO: javadoc + public void writeToContext( SvcLogicContext ctx ) { + ctx.setAttribute( prefix + "_length", Integer.toString(this.list.size()) ); + + for( int i = 0; i < this.list.size(); i++ ) { + for( Map.Entry entry : this.list.get(i).entrySet() ) { + if( entry.getKey().equals("") ) { + ctx.setAttribute(prefix + '[' + i + ']', entry.getValue()); + } else { + ctx.setAttribute(prefix + '[' + i + "]." + entry.getKey(), entry.getValue()); + } + } + } + } + + + + // ========== PRIVATE STATIC FUNCTIONS ========== + + // TODO: javadoc + private static int getCtxListIndex( String key, String prefix, int list_size ) { + int index = getCtxListIndex( key, prefix ); + if( index >= list_size ) { + throw new IllegalArgumentException("Context memory list \"" + prefix + "[]\" contains an index >= the size of the list", new ArrayIndexOutOfBoundsException("index \"" + index + "\" is outside the bounds of the context memory list \"" + prefix + "[]. List Length = " + list_size)); + } else if (index < 0) { + throw new IllegalArgumentException("Context memory list \"" + prefix + "[]\" contains a negative index", new NegativeArraySizeException("index \"" + index + "\" of context memory list is negative")); + } + + return index; + } + + // TODO: javadoc + private static int getCtxListIndex( String key, String prefix ) { + String ctx_index_str = StringUtils.substringBetween(key.substring(prefix.length()), "[", "]"); + try { + return Integer.parseInt( ctx_index_str ); + } catch (NumberFormatException e) { + throw new IllegalStateException("Could not parse index value \"" + ctx_index_str + "\" in context memory key \"" + key + "\"", e); + } + } + + // TODO: javadoc + private static int getCtxListLength( SvcLogicContext ctx, String prefix ) { + String _length_key = prefix + "_length"; + String _length_val_str = ctx.getAttribute(_length_key); + try { + return Integer.parseInt(_length_val_str); + } catch (NumberFormatException e) { + if( _length_val_str == null ) { + throw new IllegalStateException( "Could not find list length \"" + _length_key + "\" in context memory." ); + } else { + throw new IllegalStateException( "Could not parse index value \"" + _length_val_str + "\" of context memory list length \"" + _length_key + "\"" , e ); + } + } + } +} diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextObject.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextObject.java new file mode 100644 index 000000000..d79522f04 --- /dev/null +++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextObject.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 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.openecomp.sdnc.sli.SliPluginUtils; + +import org.openecomp.sdnc.sli.SvcLogicContext; + +public interface SvcLogicContextObject { + public void writeToContext( SvcLogicContext ctx, String root ); +} diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/YesNo.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/YesNo.java new file mode 100644 index 000000000..4d2fb4c29 --- /dev/null +++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/YesNo.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 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.openecomp.sdnc.sli.SliPluginUtils.commondatastructures; + +/** + * An enum found in many Yang models. It is commonly used as a + * substitute for boolean. + */ +public enum YesNo { + N, Y; + + /** + * Method overload for {@link #valueOf(String)} for the char primative + */ + public static YesNo valueOf( final char name ) { + return YesNo.valueOf( Character.toString(name) ); + } + + /** + * Method overload for {@link #valueOf(String)} for the Character object + */ + public static YesNo valueOf( final Character name ) { + if( name == null ) { + return null; + } + + return YesNo.valueOf( name.toString() ); + } +} diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/package-info.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/package-info.java new file mode 100644 index 000000000..4a81d9a30 --- /dev/null +++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/package-info.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 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.openecomp.sdnc.sli.SliPluginUtils.commondatastructures; -- cgit 1.2.3-korg From 32f16144e17d2df0831f14d9e65a83756a6ef844 Mon Sep 17 00:00:00 2001 From: Dan Timoney Date: Thu, 27 Jul 2017 16:32:20 -0400 Subject: Refactor dblib Changed openecomp references in dblib, filters and sli to onap. Note: these must be committed together to get a clean compile. Issue: CCSDK-11 Change-Id: Ibe0f64fb20f3ae9cdda2f7ea969ca722bbde0d15 Signed-off-by: Dan Timoney --- dblib/pom.xml | 4 +- dblib/provider/pom.xml | 9 +- .../ccsdk/sli/core/dblib/CachedDataSource.java | 617 ++++++++++ .../sli/core/dblib/CachedDataSourceFactory.java | 45 + .../ccsdk/sli/core/dblib/DBConfigException.java | 47 + .../sli/core/dblib/DBLIBResourceActivator.java | 130 +++ .../onap/ccsdk/sli/core/dblib/DBLibConnection.java | 390 +++++++ .../onap/ccsdk/sli/core/dblib/DBLibException.java | 39 + .../ccsdk/sli/core/dblib/DBResourceManager.java | 863 ++++++++++++++ .../ccsdk/sli/core/dblib/DBResourceObserver.java | 27 + .../onap/ccsdk/sli/core/dblib/DataAccessor.java | 33 + .../ccsdk/sli/core/dblib/DataSourceComparator.java | 33 + .../onap/ccsdk/sli/core/dblib/DbLibService.java | 46 + .../core/dblib/DblibConfigurationException.java | 45 + .../dblib/NoAvailableConnectionsException.java | 36 + .../core/dblib/TerminatingCachedDataSource.java | 82 ++ .../sli/core/dblib/config/BaseDBConfiguration.java | 104 ++ .../ccsdk/sli/core/dblib/config/DbConfigPool.java | 56 + .../sli/core/dblib/config/JDBCConfiguration.java | 31 + .../factory/AbstractDBResourceManagerFactory.java | 39 + .../factory/AbstractResourceManagerFactory.java | 104 ++ .../sli/core/dblib/factory/DBConfigFactory.java | 99 ++ .../dblib/factory/FactoryNotDefinedException.java | 37 + .../core/dblib/jdbc/JdbcDBCachedDataSource.java | 249 ++++ .../dblib/jdbc/JdbcDbResourceManagerFactory.java | 186 +++ .../sli/core/dblib/jdbc/MySQLCachedDataSource.java | 217 ++++ .../ccsdk/sli/core/dblib/pm/PollingWorker.java | 217 ++++ .../sli/core/dblib/pm/SQLExecutionMonitor.java | 237 ++++ .../core/dblib/pm/SQLExecutionMonitorObserver.java | 37 + .../sdnc/sli/resource/dblib/CachedDataSource.java | 616 ---------- .../resource/dblib/CachedDataSourceFactory.java | 45 - .../sdnc/sli/resource/dblib/DBConfigException.java | 47 - .../sli/resource/dblib/DBLIBResourceActivator.java | 130 --- .../sdnc/sli/resource/dblib/DBLibConnection.java | 390 ------- .../sdnc/sli/resource/dblib/DBLibException.java | 39 - .../sdnc/sli/resource/dblib/DBResourceManager.java | 862 -------------- .../sli/resource/dblib/DBResourceObserver.java | 27 - .../sdnc/sli/resource/dblib/DataAccessor.java | 33 - .../sli/resource/dblib/DataSourceComparator.java | 33 - .../sdnc/sli/resource/dblib/DbLibService.java | 46 - .../dblib/DblibConfigurationException.java | 45 - .../dblib/NoAvailableConnectionsException.java | 36 - .../dblib/TerminatingCachedDataSource.java | 82 -- .../resource/dblib/config/BaseDBConfiguration.java | 104 -- .../sli/resource/dblib/config/DbConfigPool.java | 56 - .../resource/dblib/config/JDBCConfiguration.java | 31 - .../factory/AbstractDBResourceManagerFactory.java | 39 - .../factory/AbstractResourceManagerFactory.java | 104 -- .../resource/dblib/factory/DBConfigFactory.java | 100 -- .../dblib/factory/FactoryNotDefinedException.java | 37 - .../dblib/jdbc/JdbcDBCachedDataSource.java | 249 ---- .../dblib/jdbc/JdbcDbResourceManagerFactory.java | 186 --- .../resource/dblib/jdbc/MySQLCachedDataSource.java | 217 ---- .../sdnc/sli/resource/dblib/pm/PollingWorker.java | 217 ---- .../sli/resource/dblib/pm/SQLExecutionMonitor.java | 237 ---- .../dblib/pm/SQLExecutionMonitorObserver.java | 37 - dblib/provider/src/main/resources/dblib.properties | 24 +- filters/features/src/main/resources/features.xml | 5 +- .../src/assembly/assemble_installer_zip.xml | 5 +- .../src/assembly/assemble_mvnrepo_zip.xml | 5 +- .../src/main/resources/scripts/install-feature.sh | 5 +- filters/provider/pom.xml | 13 +- .../org/onap/ccsdk/sli/core/filters/Activator.java | 62 + .../org/onap/ccsdk/sli/core/filters/LogFilter.java | 221 ++++ .../filters/RequestResponseDbLoggingFilter.java | 297 +++++ .../core/filters/RequestResponseLoggingFilter.java | 288 +++++ .../java/org/openecomp/sdnc/filters/Activator.java | 63 -- .../java/org/openecomp/sdnc/filters/LogFilter.java | 222 ---- .../filters/RequestResponseDbLoggingFilter.java | 297 ----- .../sdnc/filters/RequestResponseLoggingFilter.java | 289 ----- pom.xml | 5 +- sli/common/pom.xml | 6 +- .../org/onap/ccsdk/sli/core/sli/ExprGrammar.g4 | 67 ++ .../antlr4/org/openecomp/sdnc/sli/ExprGrammar.g4 | 66 -- .../ccsdk/sli/core/sli/BreakNodeException.java | 45 + .../ccsdk/sli/core/sli/ConfigurationException.java | 44 + .../sli/core/sli/DuplicateValueException.java | 44 + .../org/onap/ccsdk/sli/core/sli/MessageWriter.java | 301 +++++ .../org/onap/ccsdk/sli/core/sli/MetricLogger.java | 300 +++++ .../onap/ccsdk/sli/core/sli/SvcLogicAdaptor.java | 41 + .../org/onap/ccsdk/sli/core/sli/SvcLogicAtom.java | 173 +++ .../sli/core/sli/SvcLogicBinaryExpression.java | 148 +++ .../onap/ccsdk/sli/core/sli/SvcLogicContext.java | 247 ++++ .../ccsdk/sli/core/sli/SvcLogicDblibStore.java | 532 +++++++++ .../onap/ccsdk/sli/core/sli/SvcLogicException.java | 45 + .../ccsdk/sli/core/sli/SvcLogicExprListener.java | 315 ++++++ .../core/sli/SvcLogicExprParserErrorListener.java | 43 + .../ccsdk/sli/core/sli/SvcLogicExpression.java | 50 + .../sli/core/sli/SvcLogicExpressionFactory.java | 98 ++ .../ccsdk/sli/core/sli/SvcLogicFunctionCall.java | 79 ++ .../org/onap/ccsdk/sli/core/sli/SvcLogicGraph.java | 183 +++ .../ccsdk/sli/core/sli/SvcLogicJavaPlugin.java | 33 + .../onap/ccsdk/sli/core/sli/SvcLogicJdbcStore.java | 894 +++++++++++++++ .../org/onap/ccsdk/sli/core/sli/SvcLogicNode.java | 455 ++++++++ .../onap/ccsdk/sli/core/sli/SvcLogicParser.java | 597 ++++++++++ .../sli/core/sli/SvcLogicParserException.java | 42 + .../onap/ccsdk/sli/core/sli/SvcLogicRecorder.java | 29 + .../onap/ccsdk/sli/core/sli/SvcLogicResource.java | 52 + .../org/onap/ccsdk/sli/core/sli/SvcLogicStore.java | 36 + .../ccsdk/sli/core/sli/SvcLogicStoreFactory.java | 95 ++ .../ccsdk/sli/core/sli/SvcLogicVariableTerm.java | 76 ++ .../org/openecomp/sdnc/sli/BreakNodeException.java | 46 - .../openecomp/sdnc/sli/ConfigurationException.java | 45 - .../sdnc/sli/DuplicateValueException.java | 45 - .../java/org/openecomp/sdnc/sli/MessageWriter.java | 302 ----- .../java/org/openecomp/sdnc/sli/MetricLogger.java | 301 ----- .../org/openecomp/sdnc/sli/SvcLogicAdaptor.java | 42 - .../java/org/openecomp/sdnc/sli/SvcLogicAtom.java | 174 --- .../sdnc/sli/SvcLogicBinaryExpression.java | 149 --- .../org/openecomp/sdnc/sli/SvcLogicContext.java | 248 ---- .../org/openecomp/sdnc/sli/SvcLogicDblibStore.java | 533 --------- .../org/openecomp/sdnc/sli/SvcLogicException.java | 46 - .../openecomp/sdnc/sli/SvcLogicExprListener.java | 316 ------ .../sdnc/sli/SvcLogicExprParserErrorListener.java | 44 - .../org/openecomp/sdnc/sli/SvcLogicExpression.java | 51 - .../sdnc/sli/SvcLogicExpressionFactory.java | 99 -- .../openecomp/sdnc/sli/SvcLogicFunctionCall.java | 80 -- .../java/org/openecomp/sdnc/sli/SvcLogicGraph.java | 184 --- .../org/openecomp/sdnc/sli/SvcLogicJavaPlugin.java | 34 - .../org/openecomp/sdnc/sli/SvcLogicJdbcStore.java | 895 --------------- .../java/org/openecomp/sdnc/sli/SvcLogicNode.java | 456 -------- .../org/openecomp/sdnc/sli/SvcLogicParser.java | 598 ---------- .../sdnc/sli/SvcLogicParserException.java | 43 - .../org/openecomp/sdnc/sli/SvcLogicRecorder.java | 30 - .../org/openecomp/sdnc/sli/SvcLogicResource.java | 53 - .../java/org/openecomp/sdnc/sli/SvcLogicStore.java | 37 - .../openecomp/sdnc/sli/SvcLogicStoreFactory.java | 96 -- .../openecomp/sdnc/sli/SvcLogicVariableTerm.java | 77 -- sli/common/src/main/resources/crAseNetwork.sql | 5 +- .../ccsdk/sli/core/sli/SvcLogicContextTest.java | 68 ++ .../sli/core/sli/SvcLogicExpressionParserTest.java | 68 ++ .../ccsdk/sli/core/sli/SvcLogicParserTest.java | 162 +++ .../openecomp/sdnc/sli/SvcLogicContextTest.java | 69 -- .../sdnc/sli/SvcLogicExpressionParserTest.java | 69 -- .../org/openecomp/sdnc/sli/SvcLogicParserTest.java | 163 --- .../test/resources/EvcActivateSvcLogic_v100.xml | 5 +- .../src/test/resources/EvcPortSvcLogic_v100.xml | 5 +- .../test/resources/ReleasePortSvcLogic_v101.xml | 5 +- .../src/test/resources/bad_neutron_logic_v11.xml | 5 +- sli/common/src/test/resources/mergetest.xml | 5 +- .../src/test/resources/neutron_logic_v10.xml | 5 +- sli/common/src/test/resources/nonsense.xml | 5 +- .../src/test/resources/simplelogger.properties | 5 +- sli/common/src/test/resources/svclogic.properties | 5 +- sli/common/src/test/resources/svclogic.sh | 5 +- sli/features/src/main/resources/features.xml | 5 +- .../src/assembly/assemble_installer_zip.xml | 5 +- .../src/assembly/assemble_mvnrepo_zip.xml | 5 +- .../src/main/resources/scripts/install-feature.sh | 5 +- sli/pom.xml | 2 +- sli/provider/pom.xml | 6 +- .../sli/core/sli/provider/BlockNodeExecutor.java | 74 ++ .../sli/core/sli/provider/BreakNodeExecutor.java | 41 + .../sli/core/sli/provider/CallNodeExecutor.java | 164 +++ .../core/sli/provider/ConfigureNodeExecutor.java | 247 ++++ .../sli/core/sli/provider/DeleteNodeExecutor.java | 100 ++ .../sli/core/sli/provider/ExecuteNodeExecutor.java | 160 +++ .../sli/core/sli/provider/ExistsNodeExecutor.java | 104 ++ .../sli/core/sli/provider/ForNodeExecutor.java | 108 ++ .../core/sli/provider/GetResourceNodeExecutor.java | 133 +++ .../core/sli/provider/IsAvailableNodeExecutor.java | 102 ++ .../ccsdk/sli/core/sli/provider/MdsalHelper.java | 1185 +++++++++++++++++++ .../sli/core/sli/provider/NotifyNodeExecutor.java | 101 ++ .../sli/core/sli/provider/RecordNodeExecutor.java | 118 ++ .../sli/core/sli/provider/ReleaseNodeExecutor.java | 99 ++ .../sli/core/sli/provider/ReserveNodeExecutor.java | 113 ++ .../sli/core/sli/provider/ReturnNodeExecutor.java | 77 ++ .../sli/core/sli/provider/SaveNodeExecutor.java | 141 +++ .../sli/core/sli/provider/SetNodeExecutor.java | 188 ++++ .../sli/core/sli/provider/SvcLogicActivator.java | 224 ++++ .../core/sli/provider/SvcLogicAdaptorFactory.java | 85 ++ .../sli/provider/SvcLogicExpressionResolver.java | 604 ++++++++++ .../core/sli/provider/SvcLogicNodeExecutor.java | 109 ++ .../sli/core/sli/provider/SvcLogicService.java | 75 ++ .../sli/core/sli/provider/SvcLogicServiceImpl.java | 272 +++++ .../sli/core/sli/provider/SwitchNodeExecutor.java | 62 + .../sli/core/sli/provider/UpdateNodeExecutor.java | 135 +++ .../sli/core/sli/provider/WhileNodeExecutor.java | 74 ++ .../sdnc/sli/provider/BlockNodeExecutor.java | 75 -- .../sdnc/sli/provider/BreakNodeExecutor.java | 42 - .../sdnc/sli/provider/CallNodeExecutor.java | 165 --- .../sdnc/sli/provider/ConfigureNodeExecutor.java | 248 ---- .../sdnc/sli/provider/DeleteNodeExecutor.java | 101 -- .../sdnc/sli/provider/ExecuteNodeExecutor.java | 161 --- .../sdnc/sli/provider/ExistsNodeExecutor.java | 105 -- .../sdnc/sli/provider/ForNodeExecutor.java | 109 -- .../sdnc/sli/provider/GetResourceNodeExecutor.java | 134 --- .../sdnc/sli/provider/IsAvailableNodeExecutor.java | 103 -- .../openecomp/sdnc/sli/provider/MdsalHelper.java | 1186 -------------------- .../sdnc/sli/provider/NotifyNodeExecutor.java | 102 -- .../sdnc/sli/provider/RecordNodeExecutor.java | 119 -- .../sdnc/sli/provider/ReleaseNodeExecutor.java | 100 -- .../sdnc/sli/provider/ReserveNodeExecutor.java | 114 -- .../sdnc/sli/provider/ReturnNodeExecutor.java | 78 -- .../sdnc/sli/provider/SaveNodeExecutor.java | 142 --- .../sdnc/sli/provider/SetNodeExecutor.java | 189 ---- .../sdnc/sli/provider/SvcLogicActivator.java | 225 ---- .../sdnc/sli/provider/SvcLogicAdaptorFactory.java | 86 -- .../sli/provider/SvcLogicExpressionResolver.java | 605 ---------- .../sdnc/sli/provider/SvcLogicNodeExecutor.java | 110 -- .../sdnc/sli/provider/SvcLogicService.java | 76 -- .../sdnc/sli/provider/SvcLogicServiceImpl.java | 273 ----- .../sdnc/sli/provider/SwitchNodeExecutor.java | 63 -- .../sdnc/sli/provider/UpdateNodeExecutor.java | 136 --- .../sdnc/sli/provider/WhileNodeExecutor.java | 75 -- .../ccsdk/sli/core/sli/provider/BadPlugin.java | 55 + .../core/sli/provider/ExecuteNodeExecutorTest.java | 58 + .../sli/core/sli/provider/LunchSelectorPlugin.java | 77 ++ .../sli/core/sli/provider/MdsalHelperTest.java | 42 + .../core/sli/provider/MdsalHelperTesterUtil.java | 36 + .../ccsdk/sli/core/sli/provider/PluginTest.java | 107 ++ .../provider/SvcLogicExpressionResolverTest.java | 122 ++ .../sli/provider/SvcLogicGraphExecutorTest.java | 211 ++++ .../sli/core/sli/provider/VoidDummyPlugin.java | 37 + .../org/openecomp/sdnc/sli/provider/BadPlugin.java | 56 - .../sdnc/sli/provider/ExecuteNodeExecutorTest.java | 57 - .../sdnc/sli/provider/LunchSelectorPlugin.java | 78 -- .../sdnc/sli/provider/MdsalHelperTest.java | 43 - .../sdnc/sli/provider/MdsalHelperTesterUtil.java | 37 - .../openecomp/sdnc/sli/provider/PluginTest.java | 106 -- .../provider/SvcLogicExpressionResolverTest.java | 123 -- .../sli/provider/SvcLogicGraphExecutorTest.java | 212 ---- .../sdnc/sli/provider/VoidDummyPlugin.java | 38 - .../src/test/resources/l3sdn_logic_v10.xml | 5 +- .../src/test/resources/simplelogger.properties | 5 +- .../src/test/resources/svclogic.properties | 5 +- sli/recording/pom.xml | 4 +- .../ccsdk/sli/core/sli/recording/FileRecorder.java | 116 ++ .../sli/core/sli/recording/RecordingActivator.java | 74 ++ .../sli/core/sli/recording/Slf4jRecorder.java | 129 +++ .../openecomp/sdnc/sli/recording/FileRecorder.java | 117 -- .../sdnc/sli/recording/RecordingActivator.java | 75 -- .../sdnc/sli/recording/Slf4jRecorder.java | 130 --- .../src/main/resources/svclogic.properties | 5 +- .../features/src/main/resources/features.xml | 5 +- .../src/assembly/assemble_installer_zip.xml | 5 +- .../src/assembly/assemble_mvnrepo_zip.xml | 5 +- .../src/main/resources/scripts/install-feature.sh | 5 +- .../openecomp/sdnc/sli/SliPluginUtils/DME2.java | 11 +- .../sdnc/sli/SliPluginUtils/SliPluginUtils.java | 13 +- .../SliPluginUtils/SliPluginUtilsActivator.java | 5 +- .../sdnc/sli/SliPluginUtils/SliStringUtils.java | 11 +- .../sli/SliPluginUtils/SvcLogicContextList.java | 9 +- .../sli/SliPluginUtils/SvcLogicContextObject.java | 7 +- .../SliPluginUtils/commondatastructures/YesNo.java | 5 +- .../commondatastructures/package-info.java | 5 +- .../sli/SliPluginUtils/CheckParametersTest.java | 9 +- .../sdnc/sli/SliPluginUtils/Dme2Test.java | 5 +- .../SliPluginUtils_StaticFunctionsTest.java | 9 +- .../SliPluginUtils/SliPluginUtils_ctxSortList.java | 9 +- .../SliPluginUtils_ctxSortListTest.java | 9 +- .../sli/SliPluginUtils/SliStringUtilsTest.java | 9 +- .../SliPluginUtils/SvcLogicContextListTest.java | 7 +- sliapi/features/src/main/resources/features.xml | 5 +- .../src/assembly/assemble_installer_zip.xml | 5 +- .../src/assembly/assemble_mvnrepo_zip.xml | 5 +- .../src/main/resources/scripts/install-feature.sh | 5 +- .../impl/rev140523/SliapiProviderModule.java | 5 +- .../rev140523/SliapiProviderModuleFactory.java | 5 +- .../org/openecomp/sdnc/sliapi/SliapiHelper.java | 7 +- .../org/openecomp/sdnc/sliapi/sliapiProvider.java | 7 +- .../src/main/resources/initial/sliapi-provider.xml | 5 +- src/site/apt/nodes.apt | 5 +- src/site/site.xml | 5 +- 264 files changed, 16399 insertions(+), 16527 deletions(-) create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSourceFactory.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBConfigException.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLIBResourceActivator.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibConnection.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibException.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceManager.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceObserver.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataAccessor.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataSourceComparator.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DbLibService.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DblibConfigurationException.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/NoAvailableConnectionsException.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/TerminatingCachedDataSource.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/BaseDBConfiguration.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/DbConfigPool.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/JDBCConfiguration.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/AbstractDBResourceManagerFactory.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/AbstractResourceManagerFactory.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/DBConfigFactory.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/FactoryNotDefinedException.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDBCachedDataSource.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDbResourceManagerFactory.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/MySQLCachedDataSource.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/PollingWorker.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitor.java create mode 100644 dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitorObserver.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSourceFactory.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBConfigException.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLIBResourceActivator.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLibConnection.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLibException.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBResourceManager.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBResourceObserver.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DataAccessor.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DataSourceComparator.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DbLibService.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DblibConfigurationException.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/NoAvailableConnectionsException.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/TerminatingCachedDataSource.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/BaseDBConfiguration.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/DbConfigPool.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/JDBCConfiguration.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/AbstractDBResourceManagerFactory.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/AbstractResourceManagerFactory.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/DBConfigFactory.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/FactoryNotDefinedException.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/jdbc/JdbcDBCachedDataSource.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/jdbc/JdbcDbResourceManagerFactory.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/jdbc/MySQLCachedDataSource.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/PollingWorker.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/SQLExecutionMonitor.java delete mode 100644 dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/SQLExecutionMonitorObserver.java create mode 100644 filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/Activator.java create mode 100644 filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/LogFilter.java create mode 100644 filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/RequestResponseDbLoggingFilter.java create mode 100644 filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/RequestResponseLoggingFilter.java delete mode 100644 filters/provider/src/main/java/org/openecomp/sdnc/filters/Activator.java delete mode 100644 filters/provider/src/main/java/org/openecomp/sdnc/filters/LogFilter.java delete mode 100644 filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseDbLoggingFilter.java delete mode 100644 filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseLoggingFilter.java create mode 100755 sli/common/src/main/antlr4/org/onap/ccsdk/sli/core/sli/ExprGrammar.g4 delete mode 100755 sli/common/src/main/antlr4/org/openecomp/sdnc/sli/ExprGrammar.g4 create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/BreakNodeException.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/ConfigurationException.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/DuplicateValueException.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/MessageWriter.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/MetricLogger.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicAdaptor.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicAtom.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicBinaryExpression.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicDblibStore.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicException.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExprListener.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExprParserErrorListener.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpression.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpressionFactory.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicFunctionCall.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicGraph.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicJavaPlugin.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicJdbcStore.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicNode.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicParser.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicParserException.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicRecorder.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicResource.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicStore.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicStoreFactory.java create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicVariableTerm.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/BreakNodeException.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/ConfigurationException.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/DuplicateValueException.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/MessageWriter.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/MetricLogger.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicAdaptor.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicAtom.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicBinaryExpression.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicContext.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicDblibStore.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicException.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExprListener.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExprParserErrorListener.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExpression.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExpressionFactory.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicFunctionCall.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicGraph.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicJavaPlugin.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicJdbcStore.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicNode.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParser.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParserException.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicRecorder.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicResource.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicStore.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicStoreFactory.java delete mode 100644 sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicVariableTerm.java create mode 100644 sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java create mode 100644 sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpressionParserTest.java create mode 100644 sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicParserTest.java delete mode 100644 sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicContextTest.java delete mode 100644 sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicExpressionParserTest.java delete mode 100644 sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicParserTest.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/BlockNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/BreakNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/CallNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ConfigureNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/DeleteNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExistsNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ForNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/GetResourceNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/IsAvailableNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelper.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/NotifyNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/RecordNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReleaseNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReserveNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReturnNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SaveNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicActivator.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicAdaptorFactory.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicExpressionResolver.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicService.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicServiceImpl.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SwitchNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/UpdateNodeExecutor.java create mode 100644 sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/WhileNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/BlockNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/BreakNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/CallNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ConfigureNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/DeleteNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ExecuteNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ExistsNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ForNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/GetResourceNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/IsAvailableNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/MdsalHelper.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/NotifyNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/RecordNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReleaseNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReserveNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReturnNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SaveNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SetNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicActivator.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicAdaptorFactory.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicExpressionResolver.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicService.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicServiceImpl.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SwitchNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/UpdateNodeExecutor.java delete mode 100644 sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/WhileNodeExecutor.java create mode 100644 sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/BadPlugin.java create mode 100644 sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutorTest.java create mode 100644 sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/LunchSelectorPlugin.java create mode 100644 sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelperTest.java create mode 100644 sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelperTesterUtil.java create mode 100644 sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/PluginTest.java create mode 100644 sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicExpressionResolverTest.java create mode 100644 sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicGraphExecutorTest.java create mode 100644 sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/VoidDummyPlugin.java delete mode 100644 sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/BadPlugin.java delete mode 100644 sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/ExecuteNodeExecutorTest.java delete mode 100644 sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/LunchSelectorPlugin.java delete mode 100644 sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/MdsalHelperTest.java delete mode 100644 sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/MdsalHelperTesterUtil.java delete mode 100644 sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/PluginTest.java delete mode 100644 sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/SvcLogicExpressionResolverTest.java delete mode 100644 sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/SvcLogicGraphExecutorTest.java delete mode 100644 sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/VoidDummyPlugin.java create mode 100644 sli/recording/src/main/java/org/onap/ccsdk/sli/core/sli/recording/FileRecorder.java create mode 100644 sli/recording/src/main/java/org/onap/ccsdk/sli/core/sli/recording/RecordingActivator.java create mode 100644 sli/recording/src/main/java/org/onap/ccsdk/sli/core/sli/recording/Slf4jRecorder.java delete mode 100644 sli/recording/src/main/java/org/openecomp/sdnc/sli/recording/FileRecorder.java delete mode 100644 sli/recording/src/main/java/org/openecomp/sdnc/sli/recording/RecordingActivator.java delete mode 100644 sli/recording/src/main/java/org/openecomp/sdnc/sli/recording/Slf4jRecorder.java (limited to 'sliPluginUtils/provider/src/main') diff --git a/dblib/pom.xml b/dblib/pom.xml index 722b2d7c6..775ff0591 100755 --- a/dblib/pom.xml +++ b/dblib/pom.xml @@ -34,9 +34,9 @@ 2016 - AT&T + ONAP - openecomp + onap diff --git a/dblib/provider/pom.xml b/dblib/provider/pom.xml index 078c75499..41d383ef0 100755 --- a/dblib/provider/pom.xml +++ b/dblib/provider/pom.xml @@ -63,12 +63,9 @@ true - org.openecomp.sdnc.sli.resource.dblib - org.openecomp.sdnc.sli.resource.dblib.DBLIBResourceActivator - org.openecomp.sdnc.sli.resource.dblib;version=${project.version} - + org.onap.ccsdk.sli.core.dblib + org.onap.ccsdk.sli.core.dblib.DBLIBResourceActivator + org.onap.ccsdk.sli.core.dblib;version=${project.version} * true diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java new file mode 100644 index 000000000..9dc262d07 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java @@ -0,0 +1,617 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.io.Closeable; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.sql.Blob; +import java.sql.Connection; +import java.sql.Date; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Observer; + +import javax.sql.DataSource; +import javax.sql.rowset.CachedRowSet; +import javax.sql.rowset.RowSetProvider; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.tomcat.jdbc.pool.PoolExhaustedException; +import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; +import org.onap.ccsdk.sli.core.dblib.pm.SQLExecutionMonitor; +import org.onap.ccsdk.sli.core.dblib.pm.SQLExecutionMonitorObserver; +import org.onap.ccsdk.sli.core.dblib.pm.SQLExecutionMonitor.TestObject; + +import com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException; + + +/** + * @version $Revision: 1.13 $ + * Change Log + * Author Date Comments + * ============== ======== ==================================================== + * Rich Tabedzki + */ + +public abstract class CachedDataSource implements DataSource, SQLExecutionMonitorObserver +{ + private static Logger LOGGER = LoggerFactory.getLogger(CachedDataSource.class); + + protected static final String AS_CONF_ERROR = "AS_CONF_ERROR: "; + + protected long CONN_REQ_TIMEOUT = 30L; + protected long DATA_REQ_TIMEOUT = 100L; + + private final SQLExecutionMonitor monitor; + protected DataSource ds = null; + protected String connectionName = null; + protected boolean initialized = false; + + private long interval = 1000; + private long initialDelay = 5000; + private long expectedCompletionTime = 50L; + private boolean canTakeOffLine = true; + private long unprocessedFailoverThreshold = 3L; + + private long nextErrorReportTime = 0L; + + private String globalHostName = null; + + + public CachedDataSource(BaseDBConfiguration jdbcElem) throws DBConfigException + { + configure(jdbcElem); + monitor = new SQLExecutionMonitor(this); + } + + protected abstract void configure(BaseDBConfiguration jdbcElem) throws DBConfigException; + /* (non-Javadoc) + * @see javax.sql.DataSource#getConnection() + */ + public Connection getConnection() throws SQLException + { + return ds.getConnection(); + } + + public CachedRowSet getData(String statement, ArrayList arguments) throws SQLException, Throwable + { + TestObject testObject = null; + testObject = monitor.registerRequest(); + + Connection connection = null; + try { + connection = this.getConnection(); + if(connection == null ) { + throw new SQLException("Connection invalid"); + } + if(LOGGER.isDebugEnabled()) + LOGGER.debug("Obtained connection <" + connectionName + ">: "+connection.toString()); + return executePreparedStatement(connection, statement, arguments, true); + } finally { + try { + if(connection != null && !connection.isClosed()) { + connection.close(); + } + } catch(Throwable exc) { + // the exception not monitored + } finally { + connection = null; + } + + monitor.deregisterReguest(testObject); + } + } + + public boolean writeData(String statement, ArrayList arguments) throws SQLException, Throwable + { + TestObject testObject = null; + testObject = monitor.registerRequest(); + + Connection connection = null; + try { + connection = this.getConnection(); + if(connection == null ) { + throw new SQLException("Connection invalid"); + } + if(LOGGER.isDebugEnabled()) + LOGGER.debug("Obtained connection <" + connectionName + ">: "+connection.toString()); + return executeUpdatePreparedStatement(connection, statement, arguments, true); + } finally { + try { + if(connection != null && !connection.isClosed()) { + connection.close(); + } + } catch(Throwable exc) { + // the exception not monitored + } finally { + connection = null; + } + + monitor.deregisterReguest(testObject); + } + } + + CachedRowSet executePreparedStatement(Connection conn, String statement, ArrayList arguments, boolean close) throws SQLException, Throwable + { + long time = System.currentTimeMillis(); + + CachedRowSet data = null; + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("SQL Statement: "+ statement); + if(arguments != null && !arguments.isEmpty()) { + LOGGER.debug("Argunments: "+ Arrays.toString(arguments.toArray())); + } + } + + ResultSet rs = null; + try { + data = RowSetProvider.newFactory().createCachedRowSet(); + PreparedStatement ps = conn.prepareStatement(statement); + if(arguments != null) + { + for(int i = 0, max = arguments.size(); i < max; i++){ + ps.setObject(i+1, arguments.get(i)); + } + } + rs = ps.executeQuery(); + data.populate(rs); + // Point the rowset Cursor to the start + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("SQL SUCCESS. rows returned: " + data.size()+ ", time(ms): "+ (System.currentTimeMillis() - time)); } + } catch(SQLException exc){ + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("SQL FAILURE. time(ms): "+ (System.currentTimeMillis() - time)); + } + try { conn.rollback(); } catch(Throwable thr){} + if(arguments != null && !arguments.isEmpty()) { + LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with arguments: "+arguments.toString(), exc); + } else { + LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with no arguments. ", exc); + } + throw exc; + } catch(Throwable exc){ + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("SQL FAILURE. time(ms): "+ (System.currentTimeMillis() - time)); + } + if(arguments != null && !arguments.isEmpty()) { + LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with arguments: "+arguments.toString(), exc); + } else { + LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with no arguments. ", exc); + } + throw exc; // new SQLException(exc); + } finally { + + try { + if(rs != null){ + rs.close(); + rs = null; + } + } catch(Exception exc){ + + } + try { + if(conn != null && close){ + conn.close(); + conn = null; + } + } catch(Exception exc){ + + } + } + + return data; + } + + boolean executeUpdatePreparedStatement(Connection conn, String statement, ArrayList arguments, boolean close) throws SQLException, Throwable { + long time = System.currentTimeMillis(); + + CachedRowSet data = null; + + int rs = -1; + try { + data = RowSetProvider.newFactory().createCachedRowSet(); + PreparedStatement ps = conn.prepareStatement(statement); + if(arguments != null) + { + for(int i = 0, max = arguments.size(); i < max; i++){ + if(arguments.get(i) instanceof Blob) { + ps.setBlob(i+1, (Blob)arguments.get(i)); + } else if(arguments.get(i) instanceof Timestamp) { + ps.setTimestamp(i+1, (Timestamp)arguments.get(i)); + } else if(arguments.get(i) instanceof Integer) { + ps.setInt(i+1, (Integer)arguments.get(i)); + } else if(arguments.get(i) instanceof Long) { + ps.setLong(i+1, (Long)arguments.get(i)); + } else if(arguments.get(i) instanceof Date) { + ps.setDate(i+1, (Date)arguments.get(i)); + } else { + ps.setObject(i+1, arguments.get(i)); + } + } + } + rs = ps.executeUpdate(); + // Point the rowset Cursor to the start + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("SQL SUCCESS. rows returned: " + data.size()+ ", time(ms): "+ (System.currentTimeMillis() - time)); + } + } catch(SQLException exc){ + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("SQL FAILURE. time(ms): "+ (System.currentTimeMillis() - time)); + } + try { conn.rollback(); } catch(Throwable thr){} + if(arguments != null && !arguments.isEmpty()) { + LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with arguments: "+arguments.toString(), exc); + } else { + LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with no arguments. ", exc); + } + throw exc; + } catch(Throwable exc){ + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("SQL FAILURE. time(ms): "+ (System.currentTimeMillis() - time)); + } + if(arguments != null && !arguments.isEmpty()) { + LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with arguments: "+arguments.toString(), exc); + } else { + LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with no arguments. ", exc); + } + throw exc; // new SQLException(exc); + } finally { + try { + if(conn != null && close){ + conn.close(); + conn = null; + } + } catch(Exception exc){ + + } + } + + return true; + } + + /* (non-Javadoc) + * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String) + */ + public Connection getConnection(String username, String password) + throws SQLException + { + return ds.getConnection(username, password); + } + + /* (non-Javadoc) + * @see javax.sql.DataSource#getLogWriter() + */ + public PrintWriter getLogWriter() throws SQLException + { + return ds.getLogWriter(); + } + + /* (non-Javadoc) + * @see javax.sql.DataSource#getLoginTimeout() + */ + public int getLoginTimeout() throws SQLException + { + return ds.getLoginTimeout(); + } + + /* (non-Javadoc) + * @see javax.sql.DataSource#setLogWriter(java.io.PrintWriter) + */ + public void setLogWriter(PrintWriter out) throws SQLException + { + ds.setLogWriter(out); + } + + /* (non-Javadoc) + * @see javax.sql.DataSource#setLoginTimeout(int) + */ + public void setLoginTimeout(int seconds) throws SQLException + { + ds.setLoginTimeout(seconds); + } + + + public final String getDbConnectionName(){ + return connectionName; + } + + protected final void setDbConnectionName(String name) { + this.connectionName = name; + } + + public void cleanUp(){ + if(ds != null && ds instanceof Closeable) { + try { + ((Closeable)ds).close(); + } catch (IOException e) { + LOGGER.warn(e.getMessage()); + } + } + ds = null; + monitor.deleteObservers(); + monitor.cleanup(); + } + + public boolean isInitialized() { + return initialized; + } + + protected boolean testConnection(){ + return testConnection(false); + } + + protected boolean testConnection(boolean error_level){ + Connection conn = null; + ResultSet rs = null; + Statement stmt = null; + try + { + Boolean readOnly = null; + String hostname = null; + conn = this.getConnection(); + stmt = conn.createStatement(); + rs = stmt.executeQuery("SELECT @@global.read_only, @@global.hostname"); //("SELECT 1 FROM DUAL"); //"select BANNER from SYS.V_$VERSION" + while(rs.next()) + { + readOnly = rs.getBoolean(1); + hostname = rs.getString(2); + + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("SQL DataSource <"+getDbConnectionName() + "> connected to " + hostname + ", read-only is " + readOnly + ", tested successfully "); + } + } + + } catch (Throwable exc) { + if(error_level) { + LOGGER.error("SQL DataSource <" + this.getDbConnectionName() + "> test failed. Cause : " + exc.getMessage()); + } else { + LOGGER.info("SQL DataSource <" + this.getDbConnectionName() + "> test failed. Cause : " + exc.getMessage()); + } + return false; + } finally { + if(rs != null) { + try { + rs.close(); + rs = null; + } catch (SQLException e) { + } + } + if(stmt != null) { + try { + stmt.close(); + stmt = null; + } catch (SQLException e) { + } + } + if(conn !=null){ + try { + conn.close(); + conn = null; + } catch (SQLException e) { + } + } + } + return true; + } + + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } + + public T unwrap(Class iface) throws SQLException { + return null; + } + + @SuppressWarnings("deprecation") + public void setConnectionCachingEnabled(boolean state) + { +// if(ds != null && ds instanceof OracleDataSource) +// try { +// ((OracleDataSource)ds).setConnectionCachingEnabled(true); +// } catch (SQLException exc) { +// LOGGER.warn("", exc); +// } + } + + public void addObserver(Observer observer) { + monitor.addObserver(observer); + } + + public void deleteObserver(Observer observer) { + monitor.deleteObserver(observer); + } + + public long getInterval() { + return interval; + } + + public long getInitialDelay() { + return initialDelay; + } + + public void setInterval(long value) { + interval = value; + } + + public void setInitialDelay(long value) { + initialDelay = value; + } + + public long getExpectedCompletionTime() { + return expectedCompletionTime; + } + + public void setExpectedCompletionTime(long value) { + expectedCompletionTime = value; + } + + public long getUnprocessedFailoverThreshold() { + return unprocessedFailoverThreshold; + } + + public void setUnprocessedFailoverThreshold(long value) { + this.unprocessedFailoverThreshold = value; + } + + public boolean canTakeOffLine() { + return canTakeOffLine; + } + + public void blockImmediateOffLine() { + canTakeOffLine = false; + final Thread offLineTimer = new Thread() + { + public void run(){ + try { + Thread.sleep(30000L); + }catch(Throwable exc){ + + }finally{ + canTakeOffLine = true; + } + } + }; + offLineTimer.setDaemon(true); + offLineTimer.start(); + } + + /** + * @return the monitor + */ + final SQLExecutionMonitor getMonitor() { + return monitor; + } + + protected boolean isSlave() throws PoolExhaustedException, MySQLNonTransientConnectionException { + CachedRowSet rs = null; + boolean isSlave = true; + String hostname = "UNDETERMINED"; + try { + boolean localSlave = true; + rs = this.getData("SELECT @@global.read_only, @@global.hostname", new ArrayList()); + while(rs.next()) { + localSlave = rs.getBoolean(1); + hostname = rs.getString(2); + } + isSlave = localSlave; + } catch(PoolExhaustedException | MySQLNonTransientConnectionException peexc){ + throw peexc; + } catch (SQLException e) { + LOGGER.error("", e); + isSlave = true; + } catch (Throwable e) { + LOGGER.error("", e); + isSlave = true; + } + if(isSlave){ + LOGGER.debug("SQL SLAVE : "+connectionName + " on server " + hostname); + } else { + LOGGER.debug("SQL MASTER : "+connectionName + " on server " + hostname); + } + return isSlave; + } + + public boolean isFabric() { + return false; + } + + protected boolean lockTable(Connection conn, String tableName) { + boolean retValue = false; + Statement lock = null; + try { + if(tableName != null) { + if(LOGGER.isDebugEnabled()) { + LOGGER.debug("Executing 'LOCK TABLES " + tableName + " WRITE' on connection " + conn.toString()); + if("SVC_LOGIC".equals(tableName)) { + Exception e = new Exception(); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + LOGGER.debug(sw.toString()); + } + } + lock = conn.createStatement(); + lock.execute("LOCK TABLES " + tableName + " WRITE"); + retValue = true; + } + } catch(Exception exc){ + LOGGER.error("", exc); + retValue = false; + } finally { + try { + lock.close(); + } catch(Exception exc) { + + } + } + return retValue; + } + + protected boolean unlockTable(Connection conn) { + boolean retValue = false; + Statement lock = null; + try { + if(LOGGER.isDebugEnabled()) { + LOGGER.debug("Executing 'UNLOCK TABLES' on connection " + conn.toString()); + } + lock = conn.createStatement(); + retValue = lock.execute("UNLOCK TABLES"); + } catch(Exception exc){ + LOGGER.error("", exc); + retValue = false; + } finally { + try { + lock.close(); + } catch(Exception exc) { + + } + } + return retValue; + } + + public void getPoolInfo(boolean allocation) { + + } + + public long getNextErrorReportTime() { + return nextErrorReportTime; + } + + public void setNextErrorReportTime(long nextTime) { + this.nextErrorReportTime = nextTime; + } + + public void setGlobalHostName(String hostname) { + this.globalHostName = hostname; + } + + public String getGlobalHostName() { + return globalHostName; + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSourceFactory.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSourceFactory.java new file mode 100644 index 000000000..07e3dfab1 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSourceFactory.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + + +import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; +import org.onap.ccsdk.sli.core.dblib.config.JDBCConfiguration; +import org.onap.ccsdk.sli.core.dblib.jdbc.JdbcDBCachedDataSource; +import org.onap.ccsdk.sli.core.dblib.jdbc.MySQLCachedDataSource; + +/** + * @version $Revision: 1.1 $ + * Change Log + * Author Date Comments + * ============== ======== ==================================================== + * Rich Tabedzki + */ +public class CachedDataSourceFactory { + + public static CachedDataSource createDataSource(BaseDBConfiguration config) { + if(config instanceof JDBCConfiguration) + return JdbcDBCachedDataSource.createInstance(config); + + return (CachedDataSource)null; + } + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBConfigException.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBConfigException.java new file mode 100644 index 000000000..e41e29b5d --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBConfigException.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + + +/** + * @version $Revision: 1.1 $ + * Change Log + * Author Date Comments + * ============== ======== ==================================================== + * Rich Tabedzki + */ +public class DBConfigException extends RuntimeException +{ + /** + * + */ + private static final long serialVersionUID = 4752405152537680257L; + + public DBConfigException(Exception e) + { + super(e.toString()); + } + + public DBConfigException(String msg) + { + super(msg); + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLIBResourceActivator.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLIBResourceActivator.java new file mode 100644 index 000000000..8ae9a2665 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLIBResourceActivator.java @@ -0,0 +1,130 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.io.File; +import java.net.URL; +import java.util.Properties; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DBLIBResourceActivator implements BundleActivator { + + private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; + + private static final String DBLIB_PROP_PATH = "/dblib.properties"; + + private ServiceRegistration registration = null; + + private static final Logger LOG = LoggerFactory.getLogger(DBLIBResourceActivator.class); + + @Override + public void start(BundleContext ctx) throws Exception { + LOG.info("entering DBLIBResourceActivator.start"); + + DbLibService jdbcDataSource = null; + // Read properties + Properties props = new Properties(); + + File file = null; + URL propURL = null; + String propDir = System.getenv(SDNC_CONFIG_DIR); + if ((propDir == null) || (propDir.length() == 0)) { + propDir = "/opt/sdnc/data/properties"; + } + file = new File(propDir + DBLIB_PROP_PATH); + if(file.exists()) { + propURL = file.toURI().toURL(); + LOG.info("Using property file (1): " + file.toString()); + } else { + propURL = ctx.getBundle().getResource("dblib.properties"); + URL tmp = null; + if (propURL == null) { + file = new File(DBLIB_PROP_PATH); + tmp = this.getClass().getResource(DBLIB_PROP_PATH); +// if(!file.exists()) { + if(tmp == null) { + throw new DblibConfigurationException("Missing configuration properties resource(3) : " + DBLIB_PROP_PATH); + } else { + propURL = tmp; //file.toURI().toURL(); + LOG.info("Using property file (4): " + file.toString()); + } + } else { + LOG.info("Using property file (2): " + propURL.toString()); + } + } + + + try { + props.load(propURL.openStream()); + } catch (Exception e) { + throw new DblibConfigurationException("Could not load properties at URL " + propURL.toString(), e); + + } + + + + try { + jdbcDataSource = DBResourceManager.create(props); + } catch (Exception exc) { + throw new DblibConfigurationException("Could not get initialize database", exc); + } + + String regName = jdbcDataSource.getClass().getName(); + + LOG.info("Registering DBResourceManager service "+regName); + registration = ctx.registerService(new String[] { regName, DbLibService.class.getName(), "javax.sql.DataSource" }, jdbcDataSource, null); + } + + @Override + public void stop(BundleContext ctx) throws Exception { + LOG.info("entering DBLIBResourceActivator.stop"); + if (registration != null) + { + try { + ServiceReference sref = ctx.getServiceReference(DbLibService.class.getName()); + + if (sref == null) { + LOG.warn("Could not find service reference for DBLIB service (" + DbLibService.class.getName() + ")"); + } else { + DBResourceManager dblibSvc = (DBResourceManager) ctx.getService(sref); + if (dblibSvc == null) { + LOG.warn("Could not find service reference for DBLIB service (" + DbLibService.class.getName() + ")"); + } else { + dblibSvc.cleanUp(); + } + } + } catch(Throwable exc) { + LOG.warn("Cleanup", exc); + } + + registration.unregister(); + registration = null; + LOG.debug("Deregistering DBResourceManager service"); + } + } + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibConnection.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibConnection.java new file mode 100644 index 000000000..8181b1300 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibConnection.java @@ -0,0 +1,390 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.sql.Array; +import java.sql.Blob; +import java.sql.CallableStatement; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.NClob; +import java.sql.PreparedStatement; +import java.sql.SQLClientInfoException; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Savepoint; +import java.sql.Statement; +import java.sql.Struct; +import java.util.ArrayList; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executor; + +import javax.sql.rowset.CachedRowSet; + +import org.apache.tomcat.jdbc.pool.PooledConnection; +import org.apache.tomcat.jdbc.pool.ProxyConnection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DBLibConnection implements Connection { + + private static Logger LOGGER = LoggerFactory.getLogger(DBLibConnection.class); + + private final Connection connection; + private final CachedDataSource dataSource; + private boolean locked = false; + private String tableName = null; + + public DBLibConnection(Connection con, CachedDataSource dataSource){ + this.connection = con; + this.dataSource = dataSource; + locked = false; + dataSource.getPoolInfo(true); + } + + public boolean lockTable(String tablename) { + this.tableName = tablename; + return locked = dataSource.lockTable(connection, tableName); + } + + public void resetInactivityTimer() { + Class iface = PooledConnection.class; + try { + PooledConnection pc = connection.unwrap(iface); + pc.setTimestamp(System.currentTimeMillis()); + } catch (SQLException e) { + LOGGER.warn("Failed resetting timeout timer", e); + } + } + + public boolean unlock() { + dataSource.unlockTable(connection); + return locked = false; + } + + public boolean writeData(String statement, ArrayList arguments) throws SQLException, Throwable + { + ArrayList newList=new ArrayList(); + if(arguments != null && !arguments.isEmpty()) { + newList.addAll(arguments); + } + resetInactivityTimer(); + return dataSource.executeUpdatePreparedStatement(connection, statement, newList, false); + } + + public CachedRowSet getData(String statement, ArrayList arguments) throws SQLException, Throwable + { + ArrayList newList=new ArrayList(); + if(arguments != null && !arguments.isEmpty()) { + newList.addAll(arguments); + } + resetInactivityTimer(); + return dataSource.executePreparedStatement(connection, statement, newList, false); + } + + @Override + public T unwrap(Class iface) throws SQLException { + return connection.unwrap(iface); + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return connection.isWrapperFor(iface); + } + + @Override + public Statement createStatement() throws SQLException { + return connection.createStatement(); + } + + @Override + public PreparedStatement prepareStatement(String sql) throws SQLException { + return connection.prepareStatement(sql); + } + + @Override + public CallableStatement prepareCall(String sql) throws SQLException { + return connection.prepareCall(sql); + } + + @Override + public String nativeSQL(String sql) throws SQLException { + return connection.nativeSQL(sql); + } + + @Override + public void setAutoCommit(boolean autoCommit) throws SQLException { + connection.setAutoCommit(autoCommit); + } + + @Override + public boolean getAutoCommit() throws SQLException { + return connection.getAutoCommit(); + } + + @Override + public void commit() throws SQLException { + connection.commit(); + } + + @Override + public void rollback() throws SQLException { + connection.rollback(); + } + + @Override + public void close() throws SQLException { + if(this.locked) { + try { + this.unlock(); + } catch(Throwable th) { + LOGGER.error("Failed unlocking",th); + } + } + if(connection != null && !connection.isClosed()) { + connection.close(); + } + dataSource.getPoolInfo(false); + } + + @Override + public boolean isClosed() throws SQLException { + return connection.isClosed(); + } + + @Override + public DatabaseMetaData getMetaData() throws SQLException { + return connection.getMetaData(); + } + + @Override + public void setReadOnly(boolean readOnly) throws SQLException { + connection.setReadOnly(readOnly); + } + + @Override + public boolean isReadOnly() throws SQLException { + return connection.isReadOnly(); + } + + @Override + public void setCatalog(String catalog) throws SQLException { + connection.setCatalog(catalog); + } + + @Override + public String getCatalog() throws SQLException { + return connection.getCatalog(); + } + + @Override + public void setTransactionIsolation(int level) throws SQLException { + connection.setTransactionIsolation(level); + } + + @Override + public int getTransactionIsolation() throws SQLException { + return connection.getTransactionIsolation(); + } + + @Override + public SQLWarning getWarnings() throws SQLException { + return connection.getWarnings(); + } + + @Override + public void clearWarnings() throws SQLException { + connection.clearWarnings(); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { + return connection.createStatement(resultSetType, resultSetConcurrency); + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) + throws SQLException { + return connection.prepareStatement(sql, resultSetType, resultSetConcurrency); + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return connection.prepareCall(sql, resultSetType, resultSetConcurrency); + } + + @Override + public Map> getTypeMap() throws SQLException { + return connection.getTypeMap(); + } + + @Override + public void setTypeMap(Map> map) throws SQLException { + connection.setTypeMap(map); + } + + @Override + public void setHoldability(int holdability) throws SQLException { + connection.setHoldability(holdability); + } + + @Override + public int getHoldability() throws SQLException { + return connection.getHoldability(); + } + + @Override + public Savepoint setSavepoint() throws SQLException { + return connection.setSavepoint(); + } + + @Override + public Savepoint setSavepoint(String name) throws SQLException { + return connection.setSavepoint(name); + } + + @Override + public void rollback(Savepoint savepoint) throws SQLException { + connection.rollback(savepoint); + } + + @Override + public void releaseSavepoint(Savepoint savepoint) throws SQLException { + connection.releaseSavepoint(savepoint); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) + throws SQLException { + return connection.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, + int resultSetHoldability) throws SQLException { + return connection.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, + int resultSetHoldability) throws SQLException { + return connection.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + } + + @Override + public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + return connection.prepareStatement(sql, autoGeneratedKeys); + } + + @Override + public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + return connection.prepareStatement(sql, columnIndexes); + } + + @Override + public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + return connection.prepareStatement(sql, columnNames); + } + + @Override + public Clob createClob() throws SQLException { + return connection.createClob(); + } + + @Override + public Blob createBlob() throws SQLException { + return connection.createBlob(); + } + + @Override + public NClob createNClob() throws SQLException { + return connection.createNClob(); + } + + @Override + public SQLXML createSQLXML() throws SQLException { + return connection.createSQLXML(); + } + + @Override + public boolean isValid(int timeout) throws SQLException { + return connection.isValid(timeout); + } + + @Override + public void setClientInfo(String name, String value) throws SQLClientInfoException { + connection.setClientInfo(name, value); + } + + @Override + public void setClientInfo(Properties properties) throws SQLClientInfoException { + connection.setClientInfo(properties); + } + + @Override + public String getClientInfo(String name) throws SQLException { + return connection.getClientInfo(name); + } + + @Override + public Properties getClientInfo() throws SQLException { + return connection.getClientInfo(); + } + + @Override + public Array createArrayOf(String typeName, Object[] elements) throws SQLException { + return connection.createArrayOf(typeName, elements); + } + + @Override + public Struct createStruct(String typeName, Object[] attributes) throws SQLException { + return connection.createStruct(typeName, attributes); + } + + @Override + public void setSchema(String schema) throws SQLException { + connection.setSchema(schema); + } + + @Override + public String getSchema() throws SQLException { + return connection.getSchema(); + } + + @Override + public void abort(Executor executor) throws SQLException { + connection.abort(executor); + } + + @Override + public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { + connection.setNetworkTimeout(executor, milliseconds); + } + + @Override + public int getNetworkTimeout() throws SQLException { + return connection.getNetworkTimeout(); + } + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibException.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibException.java new file mode 100644 index 000000000..de241f478 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibException.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.sql.SQLException; + +/** + * An exception time for handling DBLIB specific error handling. + */ +public class DBLibException extends SQLException { + + /** + * + */ + private static final long serialVersionUID = -5345059355083984696L; + + public DBLibException(String message){ + super(message); + } + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceManager.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceManager.java new file mode 100644 index 000000000..78b970bf5 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceManager.java @@ -0,0 +1,863 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.SQLDataException; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.sql.SQLIntegrityConstraintViolationException; +import java.sql.SQLSyntaxErrorException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Observable; +import java.util.PriorityQueue; +import java.util.Properties; +import java.util.Queue; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.sql.DataSource; +import javax.sql.rowset.CachedRowSet; + +import org.apache.tomcat.jdbc.pool.PoolExhaustedException; +import org.onap.ccsdk.sli.core.dblib.config.DbConfigPool; +import org.onap.ccsdk.sli.core.dblib.factory.AbstractDBResourceManagerFactory; +import org.onap.ccsdk.sli.core.dblib.factory.AbstractResourceManagerFactory; +import org.onap.ccsdk.sli.core.dblib.factory.DBConfigFactory; +import org.onap.ccsdk.sli.core.dblib.pm.PollingWorker; +import org.onap.ccsdk.sli.core.dblib.pm.SQLExecutionMonitor; + +import com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * @version $Revision: 1.15 $ + * Change Log + * Author Date Comments + * ============== ======== ==================================================== + * Rich Tabedzki + */ +public class DBResourceManager implements DataSource, DataAccessor, DBResourceObserver, DbLibService { + private static Logger LOGGER = LoggerFactory.getLogger(DBResourceManager.class); + + transient boolean terminating = false; + transient protected long retryInterval = 10000L; + transient boolean recoveryMode = true; + + protected final AtomicBoolean dsSelector = new AtomicBoolean(); + +// Queue dsQueue = new ConcurrentLinkedQueue(); + Queue dsQueue = new PriorityQueue(4, new Comparator(){ + + @Override + public int compare(CachedDataSource left, CachedDataSource right) { + try { + if(!left.isSlave()) + return -1; + if(!right.isSlave()) + return 1; + + } catch (Throwable e) { + LOGGER.warn("", e); + } + return 0; + } + + }); + protected final Set broken = Collections.synchronizedSet(new HashSet()); + protected final Object monitor = new Object(); + protected final Properties configProps; + protected final Thread worker; + + protected final long terminationTimeOut; + protected final boolean monitorDbResponse; + protected final long monitoringInterval; + protected final long monitoringInitialDelay; + protected final long expectedCompletionTime; + protected final long unprocessedFailoverThreshold; + + public DBResourceManager(Properties props){ + this.configProps = props; + + // get retry interval value + retryInterval = getLongFromProperties(props, "org.onap.dblib.connection.retry", 10000L); + + // get recovery mode flag + recoveryMode = getBooleanFromProperties(props, "org.onap.dblib.connection.recovery", true); + if(!recoveryMode) + { + recoveryMode = false; + LOGGER.info("Recovery Mode disabled"); + } + // get time out value for thread cleanup + terminationTimeOut = getLongFromProperties(props, "org.onap.dblib.termination.timeout", 300000L); + // get properties for monitoring + monitorDbResponse = getBooleanFromProperties(props, "org.onap.dblib.connection.monitor", false); + monitoringInterval = getLongFromProperties(props, "org.onap.dblib.connection.monitor.interval", 1000L); + monitoringInitialDelay = getLongFromProperties(props, "org.onap.dblib.connection.monitor.startdelay", 5000L); + expectedCompletionTime = getLongFromProperties(props, "org.onap.dblib.connection.monitor.expectedcompletiontime", 5000L); + unprocessedFailoverThreshold = getLongFromProperties(props, "org.onap.dblib.connection.monitor.unprocessedfailoverthreshold", 3L); + + // initialize performance monitor + PollingWorker.createInistance(props); + + // initialize recovery thread + worker = new RecoveryMgr(); + worker.setName("DBResourcemanagerWatchThread"); + worker.setDaemon(true); + worker.start(); + } + + private void config(Properties ctx) throws Exception { + + DbConfigPool dbConfig = DBConfigFactory.createConfig(this.configProps); + + try { + AbstractResourceManagerFactory factory = AbstractDBResourceManagerFactory.getFactory(dbConfig.getType()); + if(LOGGER.isInfoEnabled()){ + LOGGER.info("Default DB config is : " + dbConfig.getType()); + LOGGER.info("Using factory : " + factory.getClass().getName()); + } + CachedDataSource[] cachedDS = factory.initDBResourceManager(dbConfig, this); + if(cachedDS == null || cachedDS.length == 0) { + LOGGER.error("Initialization of CachedDataSources failed. No instance was created."); + throw new Exception("Failed to initialize DB Library. No data source was created."); + } + + for(int i=0; i 1){ + handleGetConnectionException(dataSource, new Exception(data.toString())); + } + } + } + } + } + + public void testForceRecovery() + { + CachedDataSource active = (CachedDataSource) this.dsQueue.peek(); + handleGetConnectionException(active, new Exception("test")); + } + + class RecoveryMgr extends Thread { + + public void run() { + while(!terminating) + { + try { + Thread.sleep(retryInterval); + } catch (InterruptedException e1) { } + CachedDataSource brokenSource = null; + try { + if (!broken.isEmpty()) { + CachedDataSource[] sourceArray = broken.toArray(new CachedDataSource[0]); + for (int i = 0; i < sourceArray.length; i++) + { + brokenSource = sourceArray[i]; + if (brokenSource instanceof TerminatingCachedDataSource) + break; + if (resetConnectionPool(brokenSource)) { + broken.remove(brokenSource); + brokenSource.blockImmediateOffLine(); + dsQueue.add(brokenSource); + LOGGER.info("DataSource <" + + brokenSource.getDbConnectionName() + + "> recovered."); + } + brokenSource = null; + } + } + } catch (Exception exc) { + LOGGER.warn(exc.getMessage()); + if(brokenSource != null){ + try { + if(!broken.contains(brokenSource)) + broken.add(brokenSource); + brokenSource = null; + } catch (Exception e1) { } + } + } + } + LOGGER.info("DBResourceManager.RecoveryMgr <"+this.toString() +"> terminated." ); + } + + private boolean resetConnectionPool(CachedDataSource dataSource){ + try { + return dataSource.testConnection(); + } catch (Exception exc) { + LOGGER.info("DataSource <" + dataSource.getDbConnectionName() + "> resetCache failed with error: "+ exc.getMessage()); + return false; + } + } + } + + /* (non-Javadoc) + * @see org.onap.ccsdk.sli.resource.dblib.DbLibService#getData(java.lang.String, java.util.ArrayList, java.lang.String) + */ + @Override + public CachedRowSet getData(String statement, ArrayList arguments, String preferredDS) throws SQLException { + ArrayList newList=new ArrayList(); + if(arguments != null && !arguments.isEmpty()) { + newList.addAll(arguments); + } + if(recoveryMode) + return requestDataWithRecovery(statement, newList, preferredDS); + else + return requestDataNoRecovery(statement, newList, preferredDS); + } + + private CachedRowSet requestDataWithRecovery(String statement, ArrayList arguments, String preferredDS) throws SQLException { + Throwable lastException = null; + CachedDataSource active = null; + + // test if there are any connection pools available + LinkedList sources = new LinkedList(this.dsQueue); + if(sources.isEmpty()){ + LOGGER.error("Generated alarm: DBResourceManager.getData - No active DB connection pools are available."); + throw new DBLibException("No active DB connection pools are available in RequestDataWithRecovery call."); + } + if(preferredDS != null && !sources.peek().getDbConnectionName().equals(preferredDS)) { + Collections.reverse(sources); + } + + + // loop through available data sources to retrieve data. + while(!sources.isEmpty()) + { + active = sources.peek(); + + long time = System.currentTimeMillis(); + try { + if(!active.isFabric()) { + CachedDataSource master = findMaster(); + if(master != null) { + active = master; + master = null; + } + } + sources.remove(active); + return active.getData(statement, arguments); + } catch(SQLDataException exc){ + throw exc; + } catch(SQLSyntaxErrorException exc){ + throw exc; + } catch(SQLIntegrityConstraintViolationException exc){ + throw exc; + } catch(Throwable exc){ + lastException = exc; + String message = exc.getMessage(); + if(message == null) { + if(exc.getCause() != null) { + message = exc.getCause().getMessage(); + } + if(message == null) + message = exc.getClass().getName(); + } + LOGGER.error("Generated alarm: "+active.getDbConnectionName()+" - "+message); + handleGetConnectionException(active, exc); + } finally { + if(LOGGER.isDebugEnabled()){ + time = (System.currentTimeMillis() - time); + LOGGER.debug("getData processing time : "+ active.getDbConnectionName()+" "+time+" miliseconds."); + } + } + } + if(lastException instanceof SQLException){ + throw (SQLException)lastException; + } + // repackage the exception + // you are here because either you run out of available data sources + // or the last exception was not of SQLException type. + // repackage the exception + if(lastException == null) { + throw new DBLibException("The operation timed out while waiting to acquire a new connection." ); + } else { + SQLException exception = new DBLibException(lastException.getMessage()); + exception.setStackTrace(lastException.getStackTrace()); + if(lastException.getCause() instanceof SQLException) { + throw (SQLException)lastException.getCause(); + } + throw exception; + } + } + + private CachedRowSet requestDataNoRecovery(String statement, ArrayList arguments, String preferredDS) throws SQLException { + if(dsQueue.isEmpty()){ + LOGGER.error("Generated alarm: DBResourceManager.getData - No active DB connection pools are available."); + throw new DBLibException("No active DB connection pools are available in RequestDataNoRecovery call."); + } + CachedDataSource active = (CachedDataSource) this.dsQueue.peek(); + long time = System.currentTimeMillis(); + try { + if(!active.isFabric()) { + CachedDataSource master = findMaster(); + if(master != null) + active = master; + } + return active.getData(statement, arguments); +// } catch(SQLDataException exc){ +// throw exc; + } catch(Throwable exc){ + String message = exc.getMessage(); + if(message == null) + message = exc.getClass().getName(); + LOGGER.error("Generated alarm: "+active.getDbConnectionName()+" - "+message); + if(exc instanceof SQLException) + throw (SQLException)exc; + else { + DBLibException excptn = new DBLibException(exc.getMessage()); + excptn.setStackTrace(exc.getStackTrace()); + throw excptn; + } + } finally { + if(LOGGER.isDebugEnabled()){ + time = (System.currentTimeMillis() - time); + LOGGER.debug(">> getData : "+ active.getDbConnectionName()+" "+time+" miliseconds."); + } + } + } + + + /* (non-Javadoc) + * @see org.onap.ccsdk.sli.resource.dblib.DbLibService#writeData(java.lang.String, java.util.ArrayList, java.lang.String) + */ + @Override + public boolean writeData(String statement, ArrayList arguments, String preferredDS) throws SQLException + { + ArrayList newList=new ArrayList(); + if(arguments != null && !arguments.isEmpty()) { + newList.addAll(arguments); + } + + return writeDataNoRecovery(statement, newList, preferredDS); + } + + CachedDataSource findMaster() throws PoolExhaustedException, MySQLNonTransientConnectionException { + CachedDataSource master = null; + CachedDataSource[] dss = this.dsQueue.toArray(new CachedDataSource[0]); + for(int i=0; i arguments, String preferredDS) throws SQLException { + if(dsQueue.isEmpty()){ + LOGGER.error("Generated alarm: DBResourceManager.getData - No active DB connection pools are available."); + throw new DBLibException("No active DB connection pools are available in RequestDataNoRecovery call."); + } + + boolean initialRequest = true; + boolean retryAllowed = true; + CachedDataSource active = (CachedDataSource) this.dsQueue.peek(); + long time = System.currentTimeMillis(); + while(initialRequest) { + initialRequest = false; + try { + if(!active.isFabric()) { + CachedDataSource master = findMaster(); + if(master != null) { + active = master; + } + } + + return active.writeData(statement, arguments); + } catch(Throwable exc){ + String message = exc.getMessage(); + if(message == null) + message = exc.getClass().getName(); + LOGGER.error("Generated alarm: "+active.getDbConnectionName()+" - "+message); + if(exc instanceof SQLException) { + SQLException sqlExc = SQLException.class.cast(exc); + // handle read-only exception + if(sqlExc.getErrorCode() == 1290 && "HY000".equals(sqlExc.getSQLState())) { + LOGGER.warn("retrying due to: " + sqlExc.getMessage()); + dsQueue.remove(active); + dsQueue.add(active); + if(retryAllowed){ + retryAllowed = false; + initialRequest = true; + continue; + } + } + throw (SQLException)exc; + } else { + DBLibException excptn = new DBLibException(exc.getMessage()); + excptn.setStackTrace(exc.getStackTrace()); + throw excptn; + } + } finally { + if(LOGGER.isDebugEnabled()){ + time = (System.currentTimeMillis() - time); + LOGGER.debug("writeData processing time : "+ active.getDbConnectionName()+" "+time+" miliseconds."); + } + } + } + return true; + } + + private void setDataSource(CachedDataSource dataSource) { + if(dataSource.testConnection(true)){ + this.dsQueue.add(dataSource); + } else { + this.broken.add(dataSource); + } + } + + public Connection getConnection() throws SQLException { + Throwable lastException = null; + CachedDataSource active = null; + + if(dsQueue.isEmpty()){ + throw new DBLibException("No active DB connection pools are available in GetConnection call."); + } + + try { + active = dsQueue.peek(); + CachedDataSource tmpActive = findMaster(); + if(tmpActive != null) { + active = tmpActive; + } + return new DBLibConnection(active.getConnection(), active); + } catch(javax.sql.rowset.spi.SyncFactoryException exc){ + LOGGER.debug("Free memory (bytes): " + Runtime.getRuntime().freeMemory()); + LOGGER.warn("CLASSPATH issue. Allowing retry", exc); + lastException = exc; + } catch(PoolExhaustedException exc) { + throw new NoAvailableConnectionsException(exc); + } catch(MySQLNonTransientConnectionException exc){ + throw new NoAvailableConnectionsException(exc); + } catch(Exception exc){ + lastException = exc; + if(recoveryMode){ + handleGetConnectionException(active, exc); + } else { + if(exc instanceof MySQLNonTransientConnectionException) { + throw new NoAvailableConnectionsException(exc); + } if(exc instanceof SQLException) { + throw (SQLException)exc; + } else { + DBLibException excptn = new DBLibException(exc.getMessage()); + excptn.setStackTrace(exc.getStackTrace()); + throw excptn; + } + } + } catch (Throwable trwb) { + DBLibException excptn = new DBLibException(trwb.getMessage()); + excptn.setStackTrace(trwb.getStackTrace()); + throw excptn; + } finally { + if(LOGGER.isDebugEnabled()){ + displayState(); + } + } + + if(lastException instanceof SQLException){ + throw (SQLException)lastException; + } + // repackage the exception + if(lastException == null) { + throw new DBLibException("The operation timed out while waiting to acquire a new connection." ); + } else { + SQLException exception = new DBLibException(lastException.getMessage()); + exception.setStackTrace(lastException.getStackTrace()); + if(lastException.getCause() instanceof SQLException) { +// exception.setNextException((SQLException)lastException.getCause()); + throw (SQLException)lastException.getCause(); + } + throw exception; + } + } + + public Connection getConnection(String username, String password) + throws SQLException { + CachedDataSource active = null; + + if(dsQueue.isEmpty()){ + throw new DBLibException("No active DB connection pools are available in GetConnection call."); + } + + + try { + active = dsQueue.peek(); + CachedDataSource tmpActive = findMaster(); + if(tmpActive != null) { + active = tmpActive; + } + return active.getConnection(username, password); + } catch(Throwable exc){ + if(recoveryMode){ + handleGetConnectionException(active, exc); + } else { + if(exc instanceof SQLException) + throw (SQLException)exc; + else { + DBLibException excptn = new DBLibException(exc.getMessage()); + excptn.setStackTrace(exc.getStackTrace()); + throw excptn; + } + } + + } + + throw new DBLibException("No connections available in DBResourceManager in GetConnection call."); + } + + private void handleGetConnectionException(CachedDataSource source, Throwable exc) { + try { + if(!source.canTakeOffLine()) + { + LOGGER.error("Could not switch due to blocking"); + return; + } + + boolean removed = dsQueue.remove(source); + if(!broken.contains(source)) + { + if(broken.add(source)) + { + LOGGER.warn("DB Recovery: DataSource <" + source.getDbConnectionName() + "> put in the recovery mode. Reason : " + exc.getMessage()); + } else { + LOGGER.warn("Error putting DataSource <" +source.getDbConnectionName()+ "> in recovery mode."); + } + } else { + LOGGER.info("DB Recovery: DataSource <" + source.getDbConnectionName() + "> already in recovery queue"); + } + if(removed) + { + if(!dsQueue.isEmpty()) + { + LOGGER.warn("DB DataSource <" + dsQueue.peek().getDbConnectionName() + "> became active"); + } + } + } catch (Exception e) { + LOGGER.error("", e); + } + } + + public void cleanUp() { + for(Iterator it=dsQueue.iterator();it.hasNext();){ + CachedDataSource cds = (CachedDataSource)it.next(); + it.remove(); + cds.cleanUp(); + } + + try { + this.terminating = true; + if(broken != null) + { + try { + broken.add( new TerminatingCachedDataSource(null)); + } catch(Exception exc){ + LOGGER.error("Waiting for Worker to stop", exc); + } + } + worker.join(terminationTimeOut); + LOGGER.info("DBResourceManager.RecoveryMgr <"+worker.toString() +"> termination was successful: " + worker.getState()); + } catch(Exception exc){ + LOGGER.error("Waiting for Worker thread to terminate ", exc); + } + } + + public static DBResourceManager create(Properties props) throws Exception { + DBResourceManager dbmanager = new DBResourceManager(props); + dbmanager.config(props); + return dbmanager; + } + + public PrintWriter getLogWriter() throws SQLException { + return ((CachedDataSource)this.dsQueue.peek()).getLogWriter(); + } + + public int getLoginTimeout() throws SQLException { + return ((CachedDataSource)this.dsQueue.peek()).getLoginTimeout(); + } + + public void setLogWriter(PrintWriter out) throws SQLException { + ((CachedDataSource)this.dsQueue.peek()).setLogWriter(out); + } + + public void setLoginTimeout(int seconds) throws SQLException { + ((CachedDataSource)this.dsQueue.peek()).setLoginTimeout(seconds); + } + + public void displayState(){ + if(LOGGER.isDebugEnabled()){ + LOGGER.debug("POOLS : Active = "+dsQueue.size() + ";\t Broken = "+broken.size()); + CachedDataSource current = (CachedDataSource)dsQueue.peek(); + if(current != null) { + LOGGER.debug("POOL : Active name = \'"+current.getDbConnectionName()+ "\'"); + } + } + } + + /* (non-Javadoc) + * @see org.onap.ccsdk.sli.resource.dblib.DbLibService#isActive() + */ + @Override + public boolean isActive() { + return this.dsQueue.size()>0; + } + + public String getActiveStatus(){ + return "Connected: " + dsQueue.size()+"\tIn-recovery: "+broken.size(); + } + + public String getDBStatus(boolean htmlFormat) { + StringBuilder buffer = new StringBuilder(); + + ArrayList list = new ArrayList(); + list.addAll(dsQueue); + list.addAll(broken); + if (htmlFormat) + { + buffer.append("") + .append("Name:").append(""); + for (int i = 0; i < list.size(); i++) { + buffer.append(""); + buffer.append(((CachedDataSource) list.get(i)).getDbConnectionName()).append(""); + } + buffer.append(""); + + buffer.append("State:"); + for (int i = 0; i < list.size(); i++) { + if (broken.contains(list.get(i))) { + buffer.append("in recovery"); + } + if (dsQueue.contains(list.get(i))) { + if (dsQueue.peek() == list.get(i)) + buffer.append("active"); + else + buffer.append("standby"); + } + } + buffer.append(""); + + } else { + for (int i = 0; i < list.size(); i++) { + buffer.append("Name: ").append(((CachedDataSource) list.get(i)).getDbConnectionName()); + buffer.append("\tState: "); + if (broken.contains(list.get(i))) { + buffer.append("in recovery"); + } else + if (dsQueue.contains(list.get(i))) { + if (dsQueue.peek() == list.get(i)) + buffer.append("active"); + else + buffer.append("standby"); + } + + buffer.append("\n"); + + } + } + return buffer.toString(); + } + + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } + + public T unwrap(Class iface) throws SQLException { + return null; + } + + /** + * @return the monitorDbResponse + */ + public final boolean isMonitorDbResponse() { + return recoveryMode && monitorDbResponse; + } + + public void test(){ + CachedDataSource obj = dsQueue.peek(); + Exception ption = new Exception(); + try { + for(int i=0; i<5; i++) + { + handleGetConnectionException(obj, ption); + } + } catch(Throwable exc){ + LOGGER.warn("", exc); + } + } + + public String getPreferredDSName(){ + if(isActive()){ + return getPreferredDataSourceName(dsSelector); + } + return ""; + } + + public String getPreferredDataSourceName(AtomicBoolean flipper) { + + LinkedList snapshot = new LinkedList(dsQueue); + if(snapshot.size() > 1){ + CachedDataSource first = snapshot.getFirst(); + CachedDataSource last = snapshot.getLast(); + + int delta = first.getMonitor().getPorcessedConnectionsCount() - last.getMonitor().getPorcessedConnectionsCount(); + if(delta < 0) { + flipper.set(false); + } else if(delta > 0) { + flipper.set(true); + } else { + // check the last value and return !last + flipper.getAndSet(!flipper.get()); + } + + if (flipper.get()) + Collections.reverse(snapshot); + } + return snapshot.peek().getDbConnectionName(); + } + + public java.util.logging.Logger getParentLogger() + throws SQLFeatureNotSupportedException { + return null; + } + + public String getMasterName() { + if(isActive()){ + return getMasterDataSourceName(dsSelector); + } + return ""; + } + + + private String getMasterDataSourceName(AtomicBoolean flipper) { + + LinkedList snapshot = new LinkedList(dsQueue); + if(snapshot.size() > 1){ + CachedDataSource first = snapshot.getFirst(); + CachedDataSource last = snapshot.getLast(); + + int delta = first.getMonitor().getPorcessedConnectionsCount() - last.getMonitor().getPorcessedConnectionsCount(); + if(delta < 0) { + flipper.set(false); + } else if(delta > 0) { + flipper.set(true); + } else { + // check the last value and return !last + flipper.getAndSet(!flipper.get()); + } + + if (flipper.get()) + Collections.reverse(snapshot); + } + return snapshot.peek().getDbConnectionName(); + } + + class RemindTask extends TimerTask { + public void run() { + CachedDataSource ds = dsQueue.peek(); + if(ds != null) + ds.getPoolInfo(false); + } + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceObserver.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceObserver.java new file mode 100644 index 000000000..2e1a6e953 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceObserver.java @@ -0,0 +1,27 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.util.Observer; + +public interface DBResourceObserver extends Observer { + public boolean isMonitorDbResponse(); +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataAccessor.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataAccessor.java new file mode 100644 index 000000000..7921fa5c5 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataAccessor.java @@ -0,0 +1,33 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.sql.SQLException; +import java.util.ArrayList; + +import javax.sql.rowset.CachedRowSet; + +public interface DataAccessor { + + public abstract CachedRowSet getData(String statement, ArrayList arguments, String preferredDS) + throws SQLException; + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataSourceComparator.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataSourceComparator.java new file mode 100644 index 000000000..bc14fb8b9 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataSourceComparator.java @@ -0,0 +1,33 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.util.Comparator; + +public interface DataSourceComparator extends Comparator { + + public abstract CachedDataSource getLastUsed(); + + public abstract void setLastUsed(CachedDataSource lastUsed); + + public abstract int compare(CachedDataSource ds1, CachedDataSource ds2); + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DbLibService.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DbLibService.java new file mode 100644 index 000000000..de9846679 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DbLibService.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.sql.SQLException; +import java.util.ArrayList; + +import javax.sql.rowset.CachedRowSet; + +public interface DbLibService { + + /* (non-Javadoc) + * @see DataAccessor#getData(java.lang.String, java.util.ArrayList) + */ + public abstract CachedRowSet getData(String statement, + ArrayList arguments, String preferredDS) + throws SQLException; + + /* (non-Javadoc) + * @see DataAccessor#writeData(java.lang.String, java.util.ArrayList) + */ + public abstract boolean writeData(String statement, + ArrayList arguments, String preferredDS) + throws SQLException; + + public abstract boolean isActive(); + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DblibConfigurationException.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DblibConfigurationException.java new file mode 100644 index 000000000..be493aa1f --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DblibConfigurationException.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + + +public class DblibConfigurationException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public DblibConfigurationException() + { + super(); + } + + public DblibConfigurationException(String msg) + { + super(msg); + } + + public DblibConfigurationException(String msg, Throwable t) + { + super(msg, t); + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/NoAvailableConnectionsException.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/NoAvailableConnectionsException.java new file mode 100644 index 000000000..a39e5c5b4 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/NoAvailableConnectionsException.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.sql.SQLException; + +public class NoAvailableConnectionsException extends SQLException { + + /** + * + */ + private static final long serialVersionUID = -6259205931674413018L; + + public NoAvailableConnectionsException(Exception exc) { + super(exc); + } + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/TerminatingCachedDataSource.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/TerminatingCachedDataSource.java new file mode 100644 index 000000000..127e6d376 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/TerminatingCachedDataSource.java @@ -0,0 +1,82 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib; + +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + +import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; +import org.onap.ccsdk.sli.core.dblib.pm.SQLExecutionMonitorObserver; + + +public class TerminatingCachedDataSource extends CachedDataSource implements SQLExecutionMonitorObserver { + + public TerminatingCachedDataSource(BaseDBConfiguration jdbcElem) throws DBConfigException { + super(jdbcElem); + } + + protected void configure(BaseDBConfiguration jdbcElem) throws DBConfigException { + // no action + } + + public long getInterval() { + return 1000; + } + + public long getInitialDelay() { + return 1000; + } + + public long getExpectedCompletionTime() { + return 50; + } + + public void setExpectedCompletionTime(long value) { + + } + + public void setInterval(long value) { + + } + + public void setInitialDelay(long value) { + + } + + public long getUnprocessedFailoverThreshold() { + return 3; + } + + public void setUnprocessedFailoverThreshold(long value) { + + } + + public int compareTo(CachedDataSource ods) + { + return 0; + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/BaseDBConfiguration.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/BaseDBConfiguration.java new file mode 100644 index 000000000..4b738d426 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/BaseDBConfiguration.java @@ -0,0 +1,104 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.config; + +import java.util.Properties; + +public abstract class BaseDBConfiguration { + public static final String DATABASE_TYPE = "org.onap.ccsdk.sli.dbtype"; + public static final String DATABASE_URL = "org.onap.ccsdk.sli.jdbc.url"; + public static final String DATABASE_NAME = "org.onap.ccsdk.sli.jdbc.database"; + public static final String CONNECTION_NAME = "org.onap.ccsdk.sli.jdbc.connection.name"; + public static final String DATABASE_USER = "org.onap.ccsdk.sli.jdbc.user"; + public static final String DATABASE_PSSWD = "org.onap.ccsdk.sli.jdbc.password"; + public static final String CONNECTION_TIMEOUT="org.onap.ccsdk.sli.jdbc.connection.timeout"; + public static final String REQUEST_TIMEOUT = "org.onap.ccsdk.sli.jdbc.request.timeout"; + public static final String MIN_LIMIT = "org.onap.ccsdk.sli.jdbc.limit.min"; + public static final String MAX_LIMIT = "org.onap.ccsdk.sli.jdbc.limit.max"; + public static final String INIT_LIMIT = "org.onap.ccsdk.sli.jdbc.limit.init"; + public static final String DATABASE_HOSTS = "org.onap.ccsdk.sli.jdbc.hosts"; + + + protected final Properties props; + + public BaseDBConfiguration(Properties properties) { + this.props = properties; + } + + public int getConnTimeout() { + try { + String value = props.getProperty(CONNECTION_TIMEOUT); + return Integer.parseInt(value); + } catch(Exception exc) { + return -1; + } + } + + public int getRequestTimeout() { + try { + String value = props.getProperty(REQUEST_TIMEOUT); + if(value == null) + return -1; + return Integer.parseInt(value); + } catch(Exception exc) { + return -1; + } + } + + public String getDbConnectionName() { + return props.getProperty(CONNECTION_NAME); + } + + public String getDatabaseName() { + return props.getProperty(DATABASE_NAME); + } + + public String getDbUserId() { + return props.getProperty(DATABASE_USER); + } + + public String getDbPasswd() { + return props.getProperty(DATABASE_PSSWD); + } + + public int getDbMinLimit() { + String value = props.getProperty(MIN_LIMIT); + return Integer.parseInt(value); + } + + public int getDbMaxLimit() { + String value = props.getProperty(MAX_LIMIT); + return Integer.parseInt(value); + } + + public int getDbInitialLimit() { + String value = props.getProperty(INIT_LIMIT); + return Integer.parseInt(value); + } + + public String getDbUrl() { + return props.getProperty(DATABASE_URL); + } + + public String getServerGroup() { + return null; + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/DbConfigPool.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/DbConfigPool.java new file mode 100644 index 000000000..21fdab245 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/DbConfigPool.java @@ -0,0 +1,56 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.config; + +import java.util.ArrayList; +import java.util.Properties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DbConfigPool { + private static Logger LOGGER = LoggerFactory.getLogger(DbConfigPool.class); + + private final String type; + + private ArrayList configurations = new ArrayList(); + + public DbConfigPool(Properties properties) { + LOGGER.debug("Initializing DbConfigType"); + type = properties.getProperty(BaseDBConfiguration.DATABASE_TYPE, "JDBC").toUpperCase(); + } + + public int getTimeout() { + // TODO Auto-generated method stub + return 0; + } + + public String getType() { + return type; + } + + public JDBCConfiguration[] getJDBCbSourceArray() { + return configurations.toArray(new JDBCConfiguration[configurations.size()]); + } + + public void addConfiguration(BaseDBConfiguration config) { + configurations.add(config); + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/JDBCConfiguration.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/JDBCConfiguration.java new file mode 100644 index 000000000..fea103569 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/JDBCConfiguration.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.config; + +import java.util.Properties; + +public class JDBCConfiguration extends BaseDBConfiguration { + + public JDBCConfiguration(Properties xmlElem) { + super(xmlElem); + } + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/AbstractDBResourceManagerFactory.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/AbstractDBResourceManagerFactory.java new file mode 100644 index 000000000..e88734d2e --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/AbstractDBResourceManagerFactory.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.factory; + +import org.onap.ccsdk.sli.core.dblib.jdbc.JdbcDbResourceManagerFactory; + +/** + * @version $Revision: 1.1 $ + * Change Log + * Author Date Comments + * ============== ======== ==================================================== + * Rich Tabedzki + */ +public class AbstractDBResourceManagerFactory { + + public static AbstractResourceManagerFactory getFactory(String type) throws FactoryNotDefinedException { + + // JDBC + return JdbcDbResourceManagerFactory.createIntstance(); + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/AbstractResourceManagerFactory.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/AbstractResourceManagerFactory.java new file mode 100644 index 000000000..6fc7e7a04 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/AbstractResourceManagerFactory.java @@ -0,0 +1,104 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.factory; + + +import java.sql.SQLException; +import java.util.Set; +import java.util.concurrent.Callable; + +import org.onap.ccsdk.sli.core.dblib.CachedDataSource; +import org.onap.ccsdk.sli.core.dblib.CachedDataSourceFactory; +import org.onap.ccsdk.sli.core.dblib.DBConfigException; +import org.onap.ccsdk.sli.core.dblib.DBResourceManager; +import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; +import org.onap.ccsdk.sli.core.dblib.config.DbConfigPool; +import org.onap.ccsdk.sli.core.dblib.config.JDBCConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @version $Revision: 1.6 $ + * Change Log + * Author Date Comments + * ============== ======== ==================================================== + * Rich Tabedzki + */ +public abstract class AbstractResourceManagerFactory { + private static Logger LOGGER = LoggerFactory.getLogger(AbstractResourceManagerFactory.class); + + public abstract CachedDataSource[] initDBResourceManager(DbConfigPool dbConfig, DBResourceManager manager) throws Exception; + public abstract CachedDataSource[] initDBResourceManager(DbConfigPool dbConfig, DBResourceManager dbResourceManager, String sourceName) throws SQLException ; + + + public static AbstractResourceManagerFactory createIntstance() throws FactoryNotDefinedException { + throw new FactoryNotDefinedException("Factory method 'createIntstance' needs to be overriden in DBResourceManagerFactory"); + } + + public class DBInitTask implements Callable + { + private BaseDBConfiguration config = null; + private Set activeTasks; + + public DBInitTask(JDBCConfiguration jdbcconfig, Set tasks) { + this.config = jdbcconfig; + this.activeTasks = tasks; + } + + public CachedDataSource call() throws Exception { + CachedDataSource ds = null; + try { + ds = CachedDataSourceFactory.createDataSource(config); + return ds; + } finally { + synchronized(activeTasks) { + activeTasks.remove(this); + if (activeTasks.isEmpty()) { + final Runnable closure = new Runnable() { + + public void run() { + try { + Thread.sleep(300); + } catch (Exception e) { + } + synchronized(activeTasks) { + activeTasks.notifyAll(); + } + } + }; + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Completed CachedDataSource.Call and notifyAll from " + ds.getDbConnectionName()); + } + Thread worker = new Thread(closure); + worker.setDaemon(true); + worker.start(); + } else { + if (LOGGER.isDebugEnabled()) { + if (ds != null) { + LOGGER.debug("Completed CachedDataSource.Call from " + ds.getDbConnectionName()); + } + } + } + } + } + } + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/DBConfigFactory.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/DBConfigFactory.java new file mode 100644 index 000000000..3caa7767e --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/DBConfigFactory.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.factory; + + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Properties; + +import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; +import org.onap.ccsdk.sli.core.dblib.config.DbConfigPool; +import org.onap.ccsdk.sli.core.dblib.config.JDBCConfiguration; +import org.slf4j.LoggerFactory; + +/** + * @version $Revision: 1.1 $ + * Change Log + * Author Date Comments + * ============== ======== ==================================================== + * Rich Tabedzki 01/17/08 Initial version + */ +public class DBConfigFactory { + + public static DbConfigPool createConfig(Properties resource) { + return getConfigparams(resource); + } + + static DbConfigPool getConfigparams(Properties properties){ + DbConfigPool xmlConfig = new DbConfigPool(properties); + ArrayList propertySets = new ArrayList(); + + if("JDBC".equalsIgnoreCase(xmlConfig.getType())) { + String hosts = properties.getProperty(BaseDBConfiguration.DATABASE_HOSTS); + if(hosts == null || hosts.isEmpty()) { + propertySets.add(properties); + } else { + String[] newhost = hosts.split(","); + for(int i=0; i< newhost.length; i++) { + Properties localset = new Properties(); + localset.putAll(properties); + String url = localset.getProperty(BaseDBConfiguration.DATABASE_URL); + if(url.contains("DBHOST")) + url = url.replace("DBHOST", newhost[i]); + if(url.contains("dbhost")) + url = url.replace("dbhost", newhost[i]); + localset.setProperty(BaseDBConfiguration.DATABASE_URL, url); + localset.setProperty(BaseDBConfiguration.CONNECTION_NAME, newhost[i]); + propertySets.add(localset); + } + } + } else { + propertySets.add(properties); + } + try { + Iterator it = propertySets.iterator(); + while(it.hasNext()) { + BaseDBConfiguration config = parse(it.next()); + xmlConfig.addConfiguration(config); + } + + } catch (Exception e) { + LoggerFactory.getLogger(DBConfigFactory.class).warn("",e); + } + + return xmlConfig; + } + + public static BaseDBConfiguration parse(Properties props) throws Exception { + + String type = props.getProperty(BaseDBConfiguration.DATABASE_TYPE); + + BaseDBConfiguration config = null; + + if("JDBC".equalsIgnoreCase(type)) { + config = new JDBCConfiguration(props); + } + + return config; + + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/FactoryNotDefinedException.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/FactoryNotDefinedException.java new file mode 100644 index 000000000..b6383a53b --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/FactoryNotDefinedException.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.factory; + + +/** + * @version 1.3 + * Change Log + * Author Date Comments + * ============== ======== ==================================================== + * Rich Tabedzki 01/16/08 Initial version + */ +public class FactoryNotDefinedException extends Exception { + + public FactoryNotDefinedException(String message) { + super(message); + } + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDBCachedDataSource.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDBCachedDataSource.java new file mode 100644 index 000000000..c024d0021 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDBCachedDataSource.java @@ -0,0 +1,249 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.jdbc; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLFeatureNotSupportedException; + +import org.apache.tomcat.jdbc.pool.DataSource; +import org.apache.tomcat.jdbc.pool.PoolProperties; +import org.onap.ccsdk.sli.core.dblib.CachedDataSource; +import org.onap.ccsdk.sli.core.dblib.DBConfigException; +import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; +import org.onap.ccsdk.sli.core.dblib.config.JDBCConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.mysql.jdbc.Driver; + + +/** + * @version $Revision: 1.7 $ + * Change Log + * Author Date Comments + * ============== ======== ==================================================== + * Rich Tabedzki + */ + +public class JdbcDBCachedDataSource extends CachedDataSource +{ + private String dbUserId; + private String dbPasswd; + private String dbUrl; + + private int minLimit; + private int maxLimit; + private int initialLimit; + + private static final String AS_CONF_ERROR = "AS_CONF_ERROR: "; + + private static Logger LOGGER = LoggerFactory.getLogger(JdbcDBCachedDataSource.class); + + /** + * @param jdbcElem + */ + public JdbcDBCachedDataSource(BaseDBConfiguration jdbcElem) + { + super(jdbcElem); + } + + @Override + protected void configure(BaseDBConfiguration xmlElem) throws DBConfigException + { + BaseDBConfiguration jdbcConfig = (BaseDBConfiguration)xmlElem; + if(jdbcConfig.getConnTimeout() > 0){ + this.CONN_REQ_TIMEOUT = jdbcConfig.getConnTimeout(); + } + if(jdbcConfig.getRequestTimeout() > 0){ + this.DATA_REQ_TIMEOUT = jdbcConfig.getRequestTimeout(); + } + + // set connection pool name + String dbConnectionName = jdbcConfig.getDbConnectionName(); + super.setDbConnectionName(dbConnectionName); + // Configure the JDBC connection + dbUserId = jdbcConfig.getDbUserId(); + if (dbUserId == null) + { + String errorMsg = "Invalid XML contents: JDBCConnection missing dbUserId attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new DBConfigException(errorMsg); + } + + dbPasswd = jdbcConfig.getDbPasswd(); + if (dbPasswd == null) + { + String errorMsg = "Invalid XML contents: JDBCConnection missing dbPasswd attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new DBConfigException(errorMsg); + } + /* + dbDriver = jdbcConfig.getDbDriver(); + if (dbDriver == null) + { + String errorMsg = "Invalid XML contents: JDBCConnection missing dbDriver attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new ScpTblUpdateError(errorMsg); + } + */ + + minLimit = jdbcConfig.getDbMinLimit(); +// if (minLimit == null) +// { +// String errorMsg = "Invalid XML contents: JDBC Connection missing minLimit attribute"; +// LOGGER.error(AS_CONF_ERROR + errorMsg); +// throw new DBConfigException(errorMsg); +// } + maxLimit = jdbcConfig.getDbMaxLimit(); +// if (maxLimit == null) +// { +// String errorMsg = "Invalid XML contents: JDBC Connection missing maxLimit attribute"; +// LOGGER.error(AS_CONF_ERROR + errorMsg); +// throw new DBConfigException(errorMsg); +// } + initialLimit = jdbcConfig.getDbInitialLimit(); +// if (initialLimit == null) +// { +// String errorMsg = "Invalid XML contents: JDBC Connection missing initialLimit attribute"; +// LOGGER.error(AS_CONF_ERROR + errorMsg); +// throw new DBConfigException(errorMsg); +// } + + dbUrl = jdbcConfig.getDbUrl(); + if(dbUrl == null){ + String errorMsg = "Invalid XML contents: JDBCConnection missing dbUrl attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new DBConfigException(errorMsg); + } + + try { + Driver dr = new com.mysql.jdbc.Driver(); + Class clazz = Class.forName("com.mysql.jdbc.Driver") ; + + PoolProperties p = new PoolProperties(); + p.setDriverClassName("com.mysql.jdbc.Driver"); + p.setUrl(dbUrl); + p.setUsername(dbUserId); + p.setPassword(dbPasswd); + p.setJmxEnabled(true); + p.setTestWhileIdle(false); + p.setTestOnBorrow(true); + p.setValidationQuery("SELECT 1"); + p.setTestOnReturn(false); + p.setValidationInterval(30000); + p.setTimeBetweenEvictionRunsMillis(30000); + p.setInitialSize(initialLimit); + p.setMaxActive(maxLimit); + p.setMaxIdle(maxLimit); + p.setMaxWait(10000); + p.setRemoveAbandonedTimeout(60); + p.setMinEvictableIdleTimeMillis(30000); + p.setMinIdle(minLimit); + p.setLogAbandoned(true); + p.setRemoveAbandoned(true); + p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" + + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); + + DataSource dataSource = new DataSource(p); + + synchronized(this) + { + this.ds = dataSource; + Connection con = null; + PreparedStatement st = null; + ResultSet rs = null; + + try { + con = dataSource.getConnection(); + st = con.prepareStatement("Select 1 FROM DUAL"); + rs = st.executeQuery(); + } catch(Exception exc) { + LOGGER.error(exc.getMessage()); + } finally { + if(rs != null) rs.close(); + if(st != null) st.close(); + if(con != null) con.close(); + } + + initialized = true; + LOGGER.info("MySQLDataSource <"+dbConnectionName+"> configured successfully. Using URL: "+dbUrl); + } + +// } catch (SQLException exc) { +// initialized = false; +// StringBuffer sb = new StringBuffer(); +// sb.append("Failed to initialize MySQLDataSource<"); +// sb.append(dbConnectionName).append(">. Reason: "); +// sb.append(exc.getMessage()); +// LOGGER.error("AS_CONF_ERROR: " + sb.toString()); +//// throw new DBConfigException(e.getMessage()); + } catch (Exception exc) { + initialized = false; + StringBuffer sb = new StringBuffer(); + sb.append("Failed to initialize MySQLCachedDataSource <"); + sb.append(dbConnectionName).append(">. Reason: "); + sb.append(exc.getMessage()); + LOGGER.error("AS_CONF_ERROR: " + sb.toString()); +// throw new DBConfigException(e.getMessage()); + } + } + + public final String getDbUrl() + { + return dbUrl; + } + + public final String getDbUserId() + { + return dbUserId; + } + + public final String getDbPasswd() + { + return dbPasswd; + } + + public static JdbcDBCachedDataSource createInstance(BaseDBConfiguration config) /*throws Exception*/ { + return new JdbcDBCachedDataSource(config); + } + + public String toString(){ + return getDbConnectionName(); + } + + public java.util.logging.Logger getParentLogger() + throws SQLFeatureNotSupportedException { + // TODO Auto-generated method stub + return null; + } + + public void cleanUp(){ + DataSource dataSource = (DataSource)ds; + dataSource.getPool().purge(); + int active = dataSource.getActive(); + int size = dataSource.getSize(); + dataSource.close(true); + super.cleanUp(); + } + +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDbResourceManagerFactory.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDbResourceManagerFactory.java new file mode 100644 index 000000000..978de0eb3 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDbResourceManagerFactory.java @@ -0,0 +1,186 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.jdbc; + + +import java.sql.SQLException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.FutureTask; + +import org.onap.ccsdk.sli.core.dblib.CachedDataSource; +import org.onap.ccsdk.sli.core.dblib.CachedDataSourceFactory; +import org.onap.ccsdk.sli.core.dblib.DBResourceManager; +import org.onap.ccsdk.sli.core.dblib.DataSourceComparator; +import org.onap.ccsdk.sli.core.dblib.config.DbConfigPool; +import org.onap.ccsdk.sli.core.dblib.config.JDBCConfiguration; +import org.onap.ccsdk.sli.core.dblib.factory.AbstractResourceManagerFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @version $Revision: 1.6 $ + * Change Log + * Author Date Comments + * ============== ======== ==================================================== + * Rich Tabedzki + */ +public class JdbcDbResourceManagerFactory extends AbstractResourceManagerFactory { + private static Logger LOGGER = LoggerFactory.getLogger(JdbcDbResourceManagerFactory.class ); + private JdbcDbResourceManagerFactory(){ + + } + + class MyFutureTask extends FutureTask + { + + public MyFutureTask(Callable result) { + super(result); + } + + } + + public CachedDataSource[] initDBResourceManager(DbConfigPool dbConfig, DBResourceManager manager, String sourceName) throws SQLException + { + // here create the data sources objects + JDBCConfiguration[] list = dbConfig.getJDBCbSourceArray(); + CachedDataSource[] cachedDS = new CachedDataSource[1]; + + for(int i=0, max=list.length; i tasks = new HashSet(); + if(LOGGER.isDebugEnabled()) { + LOGGER.debug("Creating " + list.length + " datasources."); + } + + for(int i=0, max=list.length; i 0){ + this.CONN_REQ_TIMEOUT = jdbcConfig.getConnTimeout(); + } + if(jdbcConfig.getRequestTimeout() > 0){ + this.DATA_REQ_TIMEOUT = jdbcConfig.getRequestTimeout(); + } + + // set connection pool name + String dbConnectionName = jdbcConfig.getDbConnectionName(); + super.setDbConnectionName(dbConnectionName); + // Configure the JDBC connection + dbUserId = jdbcConfig.getDbUserId(); + if (dbUserId == null) + { + String errorMsg = "Invalid XML contents: JDBCConnection missing dbUserId attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new DBConfigException(errorMsg); + } + + dbPasswd = jdbcConfig.getDbPasswd(); + if (dbPasswd == null) + { + String errorMsg = "Invalid XML contents: JDBCConnection missing dbPasswd attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new DBConfigException(errorMsg); + } + /* + dbDriver = jdbcConfig.getDbDriver(); + if (dbDriver == null) + { + String errorMsg = "Invalid XML contents: JDBCConnection missing dbDriver attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new ScpTblUpdateError(errorMsg); + } + */ + + minLimit = Integer.toString(jdbcConfig.getDbMinLimit()); + if (minLimit == null) + { + String errorMsg = "Invalid XML contents: JDBC Connection missing minLimit attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new DBConfigException(errorMsg); + } + maxLimit = Integer.toString(jdbcConfig.getDbMaxLimit()); + if (maxLimit == null) + { + String errorMsg = "Invalid XML contents: JDBC Connection missing maxLimit attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new DBConfigException(errorMsg); + } + initialLimit = Integer.toString(jdbcConfig.getDbInitialLimit()); + if (initialLimit == null) + { + String errorMsg = "Invalid XML contents: JDBC Connection missing initialLimit attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new DBConfigException(errorMsg); + } + + dbUrl = jdbcConfig.getDbUrl(); + if(dbUrl == null){ + String errorMsg = "Invalid XML contents: JDBCConnection missing dbUrl attribute"; + LOGGER.error(AS_CONF_ERROR + errorMsg); + throw new DBConfigException(errorMsg); + } + + try { + + MysqlDataSource dataSource = new MysqlDataSource(); + dataSource.setUser(dbUserId); + dataSource.setPassword(dbPasswd); + dataSource.setURL(dbUrl); +// dataSource.setInitialSize(5); +// dataSource.setMaxTotal(60); +// dataSource.setMaxActive(100); +// dataSource.setMaxWait(10000); +// dataSource.setMaxIdle(10); + + Properties connAttr = new Properties(); + + connAttr.setProperty("MinLimit", minLimit); + connAttr.setProperty("MaxLimit", maxLimit); + connAttr.setProperty("InitialLimit", initialLimit); + connAttr.setProperty("TRANSACTION_ISOLATION","SERIALIZABLE"); + connAttr.setProperty("CONNECTION_TAG", dbConnectionName.toUpperCase()+"_CONNECTION"); + connAttr.setProperty("InactivityTimeout", "900"); + connAttr.setProperty("AbandonedConnectionTimeout", "600"); + connAttr.setProperty("PropertyCheckInterval", "60"); + connAttr.setProperty("ValidateConnection", "true"); + + + synchronized(this) + { + this.ds = dataSource; + + initialized = true; + LOGGER.info("MySQLDataSource <"+dbConnectionName+"> configured successfully. Using URL: "+dbUrl); + } + +// } catch (SQLException exc) { +// initialized = false; +// StringBuffer sb = new StringBuffer(); +// sb.append("Failed to initialize MySQLDataSource<"); +// sb.append(dbConnectionName).append(">. Reason: "); +// sb.append(exc.getMessage()); +// LOGGER.error("AS_CONF_ERROR: " + sb.toString()); +//// throw new DBConfigException(e.getMessage()); + } catch (Exception exc) { + initialized = false; + StringBuffer sb = new StringBuffer(); + sb.append("Failed to initialize MySQLCachedDataSource <"); + sb.append(dbConnectionName).append(">. Reason: "); + sb.append(exc.getMessage()); + LOGGER.error("AS_CONF_ERROR: " + sb.toString()); +// throw new DBConfigException(e.getMessage()); + } + } + + public final String getDbUrl() + { + return dbUrl; + } + + public final String getDbUserId() + { + return dbUserId; + } + + public final String getDbPasswd() + { + return dbPasswd; + } + + public static MySQLCachedDataSource createInstance(BaseDBConfiguration config) /*throws Exception*/ { + return new MySQLCachedDataSource(config); + } + + public String toString(){ + return getDbConnectionName(); + } + + public java.util.logging.Logger getParentLogger() + throws SQLFeatureNotSupportedException { + // TODO Auto-generated method stub + return null; + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/PollingWorker.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/PollingWorker.java new file mode 100644 index 000000000..b670a832d --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/PollingWorker.java @@ -0,0 +1,217 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.pm; + +import java.util.Iterator; +import java.util.Properties; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; +import java.util.TreeSet; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicLong; + +public class PollingWorker implements Runnable { + + private Logger LOGGER = LoggerFactory.getLogger(PollingWorker.class); + + private static PollingWorker self = null; + + private LinkedBlockingQueue tasks = new LinkedBlockingQueue(100); + private long interval = 1000L; + private Thread worker = null; + private AtomicLong[] counters = null; + private int[] bucketUnit = null; + private static boolean enabled = false; + private Timer timer = null; + + public static void post(long starttime){ + PollingWorker temp = self; + if(temp != null && enabled) { + temp.register(new TestSample(starttime)); + } + } + + public static void createInistance(Properties props){ + self = new PollingWorker(props); + } + + private PollingWorker(Properties ctxprops){ + if(ctxprops==null || ctxprops.getProperty("org.onap.ccsdk.dblib.pm") == null){ + enabled = false; + } else { + if("true".equalsIgnoreCase((String)ctxprops.getProperty("org.onap.ccsdk.dblib.pm"))){ + enabled = true; + } else { + enabled = false; + } + } + + interval = Long.parseLong(( ctxprops == null || ctxprops.getProperty("org.onap.ccsdk.dblib.pm.interval") == null) ? "60" : (String)ctxprops.getProperty("org.onap.ccsdk.dblib.pm.interval")); + // '0' bucket is to count exceptions + String sampling[] = ((ctxprops == null || ctxprops.getProperty("org.onap.ccsdk.dblib.pm.sampling")==null) ? "0,2,5,10,20,50,100" : (String)ctxprops.getProperty("org.onap.ccsdk.dblib.pm.sampling")).split(","); + + if(enabled){ + bucketUnit = new int[sampling.length]; + for(int i=0, max = bucketUnit.length; i x.starttime) + return -1; + if(endtime > x.endtime) + return -1; + return 0; + } + return 1; + } + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitor.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitor.java new file mode 100644 index 000000000..bcd4360e4 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitor.java @@ -0,0 +1,237 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.pm; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.Collections; +import java.util.Observable; +import java.util.Observer; +import java.util.SortedSet; +import java.util.Timer; +import java.util.TimerTask; +import java.util.TreeSet; +import java.util.concurrent.atomic.AtomicLong; + +import org.onap.ccsdk.sli.core.dblib.DBResourceObserver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SQLExecutionMonitor extends Observable +{ + private static Logger LOGGER = LoggerFactory.getLogger(SQLExecutionMonitor.class); + + final static long MILISECOND = 1000000L; + final static long SECOND = 1000L*MILISECOND; + + private final Timer timer; + // collection + private final SortedSet innerSet; + private SQLExecutionMonitorObserver parent = null; + private final AtomicLong completionCounter; + private boolean activeState = false; + private final long interval; + private final long initialDelay; + private final long EXPECTED_TIME_TO_COMPLETE; + private final long UNPROCESSED_FAILOVER_THRESHOLD; + + private final class MonitoringTask extends TimerTask + { + + public void run() + { + try { + TestObject testObj = new TestObject(); + testObj.setStartTime(testObj.getStartTime() - EXPECTED_TIME_TO_COMPLETE); + + // take a snapshot of the current task list + TestObject[] array = innerSet.toArray(new TestObject[0]); + SortedSet copyCurrent = new TreeSet(Arrays.asList(array)); + // get the list of the tasks that are older than the specified + // interval. + SortedSet unprocessed = copyCurrent.headSet(testObj); + + long succesfulCount = completionCounter.get(); + int unprocessedCount = unprocessed.size(); + + if (!unprocessed.isEmpty() && unprocessedCount > UNPROCESSED_FAILOVER_THRESHOLD && succesfulCount == 0) + { + // switch the Connection Pool to passive + setChanged(); + notifyObservers("Open JDBC requests=" + unprocessedCount+" in "+SQLExecutionMonitor.this.parent.getDbConnectionName()); + } + } catch (Exception exc) { + LOGGER.error("", exc); + } finally { + completionCounter.set(0L); + } + } + } + + public static class TestObject implements Comparable, Serializable + { + + private static final long serialVersionUID = 1L; + private long starttime; + private long randId; + + public TestObject() + { + starttime = System.nanoTime(); + } + + public long getStartTime() + { + return starttime; + } + + public void setStartTime(long newTime) + { + starttime = newTime; + } + + public int compareTo(TestObject o) + { + if( this == o) + return 0; + if(this.starttime > o.getStartTime()) + return 1; + if(this.starttime < o.getStartTime()) + return -1; + + if(this.hashCode() > o.hashCode()) + return 1; + if(this.hashCode() < o.hashCode()) + return -1; + + return 0; + } + + public String toString() + { + return Long.toString(starttime)+"#"+ this.hashCode(); + } + + public boolean equals(Object obj) + { + if (this == obj) + return true; + + return (obj instanceof TestObject + && starttime == ((TestObject) obj).getStartTime() + && hashCode() == ((TestObject) obj).hashCode()); + } + } + + public SQLExecutionMonitor(SQLExecutionMonitorObserver parent) + { + this.parent = parent; + completionCounter = new AtomicLong(0L); + interval = parent.getInterval(); + initialDelay = parent.getInitialDelay(); + this.UNPROCESSED_FAILOVER_THRESHOLD = parent.getUnprocessedFailoverThreshold(); + this.EXPECTED_TIME_TO_COMPLETE = parent.getExpectedCompletionTime()*MILISECOND; + + innerSet = Collections.synchronizedSortedSet(new TreeSet()); + timer = new Timer(); + } + + public void cleanup() + { + timer.cancel(); + } + + // registerRequest + public TestObject registerRequest() + { + if(activeState) + { + TestObject test = new TestObject(); + if(innerSet.add(test)) + return test; + } + return null; + } + + // deregisterSuccessfulReguest + public boolean deregisterReguest(TestObject test) + { + if(test == null) + return false; + // remove from the collection + if(innerSet.remove(test) && activeState) + { + completionCounter.incrementAndGet(); + return true; + } + return false; + } + + public void terminate() { + timer.cancel(); + } + + /** + * @return the parent + */ + public final Object getParent() { + return parent; + } + + public void addObserver(Observer observer) + { + if(observer instanceof DBResourceObserver) + { + DBResourceObserver dbObserver = (DBResourceObserver)observer; + if(dbObserver.isMonitorDbResponse()) + { + if(countObservers() == 0) + { + TimerTask remindTask = new MonitoringTask(); + timer.schedule(remindTask, initialDelay, interval); + activeState = true; + } + } + } + super.addObserver(observer); + } + + public void deleteObserver(Observer observer) + { + super.deleteObserver(observer); + if(observer instanceof DBResourceObserver) + { + DBResourceObserver dbObserver = (DBResourceObserver)observer; + if(dbObserver.isMonitorDbResponse()) + { + if(countObservers() == 0) + { + timer.cancel(); + activeState = false; + } + } + } + } + + public final int getPorcessedConnectionsCount() { + return innerSet.size(); + } +} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitorObserver.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitorObserver.java new file mode 100644 index 000000000..c17696a80 --- /dev/null +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitorObserver.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.dblib.pm; + +public interface SQLExecutionMonitorObserver { + public String getDbConnectionName(); + + public long getInterval(); + public void setInterval(long value); + + public long getInitialDelay(); + public void setInitialDelay(long value); + + public long getExpectedCompletionTime(); + public void setExpectedCompletionTime(long value); + + public long getUnprocessedFailoverThreshold(); + public void setUnprocessedFailoverThreshold(long value); +} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java deleted file mode 100644 index 58a0aeb11..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java +++ /dev/null @@ -1,616 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.io.Closeable; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.sql.Blob; -import java.sql.Connection; -import java.sql.Date; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Observer; - -import javax.sql.DataSource; -import javax.sql.rowset.CachedRowSet; -import javax.sql.rowset.RowSetProvider; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.tomcat.jdbc.pool.PoolExhaustedException; -import org.openecomp.sdnc.sli.resource.dblib.config.BaseDBConfiguration; -import org.openecomp.sdnc.sli.resource.dblib.pm.SQLExecutionMonitor; -import org.openecomp.sdnc.sli.resource.dblib.pm.SQLExecutionMonitorObserver; -import org.openecomp.sdnc.sli.resource.dblib.pm.SQLExecutionMonitor.TestObject; -import com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException; - - -/** - * @version $Revision: 1.13 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ - -public abstract class CachedDataSource implements DataSource, SQLExecutionMonitorObserver -{ - private static Logger LOGGER = LoggerFactory.getLogger(CachedDataSource.class); - - protected static final String AS_CONF_ERROR = "AS_CONF_ERROR: "; - - protected long CONN_REQ_TIMEOUT = 30L; - protected long DATA_REQ_TIMEOUT = 100L; - - private final SQLExecutionMonitor monitor; - protected DataSource ds = null; - protected String connectionName = null; - protected boolean initialized = false; - - private long interval = 1000; - private long initialDelay = 5000; - private long expectedCompletionTime = 50L; - private boolean canTakeOffLine = true; - private long unprocessedFailoverThreshold = 3L; - - private long nextErrorReportTime = 0L; - - private String globalHostName = null; - - - public CachedDataSource(BaseDBConfiguration jdbcElem) throws DBConfigException - { - configure(jdbcElem); - monitor = new SQLExecutionMonitor(this); - } - - protected abstract void configure(BaseDBConfiguration jdbcElem) throws DBConfigException; - /* (non-Javadoc) - * @see javax.sql.DataSource#getConnection() - */ - public Connection getConnection() throws SQLException - { - return ds.getConnection(); - } - - public CachedRowSet getData(String statement, ArrayList arguments) throws SQLException, Throwable - { - TestObject testObject = null; - testObject = monitor.registerRequest(); - - Connection connection = null; - try { - connection = this.getConnection(); - if(connection == null ) { - throw new SQLException("Connection invalid"); - } - if(LOGGER.isDebugEnabled()) - LOGGER.debug("Obtained connection <" + connectionName + ">: "+connection.toString()); - return executePreparedStatement(connection, statement, arguments, true); - } finally { - try { - if(connection != null && !connection.isClosed()) { - connection.close(); - } - } catch(Throwable exc) { - // the exception not monitored - } finally { - connection = null; - } - - monitor.deregisterReguest(testObject); - } - } - - public boolean writeData(String statement, ArrayList arguments) throws SQLException, Throwable - { - TestObject testObject = null; - testObject = monitor.registerRequest(); - - Connection connection = null; - try { - connection = this.getConnection(); - if(connection == null ) { - throw new SQLException("Connection invalid"); - } - if(LOGGER.isDebugEnabled()) - LOGGER.debug("Obtained connection <" + connectionName + ">: "+connection.toString()); - return executeUpdatePreparedStatement(connection, statement, arguments, true); - } finally { - try { - if(connection != null && !connection.isClosed()) { - connection.close(); - } - } catch(Throwable exc) { - // the exception not monitored - } finally { - connection = null; - } - - monitor.deregisterReguest(testObject); - } - } - - CachedRowSet executePreparedStatement(Connection conn, String statement, ArrayList arguments, boolean close) throws SQLException, Throwable - { - long time = System.currentTimeMillis(); - - CachedRowSet data = null; - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("SQL Statement: "+ statement); - if(arguments != null && !arguments.isEmpty()) { - LOGGER.debug("Argunments: "+ Arrays.toString(arguments.toArray())); - } - } - - ResultSet rs = null; - try { - data = RowSetProvider.newFactory().createCachedRowSet(); - PreparedStatement ps = conn.prepareStatement(statement); - if(arguments != null) - { - for(int i = 0, max = arguments.size(); i < max; i++){ - ps.setObject(i+1, arguments.get(i)); - } - } - rs = ps.executeQuery(); - data.populate(rs); - // Point the rowset Cursor to the start - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("SQL SUCCESS. rows returned: " + data.size()+ ", time(ms): "+ (System.currentTimeMillis() - time)); } - } catch(SQLException exc){ - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("SQL FAILURE. time(ms): "+ (System.currentTimeMillis() - time)); - } - try { conn.rollback(); } catch(Throwable thr){} - if(arguments != null && !arguments.isEmpty()) { - LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with arguments: "+arguments.toString(), exc); - } else { - LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with no arguments. ", exc); - } - throw exc; - } catch(Throwable exc){ - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("SQL FAILURE. time(ms): "+ (System.currentTimeMillis() - time)); - } - if(arguments != null && !arguments.isEmpty()) { - LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with arguments: "+arguments.toString(), exc); - } else { - LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with no arguments. ", exc); - } - throw exc; // new SQLException(exc); - } finally { - - try { - if(rs != null){ - rs.close(); - rs = null; - } - } catch(Exception exc){ - - } - try { - if(conn != null && close){ - conn.close(); - conn = null; - } - } catch(Exception exc){ - - } - } - - return data; - } - - boolean executeUpdatePreparedStatement(Connection conn, String statement, ArrayList arguments, boolean close) throws SQLException, Throwable { - long time = System.currentTimeMillis(); - - CachedRowSet data = null; - - int rs = -1; - try { - data = RowSetProvider.newFactory().createCachedRowSet(); - PreparedStatement ps = conn.prepareStatement(statement); - if(arguments != null) - { - for(int i = 0, max = arguments.size(); i < max; i++){ - if(arguments.get(i) instanceof Blob) { - ps.setBlob(i+1, (Blob)arguments.get(i)); - } else if(arguments.get(i) instanceof Timestamp) { - ps.setTimestamp(i+1, (Timestamp)arguments.get(i)); - } else if(arguments.get(i) instanceof Integer) { - ps.setInt(i+1, (Integer)arguments.get(i)); - } else if(arguments.get(i) instanceof Long) { - ps.setLong(i+1, (Long)arguments.get(i)); - } else if(arguments.get(i) instanceof Date) { - ps.setDate(i+1, (Date)arguments.get(i)); - } else { - ps.setObject(i+1, arguments.get(i)); - } - } - } - rs = ps.executeUpdate(); - // Point the rowset Cursor to the start - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("SQL SUCCESS. rows returned: " + data.size()+ ", time(ms): "+ (System.currentTimeMillis() - time)); - } - } catch(SQLException exc){ - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("SQL FAILURE. time(ms): "+ (System.currentTimeMillis() - time)); - } - try { conn.rollback(); } catch(Throwable thr){} - if(arguments != null && !arguments.isEmpty()) { - LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with arguments: "+arguments.toString(), exc); - } else { - LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with no arguments. ", exc); - } - throw exc; - } catch(Throwable exc){ - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("SQL FAILURE. time(ms): "+ (System.currentTimeMillis() - time)); - } - if(arguments != null && !arguments.isEmpty()) { - LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with arguments: "+arguments.toString(), exc); - } else { - LOGGER.error("<"+connectionName+"> Failed to execute: "+ statement + " with no arguments. ", exc); - } - throw exc; // new SQLException(exc); - } finally { - try { - if(conn != null && close){ - conn.close(); - conn = null; - } - } catch(Exception exc){ - - } - } - - return true; - } - - /* (non-Javadoc) - * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String) - */ - public Connection getConnection(String username, String password) - throws SQLException - { - return ds.getConnection(username, password); - } - - /* (non-Javadoc) - * @see javax.sql.DataSource#getLogWriter() - */ - public PrintWriter getLogWriter() throws SQLException - { - return ds.getLogWriter(); - } - - /* (non-Javadoc) - * @see javax.sql.DataSource#getLoginTimeout() - */ - public int getLoginTimeout() throws SQLException - { - return ds.getLoginTimeout(); - } - - /* (non-Javadoc) - * @see javax.sql.DataSource#setLogWriter(java.io.PrintWriter) - */ - public void setLogWriter(PrintWriter out) throws SQLException - { - ds.setLogWriter(out); - } - - /* (non-Javadoc) - * @see javax.sql.DataSource#setLoginTimeout(int) - */ - public void setLoginTimeout(int seconds) throws SQLException - { - ds.setLoginTimeout(seconds); - } - - - public final String getDbConnectionName(){ - return connectionName; - } - - protected final void setDbConnectionName(String name) { - this.connectionName = name; - } - - public void cleanUp(){ - if(ds != null && ds instanceof Closeable) { - try { - ((Closeable)ds).close(); - } catch (IOException e) { - LOGGER.warn(e.getMessage()); - } - } - ds = null; - monitor.deleteObservers(); - monitor.cleanup(); - } - - public boolean isInitialized() { - return initialized; - } - - protected boolean testConnection(){ - return testConnection(false); - } - - protected boolean testConnection(boolean error_level){ - Connection conn = null; - ResultSet rs = null; - Statement stmt = null; - try - { - Boolean readOnly = null; - String hostname = null; - conn = this.getConnection(); - stmt = conn.createStatement(); - rs = stmt.executeQuery("SELECT @@global.read_only, @@global.hostname"); //("SELECT 1 FROM DUAL"); //"select BANNER from SYS.V_$VERSION" - while(rs.next()) - { - readOnly = rs.getBoolean(1); - hostname = rs.getString(2); - - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("SQL DataSource <"+getDbConnectionName() + "> connected to " + hostname + ", read-only is " + readOnly + ", tested successfully "); - } - } - - } catch (Throwable exc) { - if(error_level) { - LOGGER.error("SQL DataSource <" + this.getDbConnectionName() + "> test failed. Cause : " + exc.getMessage()); - } else { - LOGGER.info("SQL DataSource <" + this.getDbConnectionName() + "> test failed. Cause : " + exc.getMessage()); - } - return false; - } finally { - if(rs != null) { - try { - rs.close(); - rs = null; - } catch (SQLException e) { - } - } - if(stmt != null) { - try { - stmt.close(); - stmt = null; - } catch (SQLException e) { - } - } - if(conn !=null){ - try { - conn.close(); - conn = null; - } catch (SQLException e) { - } - } - } - return true; - } - - public boolean isWrapperFor(Class iface) throws SQLException { - return false; - } - - public T unwrap(Class iface) throws SQLException { - return null; - } - - @SuppressWarnings("deprecation") - public void setConnectionCachingEnabled(boolean state) - { -// if(ds != null && ds instanceof OracleDataSource) -// try { -// ((OracleDataSource)ds).setConnectionCachingEnabled(true); -// } catch (SQLException exc) { -// LOGGER.warn("", exc); -// } - } - - public void addObserver(Observer observer) { - monitor.addObserver(observer); - } - - public void deleteObserver(Observer observer) { - monitor.deleteObserver(observer); - } - - public long getInterval() { - return interval; - } - - public long getInitialDelay() { - return initialDelay; - } - - public void setInterval(long value) { - interval = value; - } - - public void setInitialDelay(long value) { - initialDelay = value; - } - - public long getExpectedCompletionTime() { - return expectedCompletionTime; - } - - public void setExpectedCompletionTime(long value) { - expectedCompletionTime = value; - } - - public long getUnprocessedFailoverThreshold() { - return unprocessedFailoverThreshold; - } - - public void setUnprocessedFailoverThreshold(long value) { - this.unprocessedFailoverThreshold = value; - } - - public boolean canTakeOffLine() { - return canTakeOffLine; - } - - public void blockImmediateOffLine() { - canTakeOffLine = false; - final Thread offLineTimer = new Thread() - { - public void run(){ - try { - Thread.sleep(30000L); - }catch(Throwable exc){ - - }finally{ - canTakeOffLine = true; - } - } - }; - offLineTimer.setDaemon(true); - offLineTimer.start(); - } - - /** - * @return the monitor - */ - final SQLExecutionMonitor getMonitor() { - return monitor; - } - - protected boolean isSlave() throws PoolExhaustedException, MySQLNonTransientConnectionException { - CachedRowSet rs = null; - boolean isSlave = true; - String hostname = "UNDETERMINED"; - try { - boolean localSlave = true; - rs = this.getData("SELECT @@global.read_only, @@global.hostname", new ArrayList()); - while(rs.next()) { - localSlave = rs.getBoolean(1); - hostname = rs.getString(2); - } - isSlave = localSlave; - } catch(PoolExhaustedException | MySQLNonTransientConnectionException peexc){ - throw peexc; - } catch (SQLException e) { - LOGGER.error("", e); - isSlave = true; - } catch (Throwable e) { - LOGGER.error("", e); - isSlave = true; - } - if(isSlave){ - LOGGER.debug("SQL SLAVE : "+connectionName + " on server " + hostname); - } else { - LOGGER.debug("SQL MASTER : "+connectionName + " on server " + hostname); - } - return isSlave; - } - - public boolean isFabric() { - return false; - } - - protected boolean lockTable(Connection conn, String tableName) { - boolean retValue = false; - Statement lock = null; - try { - if(tableName != null) { - if(LOGGER.isDebugEnabled()) { - LOGGER.debug("Executing 'LOCK TABLES " + tableName + " WRITE' on connection " + conn.toString()); - if("SVC_LOGIC".equals(tableName)) { - Exception e = new Exception(); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - LOGGER.debug(sw.toString()); - } - } - lock = conn.createStatement(); - lock.execute("LOCK TABLES " + tableName + " WRITE"); - retValue = true; - } - } catch(Exception exc){ - LOGGER.error("", exc); - retValue = false; - } finally { - try { - lock.close(); - } catch(Exception exc) { - - } - } - return retValue; - } - - protected boolean unlockTable(Connection conn) { - boolean retValue = false; - Statement lock = null; - try { - if(LOGGER.isDebugEnabled()) { - LOGGER.debug("Executing 'UNLOCK TABLES' on connection " + conn.toString()); - } - lock = conn.createStatement(); - retValue = lock.execute("UNLOCK TABLES"); - } catch(Exception exc){ - LOGGER.error("", exc); - retValue = false; - } finally { - try { - lock.close(); - } catch(Exception exc) { - - } - } - return retValue; - } - - public void getPoolInfo(boolean allocation) { - - } - - public long getNextErrorReportTime() { - return nextErrorReportTime; - } - - public void setNextErrorReportTime(long nextTime) { - this.nextErrorReportTime = nextTime; - } - - public void setGlobalHostName(String hostname) { - this.globalHostName = hostname; - } - - public String getGlobalHostName() { - return globalHostName; - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSourceFactory.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSourceFactory.java deleted file mode 100644 index 3e51ed942..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSourceFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - - -import org.openecomp.sdnc.sli.resource.dblib.config.BaseDBConfiguration; -import org.openecomp.sdnc.sli.resource.dblib.config.JDBCConfiguration; -import org.openecomp.sdnc.sli.resource.dblib.jdbc.JdbcDBCachedDataSource; -import org.openecomp.sdnc.sli.resource.dblib.jdbc.MySQLCachedDataSource; - -/** - * @version $Revision: 1.1 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ -public class CachedDataSourceFactory { - - public static CachedDataSource createDataSource(BaseDBConfiguration config) { - if(config instanceof JDBCConfiguration) - return JdbcDBCachedDataSource.createInstance(config); - - return (CachedDataSource)null; - } - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBConfigException.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBConfigException.java deleted file mode 100644 index b324e6a2c..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBConfigException.java +++ /dev/null @@ -1,47 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - - -/** - * @version $Revision: 1.1 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ -public class DBConfigException extends RuntimeException -{ - /** - * - */ - private static final long serialVersionUID = 4752405152537680257L; - - public DBConfigException(Exception e) - { - super(e.toString()); - } - - public DBConfigException(String msg) - { - super(msg); - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLIBResourceActivator.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLIBResourceActivator.java deleted file mode 100644 index 150a9a82f..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLIBResourceActivator.java +++ /dev/null @@ -1,130 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.io.File; -import java.net.URL; -import java.util.Properties; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.framework.ServiceRegistration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DBLIBResourceActivator implements BundleActivator { - - private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; - - private static final String DBLIB_PROP_PATH = "/dblib.properties"; - - private ServiceRegistration registration = null; - - private static final Logger LOG = LoggerFactory.getLogger(DBLIBResourceActivator.class); - - @Override - public void start(BundleContext ctx) throws Exception { - LOG.info("entering DBLIBResourceActivator.start"); - - DbLibService jdbcDataSource = null; - // Read properties - Properties props = new Properties(); - - File file = null; - URL propURL = null; - String propDir = System.getenv(SDNC_CONFIG_DIR); - if ((propDir == null) || (propDir.length() == 0)) { - propDir = "/opt/sdnc/data/properties"; - } - file = new File(propDir + DBLIB_PROP_PATH); - if(file.exists()) { - propURL = file.toURI().toURL(); - LOG.info("Using property file (1): " + file.toString()); - } else { - propURL = ctx.getBundle().getResource("dblib.properties"); - URL tmp = null; - if (propURL == null) { - file = new File(DBLIB_PROP_PATH); - tmp = this.getClass().getResource(DBLIB_PROP_PATH); -// if(!file.exists()) { - if(tmp == null) { - throw new DblibConfigurationException("Missing configuration properties resource(3) : " + DBLIB_PROP_PATH); - } else { - propURL = tmp; //file.toURI().toURL(); - LOG.info("Using property file (4): " + file.toString()); - } - } else { - LOG.info("Using property file (2): " + propURL.toString()); - } - } - - - try { - props.load(propURL.openStream()); - } catch (Exception e) { - throw new DblibConfigurationException("Could not load properties at URL " + propURL.toString(), e); - - } - - - - try { - jdbcDataSource = DBResourceManager.create(props); - } catch (Exception exc) { - throw new DblibConfigurationException("Could not get initialize database", exc); - } - - String regName = jdbcDataSource.getClass().getName(); - - LOG.info("Registering DBResourceManager service "+regName); - registration = ctx.registerService(new String[] { regName, DbLibService.class.getName(), "javax.sql.DataSource" }, jdbcDataSource, null); - } - - @Override - public void stop(BundleContext ctx) throws Exception { - LOG.info("entering DBLIBResourceActivator.stop"); - if (registration != null) - { - try { - ServiceReference sref = ctx.getServiceReference(DbLibService.class.getName()); - - if (sref == null) { - LOG.warn("Could not find service reference for DBLIB service (" + DbLibService.class.getName() + ")"); - } else { - DBResourceManager dblibSvc = (DBResourceManager) ctx.getService(sref); - if (dblibSvc == null) { - LOG.warn("Could not find service reference for DBLIB service (" + DbLibService.class.getName() + ")"); - } else { - dblibSvc.cleanUp(); - } - } - } catch(Throwable exc) { - LOG.warn("Cleanup", exc); - } - - registration.unregister(); - registration = null; - LOG.debug("Deregistering DBResourceManager service"); - } - } - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLibConnection.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLibConnection.java deleted file mode 100644 index 5c1f51040..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLibConnection.java +++ /dev/null @@ -1,390 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.sql.Array; -import java.sql.Blob; -import java.sql.CallableStatement; -import java.sql.Clob; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.NClob; -import java.sql.PreparedStatement; -import java.sql.SQLClientInfoException; -import java.sql.SQLException; -import java.sql.SQLWarning; -import java.sql.SQLXML; -import java.sql.Savepoint; -import java.sql.Statement; -import java.sql.Struct; -import java.util.ArrayList; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.Executor; - -import javax.sql.rowset.CachedRowSet; - -import org.apache.tomcat.jdbc.pool.PooledConnection; -import org.apache.tomcat.jdbc.pool.ProxyConnection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DBLibConnection implements Connection { - - private static Logger LOGGER = LoggerFactory.getLogger(DBLibConnection.class); - - private final Connection connection; - private final CachedDataSource dataSource; - private boolean locked = false; - private String tableName = null; - - public DBLibConnection(Connection con, CachedDataSource dataSource){ - this.connection = con; - this.dataSource = dataSource; - locked = false; - dataSource.getPoolInfo(true); - } - - public boolean lockTable(String tablename) { - this.tableName = tablename; - return locked = dataSource.lockTable(connection, tableName); - } - - public void resetInactivityTimer() { - Class iface = PooledConnection.class; - try { - PooledConnection pc = connection.unwrap(iface); - pc.setTimestamp(System.currentTimeMillis()); - } catch (SQLException e) { - LOGGER.warn("Failed resetting timeout timer", e); - } - } - - public boolean unlock() { - dataSource.unlockTable(connection); - return locked = false; - } - - public boolean writeData(String statement, ArrayList arguments) throws SQLException, Throwable - { - ArrayList newList=new ArrayList(); - if(arguments != null && !arguments.isEmpty()) { - newList.addAll(arguments); - } - resetInactivityTimer(); - return dataSource.executeUpdatePreparedStatement(connection, statement, newList, false); - } - - public CachedRowSet getData(String statement, ArrayList arguments) throws SQLException, Throwable - { - ArrayList newList=new ArrayList(); - if(arguments != null && !arguments.isEmpty()) { - newList.addAll(arguments); - } - resetInactivityTimer(); - return dataSource.executePreparedStatement(connection, statement, newList, false); - } - - @Override - public T unwrap(Class iface) throws SQLException { - return connection.unwrap(iface); - } - - @Override - public boolean isWrapperFor(Class iface) throws SQLException { - return connection.isWrapperFor(iface); - } - - @Override - public Statement createStatement() throws SQLException { - return connection.createStatement(); - } - - @Override - public PreparedStatement prepareStatement(String sql) throws SQLException { - return connection.prepareStatement(sql); - } - - @Override - public CallableStatement prepareCall(String sql) throws SQLException { - return connection.prepareCall(sql); - } - - @Override - public String nativeSQL(String sql) throws SQLException { - return connection.nativeSQL(sql); - } - - @Override - public void setAutoCommit(boolean autoCommit) throws SQLException { - connection.setAutoCommit(autoCommit); - } - - @Override - public boolean getAutoCommit() throws SQLException { - return connection.getAutoCommit(); - } - - @Override - public void commit() throws SQLException { - connection.commit(); - } - - @Override - public void rollback() throws SQLException { - connection.rollback(); - } - - @Override - public void close() throws SQLException { - if(this.locked) { - try { - this.unlock(); - } catch(Throwable th) { - LOGGER.error("Failed unlocking",th); - } - } - if(connection != null && !connection.isClosed()) { - connection.close(); - } - dataSource.getPoolInfo(false); - } - - @Override - public boolean isClosed() throws SQLException { - return connection.isClosed(); - } - - @Override - public DatabaseMetaData getMetaData() throws SQLException { - return connection.getMetaData(); - } - - @Override - public void setReadOnly(boolean readOnly) throws SQLException { - connection.setReadOnly(readOnly); - } - - @Override - public boolean isReadOnly() throws SQLException { - return connection.isReadOnly(); - } - - @Override - public void setCatalog(String catalog) throws SQLException { - connection.setCatalog(catalog); - } - - @Override - public String getCatalog() throws SQLException { - return connection.getCatalog(); - } - - @Override - public void setTransactionIsolation(int level) throws SQLException { - connection.setTransactionIsolation(level); - } - - @Override - public int getTransactionIsolation() throws SQLException { - return connection.getTransactionIsolation(); - } - - @Override - public SQLWarning getWarnings() throws SQLException { - return connection.getWarnings(); - } - - @Override - public void clearWarnings() throws SQLException { - connection.clearWarnings(); - } - - @Override - public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { - return connection.createStatement(resultSetType, resultSetConcurrency); - } - - @Override - public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) - throws SQLException { - return connection.prepareStatement(sql, resultSetType, resultSetConcurrency); - } - - @Override - public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { - return connection.prepareCall(sql, resultSetType, resultSetConcurrency); - } - - @Override - public Map> getTypeMap() throws SQLException { - return connection.getTypeMap(); - } - - @Override - public void setTypeMap(Map> map) throws SQLException { - connection.setTypeMap(map); - } - - @Override - public void setHoldability(int holdability) throws SQLException { - connection.setHoldability(holdability); - } - - @Override - public int getHoldability() throws SQLException { - return connection.getHoldability(); - } - - @Override - public Savepoint setSavepoint() throws SQLException { - return connection.setSavepoint(); - } - - @Override - public Savepoint setSavepoint(String name) throws SQLException { - return connection.setSavepoint(name); - } - - @Override - public void rollback(Savepoint savepoint) throws SQLException { - connection.rollback(savepoint); - } - - @Override - public void releaseSavepoint(Savepoint savepoint) throws SQLException { - connection.releaseSavepoint(savepoint); - } - - @Override - public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) - throws SQLException { - return connection.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); - } - - @Override - public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, - int resultSetHoldability) throws SQLException { - return connection.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); - } - - @Override - public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, - int resultSetHoldability) throws SQLException { - return connection.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); - } - - @Override - public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { - return connection.prepareStatement(sql, autoGeneratedKeys); - } - - @Override - public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { - return connection.prepareStatement(sql, columnIndexes); - } - - @Override - public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { - return connection.prepareStatement(sql, columnNames); - } - - @Override - public Clob createClob() throws SQLException { - return connection.createClob(); - } - - @Override - public Blob createBlob() throws SQLException { - return connection.createBlob(); - } - - @Override - public NClob createNClob() throws SQLException { - return connection.createNClob(); - } - - @Override - public SQLXML createSQLXML() throws SQLException { - return connection.createSQLXML(); - } - - @Override - public boolean isValid(int timeout) throws SQLException { - return connection.isValid(timeout); - } - - @Override - public void setClientInfo(String name, String value) throws SQLClientInfoException { - connection.setClientInfo(name, value); - } - - @Override - public void setClientInfo(Properties properties) throws SQLClientInfoException { - connection.setClientInfo(properties); - } - - @Override - public String getClientInfo(String name) throws SQLException { - return connection.getClientInfo(name); - } - - @Override - public Properties getClientInfo() throws SQLException { - return connection.getClientInfo(); - } - - @Override - public Array createArrayOf(String typeName, Object[] elements) throws SQLException { - return connection.createArrayOf(typeName, elements); - } - - @Override - public Struct createStruct(String typeName, Object[] attributes) throws SQLException { - return connection.createStruct(typeName, attributes); - } - - @Override - public void setSchema(String schema) throws SQLException { - connection.setSchema(schema); - } - - @Override - public String getSchema() throws SQLException { - return connection.getSchema(); - } - - @Override - public void abort(Executor executor) throws SQLException { - connection.abort(executor); - } - - @Override - public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { - connection.setNetworkTimeout(executor, milliseconds); - } - - @Override - public int getNetworkTimeout() throws SQLException { - return connection.getNetworkTimeout(); - } - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLibException.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLibException.java deleted file mode 100644 index cc80741dc..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBLibException.java +++ /dev/null @@ -1,39 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.sql.SQLException; - -/** - * An exception time for handling DBLIB specific error handling. - */ -public class DBLibException extends SQLException { - - /** - * - */ - private static final long serialVersionUID = -5345059355083984696L; - - public DBLibException(String message){ - super(message); - } - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBResourceManager.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBResourceManager.java deleted file mode 100644 index 5cf2953b7..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBResourceManager.java +++ /dev/null @@ -1,862 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.io.PrintWriter; -import java.sql.Connection; -import java.sql.SQLDataException; -import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; -import java.sql.SQLIntegrityConstraintViolationException; -import java.sql.SQLSyntaxErrorException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.Observable; -import java.util.PriorityQueue; -import java.util.Properties; -import java.util.Queue; -import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.sql.DataSource; -import javax.sql.rowset.CachedRowSet; - -import org.apache.tomcat.jdbc.pool.PoolExhaustedException; -import org.openecomp.sdnc.sli.resource.dblib.config.DbConfigPool; -import org.openecomp.sdnc.sli.resource.dblib.factory.AbstractDBResourceManagerFactory; -import org.openecomp.sdnc.sli.resource.dblib.factory.AbstractResourceManagerFactory; -import org.openecomp.sdnc.sli.resource.dblib.factory.DBConfigFactory; -import org.openecomp.sdnc.sli.resource.dblib.pm.PollingWorker; -import org.openecomp.sdnc.sli.resource.dblib.pm.SQLExecutionMonitor; -import com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * @version $Revision: 1.15 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ -public class DBResourceManager implements DataSource, DataAccessor, DBResourceObserver, DbLibService { - private static Logger LOGGER = LoggerFactory.getLogger(DBResourceManager.class); - - transient boolean terminating = false; - transient protected long retryInterval = 10000L; - transient boolean recoveryMode = true; - - protected final AtomicBoolean dsSelector = new AtomicBoolean(); - -// Queue dsQueue = new ConcurrentLinkedQueue(); - Queue dsQueue = new PriorityQueue(4, new Comparator(){ - - @Override - public int compare(CachedDataSource left, CachedDataSource right) { - try { - if(!left.isSlave()) - return -1; - if(!right.isSlave()) - return 1; - - } catch (Throwable e) { - LOGGER.warn("", e); - } - return 0; - } - - }); - protected final Set broken = Collections.synchronizedSet(new HashSet()); - protected final Object monitor = new Object(); - protected final Properties configProps; - protected final Thread worker; - - protected final long terminationTimeOut; - protected final boolean monitorDbResponse; - protected final long monitoringInterval; - protected final long monitoringInitialDelay; - protected final long expectedCompletionTime; - protected final long unprocessedFailoverThreshold; - - public DBResourceManager(Properties props){ - this.configProps = props; - - // get retry interval value - retryInterval = getLongFromProperties(props, "org.openecomp.dblib.connection.retry", 10000L); - - // get recovery mode flag - recoveryMode = getBooleanFromProperties(props, "org.openecomp.dblib.connection.recovery", true); - if(!recoveryMode) - { - recoveryMode = false; - LOGGER.info("Recovery Mode disabled"); - } - // get time out value for thread cleanup - terminationTimeOut = getLongFromProperties(props, "org.openecomp.dblib.termination.timeout", 300000L); - // get properties for monitoring - monitorDbResponse = getBooleanFromProperties(props, "org.openecomp.dblib.connection.monitor", false); - monitoringInterval = getLongFromProperties(props, "org.openecomp.dblib.connection.monitor.interval", 1000L); - monitoringInitialDelay = getLongFromProperties(props, "org.openecomp.dblib.connection.monitor.startdelay", 5000L); - expectedCompletionTime = getLongFromProperties(props, "org.openecomp.dblib.connection.monitor.expectedcompletiontime", 5000L); - unprocessedFailoverThreshold = getLongFromProperties(props, "org.openecomp.dblib.connection.monitor.unprocessedfailoverthreshold", 3L); - - // initialize performance monitor - PollingWorker.createInistance(props); - - // initialize recovery thread - worker = new RecoveryMgr(); - worker.setName("DBResourcemanagerWatchThread"); - worker.setDaemon(true); - worker.start(); - } - - private void config(Properties ctx) throws Exception { - - DbConfigPool dbConfig = DBConfigFactory.createConfig(this.configProps); - - try { - AbstractResourceManagerFactory factory = AbstractDBResourceManagerFactory.getFactory(dbConfig.getType()); - if(LOGGER.isInfoEnabled()){ - LOGGER.info("Default DB config is : " + dbConfig.getType()); - LOGGER.info("Using factory : " + factory.getClass().getName()); - } - CachedDataSource[] cachedDS = factory.initDBResourceManager(dbConfig, this); - if(cachedDS == null || cachedDS.length == 0) { - LOGGER.error("Initialization of CachedDataSources failed. No instance was created."); - throw new Exception("Failed to initialize DB Library. No data source was created."); - } - - for(int i=0; i 1){ - handleGetConnectionException(dataSource, new Exception(data.toString())); - } - } - } - } - } - - public void testForceRecovery() - { - CachedDataSource active = (CachedDataSource) this.dsQueue.peek(); - handleGetConnectionException(active, new Exception("test")); - } - - class RecoveryMgr extends Thread { - - public void run() { - while(!terminating) - { - try { - Thread.sleep(retryInterval); - } catch (InterruptedException e1) { } - CachedDataSource brokenSource = null; - try { - if (!broken.isEmpty()) { - CachedDataSource[] sourceArray = broken.toArray(new CachedDataSource[0]); - for (int i = 0; i < sourceArray.length; i++) - { - brokenSource = sourceArray[i]; - if (brokenSource instanceof TerminatingCachedDataSource) - break; - if (resetConnectionPool(brokenSource)) { - broken.remove(brokenSource); - brokenSource.blockImmediateOffLine(); - dsQueue.add(brokenSource); - LOGGER.info("DataSource <" - + brokenSource.getDbConnectionName() - + "> recovered."); - } - brokenSource = null; - } - } - } catch (Exception exc) { - LOGGER.warn(exc.getMessage()); - if(brokenSource != null){ - try { - if(!broken.contains(brokenSource)) - broken.add(brokenSource); - brokenSource = null; - } catch (Exception e1) { } - } - } - } - LOGGER.info("DBResourceManager.RecoveryMgr <"+this.toString() +"> terminated." ); - } - - private boolean resetConnectionPool(CachedDataSource dataSource){ - try { - return dataSource.testConnection(); - } catch (Exception exc) { - LOGGER.info("DataSource <" + dataSource.getDbConnectionName() + "> resetCache failed with error: "+ exc.getMessage()); - return false; - } - } - } - - /* (non-Javadoc) - * @see org.openecomp.sdnc.sli.resource.dblib.DbLibService#getData(java.lang.String, java.util.ArrayList, java.lang.String) - */ - @Override - public CachedRowSet getData(String statement, ArrayList arguments, String preferredDS) throws SQLException { - ArrayList newList=new ArrayList(); - if(arguments != null && !arguments.isEmpty()) { - newList.addAll(arguments); - } - if(recoveryMode) - return requestDataWithRecovery(statement, newList, preferredDS); - else - return requestDataNoRecovery(statement, newList, preferredDS); - } - - private CachedRowSet requestDataWithRecovery(String statement, ArrayList arguments, String preferredDS) throws SQLException { - Throwable lastException = null; - CachedDataSource active = null; - - // test if there are any connection pools available - LinkedList sources = new LinkedList(this.dsQueue); - if(sources.isEmpty()){ - LOGGER.error("Generated alarm: DBResourceManager.getData - No active DB connection pools are available."); - throw new DBLibException("No active DB connection pools are available in RequestDataWithRecovery call."); - } - if(preferredDS != null && !sources.peek().getDbConnectionName().equals(preferredDS)) { - Collections.reverse(sources); - } - - - // loop through available data sources to retrieve data. - while(!sources.isEmpty()) - { - active = sources.peek(); - - long time = System.currentTimeMillis(); - try { - if(!active.isFabric()) { - CachedDataSource master = findMaster(); - if(master != null) { - active = master; - master = null; - } - } - sources.remove(active); - return active.getData(statement, arguments); - } catch(SQLDataException exc){ - throw exc; - } catch(SQLSyntaxErrorException exc){ - throw exc; - } catch(SQLIntegrityConstraintViolationException exc){ - throw exc; - } catch(Throwable exc){ - lastException = exc; - String message = exc.getMessage(); - if(message == null) { - if(exc.getCause() != null) { - message = exc.getCause().getMessage(); - } - if(message == null) - message = exc.getClass().getName(); - } - LOGGER.error("Generated alarm: "+active.getDbConnectionName()+" - "+message); - handleGetConnectionException(active, exc); - } finally { - if(LOGGER.isDebugEnabled()){ - time = (System.currentTimeMillis() - time); - LOGGER.debug("getData processing time : "+ active.getDbConnectionName()+" "+time+" miliseconds."); - } - } - } - if(lastException instanceof SQLException){ - throw (SQLException)lastException; - } - // repackage the exception - // you are here because either you run out of available data sources - // or the last exception was not of SQLException type. - // repackage the exception - if(lastException == null) { - throw new DBLibException("The operation timed out while waiting to acquire a new connection." ); - } else { - SQLException exception = new DBLibException(lastException.getMessage()); - exception.setStackTrace(lastException.getStackTrace()); - if(lastException.getCause() instanceof SQLException) { - throw (SQLException)lastException.getCause(); - } - throw exception; - } - } - - private CachedRowSet requestDataNoRecovery(String statement, ArrayList arguments, String preferredDS) throws SQLException { - if(dsQueue.isEmpty()){ - LOGGER.error("Generated alarm: DBResourceManager.getData - No active DB connection pools are available."); - throw new DBLibException("No active DB connection pools are available in RequestDataNoRecovery call."); - } - CachedDataSource active = (CachedDataSource) this.dsQueue.peek(); - long time = System.currentTimeMillis(); - try { - if(!active.isFabric()) { - CachedDataSource master = findMaster(); - if(master != null) - active = master; - } - return active.getData(statement, arguments); -// } catch(SQLDataException exc){ -// throw exc; - } catch(Throwable exc){ - String message = exc.getMessage(); - if(message == null) - message = exc.getClass().getName(); - LOGGER.error("Generated alarm: "+active.getDbConnectionName()+" - "+message); - if(exc instanceof SQLException) - throw (SQLException)exc; - else { - DBLibException excptn = new DBLibException(exc.getMessage()); - excptn.setStackTrace(exc.getStackTrace()); - throw excptn; - } - } finally { - if(LOGGER.isDebugEnabled()){ - time = (System.currentTimeMillis() - time); - LOGGER.debug(">> getData : "+ active.getDbConnectionName()+" "+time+" miliseconds."); - } - } - } - - - /* (non-Javadoc) - * @see org.openecomp.sdnc.sli.resource.dblib.DbLibService#writeData(java.lang.String, java.util.ArrayList, java.lang.String) - */ - @Override - public boolean writeData(String statement, ArrayList arguments, String preferredDS) throws SQLException - { - ArrayList newList=new ArrayList(); - if(arguments != null && !arguments.isEmpty()) { - newList.addAll(arguments); - } - - return writeDataNoRecovery(statement, newList, preferredDS); - } - - CachedDataSource findMaster() throws PoolExhaustedException, MySQLNonTransientConnectionException { - CachedDataSource master = null; - CachedDataSource[] dss = this.dsQueue.toArray(new CachedDataSource[0]); - for(int i=0; i arguments, String preferredDS) throws SQLException { - if(dsQueue.isEmpty()){ - LOGGER.error("Generated alarm: DBResourceManager.getData - No active DB connection pools are available."); - throw new DBLibException("No active DB connection pools are available in RequestDataNoRecovery call."); - } - - boolean initialRequest = true; - boolean retryAllowed = true; - CachedDataSource active = (CachedDataSource) this.dsQueue.peek(); - long time = System.currentTimeMillis(); - while(initialRequest) { - initialRequest = false; - try { - if(!active.isFabric()) { - CachedDataSource master = findMaster(); - if(master != null) { - active = master; - } - } - - return active.writeData(statement, arguments); - } catch(Throwable exc){ - String message = exc.getMessage(); - if(message == null) - message = exc.getClass().getName(); - LOGGER.error("Generated alarm: "+active.getDbConnectionName()+" - "+message); - if(exc instanceof SQLException) { - SQLException sqlExc = SQLException.class.cast(exc); - // handle read-only exception - if(sqlExc.getErrorCode() == 1290 && "HY000".equals(sqlExc.getSQLState())) { - LOGGER.warn("retrying due to: " + sqlExc.getMessage()); - dsQueue.remove(active); - dsQueue.add(active); - if(retryAllowed){ - retryAllowed = false; - initialRequest = true; - continue; - } - } - throw (SQLException)exc; - } else { - DBLibException excptn = new DBLibException(exc.getMessage()); - excptn.setStackTrace(exc.getStackTrace()); - throw excptn; - } - } finally { - if(LOGGER.isDebugEnabled()){ - time = (System.currentTimeMillis() - time); - LOGGER.debug("writeData processing time : "+ active.getDbConnectionName()+" "+time+" miliseconds."); - } - } - } - return true; - } - - private void setDataSource(CachedDataSource dataSource) { - if(dataSource.testConnection(true)){ - this.dsQueue.add(dataSource); - } else { - this.broken.add(dataSource); - } - } - - public Connection getConnection() throws SQLException { - Throwable lastException = null; - CachedDataSource active = null; - - if(dsQueue.isEmpty()){ - throw new DBLibException("No active DB connection pools are available in GetConnection call."); - } - - try { - active = dsQueue.peek(); - CachedDataSource tmpActive = findMaster(); - if(tmpActive != null) { - active = tmpActive; - } - return new DBLibConnection(active.getConnection(), active); - } catch(javax.sql.rowset.spi.SyncFactoryException exc){ - LOGGER.debug("Free memory (bytes): " + Runtime.getRuntime().freeMemory()); - LOGGER.warn("CLASSPATH issue. Allowing retry", exc); - lastException = exc; - } catch(PoolExhaustedException exc) { - throw new NoAvailableConnectionsException(exc); - } catch(MySQLNonTransientConnectionException exc){ - throw new NoAvailableConnectionsException(exc); - } catch(Exception exc){ - lastException = exc; - if(recoveryMode){ - handleGetConnectionException(active, exc); - } else { - if(exc instanceof MySQLNonTransientConnectionException) { - throw new NoAvailableConnectionsException(exc); - } if(exc instanceof SQLException) { - throw (SQLException)exc; - } else { - DBLibException excptn = new DBLibException(exc.getMessage()); - excptn.setStackTrace(exc.getStackTrace()); - throw excptn; - } - } - } catch (Throwable trwb) { - DBLibException excptn = new DBLibException(trwb.getMessage()); - excptn.setStackTrace(trwb.getStackTrace()); - throw excptn; - } finally { - if(LOGGER.isDebugEnabled()){ - displayState(); - } - } - - if(lastException instanceof SQLException){ - throw (SQLException)lastException; - } - // repackage the exception - if(lastException == null) { - throw new DBLibException("The operation timed out while waiting to acquire a new connection." ); - } else { - SQLException exception = new DBLibException(lastException.getMessage()); - exception.setStackTrace(lastException.getStackTrace()); - if(lastException.getCause() instanceof SQLException) { -// exception.setNextException((SQLException)lastException.getCause()); - throw (SQLException)lastException.getCause(); - } - throw exception; - } - } - - public Connection getConnection(String username, String password) - throws SQLException { - CachedDataSource active = null; - - if(dsQueue.isEmpty()){ - throw new DBLibException("No active DB connection pools are available in GetConnection call."); - } - - - try { - active = dsQueue.peek(); - CachedDataSource tmpActive = findMaster(); - if(tmpActive != null) { - active = tmpActive; - } - return active.getConnection(username, password); - } catch(Throwable exc){ - if(recoveryMode){ - handleGetConnectionException(active, exc); - } else { - if(exc instanceof SQLException) - throw (SQLException)exc; - else { - DBLibException excptn = new DBLibException(exc.getMessage()); - excptn.setStackTrace(exc.getStackTrace()); - throw excptn; - } - } - - } - - throw new DBLibException("No connections available in DBResourceManager in GetConnection call."); - } - - private void handleGetConnectionException(CachedDataSource source, Throwable exc) { - try { - if(!source.canTakeOffLine()) - { - LOGGER.error("Could not switch due to blocking"); - return; - } - - boolean removed = dsQueue.remove(source); - if(!broken.contains(source)) - { - if(broken.add(source)) - { - LOGGER.warn("DB Recovery: DataSource <" + source.getDbConnectionName() + "> put in the recovery mode. Reason : " + exc.getMessage()); - } else { - LOGGER.warn("Error putting DataSource <" +source.getDbConnectionName()+ "> in recovery mode."); - } - } else { - LOGGER.info("DB Recovery: DataSource <" + source.getDbConnectionName() + "> already in recovery queue"); - } - if(removed) - { - if(!dsQueue.isEmpty()) - { - LOGGER.warn("DB DataSource <" + dsQueue.peek().getDbConnectionName() + "> became active"); - } - } - } catch (Exception e) { - LOGGER.error("", e); - } - } - - public void cleanUp() { - for(Iterator it=dsQueue.iterator();it.hasNext();){ - CachedDataSource cds = (CachedDataSource)it.next(); - it.remove(); - cds.cleanUp(); - } - - try { - this.terminating = true; - if(broken != null) - { - try { - broken.add( new TerminatingCachedDataSource(null)); - } catch(Exception exc){ - LOGGER.error("Waiting for Worker to stop", exc); - } - } - worker.join(terminationTimeOut); - LOGGER.info("DBResourceManager.RecoveryMgr <"+worker.toString() +"> termination was successful: " + worker.getState()); - } catch(Exception exc){ - LOGGER.error("Waiting for Worker thread to terminate ", exc); - } - } - - public static DBResourceManager create(Properties props) throws Exception { - DBResourceManager dbmanager = new DBResourceManager(props); - dbmanager.config(props); - return dbmanager; - } - - public PrintWriter getLogWriter() throws SQLException { - return ((CachedDataSource)this.dsQueue.peek()).getLogWriter(); - } - - public int getLoginTimeout() throws SQLException { - return ((CachedDataSource)this.dsQueue.peek()).getLoginTimeout(); - } - - public void setLogWriter(PrintWriter out) throws SQLException { - ((CachedDataSource)this.dsQueue.peek()).setLogWriter(out); - } - - public void setLoginTimeout(int seconds) throws SQLException { - ((CachedDataSource)this.dsQueue.peek()).setLoginTimeout(seconds); - } - - public void displayState(){ - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("POOLS : Active = "+dsQueue.size() + ";\t Broken = "+broken.size()); - CachedDataSource current = (CachedDataSource)dsQueue.peek(); - if(current != null) { - LOGGER.debug("POOL : Active name = \'"+current.getDbConnectionName()+ "\'"); - } - } - } - - /* (non-Javadoc) - * @see org.openecomp.sdnc.sli.resource.dblib.DbLibService#isActive() - */ - @Override - public boolean isActive() { - return this.dsQueue.size()>0; - } - - public String getActiveStatus(){ - return "Connected: " + dsQueue.size()+"\tIn-recovery: "+broken.size(); - } - - public String getDBStatus(boolean htmlFormat) { - StringBuilder buffer = new StringBuilder(); - - ArrayList list = new ArrayList(); - list.addAll(dsQueue); - list.addAll(broken); - if (htmlFormat) - { - buffer.append("") - .append("Name:").append(""); - for (int i = 0; i < list.size(); i++) { - buffer.append(""); - buffer.append(((CachedDataSource) list.get(i)).getDbConnectionName()).append(""); - } - buffer.append(""); - - buffer.append("State:"); - for (int i = 0; i < list.size(); i++) { - if (broken.contains(list.get(i))) { - buffer.append("in recovery"); - } - if (dsQueue.contains(list.get(i))) { - if (dsQueue.peek() == list.get(i)) - buffer.append("active"); - else - buffer.append("standby"); - } - } - buffer.append(""); - - } else { - for (int i = 0; i < list.size(); i++) { - buffer.append("Name: ").append(((CachedDataSource) list.get(i)).getDbConnectionName()); - buffer.append("\tState: "); - if (broken.contains(list.get(i))) { - buffer.append("in recovery"); - } else - if (dsQueue.contains(list.get(i))) { - if (dsQueue.peek() == list.get(i)) - buffer.append("active"); - else - buffer.append("standby"); - } - - buffer.append("\n"); - - } - } - return buffer.toString(); - } - - public boolean isWrapperFor(Class iface) throws SQLException { - return false; - } - - public T unwrap(Class iface) throws SQLException { - return null; - } - - /** - * @return the monitorDbResponse - */ - public final boolean isMonitorDbResponse() { - return recoveryMode && monitorDbResponse; - } - - public void test(){ - CachedDataSource obj = dsQueue.peek(); - Exception ption = new Exception(); - try { - for(int i=0; i<5; i++) - { - handleGetConnectionException(obj, ption); - } - } catch(Throwable exc){ - LOGGER.warn("", exc); - } - } - - public String getPreferredDSName(){ - if(isActive()){ - return getPreferredDataSourceName(dsSelector); - } - return ""; - } - - public String getPreferredDataSourceName(AtomicBoolean flipper) { - - LinkedList snapshot = new LinkedList(dsQueue); - if(snapshot.size() > 1){ - CachedDataSource first = snapshot.getFirst(); - CachedDataSource last = snapshot.getLast(); - - int delta = first.getMonitor().getPorcessedConnectionsCount() - last.getMonitor().getPorcessedConnectionsCount(); - if(delta < 0) { - flipper.set(false); - } else if(delta > 0) { - flipper.set(true); - } else { - // check the last value and return !last - flipper.getAndSet(!flipper.get()); - } - - if (flipper.get()) - Collections.reverse(snapshot); - } - return snapshot.peek().getDbConnectionName(); - } - - public java.util.logging.Logger getParentLogger() - throws SQLFeatureNotSupportedException { - return null; - } - - public String getMasterName() { - if(isActive()){ - return getMasterDataSourceName(dsSelector); - } - return ""; - } - - - private String getMasterDataSourceName(AtomicBoolean flipper) { - - LinkedList snapshot = new LinkedList(dsQueue); - if(snapshot.size() > 1){ - CachedDataSource first = snapshot.getFirst(); - CachedDataSource last = snapshot.getLast(); - - int delta = first.getMonitor().getPorcessedConnectionsCount() - last.getMonitor().getPorcessedConnectionsCount(); - if(delta < 0) { - flipper.set(false); - } else if(delta > 0) { - flipper.set(true); - } else { - // check the last value and return !last - flipper.getAndSet(!flipper.get()); - } - - if (flipper.get()) - Collections.reverse(snapshot); - } - return snapshot.peek().getDbConnectionName(); - } - - class RemindTask extends TimerTask { - public void run() { - CachedDataSource ds = dsQueue.peek(); - if(ds != null) - ds.getPoolInfo(false); - } - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBResourceObserver.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBResourceObserver.java deleted file mode 100644 index e06779f35..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DBResourceObserver.java +++ /dev/null @@ -1,27 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.util.Observer; - -public interface DBResourceObserver extends Observer { - public boolean isMonitorDbResponse(); -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DataAccessor.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DataAccessor.java deleted file mode 100644 index cd054a51d..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DataAccessor.java +++ /dev/null @@ -1,33 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.sql.SQLException; -import java.util.ArrayList; - -import javax.sql.rowset.CachedRowSet; - -public interface DataAccessor { - - public abstract CachedRowSet getData(String statement, ArrayList arguments, String preferredDS) - throws SQLException; - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DataSourceComparator.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DataSourceComparator.java deleted file mode 100644 index 37d625136..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DataSourceComparator.java +++ /dev/null @@ -1,33 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.util.Comparator; - -public interface DataSourceComparator extends Comparator { - - public abstract CachedDataSource getLastUsed(); - - public abstract void setLastUsed(CachedDataSource lastUsed); - - public abstract int compare(CachedDataSource ds1, CachedDataSource ds2); - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DbLibService.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DbLibService.java deleted file mode 100644 index 25edd1f07..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DbLibService.java +++ /dev/null @@ -1,46 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.sql.SQLException; -import java.util.ArrayList; - -import javax.sql.rowset.CachedRowSet; - -public interface DbLibService { - - /* (non-Javadoc) - * @see DataAccessor#getData(java.lang.String, java.util.ArrayList) - */ - public abstract CachedRowSet getData(String statement, - ArrayList arguments, String preferredDS) - throws SQLException; - - /* (non-Javadoc) - * @see DataAccessor#writeData(java.lang.String, java.util.ArrayList) - */ - public abstract boolean writeData(String statement, - ArrayList arguments, String preferredDS) - throws SQLException; - - public abstract boolean isActive(); - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DblibConfigurationException.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DblibConfigurationException.java deleted file mode 100644 index 17700a5ee..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/DblibConfigurationException.java +++ /dev/null @@ -1,45 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - - -public class DblibConfigurationException extends Exception { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DblibConfigurationException() - { - super(); - } - - public DblibConfigurationException(String msg) - { - super(msg); - } - - public DblibConfigurationException(String msg, Throwable t) - { - super(msg, t); - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/NoAvailableConnectionsException.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/NoAvailableConnectionsException.java deleted file mode 100644 index 16895b4d5..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/NoAvailableConnectionsException.java +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.sql.SQLException; - -public class NoAvailableConnectionsException extends SQLException { - - /** - * - */ - private static final long serialVersionUID = -6259205931674413018L; - - public NoAvailableConnectionsException(Exception exc) { - super(exc); - } - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/TerminatingCachedDataSource.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/TerminatingCachedDataSource.java deleted file mode 100644 index 234bbed0c..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/TerminatingCachedDataSource.java +++ /dev/null @@ -1,82 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib; - -import java.sql.SQLFeatureNotSupportedException; -import java.util.logging.Logger; - -import org.openecomp.sdnc.sli.resource.dblib.config.BaseDBConfiguration; -import org.openecomp.sdnc.sli.resource.dblib.pm.SQLExecutionMonitorObserver; - - -public class TerminatingCachedDataSource extends CachedDataSource implements SQLExecutionMonitorObserver { - - public TerminatingCachedDataSource(BaseDBConfiguration jdbcElem) throws DBConfigException { - super(jdbcElem); - } - - protected void configure(BaseDBConfiguration jdbcElem) throws DBConfigException { - // no action - } - - public long getInterval() { - return 1000; - } - - public long getInitialDelay() { - return 1000; - } - - public long getExpectedCompletionTime() { - return 50; - } - - public void setExpectedCompletionTime(long value) { - - } - - public void setInterval(long value) { - - } - - public void setInitialDelay(long value) { - - } - - public long getUnprocessedFailoverThreshold() { - return 3; - } - - public void setUnprocessedFailoverThreshold(long value) { - - } - - public int compareTo(CachedDataSource ods) - { - return 0; - } - - public Logger getParentLogger() throws SQLFeatureNotSupportedException { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/BaseDBConfiguration.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/BaseDBConfiguration.java deleted file mode 100644 index 976b1cf2d..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/BaseDBConfiguration.java +++ /dev/null @@ -1,104 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.config; - -import java.util.Properties; - -public abstract class BaseDBConfiguration { - public static final String DATABASE_TYPE = "org.openecomp.sdnc.sli.dbtype"; - public static final String DATABASE_URL = "org.openecomp.sdnc.sli.jdbc.url"; - public static final String DATABASE_NAME = "org.openecomp.sdnc.sli.jdbc.database"; - public static final String CONNECTION_NAME = "org.openecomp.sdnc.sli.jdbc.connection.name"; - public static final String DATABASE_USER = "org.openecomp.sdnc.sli.jdbc.user"; - public static final String DATABASE_PSSWD = "org.openecomp.sdnc.sli.jdbc.password"; - public static final String CONNECTION_TIMEOUT="org.openecomp.sdnc.sli.jdbc.connection.timeout"; - public static final String REQUEST_TIMEOUT = "org.openecomp.sdnc.sli.jdbc.request.timeout"; - public static final String MIN_LIMIT = "org.openecomp.sdnc.sli.jdbc.limit.min"; - public static final String MAX_LIMIT = "org.openecomp.sdnc.sli.jdbc.limit.max"; - public static final String INIT_LIMIT = "org.openecomp.sdnc.sli.jdbc.limit.init"; - public static final String DATABASE_HOSTS = "org.openecomp.sdnc.sli.jdbc.hosts"; - - - protected final Properties props; - - public BaseDBConfiguration(Properties properties) { - this.props = properties; - } - - public int getConnTimeout() { - try { - String value = props.getProperty(CONNECTION_TIMEOUT); - return Integer.parseInt(value); - } catch(Exception exc) { - return -1; - } - } - - public int getRequestTimeout() { - try { - String value = props.getProperty(REQUEST_TIMEOUT); - if(value == null) - return -1; - return Integer.parseInt(value); - } catch(Exception exc) { - return -1; - } - } - - public String getDbConnectionName() { - return props.getProperty(CONNECTION_NAME); - } - - public String getDatabaseName() { - return props.getProperty(DATABASE_NAME); - } - - public String getDbUserId() { - return props.getProperty(DATABASE_USER); - } - - public String getDbPasswd() { - return props.getProperty(DATABASE_PSSWD); - } - - public int getDbMinLimit() { - String value = props.getProperty(MIN_LIMIT); - return Integer.parseInt(value); - } - - public int getDbMaxLimit() { - String value = props.getProperty(MAX_LIMIT); - return Integer.parseInt(value); - } - - public int getDbInitialLimit() { - String value = props.getProperty(INIT_LIMIT); - return Integer.parseInt(value); - } - - public String getDbUrl() { - return props.getProperty(DATABASE_URL); - } - - public String getServerGroup() { - return null; - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/DbConfigPool.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/DbConfigPool.java deleted file mode 100644 index 117f9321d..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/DbConfigPool.java +++ /dev/null @@ -1,56 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.config; - -import java.util.ArrayList; -import java.util.Properties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DbConfigPool { - private static Logger LOGGER = LoggerFactory.getLogger(DbConfigPool.class); - - private final String type; - - private ArrayList configurations = new ArrayList(); - - public DbConfigPool(Properties properties) { - LOGGER.debug("Initializing DbConfigType"); - type = properties.getProperty(BaseDBConfiguration.DATABASE_TYPE, "JDBC").toUpperCase(); - } - - public int getTimeout() { - // TODO Auto-generated method stub - return 0; - } - - public String getType() { - return type; - } - - public JDBCConfiguration[] getJDBCbSourceArray() { - return configurations.toArray(new JDBCConfiguration[configurations.size()]); - } - - public void addConfiguration(BaseDBConfiguration config) { - configurations.add(config); - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/JDBCConfiguration.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/JDBCConfiguration.java deleted file mode 100644 index cb6ea3e5c..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/config/JDBCConfiguration.java +++ /dev/null @@ -1,31 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.config; - -import java.util.Properties; - -public class JDBCConfiguration extends BaseDBConfiguration { - - public JDBCConfiguration(Properties xmlElem) { - super(xmlElem); - } - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/AbstractDBResourceManagerFactory.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/AbstractDBResourceManagerFactory.java deleted file mode 100644 index f4291a7dd..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/AbstractDBResourceManagerFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.factory; - -import org.openecomp.sdnc.sli.resource.dblib.jdbc.JdbcDbResourceManagerFactory; - -/** - * @version $Revision: 1.1 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ -public class AbstractDBResourceManagerFactory { - - public static AbstractResourceManagerFactory getFactory(String type) throws FactoryNotDefinedException { - - // JDBC - return JdbcDbResourceManagerFactory.createIntstance(); - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/AbstractResourceManagerFactory.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/AbstractResourceManagerFactory.java deleted file mode 100644 index 0f58a3f03..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/AbstractResourceManagerFactory.java +++ /dev/null @@ -1,104 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.factory; - - -import java.sql.SQLException; -import java.util.Set; -import java.util.concurrent.Callable; - -import org.openecomp.sdnc.sli.resource.dblib.CachedDataSource; -import org.openecomp.sdnc.sli.resource.dblib.CachedDataSourceFactory; -import org.openecomp.sdnc.sli.resource.dblib.DBConfigException; -import org.openecomp.sdnc.sli.resource.dblib.DBResourceManager; -import org.openecomp.sdnc.sli.resource.dblib.config.BaseDBConfiguration; -import org.openecomp.sdnc.sli.resource.dblib.config.DbConfigPool; -import org.openecomp.sdnc.sli.resource.dblib.config.JDBCConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @version $Revision: 1.6 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ -public abstract class AbstractResourceManagerFactory { - private static Logger LOGGER = LoggerFactory.getLogger(AbstractResourceManagerFactory.class); - - public abstract CachedDataSource[] initDBResourceManager(DbConfigPool dbConfig, DBResourceManager manager) throws Exception; - public abstract CachedDataSource[] initDBResourceManager(DbConfigPool dbConfig, DBResourceManager dbResourceManager, String sourceName) throws SQLException ; - - - public static AbstractResourceManagerFactory createIntstance() throws FactoryNotDefinedException { - throw new FactoryNotDefinedException("Factory method 'createIntstance' needs to be overriden in DBResourceManagerFactory"); - } - - public class DBInitTask implements Callable - { - private BaseDBConfiguration config = null; - private Set activeTasks; - - public DBInitTask(JDBCConfiguration jdbcconfig, Set tasks) { - this.config = jdbcconfig; - this.activeTasks = tasks; - } - - public CachedDataSource call() throws Exception { - CachedDataSource ds = null; - try { - ds = CachedDataSourceFactory.createDataSource(config); - return ds; - } finally { - synchronized(activeTasks) { - activeTasks.remove(this); - if (activeTasks.isEmpty()) { - final Runnable closure = new Runnable() { - - public void run() { - try { - Thread.sleep(300); - } catch (Exception e) { - } - synchronized(activeTasks) { - activeTasks.notifyAll(); - } - } - }; - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Completed CachedDataSource.Call and notifyAll from " + ds.getDbConnectionName()); - } - Thread worker = new Thread(closure); - worker.setDaemon(true); - worker.start(); - } else { - if (LOGGER.isDebugEnabled()) { - if (ds != null) { - LOGGER.debug("Completed CachedDataSource.Call from " + ds.getDbConnectionName()); - } - } - } - } - } - } - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/DBConfigFactory.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/DBConfigFactory.java deleted file mode 100644 index 8aadcae6b..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/DBConfigFactory.java +++ /dev/null @@ -1,100 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.factory; - - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Properties; - -import org.slf4j.LoggerFactory; - -import org.openecomp.sdnc.sli.resource.dblib.config.BaseDBConfiguration; -import org.openecomp.sdnc.sli.resource.dblib.config.DbConfigPool; -import org.openecomp.sdnc.sli.resource.dblib.config.JDBCConfiguration; - -/** - * @version $Revision: 1.1 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki 01/17/08 Initial version - */ -public class DBConfigFactory { - - public static DbConfigPool createConfig(Properties resource) { - return getConfigparams(resource); - } - - static DbConfigPool getConfigparams(Properties properties){ - DbConfigPool xmlConfig = new DbConfigPool(properties); - ArrayList propertySets = new ArrayList(); - - if("JDBC".equalsIgnoreCase(xmlConfig.getType())) { - String hosts = properties.getProperty(BaseDBConfiguration.DATABASE_HOSTS); - if(hosts == null || hosts.isEmpty()) { - propertySets.add(properties); - } else { - String[] newhost = hosts.split(","); - for(int i=0; i< newhost.length; i++) { - Properties localset = new Properties(); - localset.putAll(properties); - String url = localset.getProperty(BaseDBConfiguration.DATABASE_URL); - if(url.contains("DBHOST")) - url = url.replace("DBHOST", newhost[i]); - if(url.contains("dbhost")) - url = url.replace("dbhost", newhost[i]); - localset.setProperty(BaseDBConfiguration.DATABASE_URL, url); - localset.setProperty(BaseDBConfiguration.CONNECTION_NAME, newhost[i]); - propertySets.add(localset); - } - } - } else { - propertySets.add(properties); - } - try { - Iterator it = propertySets.iterator(); - while(it.hasNext()) { - BaseDBConfiguration config = parse(it.next()); - xmlConfig.addConfiguration(config); - } - - } catch (Exception e) { - LoggerFactory.getLogger(DBConfigFactory.class).warn("",e); - } - - return xmlConfig; - } - - public static BaseDBConfiguration parse(Properties props) throws Exception { - - String type = props.getProperty(BaseDBConfiguration.DATABASE_TYPE); - - BaseDBConfiguration config = null; - - if("JDBC".equalsIgnoreCase(type)) { - config = new JDBCConfiguration(props); - } - - return config; - - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/FactoryNotDefinedException.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/FactoryNotDefinedException.java deleted file mode 100644 index e38cd3519..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/factory/FactoryNotDefinedException.java +++ /dev/null @@ -1,37 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.factory; - - -/** - * @version 1.3 - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki 01/16/08 Initial version - */ -public class FactoryNotDefinedException extends Exception { - - public FactoryNotDefinedException(String message) { - super(message); - } - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/jdbc/JdbcDBCachedDataSource.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/jdbc/JdbcDBCachedDataSource.java deleted file mode 100644 index 90c76f637..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/jdbc/JdbcDBCachedDataSource.java +++ /dev/null @@ -1,249 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.jdbc; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLFeatureNotSupportedException; - -import org.apache.tomcat.jdbc.pool.DataSource; -import org.apache.tomcat.jdbc.pool.PoolProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.openecomp.sdnc.sli.resource.dblib.CachedDataSource; -import org.openecomp.sdnc.sli.resource.dblib.DBConfigException; -import org.openecomp.sdnc.sli.resource.dblib.config.BaseDBConfiguration; -import org.openecomp.sdnc.sli.resource.dblib.config.JDBCConfiguration; -import com.mysql.jdbc.Driver; - - -/** - * @version $Revision: 1.7 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ - -public class JdbcDBCachedDataSource extends CachedDataSource -{ - private String dbUserId; - private String dbPasswd; - private String dbUrl; - - private int minLimit; - private int maxLimit; - private int initialLimit; - - private static final String AS_CONF_ERROR = "AS_CONF_ERROR: "; - - private static Logger LOGGER = LoggerFactory.getLogger(JdbcDBCachedDataSource.class); - - /** - * @param jdbcElem - */ - public JdbcDBCachedDataSource(BaseDBConfiguration jdbcElem) - { - super(jdbcElem); - } - - @Override - protected void configure(BaseDBConfiguration xmlElem) throws DBConfigException - { - BaseDBConfiguration jdbcConfig = (BaseDBConfiguration)xmlElem; - if(jdbcConfig.getConnTimeout() > 0){ - this.CONN_REQ_TIMEOUT = jdbcConfig.getConnTimeout(); - } - if(jdbcConfig.getRequestTimeout() > 0){ - this.DATA_REQ_TIMEOUT = jdbcConfig.getRequestTimeout(); - } - - // set connection pool name - String dbConnectionName = jdbcConfig.getDbConnectionName(); - super.setDbConnectionName(dbConnectionName); - // Configure the JDBC connection - dbUserId = jdbcConfig.getDbUserId(); - if (dbUserId == null) - { - String errorMsg = "Invalid XML contents: JDBCConnection missing dbUserId attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - - dbPasswd = jdbcConfig.getDbPasswd(); - if (dbPasswd == null) - { - String errorMsg = "Invalid XML contents: JDBCConnection missing dbPasswd attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - /* - dbDriver = jdbcConfig.getDbDriver(); - if (dbDriver == null) - { - String errorMsg = "Invalid XML contents: JDBCConnection missing dbDriver attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new ScpTblUpdateError(errorMsg); - } - */ - - minLimit = jdbcConfig.getDbMinLimit(); -// if (minLimit == null) -// { -// String errorMsg = "Invalid XML contents: JDBC Connection missing minLimit attribute"; -// LOGGER.error(AS_CONF_ERROR + errorMsg); -// throw new DBConfigException(errorMsg); -// } - maxLimit = jdbcConfig.getDbMaxLimit(); -// if (maxLimit == null) -// { -// String errorMsg = "Invalid XML contents: JDBC Connection missing maxLimit attribute"; -// LOGGER.error(AS_CONF_ERROR + errorMsg); -// throw new DBConfigException(errorMsg); -// } - initialLimit = jdbcConfig.getDbInitialLimit(); -// if (initialLimit == null) -// { -// String errorMsg = "Invalid XML contents: JDBC Connection missing initialLimit attribute"; -// LOGGER.error(AS_CONF_ERROR + errorMsg); -// throw new DBConfigException(errorMsg); -// } - - dbUrl = jdbcConfig.getDbUrl(); - if(dbUrl == null){ - String errorMsg = "Invalid XML contents: JDBCConnection missing dbUrl attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - - try { - Driver dr = new com.mysql.jdbc.Driver(); - Class clazz = Class.forName("com.mysql.jdbc.Driver") ; - - PoolProperties p = new PoolProperties(); - p.setDriverClassName("com.mysql.jdbc.Driver"); - p.setUrl(dbUrl); - p.setUsername(dbUserId); - p.setPassword(dbPasswd); - p.setJmxEnabled(true); - p.setTestWhileIdle(false); - p.setTestOnBorrow(true); - p.setValidationQuery("SELECT 1"); - p.setTestOnReturn(false); - p.setValidationInterval(30000); - p.setTimeBetweenEvictionRunsMillis(30000); - p.setInitialSize(initialLimit); - p.setMaxActive(maxLimit); - p.setMaxIdle(maxLimit); - p.setMaxWait(10000); - p.setRemoveAbandonedTimeout(60); - p.setMinEvictableIdleTimeMillis(30000); - p.setMinIdle(minLimit); - p.setLogAbandoned(true); - p.setRemoveAbandoned(true); - p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" - + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); - - DataSource dataSource = new DataSource(p); - - synchronized(this) - { - this.ds = dataSource; - Connection con = null; - PreparedStatement st = null; - ResultSet rs = null; - - try { - con = dataSource.getConnection(); - st = con.prepareStatement("Select 1 FROM DUAL"); - rs = st.executeQuery(); - } catch(Exception exc) { - LOGGER.error(exc.getMessage()); - } finally { - if(rs != null) rs.close(); - if(st != null) st.close(); - if(con != null) con.close(); - } - - initialized = true; - LOGGER.info("MySQLDataSource <"+dbConnectionName+"> configured successfully. Using URL: "+dbUrl); - } - -// } catch (SQLException exc) { -// initialized = false; -// StringBuffer sb = new StringBuffer(); -// sb.append("Failed to initialize MySQLDataSource<"); -// sb.append(dbConnectionName).append(">. Reason: "); -// sb.append(exc.getMessage()); -// LOGGER.error("AS_CONF_ERROR: " + sb.toString()); -//// throw new DBConfigException(e.getMessage()); - } catch (Exception exc) { - initialized = false; - StringBuffer sb = new StringBuffer(); - sb.append("Failed to initialize MySQLCachedDataSource <"); - sb.append(dbConnectionName).append(">. Reason: "); - sb.append(exc.getMessage()); - LOGGER.error("AS_CONF_ERROR: " + sb.toString()); -// throw new DBConfigException(e.getMessage()); - } - } - - public final String getDbUrl() - { - return dbUrl; - } - - public final String getDbUserId() - { - return dbUserId; - } - - public final String getDbPasswd() - { - return dbPasswd; - } - - public static JdbcDBCachedDataSource createInstance(BaseDBConfiguration config) /*throws Exception*/ { - return new JdbcDBCachedDataSource(config); - } - - public String toString(){ - return getDbConnectionName(); - } - - public java.util.logging.Logger getParentLogger() - throws SQLFeatureNotSupportedException { - // TODO Auto-generated method stub - return null; - } - - public void cleanUp(){ - DataSource dataSource = (DataSource)ds; - dataSource.getPool().purge(); - int active = dataSource.getActive(); - int size = dataSource.getSize(); - dataSource.close(true); - super.cleanUp(); - } - -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/jdbc/JdbcDbResourceManagerFactory.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/jdbc/JdbcDbResourceManagerFactory.java deleted file mode 100644 index 84399dfd9..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/jdbc/JdbcDbResourceManagerFactory.java +++ /dev/null @@ -1,186 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.jdbc; - - -import java.sql.SQLException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.FutureTask; - -import org.openecomp.sdnc.sli.resource.dblib.CachedDataSource; -import org.openecomp.sdnc.sli.resource.dblib.CachedDataSourceFactory; -import org.openecomp.sdnc.sli.resource.dblib.DBResourceManager; -import org.openecomp.sdnc.sli.resource.dblib.DataSourceComparator; -import org.openecomp.sdnc.sli.resource.dblib.config.DbConfigPool; -import org.openecomp.sdnc.sli.resource.dblib.config.JDBCConfiguration; -import org.openecomp.sdnc.sli.resource.dblib.factory.AbstractResourceManagerFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @version $Revision: 1.6 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ -public class JdbcDbResourceManagerFactory extends AbstractResourceManagerFactory { - private static Logger LOGGER = LoggerFactory.getLogger(JdbcDbResourceManagerFactory.class ); - private JdbcDbResourceManagerFactory(){ - - } - - class MyFutureTask extends FutureTask - { - - public MyFutureTask(Callable result) { - super(result); - } - - } - - public CachedDataSource[] initDBResourceManager(DbConfigPool dbConfig, DBResourceManager manager, String sourceName) throws SQLException - { - // here create the data sources objects - JDBCConfiguration[] list = dbConfig.getJDBCbSourceArray(); - CachedDataSource[] cachedDS = new CachedDataSource[1]; - - for(int i=0, max=list.length; i tasks = new HashSet(); - if(LOGGER.isDebugEnabled()) { - LOGGER.debug("Creating " + list.length + " datasources."); - } - - for(int i=0, max=list.length; i 0){ - this.CONN_REQ_TIMEOUT = jdbcConfig.getConnTimeout(); - } - if(jdbcConfig.getRequestTimeout() > 0){ - this.DATA_REQ_TIMEOUT = jdbcConfig.getRequestTimeout(); - } - - // set connection pool name - String dbConnectionName = jdbcConfig.getDbConnectionName(); - super.setDbConnectionName(dbConnectionName); - // Configure the JDBC connection - dbUserId = jdbcConfig.getDbUserId(); - if (dbUserId == null) - { - String errorMsg = "Invalid XML contents: JDBCConnection missing dbUserId attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - - dbPasswd = jdbcConfig.getDbPasswd(); - if (dbPasswd == null) - { - String errorMsg = "Invalid XML contents: JDBCConnection missing dbPasswd attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - /* - dbDriver = jdbcConfig.getDbDriver(); - if (dbDriver == null) - { - String errorMsg = "Invalid XML contents: JDBCConnection missing dbDriver attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new ScpTblUpdateError(errorMsg); - } - */ - - minLimit = Integer.toString(jdbcConfig.getDbMinLimit()); - if (minLimit == null) - { - String errorMsg = "Invalid XML contents: JDBC Connection missing minLimit attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - maxLimit = Integer.toString(jdbcConfig.getDbMaxLimit()); - if (maxLimit == null) - { - String errorMsg = "Invalid XML contents: JDBC Connection missing maxLimit attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - initialLimit = Integer.toString(jdbcConfig.getDbInitialLimit()); - if (initialLimit == null) - { - String errorMsg = "Invalid XML contents: JDBC Connection missing initialLimit attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - - dbUrl = jdbcConfig.getDbUrl(); - if(dbUrl == null){ - String errorMsg = "Invalid XML contents: JDBCConnection missing dbUrl attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - - try { - - MysqlDataSource dataSource = new MysqlDataSource(); - dataSource.setUser(dbUserId); - dataSource.setPassword(dbPasswd); - dataSource.setURL(dbUrl); -// dataSource.setInitialSize(5); -// dataSource.setMaxTotal(60); -// dataSource.setMaxActive(100); -// dataSource.setMaxWait(10000); -// dataSource.setMaxIdle(10); - - Properties connAttr = new Properties(); - - connAttr.setProperty("MinLimit", minLimit); - connAttr.setProperty("MaxLimit", maxLimit); - connAttr.setProperty("InitialLimit", initialLimit); - connAttr.setProperty("TRANSACTION_ISOLATION","SERIALIZABLE"); - connAttr.setProperty("CONNECTION_TAG", dbConnectionName.toUpperCase()+"_CONNECTION"); - connAttr.setProperty("InactivityTimeout", "900"); - connAttr.setProperty("AbandonedConnectionTimeout", "600"); - connAttr.setProperty("PropertyCheckInterval", "60"); - connAttr.setProperty("ValidateConnection", "true"); - - - synchronized(this) - { - this.ds = dataSource; - - initialized = true; - LOGGER.info("MySQLDataSource <"+dbConnectionName+"> configured successfully. Using URL: "+dbUrl); - } - -// } catch (SQLException exc) { -// initialized = false; -// StringBuffer sb = new StringBuffer(); -// sb.append("Failed to initialize MySQLDataSource<"); -// sb.append(dbConnectionName).append(">. Reason: "); -// sb.append(exc.getMessage()); -// LOGGER.error("AS_CONF_ERROR: " + sb.toString()); -//// throw new DBConfigException(e.getMessage()); - } catch (Exception exc) { - initialized = false; - StringBuffer sb = new StringBuffer(); - sb.append("Failed to initialize MySQLCachedDataSource <"); - sb.append(dbConnectionName).append(">. Reason: "); - sb.append(exc.getMessage()); - LOGGER.error("AS_CONF_ERROR: " + sb.toString()); -// throw new DBConfigException(e.getMessage()); - } - } - - public final String getDbUrl() - { - return dbUrl; - } - - public final String getDbUserId() - { - return dbUserId; - } - - public final String getDbPasswd() - { - return dbPasswd; - } - - public static MySQLCachedDataSource createInstance(BaseDBConfiguration config) /*throws Exception*/ { - return new MySQLCachedDataSource(config); - } - - public String toString(){ - return getDbConnectionName(); - } - - public java.util.logging.Logger getParentLogger() - throws SQLFeatureNotSupportedException { - // TODO Auto-generated method stub - return null; - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/PollingWorker.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/PollingWorker.java deleted file mode 100644 index de87fa7e8..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/PollingWorker.java +++ /dev/null @@ -1,217 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.pm; - -import java.util.Iterator; -import java.util.Properties; -import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; -import java.util.TreeSet; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.atomic.AtomicLong; - -public class PollingWorker implements Runnable { - - private Logger LOGGER = LoggerFactory.getLogger(PollingWorker.class); - - private static PollingWorker self = null; - - private LinkedBlockingQueue tasks = new LinkedBlockingQueue(100); - private long interval = 1000L; - private Thread worker = null; - private AtomicLong[] counters = null; - private int[] bucketUnit = null; - private static boolean enabled = false; - private Timer timer = null; - - public static void post(long starttime){ - PollingWorker temp = self; - if(temp != null && enabled) { - temp.register(new TestSample(starttime)); - } - } - - public static void createInistance(Properties props){ - self = new PollingWorker(props); - } - - private PollingWorker(Properties ctxprops){ - if(ctxprops==null || ctxprops.getProperty("org.openecomp.sdnc.dblib.pm") == null){ - enabled = false; - } else { - if("true".equalsIgnoreCase((String)ctxprops.getProperty("org.openecomp.sdnc.dblib.pm"))){ - enabled = true; - } else { - enabled = false; - } - } - - interval = Long.parseLong(( ctxprops == null || ctxprops.getProperty("org.openecomp.sdnc.dblib.pm.interval") == null) ? "60" : (String)ctxprops.getProperty("org.openecomp.sdnc.dblib.pm.interval")); - // '0' bucket is to count exceptions - String sampling[] = ((ctxprops == null || ctxprops.getProperty("org.openecomp.sdnc.dblib.pm.sampling")==null) ? "0,2,5,10,20,50,100" : (String)ctxprops.getProperty("org.openecomp.sdnc.dblib.pm.sampling")).split(","); - - if(enabled){ - bucketUnit = new int[sampling.length]; - for(int i=0, max = bucketUnit.length; i x.starttime) - return -1; - if(endtime > x.endtime) - return -1; - return 0; - } - return 1; - } - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/SQLExecutionMonitor.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/SQLExecutionMonitor.java deleted file mode 100644 index c58c9db7d..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/SQLExecutionMonitor.java +++ /dev/null @@ -1,237 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.pm; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.Collections; -import java.util.Observable; -import java.util.Observer; -import java.util.SortedSet; -import java.util.Timer; -import java.util.TimerTask; -import java.util.TreeSet; -import java.util.concurrent.atomic.AtomicLong; - -import org.openecomp.sdnc.sli.resource.dblib.DBResourceObserver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SQLExecutionMonitor extends Observable -{ - private static Logger LOGGER = LoggerFactory.getLogger(SQLExecutionMonitor.class); - - final static long MILISECOND = 1000000L; - final static long SECOND = 1000L*MILISECOND; - - private final Timer timer; - // collection - private final SortedSet innerSet; - private SQLExecutionMonitorObserver parent = null; - private final AtomicLong completionCounter; - private boolean activeState = false; - private final long interval; - private final long initialDelay; - private final long EXPECTED_TIME_TO_COMPLETE; - private final long UNPROCESSED_FAILOVER_THRESHOLD; - - private final class MonitoringTask extends TimerTask - { - - public void run() - { - try { - TestObject testObj = new TestObject(); - testObj.setStartTime(testObj.getStartTime() - EXPECTED_TIME_TO_COMPLETE); - - // take a snapshot of the current task list - TestObject[] array = innerSet.toArray(new TestObject[0]); - SortedSet copyCurrent = new TreeSet(Arrays.asList(array)); - // get the list of the tasks that are older than the specified - // interval. - SortedSet unprocessed = copyCurrent.headSet(testObj); - - long succesfulCount = completionCounter.get(); - int unprocessedCount = unprocessed.size(); - - if (!unprocessed.isEmpty() && unprocessedCount > UNPROCESSED_FAILOVER_THRESHOLD && succesfulCount == 0) - { - // switch the Connection Pool to passive - setChanged(); - notifyObservers("Open JDBC requests=" + unprocessedCount+" in "+SQLExecutionMonitor.this.parent.getDbConnectionName()); - } - } catch (Exception exc) { - LOGGER.error("", exc); - } finally { - completionCounter.set(0L); - } - } - } - - public static class TestObject implements Comparable, Serializable - { - - private static final long serialVersionUID = 1L; - private long starttime; - private long randId; - - public TestObject() - { - starttime = System.nanoTime(); - } - - public long getStartTime() - { - return starttime; - } - - public void setStartTime(long newTime) - { - starttime = newTime; - } - - public int compareTo(TestObject o) - { - if( this == o) - return 0; - if(this.starttime > o.getStartTime()) - return 1; - if(this.starttime < o.getStartTime()) - return -1; - - if(this.hashCode() > o.hashCode()) - return 1; - if(this.hashCode() < o.hashCode()) - return -1; - - return 0; - } - - public String toString() - { - return Long.toString(starttime)+"#"+ this.hashCode(); - } - - public boolean equals(Object obj) - { - if (this == obj) - return true; - - return (obj instanceof TestObject - && starttime == ((TestObject) obj).getStartTime() - && hashCode() == ((TestObject) obj).hashCode()); - } - } - - public SQLExecutionMonitor(SQLExecutionMonitorObserver parent) - { - this.parent = parent; - completionCounter = new AtomicLong(0L); - interval = parent.getInterval(); - initialDelay = parent.getInitialDelay(); - this.UNPROCESSED_FAILOVER_THRESHOLD = parent.getUnprocessedFailoverThreshold(); - this.EXPECTED_TIME_TO_COMPLETE = parent.getExpectedCompletionTime()*MILISECOND; - - innerSet = Collections.synchronizedSortedSet(new TreeSet()); - timer = new Timer(); - } - - public void cleanup() - { - timer.cancel(); - } - - // registerRequest - public TestObject registerRequest() - { - if(activeState) - { - TestObject test = new TestObject(); - if(innerSet.add(test)) - return test; - } - return null; - } - - // deregisterSuccessfulReguest - public boolean deregisterReguest(TestObject test) - { - if(test == null) - return false; - // remove from the collection - if(innerSet.remove(test) && activeState) - { - completionCounter.incrementAndGet(); - return true; - } - return false; - } - - public void terminate() { - timer.cancel(); - } - - /** - * @return the parent - */ - public final Object getParent() { - return parent; - } - - public void addObserver(Observer observer) - { - if(observer instanceof DBResourceObserver) - { - DBResourceObserver dbObserver = (DBResourceObserver)observer; - if(dbObserver.isMonitorDbResponse()) - { - if(countObservers() == 0) - { - TimerTask remindTask = new MonitoringTask(); - timer.schedule(remindTask, initialDelay, interval); - activeState = true; - } - } - } - super.addObserver(observer); - } - - public void deleteObserver(Observer observer) - { - super.deleteObserver(observer); - if(observer instanceof DBResourceObserver) - { - DBResourceObserver dbObserver = (DBResourceObserver)observer; - if(dbObserver.isMonitorDbResponse()) - { - if(countObservers() == 0) - { - timer.cancel(); - activeState = false; - } - } - } - } - - public final int getPorcessedConnectionsCount() { - return innerSet.size(); - } -} diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/SQLExecutionMonitorObserver.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/SQLExecutionMonitorObserver.java deleted file mode 100644 index 1f329750b..000000000 --- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/pm/SQLExecutionMonitorObserver.java +++ /dev/null @@ -1,37 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openecomp - * ================================================================================ - * Copyright (C) 2016 - 2017 AT&T - * ================================================================================ - * 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.openecomp.sdnc.sli.resource.dblib.pm; - -public interface SQLExecutionMonitorObserver { - public String getDbConnectionName(); - - public long getInterval(); - public void setInterval(long value); - - public long getInitialDelay(); - public void setInitialDelay(long value); - - public long getExpectedCompletionTime(); - public void setExpectedCompletionTime(long value); - - public long getUnprocessedFailoverThreshold(); - public void setUnprocessedFailoverThreshold(long value); -} diff --git a/dblib/provider/src/main/resources/dblib.properties b/dblib/provider/src/main/resources/dblib.properties index ac295c78d..3e62308fc 100755 --- a/dblib/provider/src/main/resources/dblib.properties +++ b/dblib/provider/src/main/resources/dblib.properties @@ -1,13 +1,13 @@ -org.openecomp.sdnc.sli.dbtype=jdbc -org.openecomp.sdnc.sli.jdbc.hosts=sdnctldb01,sdnctldb02 -org.openecomp.sdnc.sli.jdbc.url=jdbc:mysql://DBHOST:3306/sdnctl -org.openecomp.sdnc.sli.jdbc.database=sdnctl -org.openecomp.sdnc.sli.jdbc.user={user for sdnctl} -org.openecomp.sdnc.sli.jdbc.password={password for sdnctl} -org.openecomp.sdnc.sli.jdbc.connection.name=sdnctldb01 +org.onap.ccsdk.sli.dbtype=jdbc +org.onap.ccsdk.sli.jdbc.hosts=sdnctldb01,sdnctldb02 +org.onap.ccsdk.sli.jdbc.url=jdbc:mysql://DBHOST:3306/sdnctl +org.onap.ccsdk.sli.jdbc.database=sdnctl +org.onap.ccsdk.sli.jdbc.user={user for sdnctl} +org.onap.ccsdk.sli.jdbc.password={password for sdnctl} +org.onap.ccsdk.sli.jdbc.connection.name=sdnctldb01 -org.openecomp.sdnc.sli.jdbc.connection.timeout=50 -org.openecomp.sdnc.sli.jdbc.request.timeout=100 -org.openecomp.sdnc.sli.jdbc.limit.init=10 -org.openecomp.sdnc.sli.jdbc.limit.min=10 -org.openecomp.sdnc.sli.jdbc.limit.max=20 +org.onap.ccsdk.sli.jdbc.connection.timeout=50 +org.onap.ccsdk.sli.jdbc.request.timeout=100 +org.onap.ccsdk.sli.jdbc.limit.init=10 +org.onap.ccsdk.sli.jdbc.limit.min=10 +org.onap.ccsdk.sli.jdbc.limit.max=20 diff --git a/filters/features/src/main/resources/features.xml b/filters/features/src/main/resources/features.xml index d0cadff25..6837553d5 100644 --- a/filters/features/src/main/resources/features.xml +++ b/filters/features/src/main/resources/features.xml @@ -1,10 +1,9 @@ true diff --git a/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/Activator.java b/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/Activator.java new file mode 100644 index 000000000..c97142f1b --- /dev/null +++ b/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/Activator.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.filters; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class Activator implements BundleActivator { + + private ServiceRegistration registration = null; + + private static final Logger LOG = LoggerFactory.getLogger(Activator.class); + + @Override + public void start(BundleContext ctx) throws Exception { + + + + Object impl = new String(); + String regName = impl.getClass().getName(); + + if (registration == null) + { + LOG.debug("Registering Filters service "+regName); + registration = ctx.registerService(regName, impl, null); + } + + } + + @Override + public void stop(BundleContext ctx) throws Exception { + + if (registration != null) + { + registration.unregister(); + registration = null; + } + } + +} diff --git a/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/LogFilter.java b/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/LogFilter.java new file mode 100644 index 000000000..9df74c35a --- /dev/null +++ b/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/LogFilter.java @@ -0,0 +1,221 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.filters; + +import java.io.IOException; +import java.util.UUID; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.codec.binary.Base64; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + + + +/** + * Logs IN request according ECOMP Logging Guidelines at https://tspace.web.att.com/viewer/app/lcfiles/ae5f7751-39da-4c6b-8a83-5836c8c815e1/content + */ +public class LogFilter implements Filter { + + //X-ECOMP is shared between audit and metric + public static final String BEGIN_TIMESTAMP = "AUDIT-BeginTimestamp"; + public static final String END_TIMESTAMP = "AUDIT-EndTimestamp"; + public static final String REQUEST_ID = "X-ECOMP-RequestID"; + public static final String SERVICE_INSTANCE = "X-ECOMP-ServiceInstanceID"; + public static final String THREAD_ID ="X-ECOMP-ThreadId"; //optional + public static final String PHYSICAL_SERVER_NAME="X-ECOMP-PhysicalServerName"; //optional + public static final String SERVICE_NAME="X-ECOMP-ServiceName"; + public static final String PARTNER_NAME="X-ECOMP-PartnerName"; + public static final String STATUS_CODE="AUDIT-StatusCode"; + public static final String RESP_CODE="AUDIT-ResponseCode"; + public static final String RESP_DESC="AUDIT-ResponseDescription"; + public static final String INSTANCE_UUID="AUDIT-InstanceUUID"; + public static final String CATEGORY="AUDIT-INFO"; + public static final String SEVERITY ="AUDIT-Severity"; //optional + public static final String SERVER_IP="AUDIT-ServerIP"; //by chef node['ip'] + public static final String ELAPSED_TIME="AUDIT-ElapsedTime"; + public static final String SERVER_HOST="AUDIT-Server";//by chef node['fqdn'] + public static final String CLIENT_IP="AUDIT-ClientIPaddress"; + public static final String CLASS="AUDIT-Classname"; //optional + public static final String UNUSED="AUDIT-Unused"; //empty + public static final String PROCESS_KEY="AUDIT-ProcessKey"; //optional + public static final String CUST_1="AUDIT-CustomField1";//optional + public static final String CUST_2="AUDIT-CustomField2"; //optional + public static final String CUST_3="AUDIT-CustomField3"; //optional + public static final String CUST_4="AUDIT-CustomField4"; //optional + public static final String DETAIL_MESSAGE="AUDIT-DetailMessage";//optional + + + private static final Logger log = LoggerFactory.getLogger(LogFilter.class); + private static final Logger AUDIT = LoggerFactory.getLogger("org.openecomp.sdnc.filters.audit"); + @Override + public void destroy() { + } + + @Override + public void doFilter(final ServletRequest request, final ServletResponse response, + final FilterChain filterChain) throws IOException, ServletException { + + long startTime = System.currentTimeMillis(); + try { + + if ( request != null && request instanceof HttpServletRequest ) { + pre((HttpServletRequest)request); + } + filterChain.doFilter(request, response); + + + } finally { + + if (request != null && request instanceof HttpServletRequest ) { + post((HttpServletRequest)request,(HttpServletResponse)response,startTime); + } + MDC.clear(); + } + + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + + + private void pre(HttpServletRequest request) { + + UUID uuid = UUID.randomUUID(); + // check if uuid is in header X-ECOMP-RequestID + + String ecompUUID = request.getHeader(REQUEST_ID); + + if (ecompUUID != null && ecompUUID.length() > 0) { + try { + uuid = UUID.fromString(ecompUUID); + log.info("UUID is ECOMP UUID " + uuid.toString()); + } catch (Exception ex){ + log.warn("Failed to convert ECOMP UUID to java.util.UUID format:" + ecompUUID,ex); + } + } + MDC.put(REQUEST_ID, uuid.toString()); + + String userName="unknown"; + + /* below returning org.opendaylight.aaa.shiro.realm.TokenAuthRealm$ODLPrincipal@745dfcfe + if ( request.getUserPrincipal() != null) { + userName = request.getUserPrincipal().getName(); + } + */ + // going directly after Authorization header + if (request.getHeader("Authorization") != null) { + String authzHeader = request.getHeader("Authorization"); + String usernameAndPassword = new String(Base64.decodeBase64(authzHeader.substring(6).getBytes())); + + int userNameIndex = usernameAndPassword.indexOf(":"); + String username = usernameAndPassword.substring(0, userNameIndex); + userName = username; + + } + + + MDC.put(PARTNER_NAME, userName); + //just to initilaze for metric logger (outbound calls) + MDC.put("X-ECOMP-TargetEntity",""); + MDC.put("X-ECOMP-TargetServiceName",""); + + MDC.put(SERVICE_NAME,request.getRequestURL().toString()); + MDC.put(SERVICE_INSTANCE,""); + + } + + + private void post(HttpServletRequest request,HttpServletResponse response,long startTime) { + + //AUDIT.info("{}|{}|{}{}",request.getRemoteHost(),request.getMethod(),request.getRequestURL().toString(),request.getQueryString()); + //AUDIT.info(request.getRemoteHost() + D + request.getMethod() + D + request.getRequestURL().toString() + D + request.getQueryString()); + //METRIC.info(request.getMethod() + D + response.getStatus() + D + request.getRequestURL().toString() + D + (System.currentTimeMillis() - startTime) + " ms"); + MDC.put(BEGIN_TIMESTAMP,asIso8601(startTime)); + MDC.put(END_TIMESTAMP,asIso8601(System.currentTimeMillis())); + //MDC.put(REQUEST_ID,"already done above"); + MDC.put(SERVICE_NAME,request.getRequestURL().toString()); + int idx = request.getPathInfo().toString().lastIndexOf(":"); + String instance = ""; + if ( idx != -1 ) { + instance = request.getPathInfo().substring(idx+1); + } + MDC.put(SERVICE_INSTANCE,instance); + MDC.put(THREAD_ID,""); + MDC.put(PHYSICAL_SERVER_NAME,""); + //MDC.put(PARTNER_NAME,"already done above"); + if ( response.getStatus() >= 400 ) { + MDC.put(STATUS_CODE,"ERROR"); + } else { + MDC.put(STATUS_CODE,"COMPLETE"); + } + + MDC.put(RESP_CODE,"" + response.getStatus()); + MDC.put(RESP_DESC,""); + MDC.put(INSTANCE_UUID,""); + MDC.put(CATEGORY,""); + MDC.put(SEVERITY,""); + //MDC.put(SERVER_IP,""); //by chef + MDC.put(ELAPSED_TIME,"" + (System.currentTimeMillis() - startTime)); + //MDC.put(SERVER_HOST,""); //by chef + MDC.put(CLIENT_IP,request.getRemoteHost()); + MDC.put(CLASS,""); + MDC.put(UNUSED,""); + MDC.put(PROCESS_KEY,""); + MDC.put(CUST_1,""); + MDC.put(CUST_2,""); + MDC.put(CUST_3,""); + MDC.put(CUST_4,""); + MDC.put(DETAIL_MESSAGE,request.getMethod()); + + AUDIT.info(""); + } + + private String asIso8601(Date date) { + TimeZone tz = TimeZone.getTimeZone("UTC"); + DateFormat df = new SimpleDateFormat("yyy-MM-dd'T'hh:mm:ss:SS'+00:00'"); + df.setTimeZone(tz); + return df.format(date); + } + + private String asIso8601(long tsInMillis) { + return asIso8601(new Date(tsInMillis)); + } + + +} diff --git a/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/RequestResponseDbLoggingFilter.java b/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/RequestResponseDbLoggingFilter.java new file mode 100644 index 000000000..b187d9573 --- /dev/null +++ b/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/RequestResponseDbLoggingFilter.java @@ -0,0 +1,297 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.filters; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.util.zip.GZIPInputStream; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +import org.onap.ccsdk.sli.core.sli.MessageWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RequestResponseDbLoggingFilter implements Filter { + + private static Logger log = LoggerFactory.getLogger(RequestResponseDbLoggingFilter.class); + + public static final String REQUEST_ID = "X-ECOMP-RequestID"; + + private static class ByteArrayServletStream extends ServletOutputStream { + + ByteArrayOutputStream baos; + + ByteArrayServletStream(ByteArrayOutputStream baos) { + this.baos = baos; + } + + @Override + public void write(int param) throws IOException { + baos.write(param); + } + } + + private static class ByteArrayPrintWriter { + + private ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + private PrintWriter pw = new PrintWriter(baos); + + private ServletOutputStream sos = new ByteArrayServletStream(baos); + + public PrintWriter getWriter() { + return pw; + } + + public ServletOutputStream getStream() { + return sos; + } + + byte[] toByteArray() { + return baos.toByteArray(); + } + } + + private class BufferedServletInputStream extends ServletInputStream { + + ByteArrayInputStream bais; + + public BufferedServletInputStream(ByteArrayInputStream bais) { + this.bais = bais; + } + + @Override + public int available() { + return bais.available(); + } + + @Override + public int read() { + return bais.read(); + } + + @Override + public int read(byte[] buf, int off, int len) { + return bais.read(buf, off, len); + } + + } + + private class BufferedRequestWrapper extends HttpServletRequestWrapper { + + ByteArrayInputStream bais; + + ByteArrayOutputStream baos; + + BufferedServletInputStream bsis; + + byte[] buffer; + + public BufferedRequestWrapper(HttpServletRequest req) throws IOException { + super(req); + + InputStream is = req.getInputStream(); + baos = new ByteArrayOutputStream(); + byte buf[] = new byte[1024]; + int letti; + while ((letti = is.read(buf)) > 0) { + baos.write(buf, 0, letti); + } + buffer = baos.toByteArray(); + + } + + @Override + public ServletInputStream getInputStream() { + try { + bais = new ByteArrayInputStream(buffer); + bsis = new BufferedServletInputStream(bais); + } catch (Exception ex) { + ex.printStackTrace(); + } + + return bsis; + } + + public byte[] getBuffer() { + return buffer; + } + + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain) + throws IOException, ServletException { + + if (request == null || !(request instanceof HttpServletRequest)) { + filterChain.doFilter(request, response); + return; + } + + long t1 = System.currentTimeMillis(); + + final HttpServletRequest httpRequest = (HttpServletRequest) request; + BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(httpRequest); + + String requestId = httpRequest.getHeader(REQUEST_ID); + if (requestId == null || requestId.trim().length() == 0) { + log.warn("Could not write request in DB: " + REQUEST_ID + " is missing in the HTTP headers."); + return; + } + + String requestHost = request.getRemoteHost(); + if (requestHost == null) + requestHost = request.getRemoteAddr(); + + String requestStr = new String(bufferedRequest.getBuffer()); + + MessageWriter.saveIncomingRequest(requestId, null, requestHost, requestStr); + + long t2 = System.currentTimeMillis(); + + log.info("Request saved in DB for request-id: " + requestId + ". TIme: " + (t2 - t1)); + + final HttpServletResponse httpResponse = (HttpServletResponse) response; + + final ByteArrayPrintWriter pw = new ByteArrayPrintWriter(); + HttpServletResponse wrappedResp = new HttpServletResponseWrapper(httpResponse) { + + @Override + public PrintWriter getWriter() { + return pw.getWriter(); + } + + @Override + public ServletOutputStream getOutputStream() { + return pw.getStream(); + } + }; + + try { + + filterChain.doFilter(bufferedRequest, wrappedResp); + + } finally { + + if (request != null && request instanceof HttpServletRequest) { + + t1 = System.currentTimeMillis(); + + byte[] bytes = pw.toByteArray(); + response.getOutputStream().write(bytes); + response.getOutputStream().flush(); + + String responseStr = null; + if ("gzip".equals(httpResponse.getHeader("Content-Encoding"))) { + responseStr = decompressGZIPByteArray(bytes); + } else { + responseStr = new String(bytes); + } + + MessageWriter.saveIncomingResponse(requestId, httpResponse.getStatus(), responseStr); + + t2 = System.currentTimeMillis(); + + log.info("Response saved in DB for request-id: " + requestId + ". TIme: " + (t2 - t1)); + } + } + + } + + @Override + public void destroy() { + } + + private String decompressGZIPByteArray(byte[] bytes) { + + BufferedReader in = null; + InputStreamReader inR = null; + ByteArrayInputStream byteS = null; + GZIPInputStream gzS = null; + StringBuilder str = new StringBuilder(); + try { + byteS = new ByteArrayInputStream(bytes); + gzS = new GZIPInputStream(byteS); + inR = new InputStreamReader(gzS); + in = new BufferedReader(inR); + + if (in != null) { + + String content; + + while ((content = in.readLine()) != null) { + str.append(content); + } + } + + } catch (Exception e) { + log.error("Failed get read GZIPInputStream", e); + } finally { + + if (byteS != null) + try { + byteS.close(); + } catch (IOException e1) { + log.error("Failed to close ByteStream", e1); + } + if (gzS != null) + try { + gzS.close(); + } catch (IOException e2) { + log.error("Failed to close GZStream", e2); + } + if (inR != null) + try { + inR.close(); + } catch (IOException e3) { + log.error("Failed to close InputReader", e3); + } + if (in != null) + try { + in.close(); + } catch (IOException e) { + log.error("Failed to close BufferedReader", e); + } + } + return str.toString(); + } +} diff --git a/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/RequestResponseLoggingFilter.java b/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/RequestResponseLoggingFilter.java new file mode 100644 index 000000000..e4b0b7d1f --- /dev/null +++ b/filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/RequestResponseLoggingFilter.java @@ -0,0 +1,288 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.filters; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.util.Enumeration; +import java.util.zip.GZIPInputStream; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +public class RequestResponseLoggingFilter implements Filter { + + private static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("org.openecomp.sdnc.filters.request.response"); + + private static class ByteArrayServletStream extends ServletOutputStream { + + ByteArrayOutputStream baos; + + ByteArrayServletStream(ByteArrayOutputStream baos) { + this.baos = baos; + } + + @Override + public void write(int param) throws IOException { + baos.write(param); + } + } + + private static class ByteArrayPrintWriter { + + private ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + private PrintWriter pw = new PrintWriter(baos); + + private ServletOutputStream sos = new ByteArrayServletStream(baos); + + public PrintWriter getWriter() { + return pw; + } + + public ServletOutputStream getStream() { + return sos; + } + + byte[] toByteArray() { + return baos.toByteArray(); + } + } + + private class BufferedServletInputStream extends ServletInputStream { + + ByteArrayInputStream bais; + + public BufferedServletInputStream(ByteArrayInputStream bais) { + this.bais = bais; + } + + @Override + public int available() { + return bais.available(); + } + + @Override + public int read() { + return bais.read(); + } + + @Override + public int read(byte[] buf, int off, int len) { + return bais.read(buf, off, len); + } + + } + + private class BufferedRequestWrapper extends HttpServletRequestWrapper { + + ByteArrayInputStream bais; + + ByteArrayOutputStream baos; + + BufferedServletInputStream bsis; + + byte[] buffer; + + public BufferedRequestWrapper(HttpServletRequest req) throws IOException { + super(req); + + InputStream is = req.getInputStream(); + baos = new ByteArrayOutputStream(); + byte buf[] = new byte[1024]; + int letti; + while ((letti = is.read(buf)) > 0) { + baos.write(buf, 0, letti); + } + buffer = baos.toByteArray(); + + } + + @Override + public ServletInputStream getInputStream() { + try { + bais = new ByteArrayInputStream(buffer); + bsis = new BufferedServletInputStream(bais); + } catch (Exception ex) { + ex.printStackTrace(); + } + + return bsis; + } + + public byte[] getBuffer() { + return buffer; + } + + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + + final HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; + BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(httpRequest); + + StringBuilder requestHeaders = new StringBuilder("REQUEST|"); + requestHeaders.append(httpRequest.getMethod()); + requestHeaders.append(":"); + requestHeaders.append(httpRequest.getRequestURL().toString()); + requestHeaders.append("|"); + String header; + for (Enumeration e = httpRequest.getHeaderNames(); e.hasMoreElements();) { + header = e.nextElement(); + requestHeaders.append(header); + requestHeaders.append(":"); + requestHeaders.append(httpRequest.getHeader(header)); + requestHeaders.append(";"); + + } + log.info(requestHeaders.toString()); + + log.info("REQUEST BODY|" + new String(bufferedRequest.getBuffer())); + + final HttpServletResponse response = (HttpServletResponse) servletResponse; + + final ByteArrayPrintWriter pw = new ByteArrayPrintWriter(); + HttpServletResponse wrappedResp = new HttpServletResponseWrapper(response) { + @Override + public PrintWriter getWriter() { + return pw.getWriter(); + } + + @Override + public ServletOutputStream getOutputStream() { + return pw.getStream(); + } + + }; + + try { + + filterChain.doFilter(bufferedRequest, wrappedResp); + + }catch (Exception e){ + log.error("Chain Exception",e); + throw e; + } finally { + byte[] bytes = pw.toByteArray(); + response.getOutputStream().write(bytes); + response.getOutputStream().flush(); + + StringBuilder responseHeaders = new StringBuilder("RESPONSE HEADERS|"); + + for (String headerName : response.getHeaderNames()) { + responseHeaders.append(headerName); + responseHeaders.append(":"); + responseHeaders.append(response.getHeader(headerName)); + responseHeaders.append(";"); + + } + log.info(responseHeaders.toString()); + + if ("gzip".equals(response.getHeader("Content-Encoding"))) { + + log.info("UNGZIPED RESPONSE BODY|" + decompressGZIPByteArray(bytes)); + + } else { + + log.info("RESPONSE BODY|" + new String(bytes)); + } + } + } + + @Override + public void destroy() { + } + + private String decompressGZIPByteArray(byte[] bytes) { + + BufferedReader in = null; + InputStreamReader inR = null; + ByteArrayInputStream byteS = null; + GZIPInputStream gzS = null; + StringBuilder str = new StringBuilder(); + try { + byteS = new ByteArrayInputStream(bytes); + gzS = new GZIPInputStream(byteS); + inR = new InputStreamReader(gzS); + in = new BufferedReader(inR); + + if (in != null) { + + String content; + + while ((content = in.readLine()) != null) { + str.append(content); + } + } + + } catch (Exception e) { + log.error("Failed get read GZIPInputStream", e); + } finally { + + if (byteS != null) + try { + byteS.close(); + } catch (IOException e1) { + log.error("Failed to close ByteStream", e1); + } + if (gzS != null) + try { + gzS.close(); + } catch (IOException e2) { + log.error("Failed to close GZStream", e2); + } + if (inR != null) + try { + inR.close(); + } catch (IOException e3) { + log.error("Failed to close InputReader", e3); + } + if (in != null) + try { + in.close(); + } catch (IOException e) { + log.error("Failed to close BufferedReader", e); + } + } + return str.toString(); + } +} diff --git a/filters/provider/src/main/java/org/openecomp/sdnc/filters/Activator.java b/filters/provider/src/main/java/org/openecomp/sdnc/filters/Activator.java deleted file mode 100644 index d21b30992..000000000 --- a/filters/provider/src/main/java/org/openecomp/sdnc/filters/Activator.java +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.filters; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceRegistration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class Activator implements BundleActivator { - - private ServiceRegistration registration = null; - - private static final Logger LOG = LoggerFactory.getLogger(Activator.class); - - @Override - public void start(BundleContext ctx) throws Exception { - - - - Object impl = new String(); - String regName = impl.getClass().getName(); - - if (registration == null) - { - LOG.debug("Registering Filters service "+regName); - registration = ctx.registerService(regName, impl, null); - } - - } - - @Override - public void stop(BundleContext ctx) throws Exception { - - if (registration != null) - { - registration.unregister(); - registration = null; - } - } - -} diff --git a/filters/provider/src/main/java/org/openecomp/sdnc/filters/LogFilter.java b/filters/provider/src/main/java/org/openecomp/sdnc/filters/LogFilter.java deleted file mode 100644 index 809cfb287..000000000 --- a/filters/provider/src/main/java/org/openecomp/sdnc/filters/LogFilter.java +++ /dev/null @@ -1,222 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.filters; - -import java.io.IOException; -import java.util.UUID; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.codec.binary.Base64; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; - - - -/** - * Logs IN request according ECOMP Logging Guidelines at https://tspace.web.att.com/viewer/app/lcfiles/ae5f7751-39da-4c6b-8a83-5836c8c815e1/content - */ -public class LogFilter implements Filter { - - //X-ECOMP is shared between audit and metric - public static final String BEGIN_TIMESTAMP = "AUDIT-BeginTimestamp"; - public static final String END_TIMESTAMP = "AUDIT-EndTimestamp"; - public static final String REQUEST_ID = "X-ECOMP-RequestID"; - public static final String SERVICE_INSTANCE = "X-ECOMP-ServiceInstanceID"; - public static final String THREAD_ID ="X-ECOMP-ThreadId"; //optional - public static final String PHYSICAL_SERVER_NAME="X-ECOMP-PhysicalServerName"; //optional - public static final String SERVICE_NAME="X-ECOMP-ServiceName"; - public static final String PARTNER_NAME="X-ECOMP-PartnerName"; - public static final String STATUS_CODE="AUDIT-StatusCode"; - public static final String RESP_CODE="AUDIT-ResponseCode"; - public static final String RESP_DESC="AUDIT-ResponseDescription"; - public static final String INSTANCE_UUID="AUDIT-InstanceUUID"; - public static final String CATEGORY="AUDIT-INFO"; - public static final String SEVERITY ="AUDIT-Severity"; //optional - public static final String SERVER_IP="AUDIT-ServerIP"; //by chef node['ip'] - public static final String ELAPSED_TIME="AUDIT-ElapsedTime"; - public static final String SERVER_HOST="AUDIT-Server";//by chef node['fqdn'] - public static final String CLIENT_IP="AUDIT-ClientIPaddress"; - public static final String CLASS="AUDIT-Classname"; //optional - public static final String UNUSED="AUDIT-Unused"; //empty - public static final String PROCESS_KEY="AUDIT-ProcessKey"; //optional - public static final String CUST_1="AUDIT-CustomField1";//optional - public static final String CUST_2="AUDIT-CustomField2"; //optional - public static final String CUST_3="AUDIT-CustomField3"; //optional - public static final String CUST_4="AUDIT-CustomField4"; //optional - public static final String DETAIL_MESSAGE="AUDIT-DetailMessage";//optional - - - private static final Logger log = LoggerFactory.getLogger(LogFilter.class); - private static final Logger AUDIT = LoggerFactory.getLogger("org.openecomp.sdnc.filters.audit"); - @Override - public void destroy() { - } - - @Override - public void doFilter(final ServletRequest request, final ServletResponse response, - final FilterChain filterChain) throws IOException, ServletException { - - long startTime = System.currentTimeMillis(); - try { - - if ( request != null && request instanceof HttpServletRequest ) { - pre((HttpServletRequest)request); - } - filterChain.doFilter(request, response); - - - } finally { - - if (request != null && request instanceof HttpServletRequest ) { - post((HttpServletRequest)request,(HttpServletResponse)response,startTime); - } - MDC.clear(); - } - - } - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - - - private void pre(HttpServletRequest request) { - - UUID uuid = UUID.randomUUID(); - // check if uuid is in header X-ECOMP-RequestID - - String ecompUUID = request.getHeader(REQUEST_ID); - - if (ecompUUID != null && ecompUUID.length() > 0) { - try { - uuid = UUID.fromString(ecompUUID); - log.info("UUID is ECOMP UUID " + uuid.toString()); - } catch (Exception ex){ - log.warn("Failed to convert ECOMP UUID to java.util.UUID format:" + ecompUUID,ex); - } - } - MDC.put(REQUEST_ID, uuid.toString()); - - String userName="unknown"; - - /* below returning org.opendaylight.aaa.shiro.realm.TokenAuthRealm$ODLPrincipal@745dfcfe - if ( request.getUserPrincipal() != null) { - userName = request.getUserPrincipal().getName(); - } - */ - // going directly after Authorization header - if (request.getHeader("Authorization") != null) { - String authzHeader = request.getHeader("Authorization"); - String usernameAndPassword = new String(Base64.decodeBase64(authzHeader.substring(6).getBytes())); - - int userNameIndex = usernameAndPassword.indexOf(":"); - String username = usernameAndPassword.substring(0, userNameIndex); - userName = username; - - } - - - MDC.put(PARTNER_NAME, userName); - //just to initilaze for metric logger (outbound calls) - MDC.put("X-ECOMP-TargetEntity",""); - MDC.put("X-ECOMP-TargetServiceName",""); - - MDC.put(SERVICE_NAME,request.getRequestURL().toString()); - MDC.put(SERVICE_INSTANCE,""); - - } - - - private void post(HttpServletRequest request,HttpServletResponse response,long startTime) { - - //AUDIT.info("{}|{}|{}{}",request.getRemoteHost(),request.getMethod(),request.getRequestURL().toString(),request.getQueryString()); - //AUDIT.info(request.getRemoteHost() + D + request.getMethod() + D + request.getRequestURL().toString() + D + request.getQueryString()); - //METRIC.info(request.getMethod() + D + response.getStatus() + D + request.getRequestURL().toString() + D + (System.currentTimeMillis() - startTime) + " ms"); - MDC.put(BEGIN_TIMESTAMP,asIso8601(startTime)); - MDC.put(END_TIMESTAMP,asIso8601(System.currentTimeMillis())); - //MDC.put(REQUEST_ID,"already done above"); - MDC.put(SERVICE_NAME,request.getRequestURL().toString()); - int idx = request.getPathInfo().toString().lastIndexOf(":"); - String instance = ""; - if ( idx != -1 ) { - instance = request.getPathInfo().substring(idx+1); - } - MDC.put(SERVICE_INSTANCE,instance); - MDC.put(THREAD_ID,""); - MDC.put(PHYSICAL_SERVER_NAME,""); - //MDC.put(PARTNER_NAME,"already done above"); - if ( response.getStatus() >= 400 ) { - MDC.put(STATUS_CODE,"ERROR"); - } else { - MDC.put(STATUS_CODE,"COMPLETE"); - } - - MDC.put(RESP_CODE,"" + response.getStatus()); - MDC.put(RESP_DESC,""); - MDC.put(INSTANCE_UUID,""); - MDC.put(CATEGORY,""); - MDC.put(SEVERITY,""); - //MDC.put(SERVER_IP,""); //by chef - MDC.put(ELAPSED_TIME,"" + (System.currentTimeMillis() - startTime)); - //MDC.put(SERVER_HOST,""); //by chef - MDC.put(CLIENT_IP,request.getRemoteHost()); - MDC.put(CLASS,""); - MDC.put(UNUSED,""); - MDC.put(PROCESS_KEY,""); - MDC.put(CUST_1,""); - MDC.put(CUST_2,""); - MDC.put(CUST_3,""); - MDC.put(CUST_4,""); - MDC.put(DETAIL_MESSAGE,request.getMethod()); - - AUDIT.info(""); - } - - private String asIso8601(Date date) { - TimeZone tz = TimeZone.getTimeZone("UTC"); - DateFormat df = new SimpleDateFormat("yyy-MM-dd'T'hh:mm:ss:SS'+00:00'"); - df.setTimeZone(tz); - return df.format(date); - } - - private String asIso8601(long tsInMillis) { - return asIso8601(new Date(tsInMillis)); - } - - -} diff --git a/filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseDbLoggingFilter.java b/filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseDbLoggingFilter.java deleted file mode 100644 index 183301be5..000000000 --- a/filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseDbLoggingFilter.java +++ /dev/null @@ -1,297 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.filters; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.util.zip.GZIPInputStream; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletInputStream; -import javax.servlet.ServletOutputStream; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpServletResponseWrapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.openecomp.sdnc.sli.MessageWriter; - -public class RequestResponseDbLoggingFilter implements Filter { - - private static Logger log = LoggerFactory.getLogger(RequestResponseDbLoggingFilter.class); - - public static final String REQUEST_ID = "X-ECOMP-RequestID"; - - private static class ByteArrayServletStream extends ServletOutputStream { - - ByteArrayOutputStream baos; - - ByteArrayServletStream(ByteArrayOutputStream baos) { - this.baos = baos; - } - - @Override - public void write(int param) throws IOException { - baos.write(param); - } - } - - private static class ByteArrayPrintWriter { - - private ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - private PrintWriter pw = new PrintWriter(baos); - - private ServletOutputStream sos = new ByteArrayServletStream(baos); - - public PrintWriter getWriter() { - return pw; - } - - public ServletOutputStream getStream() { - return sos; - } - - byte[] toByteArray() { - return baos.toByteArray(); - } - } - - private class BufferedServletInputStream extends ServletInputStream { - - ByteArrayInputStream bais; - - public BufferedServletInputStream(ByteArrayInputStream bais) { - this.bais = bais; - } - - @Override - public int available() { - return bais.available(); - } - - @Override - public int read() { - return bais.read(); - } - - @Override - public int read(byte[] buf, int off, int len) { - return bais.read(buf, off, len); - } - - } - - private class BufferedRequestWrapper extends HttpServletRequestWrapper { - - ByteArrayInputStream bais; - - ByteArrayOutputStream baos; - - BufferedServletInputStream bsis; - - byte[] buffer; - - public BufferedRequestWrapper(HttpServletRequest req) throws IOException { - super(req); - - InputStream is = req.getInputStream(); - baos = new ByteArrayOutputStream(); - byte buf[] = new byte[1024]; - int letti; - while ((letti = is.read(buf)) > 0) { - baos.write(buf, 0, letti); - } - buffer = baos.toByteArray(); - - } - - @Override - public ServletInputStream getInputStream() { - try { - bais = new ByteArrayInputStream(buffer); - bsis = new BufferedServletInputStream(bais); - } catch (Exception ex) { - ex.printStackTrace(); - } - - return bsis; - } - - public byte[] getBuffer() { - return buffer; - } - - } - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - @Override - public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain) - throws IOException, ServletException { - - if (request == null || !(request instanceof HttpServletRequest)) { - filterChain.doFilter(request, response); - return; - } - - long t1 = System.currentTimeMillis(); - - final HttpServletRequest httpRequest = (HttpServletRequest) request; - BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(httpRequest); - - String requestId = httpRequest.getHeader(REQUEST_ID); - if (requestId == null || requestId.trim().length() == 0) { - log.warn("Could not write request in DB: " + REQUEST_ID + " is missing in the HTTP headers."); - return; - } - - String requestHost = request.getRemoteHost(); - if (requestHost == null) - requestHost = request.getRemoteAddr(); - - String requestStr = new String(bufferedRequest.getBuffer()); - - MessageWriter.saveIncomingRequest(requestId, null, requestHost, requestStr); - - long t2 = System.currentTimeMillis(); - - log.info("Request saved in DB for request-id: " + requestId + ". TIme: " + (t2 - t1)); - - final HttpServletResponse httpResponse = (HttpServletResponse) response; - - final ByteArrayPrintWriter pw = new ByteArrayPrintWriter(); - HttpServletResponse wrappedResp = new HttpServletResponseWrapper(httpResponse) { - - @Override - public PrintWriter getWriter() { - return pw.getWriter(); - } - - @Override - public ServletOutputStream getOutputStream() { - return pw.getStream(); - } - }; - - try { - - filterChain.doFilter(bufferedRequest, wrappedResp); - - } finally { - - if (request != null && request instanceof HttpServletRequest) { - - t1 = System.currentTimeMillis(); - - byte[] bytes = pw.toByteArray(); - response.getOutputStream().write(bytes); - response.getOutputStream().flush(); - - String responseStr = null; - if ("gzip".equals(httpResponse.getHeader("Content-Encoding"))) { - responseStr = decompressGZIPByteArray(bytes); - } else { - responseStr = new String(bytes); - } - - MessageWriter.saveIncomingResponse(requestId, httpResponse.getStatus(), responseStr); - - t2 = System.currentTimeMillis(); - - log.info("Response saved in DB for request-id: " + requestId + ". TIme: " + (t2 - t1)); - } - } - - } - - @Override - public void destroy() { - } - - private String decompressGZIPByteArray(byte[] bytes) { - - BufferedReader in = null; - InputStreamReader inR = null; - ByteArrayInputStream byteS = null; - GZIPInputStream gzS = null; - StringBuilder str = new StringBuilder(); - try { - byteS = new ByteArrayInputStream(bytes); - gzS = new GZIPInputStream(byteS); - inR = new InputStreamReader(gzS); - in = new BufferedReader(inR); - - if (in != null) { - - String content; - - while ((content = in.readLine()) != null) { - str.append(content); - } - } - - } catch (Exception e) { - log.error("Failed get read GZIPInputStream", e); - } finally { - - if (byteS != null) - try { - byteS.close(); - } catch (IOException e1) { - log.error("Failed to close ByteStream", e1); - } - if (gzS != null) - try { - gzS.close(); - } catch (IOException e2) { - log.error("Failed to close GZStream", e2); - } - if (inR != null) - try { - inR.close(); - } catch (IOException e3) { - log.error("Failed to close InputReader", e3); - } - if (in != null) - try { - in.close(); - } catch (IOException e) { - log.error("Failed to close BufferedReader", e); - } - } - return str.toString(); - } -} diff --git a/filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseLoggingFilter.java b/filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseLoggingFilter.java deleted file mode 100644 index b15932f09..000000000 --- a/filters/provider/src/main/java/org/openecomp/sdnc/filters/RequestResponseLoggingFilter.java +++ /dev/null @@ -1,289 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.filters; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.util.Enumeration; -import java.util.zip.GZIPInputStream; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletInputStream; -import javax.servlet.ServletOutputStream; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpServletResponseWrapper; - -public class RequestResponseLoggingFilter implements Filter { - - private static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("org.openecomp.sdnc.filters.request.response"); - - private static class ByteArrayServletStream extends ServletOutputStream { - - ByteArrayOutputStream baos; - - ByteArrayServletStream(ByteArrayOutputStream baos) { - this.baos = baos; - } - - @Override - public void write(int param) throws IOException { - baos.write(param); - } - } - - private static class ByteArrayPrintWriter { - - private ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - private PrintWriter pw = new PrintWriter(baos); - - private ServletOutputStream sos = new ByteArrayServletStream(baos); - - public PrintWriter getWriter() { - return pw; - } - - public ServletOutputStream getStream() { - return sos; - } - - byte[] toByteArray() { - return baos.toByteArray(); - } - } - - private class BufferedServletInputStream extends ServletInputStream { - - ByteArrayInputStream bais; - - public BufferedServletInputStream(ByteArrayInputStream bais) { - this.bais = bais; - } - - @Override - public int available() { - return bais.available(); - } - - @Override - public int read() { - return bais.read(); - } - - @Override - public int read(byte[] buf, int off, int len) { - return bais.read(buf, off, len); - } - - } - - private class BufferedRequestWrapper extends HttpServletRequestWrapper { - - ByteArrayInputStream bais; - - ByteArrayOutputStream baos; - - BufferedServletInputStream bsis; - - byte[] buffer; - - public BufferedRequestWrapper(HttpServletRequest req) throws IOException { - super(req); - - InputStream is = req.getInputStream(); - baos = new ByteArrayOutputStream(); - byte buf[] = new byte[1024]; - int letti; - while ((letti = is.read(buf)) > 0) { - baos.write(buf, 0, letti); - } - buffer = baos.toByteArray(); - - } - - @Override - public ServletInputStream getInputStream() { - try { - bais = new ByteArrayInputStream(buffer); - bsis = new BufferedServletInputStream(bais); - } catch (Exception ex) { - ex.printStackTrace(); - } - - return bsis; - } - - public byte[] getBuffer() { - return buffer; - } - - } - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { - - final HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; - BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(httpRequest); - - StringBuilder requestHeaders = new StringBuilder("REQUEST|"); - requestHeaders.append(httpRequest.getMethod()); - requestHeaders.append(":"); - requestHeaders.append(httpRequest.getRequestURL().toString()); - requestHeaders.append("|"); - String header; - for (Enumeration e = httpRequest.getHeaderNames(); e.hasMoreElements();) { - header = e.nextElement(); - requestHeaders.append(header); - requestHeaders.append(":"); - requestHeaders.append(httpRequest.getHeader(header)); - requestHeaders.append(";"); - - } - log.info(requestHeaders.toString()); - - log.info("REQUEST BODY|" + new String(bufferedRequest.getBuffer())); - - final HttpServletResponse response = (HttpServletResponse) servletResponse; - - final ByteArrayPrintWriter pw = new ByteArrayPrintWriter(); - HttpServletResponse wrappedResp = new HttpServletResponseWrapper(response) { - @Override - public PrintWriter getWriter() { - return pw.getWriter(); - } - - @Override - public ServletOutputStream getOutputStream() { - return pw.getStream(); - } - - }; - - try { - - filterChain.doFilter(bufferedRequest, wrappedResp); - - }catch (Exception e){ - log.error("Chain Exception",e); - throw e; - } finally { - byte[] bytes = pw.toByteArray(); - response.getOutputStream().write(bytes); - response.getOutputStream().flush(); - - StringBuilder responseHeaders = new StringBuilder("RESPONSE HEADERS|"); - - for (String headerName : response.getHeaderNames()) { - responseHeaders.append(headerName); - responseHeaders.append(":"); - responseHeaders.append(response.getHeader(headerName)); - responseHeaders.append(";"); - - } - log.info(responseHeaders.toString()); - - if ("gzip".equals(response.getHeader("Content-Encoding"))) { - - log.info("UNGZIPED RESPONSE BODY|" + decompressGZIPByteArray(bytes)); - - } else { - - log.info("RESPONSE BODY|" + new String(bytes)); - } - } - } - - @Override - public void destroy() { - } - - private String decompressGZIPByteArray(byte[] bytes) { - - BufferedReader in = null; - InputStreamReader inR = null; - ByteArrayInputStream byteS = null; - GZIPInputStream gzS = null; - StringBuilder str = new StringBuilder(); - try { - byteS = new ByteArrayInputStream(bytes); - gzS = new GZIPInputStream(byteS); - inR = new InputStreamReader(gzS); - in = new BufferedReader(inR); - - if (in != null) { - - String content; - - while ((content = in.readLine()) != null) { - str.append(content); - } - } - - } catch (Exception e) { - log.error("Failed get read GZIPInputStream", e); - } finally { - - if (byteS != null) - try { - byteS.close(); - } catch (IOException e1) { - log.error("Failed to close ByteStream", e1); - } - if (gzS != null) - try { - gzS.close(); - } catch (IOException e2) { - log.error("Failed to close GZStream", e2); - } - if (inR != null) - try { - inR.close(); - } catch (IOException e3) { - log.error("Failed to close InputReader", e3); - } - if (in != null) - try { - in.close(); - } catch (IOException e) { - log.error("Failed to close BufferedReader", e); - } - } - return str.toString(); - } -} diff --git a/pom.xml b/pom.xml index 8e9d10b60..4a1a25010 100755 --- a/pom.xml +++ b/pom.xml @@ -118,10 +118,9 @@ 2017 - AT&T Intellectual Property. All rights - reserved. + ONAP - openECOMP : SDN-C + ONAP : CCSDK true diff --git a/sli/common/pom.xml b/sli/common/pom.xml index 9a49e69e4..8b19891f0 100755 --- a/sli/common/pom.xml +++ b/sli/common/pom.xml @@ -108,8 +108,8 @@ **/*.xsd - org.openecomp.sdnc.sli.SvcLogicParser - org.openecomp.sdnc.sli + org.onap.ccsdk.sli.core.sli.SvcLogicParser + org.onap.ccsdk.sli.core.sli true @@ -121,7 +121,7 @@ true - org.openecomp.sdnc.sli;version=${project.version} + org.onap.ccsdk.sli.core.sli;version=${project.version} * *;scope=compile;artifactId=commons-lang|commons-lang3 true diff --git a/sli/common/src/main/antlr4/org/onap/ccsdk/sli/core/sli/ExprGrammar.g4 b/sli/common/src/main/antlr4/org/onap/ccsdk/sli/core/sli/ExprGrammar.g4 new file mode 100755 index 000000000..1b026bb1a --- /dev/null +++ b/sli/common/src/main/antlr4/org/onap/ccsdk/sli/core/sli/ExprGrammar.g4 @@ -0,0 +1,67 @@ + +grammar ExprGrammar; + +options { + language = Java; +} + + +COMPAREOP : '==' | '!=' | '>' | '<' | '>=' | '<='; + +RELOP : 'and' | 'or'; + +ADDOP : '+' | '-'; + +MULTOP : '/' | '*'; + +NUMBER : ('0'..'9')+; + +STRING : '\'' ~[\']* '\''; + +IDENTIFIER : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-')*; + +// CONTEXT_VAR : '$' IDENTIFIER; + +WS: [ \n\t\r]+ -> skip; + +constant : NUMBER | STRING ; + +variableLead : ('$')? variableTerm ; + +variableTerm : IDENTIFIER ('[' expr ']')? ; + +variable : variableLead ('.' variableTerm)* ('.')?; + +// variable : CONTEXT_VAR ( '[' expr ']' )? ('.' IDENTIFIER )? ; + +atom : constant | variable; + + +expr : atom + | parenExpr + | multExpr + | addExpr + | compareExpr + | relExpr + | funcExpr; + +parenExpr : '(' expr ')'; + +term : atom | parenExpr | funcExpr; + +multExpr : term (MULTOP term)*; + +addExpr : multExpr (ADDOP multExpr)*; + +compareExpr : addExpr COMPAREOP addExpr; + +relExpr : compareExpr (RELOP expr)*; + +funcExpr : IDENTIFIER '(' expr (',' expr)* ')'; + + + + + + + diff --git a/sli/common/src/main/antlr4/org/openecomp/sdnc/sli/ExprGrammar.g4 b/sli/common/src/main/antlr4/org/openecomp/sdnc/sli/ExprGrammar.g4 deleted file mode 100755 index 51f401690..000000000 --- a/sli/common/src/main/antlr4/org/openecomp/sdnc/sli/ExprGrammar.g4 +++ /dev/null @@ -1,66 +0,0 @@ -grammar ExprGrammar; - -options { - language = Java; -} - - -COMPAREOP : '==' | '!=' | '>' | '<' | '>=' | '<='; - -RELOP : 'and' | 'or'; - -ADDOP : '+' | '-'; - -MULTOP : '/' | '*'; - -NUMBER : ('0'..'9')+; - -STRING : '\'' ~[\']* '\''; - -IDENTIFIER : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-')*; - -// CONTEXT_VAR : '$' IDENTIFIER; - -WS: [ \n\t\r]+ -> skip; - -constant : NUMBER | STRING ; - -variableLead : ('$')? variableTerm ; - -variableTerm : IDENTIFIER ('[' expr ']')? ; - -variable : variableLead ('.' variableTerm)* ('.')?; - -// variable : CONTEXT_VAR ( '[' expr ']' )? ('.' IDENTIFIER )? ; - -atom : constant | variable; - - -expr : atom - | parenExpr - | multExpr - | addExpr - | compareExpr - | relExpr - | funcExpr; - -parenExpr : '(' expr ')'; - -term : atom | parenExpr | funcExpr; - -multExpr : term (MULTOP term)*; - -addExpr : multExpr (ADDOP multExpr)*; - -compareExpr : addExpr COMPAREOP addExpr; - -relExpr : compareExpr (RELOP expr)*; - -funcExpr : IDENTIFIER '(' expr (',' expr)* ')'; - - - - - - - diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/BreakNodeException.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/BreakNodeException.java new file mode 100644 index 000000000..d85514cbc --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/BreakNodeException.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +public class BreakNodeException extends SvcLogicException { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public BreakNodeException() + { + super(); + } + + public BreakNodeException(String message) + { + super(message); + } + + public BreakNodeException(String message, Throwable t) + { + super(message, t); + } + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/ConfigurationException.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/ConfigurationException.java new file mode 100644 index 000000000..7a8531008 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/ConfigurationException.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +public class ConfigurationException extends SvcLogicException { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public ConfigurationException() + { + super(); + } + + public ConfigurationException(String msg) + { + super(msg); + } + + public ConfigurationException(String msg, Throwable t) + { + super(msg, t); + } +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/DuplicateValueException.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/DuplicateValueException.java new file mode 100644 index 000000000..24d06a211 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/DuplicateValueException.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +public class DuplicateValueException extends SvcLogicException { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public DuplicateValueException() + { + super(); + } + + public DuplicateValueException(String message) + { + super(message); + } + + public DuplicateValueException(String message, Throwable t) + { + super(message, t); + } +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/MessageWriter.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/MessageWriter.java new file mode 100644 index 000000000..b9f9e5347 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/MessageWriter.java @@ -0,0 +1,301 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.File; +import java.io.FileInputStream; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Properties; + +import javax.sql.rowset.CachedRowSet; + +import org.onap.ccsdk.sli.core.dblib.DbLibService; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class MessageWriter { + + private static final Logger LOG = LoggerFactory.getLogger(MessageWriter.class); + + private static final String DBLIB_SERVICE = "org.onap.ccsdk.sli.core.dblib.DBResourceManager"; + private static final String SVCLOGIC_PROP_VAR = "SDNC_SLI_PROPERTIES"; + private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; + + private static final String INCOMING_PROPERTY_NAME = "org.onap.ccsdk.sli.MessageWriter.writeIncomingRequests"; + private static final String OUTGOING_PROPERTY_NAME = "org.onap.ccsdk.sli.MessageWriter.writeOutgoingRequests"; + + private static final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + + private static DbLibService dbLibService = null; + + private static boolean incomingEnabled = false; + private static boolean outgoingEnabled = false; + + private static boolean initialized = false; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static void init() { + if (initialized) + return; + + initialized = true; + + // Read properties + Properties props = new Properties(); + String propPath = System.getenv(SVCLOGIC_PROP_VAR); + + if (propPath == null) { + String propDir = System.getenv(SDNC_CONFIG_DIR); + if (propDir == null) { + propDir = "/opt/sdnc/data/properties"; + } + propPath = propDir + "/svclogic.properties"; + LOG.warn("Environment variable " + SVCLOGIC_PROP_VAR + " unset - defaulting to " + propPath); + } + + File propFile = new File(propPath); + + if (!propFile.exists()) { + LOG.warn("Property file does not exist: " + propPath); + } + + try { + props.load(new FileInputStream(propFile)); + } catch (Exception e) { + LOG.warn("Error loading property file: " + propPath, e); + } + + incomingEnabled = Boolean.valueOf(props.getProperty(INCOMING_PROPERTY_NAME, "false")); + outgoingEnabled = Boolean.valueOf(props.getProperty(OUTGOING_PROPERTY_NAME, "false")); + + LOG.info(INCOMING_PROPERTY_NAME + ": " + incomingEnabled); + LOG.info(OUTGOING_PROPERTY_NAME + ": " + outgoingEnabled); + + if (dbLibService != null) + return; + + BundleContext bctx = FrameworkUtil.getBundle(MessageWriter.class).getBundleContext(); + + ServiceReference sref = bctx.getServiceReference(DBLIB_SERVICE); + + if (sref == null) { + LOG.warn("Could not find service reference for DBLIB service (" + DBLIB_SERVICE + ")"); + } else { + dbLibService = (DbLibService) bctx.getService(sref); + if (dbLibService == null) { + LOG.warn("Could not find service reference for DBLIB service (" + DBLIB_SERVICE + ")"); + } + } + } + + public static void saveOutgoingRequest( + String requestId, + String serviceInstanceId, + String targetUrl, + String request) { + try { + init(); + + if (!outgoingEnabled) + return; + + if (serviceInstanceId == null || serviceInstanceId.trim().length() == 0) + serviceInstanceId = "NA"; + + int seqnum = getLastSequenceNumber("OUTGOING_MESSAGE", requestId) + 1; + String now = df.format(new Date()); + + String sql = "INSERT INTO OUTGOING_MESSAGE (\n" + + " request_id, sequence_number, service_instance_id, target_url, request, start_time)\n" + + "VALUES (?, ?, ?, ?, ?, ?)"; + + ArrayList data = new ArrayList<>(); + data.add(requestId); + data.add(String.valueOf(seqnum)); + data.add(serviceInstanceId); + data.add(targetUrl); + data.add(request); + data.add(now); + + dbLibService.writeData(sql, data, null); + + } catch (Exception e) { + LOG.warn("Failed to save outgoing request for request-id: " + requestId, e); + } + } + + public static void saveOutgoingResponse(String requestId, int httpResponseCode, String response) { + try { + init(); + + if (!outgoingEnabled) + return; + + int seqnum = getLastSequenceNumber("OUTGOING_MESSAGE", requestId); + if (seqnum == 0) { + LOG.warn("Failed to save outgoing response for request-id: " + requestId + + ": Request record not found in OUTGOING_MESSAGE"); + return; + } + + String now = df.format(new Date()); + + String sql = "UPDATE OUTGOING_MESSAGE SET http_response_code = ?, response = ?,\n" + + " duration = timestampdiff(MICROSECOND, start_time, ?) / 1000\n" + + "WHERE request_id = ? AND sequence_number = ?"; + + ArrayList data = new ArrayList<>(); + data.add(String.valueOf(httpResponseCode)); + data.add(response); + data.add(now); + data.add(requestId); + data.add(String.valueOf(seqnum)); + + dbLibService.writeData(sql, data, null); + + } catch (Exception e) { + LOG.warn("Failed to save outgoing response for request-id: " + requestId, e); + } + } + + public static void saveIncomingRequest( + String requestId, + String serviceInstanceId, + String requestHost, + String request) { + try { + init(); + + if (!incomingEnabled) + return; + + if (serviceInstanceId == null || serviceInstanceId.trim().length() == 0) + serviceInstanceId = "NA"; + + int seqnum = getLastSequenceNumber("INCOMING_MESSAGE", requestId) + 1; + String now = df.format(new Date()); + + String sql = "INSERT INTO INCOMING_MESSAGE (\n" + + " request_id, sequence_number, service_instance_id, request_host, request, start_time)\n" + + "VALUES (?, ?, ?, ?, ?, ?)"; + + ArrayList data = new ArrayList<>(); + data.add(requestId); + data.add(String.valueOf(seqnum)); + data.add(serviceInstanceId); + data.add(requestHost); + data.add(request); + data.add(now); + + dbLibService.writeData(sql, data, null); + + } catch (Exception e) { + LOG.warn("Failed to save incoming request for request-id: " + requestId, e); + } + } + + public static void saveIncomingResponse(String requestId, int httpResponseCode, String response) { + try { + init(); + + if (!incomingEnabled) + return; + + int seqnum = getLastSequenceNumber("INCOMING_MESSAGE", requestId); + if (seqnum == 0) { + LOG.warn("Failed to save response for request-id: " + requestId + + ": Request record not found in INCOMING_MESSAGE"); + return; + } + + String now = df.format(new Date()); + + String sql = "UPDATE INCOMING_MESSAGE SET http_response_code = ?, response = ?,\n" + + " duration = timestampdiff(MICROSECOND, start_time, ?) / 1000\n" + + "WHERE request_id = ? AND sequence_number = ?"; + + ArrayList data = new ArrayList<>(); + data.add(String.valueOf(httpResponseCode)); + data.add(response); + data.add(now); + data.add(requestId); + data.add(String.valueOf(seqnum)); + + dbLibService.writeData(sql, data, null); + + } catch (Exception e) { + LOG.warn("Failed to save response for request-id: " + requestId, e); + } + } + + public static String getServiceInstanceId(String requestId) throws SQLException { + init(); + + String sql = "SELECT service_instance_id FROM OUTGOING_MESSAGE WHERE request_id = '" + requestId + + "' ORDER BY sequence_number DESC"; + + CachedRowSet rs = null; + try { + rs = dbLibService.getData(sql, null, null); + if (rs.next()) { + return rs.getString("service_instance_id"); + } + } finally { + if (rs != null) { + try { + rs.close(); + } catch (Exception e) { + LOG.warn("Failed to close CachedRowSet", e); + } + } + } + return null; + } + + private static int getLastSequenceNumber(String tableName, String requestId) throws SQLException { + String sql = "SELECT sequence_number FROM " + tableName + " WHERE request_id = '" + requestId + + "' ORDER BY sequence_number DESC"; + + CachedRowSet rs = null; + try { + rs = dbLibService.getData(sql, null, null); + if (rs.next()) { + return rs.getInt("sequence_number"); + } + } finally { + if (rs != null) { + try { + rs.close(); + } catch (Exception e) { + LOG.warn("Failed to close CachedRowSet", e); + } + } + } + return 0; + } +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/MetricLogger.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/MetricLogger.java new file mode 100644 index 000000000..7d1250c03 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/MetricLogger.java @@ -0,0 +1,300 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.net.InetAddress; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + +/** + * @author dt5972 + * + */ +public class MetricLogger { + + private static final Logger KARAF = LoggerFactory.getLogger(MetricLogger.class); + private static final Logger METRIC = LoggerFactory.getLogger("org.onap.ccsdk.sli.filters.metric"); + + public static final String BEGIN_TIMESTAMP = "X-ECOMP-BeginTimestamp"; + public static final String END_TIMESTAMP = "X-ECOMP-EndTimestamp"; + public static final String REQUEST_ID = "X-ECOMP-RequestID"; + public static final String SERVICE_INSTANCE_ID = "X-ECOMP-ServiceInstanceID"; + public static final String SERVICE_NAME = "X-ECOMP-ServiceName"; + public static final String PARTNER_NAME = "X-ECOMP-PartnerName"; + public static final String TARGET_ENTITY = "X-ECOMP-TargetEntity"; + public static final String TARGET_SERVICE_NAME = "X-ECOMP-TargetServiceName"; + public static final String STATUS_CODE = "X-ECOMP-StatusCode"; + public static final String RESPONSE_CODE = "X-ECOMP-ResponseCode"; + public static final String RESPONSE_DESCRIPTION = "X-ECOMP-ResponseDescription"; + public static final String INSTANCE_UUID = "X-ECOMP-InstanceUUID"; + public static final String CATEGORY_LOG_LEVEL = "X-ECOMP-CategoryLogLevel"; + public static final String SEVERITY = "X-ECOMP-Severity"; + public static final String SERVER_IP_ADDRESS = "X-ECOMP-ServerIpAddress"; + public static final String ELAPSED_TIME = "X-ECOMP-ElapsedTime"; + public static final String SERVER = "X-ECOMP-Server"; + public static final String CLIENT_IP = "X-ECOMP-ClientIp"; + public static final String CLASS_NAME = "X-ECOMP-ClassName"; + public static final String TARGET_VIRTUAL_ENTITY = "X-ECOMP-TargetVirtualEntity"; + + private long beginTimestamp; + private String lastMsg = null; + + public MetricLogger() { + beginTimestamp = System.currentTimeMillis(); + + try { + InetAddress localhost = InetAddress.getLocalHost(); + setServerIpAddress(localhost.getHostAddress()); + setServer(localhost.getCanonicalHostName()); + } catch (Exception e) { + KARAF.error("Could not get localhost", e); + } + + } + + + public String getBeginTimestamp() { + return MDC.get(BEGIN_TIMESTAMP); + } + + private void setBeginTimestamp(long beginTimestamp) { + this.beginTimestamp = beginTimestamp; + MDC.put(BEGIN_TIMESTAMP, MetricLogger.asIso8601(beginTimestamp)); + } + + public String getEndTimestamp() { + return MDC.get(END_TIMESTAMP); + } + + private void setEndTimestamp(long endTimestamp) { + // Set MDC with formatted time stamp + MDC.put(END_TIMESTAMP, MetricLogger.asIso8601(endTimestamp)); + + // Set elapsed time + setElapsedTime(endTimestamp - beginTimestamp); + + } + + public String getRequestID() { + return MDC.get(REQUEST_ID); + } + + + public String getServiceInstanceID() { + return MDC.get(SERVICE_INSTANCE_ID); + } + + private void setServiceInstanceID(String svcInstanceId) { + MDC.put(SERVICE_INSTANCE_ID, svcInstanceId); + } + + public String getServiceName() { + return MDC.get(SERVICE_NAME); + } + + private void setServiceName(String svcName) { + MDC.put(SERVICE_NAME, svcName); + } + + public String getPartnerName() { + return MDC.get(PARTNER_NAME); + } + + private void setPartnerName(String partnerName) { + MDC.put(PARTNER_NAME, partnerName); + } + + public String getTargetEntity() { + return MDC.get(TARGET_ENTITY); + } + + private void setTargetEntity(String targetEntity) { + MDC.put(TARGET_ENTITY, targetEntity); + } + + public String getTargetServiceName() { + return MDC.get(TARGET_SERVICE_NAME); + } + + private void setTargetServiceName(String targetServiceName) { + MDC.put(TARGET_SERVICE_NAME, targetServiceName); + } + + public String getStatusCode() { + return MDC.get(STATUS_CODE); + } + + private void setStatusCode(String statusCode) { + MDC.put(STATUS_CODE, statusCode); + } + + public String getResponseCode() { + return MDC.get(RESPONSE_CODE); + } + + private void setResponseCode(String responseCode) { + MDC.put(RESPONSE_CODE, responseCode); + } + + public String getResponseDescription() { + return MDC.get(RESPONSE_DESCRIPTION); + } + + private void setResponseDescription(String responseDesc) { + MDC.put(RESPONSE_DESCRIPTION, responseDesc); + } + + public String getInstanceUUID() { + return MDC.get(INSTANCE_UUID); + } + + private void setInstanceUUID(String instanceUUID) { + MDC.put(INSTANCE_UUID, instanceUUID); + } + + public String getCategoryLogLevel() { + return MDC.get(CATEGORY_LOG_LEVEL); + } + + private void setCategoryLogLevel(String categoryLogLevel) { + MDC.put(CATEGORY_LOG_LEVEL, categoryLogLevel); + } + + public String getSeverity() { + return MDC.get(SEVERITY); + } + + private void setSeverity(String severity) { + MDC.put(SEVERITY, severity); + } + + public String getServerIpAddress() { + return MDC.get(SERVER_IP_ADDRESS); + } + + private void setServerIpAddress(String serverIpAddress) { + MDC.put(SERVER_IP_ADDRESS, serverIpAddress); + } + + public String getElapsedTime() { + return MDC.get(ELAPSED_TIME); + } + + private void setElapsedTime(long elapsedTime) { + MDC.put(ELAPSED_TIME, ""+elapsedTime); + } + + public String getServer() { + return MDC.get(SERVER); + } + + private void setServer(String server) { + MDC.put(SERVER, server); + } + + public String getClientIp() { + return MDC.get(CLIENT_IP); + } + + private void setClientIp(String clientIp) { + MDC.put(CLIENT_IP, clientIp); + } + + public String getClassName() { + return MDC.get(CLASS_NAME); + } + + private void setClassName(String className) { + MDC.put(CLASS_NAME, className); + } + + public String getTargetVirtualEntity() { + return MDC.get(TARGET_VIRTUAL_ENTITY); + } + + private void setTargetVirtualEntity(String targetVirtualEntity) { + MDC.put(TARGET_VIRTUAL_ENTITY, targetVirtualEntity); + } + + public static String asIso8601(Date date) { + TimeZone tz = TimeZone.getTimeZone("UTC"); + DateFormat df = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss:SS'+00:00'"); + df.setTimeZone(tz); + return df.format(date); + } + + public static String asIso8601(long tsInMillis) { + return MetricLogger.asIso8601(new Date(tsInMillis)); + } + + public void logRequest(String svcInstanceId, String svcName, String partnerName, String targetEntity, String targetServiceName, String targetVirtualEntity, String msg) { + + setBeginTimestamp(System.currentTimeMillis()); + + if (svcInstanceId != null) { + setServiceInstanceID(svcInstanceId); + } + + if (svcName != null) { + setServiceName(svcName); + } + + if (partnerName != null) { + setPartnerName(partnerName); + } + + if (targetEntity != null) { + setTargetEntity(targetEntity); + } + + if (targetServiceName != null) { + setTargetServiceName(targetServiceName); + } + + if (targetVirtualEntity != null) { + setTargetVirtualEntity(targetVirtualEntity); + } + + this.lastMsg = msg; + + + } + + public void logResponse(String statusCode, String responseCode, String responseDescription) { + setEndTimestamp(System.currentTimeMillis()); + + setStatusCode(statusCode); + setResponseCode(responseCode); + setResponseDescription(responseDescription); + + METRIC.info(lastMsg); + + } +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicAdaptor.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicAdaptor.java new file mode 100644 index 000000000..3a3dd75d3 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicAdaptor.java @@ -0,0 +1,41 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.util.Map; + +public interface SvcLogicAdaptor { + + public enum ConfigStatus { + SUCCESS, + ALREADY_ACTIVE, + NOT_FOUND, + NOT_READY, + FAILURE + } + + public ConfigStatus configure(String key, Map parameters, SvcLogicContext ctx); + + public ConfigStatus activate(String key, SvcLogicContext ctx); + + public ConfigStatus deactivate(String key, SvcLogicContext ctx); + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicAtom.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicAtom.java new file mode 100644 index 000000000..47912397c --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicAtom.java @@ -0,0 +1,173 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; + +public class SvcLogicAtom extends SvcLogicExpression { + + public enum AtomType { + NUMBER, + STRING, + IDENTIFIER, + CONTEXT_VAR + + } + + private AtomType atomType; + private String atom; + + + public SvcLogicAtom(String atomType, String atom) + { + this.atomType = AtomType.valueOf(atomType); + this.atom = atom; + + } + + public SvcLogicAtom(String atom) + { + + if (atom == null) + { + this.atomType = null; + this.atom = null; + } + else + { + if (atom.startsWith("$")) + { + this.atomType = AtomType.CONTEXT_VAR; + this.atom = atom.substring(1); + } + else + { + if (Character.isDigit(atom.charAt(0))) + { + this.atomType = AtomType.NUMBER; + this.atom = atom; + } + else if (atom.charAt(0) == '\'') + { + this.atomType = AtomType.STRING; + this.atom = atom.substring(1, atom.length()-1); + } + else + { + this.atomType = AtomType.IDENTIFIER; + this.atom = atom; + + } + + } + } + } + + public AtomType getAtomType() { + return atomType; + } + + public void setAtomType(String newType) + { + atomType = AtomType.valueOf(newType); + } + + public String getAtom() { + return atom; + } + + + + public void setAtomType(AtomType atomType) { + this.atomType = atomType; + } + + public void setAtom(String atom) { + this.atom = atom; + } + + + + public String toString() + { + StringBuffer sbuff = new StringBuffer(); + switch(getAtomType()) + { + case CONTEXT_VAR: + sbuff.append("$"); + case IDENTIFIER: + boolean needDot = false; + for (SvcLogicExpression term: this.getOperands()) + { + if (needDot) + { + sbuff.append("."); + } + sbuff.append(term.toString()); + needDot = true; + } + return(sbuff.toString()); + case STRING: + case NUMBER: + default: + return(atom); + } + } + + public String asParsedExpr() + { + // simplify debugging output for NUMBER type + if (atomType == AtomType.NUMBER) { + return atom; + } + + StringBuffer sbuff = new StringBuffer(); + + sbuff.append("(atom"); + sbuff.append("<"); + sbuff.append(atomType.toString()); + sbuff.append(">"); + + switch(atomType) + { + case IDENTIFIER: + case CONTEXT_VAR: + for (SvcLogicExpression term : getOperands()) + { + sbuff.append(" "); + sbuff.append(term.asParsedExpr()); + + } + break; + default: + sbuff.append(" "); + sbuff.append(atom); + } + + sbuff.append(")"); + return(sbuff.toString()); + } + + + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicBinaryExpression.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicBinaryExpression.java new file mode 100644 index 000000000..ee2a24358 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicBinaryExpression.java @@ -0,0 +1,148 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.util.LinkedList; +import java.util.List; + +public class SvcLogicBinaryExpression extends SvcLogicExpression { + + + public enum OperatorType { + addOp("+"), + subOp("-"), + multOp("*"), + divOp("/"), + equalOp("=="), + ltOp("<"), + leOp("<="), + gtOp(">"), + geOp(">="), + neOp("!="), + andOp("and"), + orOp("or"); + + private String text; + + private OperatorType(String text) + { + this.text = text; + } + + public String getText() + { + return(text); + } + + public static OperatorType fromString(String text) + { + if (text != null) + { + for (OperatorType t : OperatorType.values()) + { + if (text.equalsIgnoreCase(t.getText())) { + + return(t); + } + } + } + return(null); + } + + public String toString() + { + return(text); + } + } + private List operators; + + public List getOperators() { + return operators; + } + + public SvcLogicBinaryExpression() + { + operators = new LinkedList(); + } + + public void addOperator(String operator) + { + operators.add(OperatorType.fromString(operator)); + } + + + public String toString() + { + + Listoperands = getOperands(); + StringBuffer sbuff = new StringBuffer(); + + sbuff.append(operands.get(0).toString()); + for (int i = 0 ; i < operators.size(); i++) + { + sbuff.append(" "); + sbuff.append(operators.get(i)); + sbuff.append(" "); + if (i + 1 < operands.size()) { + sbuff.append(operands.get(i + 1).toString()); + } else { + // expression incomplete; operand not bound yet + sbuff.append("?"); + } + } + + return(sbuff.toString()); + + } + + public String asParsedExpr() { + + List operands = getOperands(); + + if (operators.isEmpty()) { + return operands.get(0).asParsedExpr(); + } else { + StringBuffer sbuff = new StringBuffer(); + // operators in reverse order for left associativity + for (int i = operators.size() - 1; i >= 0; --i) { + sbuff.append("("); + sbuff.append(operators.get(i).getText()); + sbuff.append(" "); + } + for (int i = 0; i < operators.size() + 1; ++i) { + if (i < operands.size()) { + sbuff.append(operands.get(i).asParsedExpr()); + } else { + // expression incomplete; operand not bound yet + sbuff.append("?"); + } + if (i != 0) { + sbuff.append(")"); + } + if (i < operators.size()) { + sbuff.append(" "); + } + } + return sbuff.toString(); + } + } + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java new file mode 100644 index 000000000..b5892eff5 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java @@ -0,0 +1,247 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; + + +public class SvcLogicContext { + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicContext.class); + + private HashMap attributes; + + private DOMDataBroker domDataBroker; + + private String status = "success"; + + public SvcLogicContext() + { + this.attributes = new HashMap (); + + } + + public SvcLogicContext(Properties props) + { + this.attributes = new HashMap (); + + if (props.containsKey("SvcLogic.status")) + { + this.status = props.getProperty("SvcLogic.status"); + } + + for (Object nameObj : props.keySet()) + { + String propName = (String) nameObj; + attributes.put(propName, props.getProperty(propName)); + } + } + + + + public DOMDataBroker getDomDataBroker() { + return domDataBroker; + } + + public void setDomDataBroker(DOMDataBroker domDataBroker) { + this.domDataBroker = domDataBroker; + } + + public String getAttribute(String name) + { + if (attributes.containsKey(name)) + { + return(attributes.get(name)); + } + else + { + return(null); + } + } + + public void setAttribute(String name, String value) + { + if (value == null) { + if (attributes.containsKey(name)) { + attributes.remove(name); + } + } else { + attributes.put(name, value); + } + } + + public Set getAttributeKeySet() + { + return(attributes.keySet()); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Properties toProperties() + { + Properties props = new Properties(); + + if (status != null) + { + props.setProperty("SvcLogic.status", status); + } + + for (String attrName : attributes.keySet()) + { + String attrVal = attributes.get(attrName); + if (attrVal == null) { + LOG.warn("attribute " + attrName + + "null - setting to empty string"); + props.setProperty(attrName, ""); + } else { + props.setProperty(attrName, attributes.get(attrName)); + } + } + + return(props); + } + + public void mergeDocument(String pfx, Document doc) { + String prefix = ""; + + if (pfx != null) { + prefix = pfx; + } + + Element root = doc.getDocumentElement(); + + mergeElement(prefix, root, null); + } + + public void mergeElement(String pfx, Element element, Map nodeMap) { + + // In XML, cannot tell the difference between containers and lists. + // So, have to treat each element as both (ugly but necessary). + // We do this by passing a nodeMap to be used to count instance of each tag, + // which will be used to set _length and to set index + + LOG.trace("mergeElement("+pfx+","+element.getTagName()+","+nodeMap+")"); + + String curTagName = element.getTagName(); + String prefix = curTagName; + + if (pfx != null) { + prefix = pfx + "." + prefix; + } + + int myIdx = 0; + + if (nodeMap != null) { + if (nodeMap.containsKey(curTagName)) { + myIdx = nodeMap.get(curTagName).intValue(); + } + + nodeMap.put(curTagName, new Integer(myIdx+1)); + this.setAttribute(prefix+"_length", ""+(myIdx+1)); + } + + NodeList children = element.getChildNodes(); + + int numChildren = children.getLength(); + + Map childMap = new HashMap(); + Map idxChildMap = new HashMap(); + + for (int i = 0 ; i < numChildren ; i++) { + Node curNode = children.item(i); + + if (curNode instanceof Text) { + Text curText = (Text) curNode; + String curTextValue = curText.getTextContent(); + LOG.trace("Setting ctx variable "+prefix+" = "+curTextValue); + this.setAttribute(prefix, curText.getTextContent()); + + + } else if (curNode instanceof Element) { + mergeElement(prefix, (Element) curNode, childMap); + if (nodeMap != null) { + + mergeElement(prefix+"["+myIdx+"]", (Element)curNode, idxChildMap); + + } + } + } + + } + + public String resolve(String ctxVarName) { + + if (ctxVarName.indexOf('[') == -1) { + // Ctx variable contains no arrays + return (this.getAttribute(ctxVarName)); + } + + // Resolve any array references + StringBuffer sbuff = new StringBuffer(); + String[] ctxVarParts = ctxVarName.split("\\["); + sbuff.append(ctxVarParts[0]); + for (int i = 1; i < ctxVarParts.length; i++) { + if (ctxVarParts[i].startsWith("$")) { + int endBracketLoc = ctxVarParts[i].indexOf("]"); + if (endBracketLoc == -1) { + // Missing end bracket ... give up parsing + LOG.warn("Variable reference " + ctxVarName + + " seems to be missing a ']'"); + return (this.getAttribute(ctxVarName)); + } + + String idxVarName = ctxVarParts[i].substring(1, endBracketLoc); + String remainder = ctxVarParts[i].substring(endBracketLoc); + + sbuff.append("["); + sbuff.append(this.getAttribute(idxVarName)); + sbuff.append(remainder); + + } else { + // Index is not a variable reference + sbuff.append("["); + sbuff.append(ctxVarParts[i]); + } + } + + return (this.getAttribute(sbuff.toString())); + } + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicDblibStore.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicDblibStore.java new file mode 100644 index 000000000..ac656ffa8 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicDblibStore.java @@ -0,0 +1,532 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.sql.Blob; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Properties; + +import javax.sql.rowset.CachedRowSet; + +import org.onap.ccsdk.sli.core.dblib.DBResourceManager; +import org.onap.ccsdk.sli.core.dblib.DbLibService; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SvcLogicDblibStore implements SvcLogicStore { + + private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicDblibStore.class); + + private static final String DBLIB_SERVICE = + // "org.openecomp.sdnc.sli.resource.dblib.DBLibService"; + "org.openecomp.sdnc.sli.resource.dblib.DBResourceManager"; + + Properties props = null; + + public void init(Properties props) throws ConfigurationException { + + DbLibService dbSvc = getDbLibService(); + if(dbSvc == null) { + LOG.error("SvcLogic cannot acquire DBLIB_SERVICE"); + return; + } + try { + dbSvc.getData("select 1 from DUAL", new ArrayList(), null); + LOG.debug("SQL test was successful"); + } catch (SQLException e) { + LOG.error("Failed SQL test", e); + } + } + + public boolean hasGraph(String module, String rpc, String version, + String mode) throws SvcLogicException { + + DbLibService dbSvc = getDbLibService(); + + boolean retval = false; + CachedRowSet results = null; + String hasVersionGraphSql = "SELECT count(*) FROM SVC_LOGIC" + + " WHERE module = ? AND rpc = ? AND mode = ? AND version = ?"; + + String hasActiveGraphSql = "SELECT count(*) FROM SVC_LOGIC" + + " WHERE module = ? AND rpc = ? AND mode = ? AND active = 'Y'"; + + PreparedStatement hasGraphStmt = null; + + ArrayList args = new ArrayList(); + args.add(module); + args.add(rpc); + args.add(mode); + + try { + + if (version == null) { + results = dbSvc.getData(hasActiveGraphSql, args, null); + } else { + args.add(version); + results = dbSvc.getData(hasVersionGraphSql, args, null); + } + + if (results.next()) { + int cnt = results.getInt(1); + + if (cnt > 0) { + retval = true; + } + + } + } catch (Exception e) { + throw new ConfigurationException("SQL query failed", e); + } finally { + if (results != null) { + try { + + results.close(); + } catch (SQLException x) { + } + } + + } + + return (retval); + + } + + public SvcLogicGraph fetch(String module, String rpc, String version, + String mode) throws SvcLogicException { + + DbLibService dbSvc = getDbLibService(); + + Connection dbConn = null; + SvcLogicGraph retval = null; + ResultSet results = null; + + String fetchVersionGraphSql = "SELECT graph FROM SVC_LOGIC" + + " WHERE module = ? AND rpc = ? AND mode = ? AND version = ?"; + + String fetchActiveGraphSql = "SELECT graph FROM SVC_LOGIC" + + " WHERE module = ? AND rpc = ? AND mode = ? AND active = 'Y'"; + + + try { + dbConn = ((DBResourceManager) dbSvc).getConnection(); + PreparedStatement fetchGraphStmt; + + ArrayList args = new ArrayList(); + args.add(module); + args.add(rpc); + args.add(mode); + + if (version == null) { + fetchGraphStmt = dbConn.prepareStatement(fetchActiveGraphSql); + } else { + fetchGraphStmt = dbConn.prepareStatement(fetchVersionGraphSql); + } + + fetchGraphStmt.setString(1, module); + fetchGraphStmt.setString(2, rpc); + fetchGraphStmt.setString(3, mode); + if (version != null) { + fetchGraphStmt.setString(4,version); + } + + results = fetchGraphStmt.executeQuery(); + + if (results.next()) { + Blob graphBlob = results.getBlob("graph"); + + ObjectInputStream gStream = new ObjectInputStream( + graphBlob.getBinaryStream()); + + Object graphObj = gStream.readObject(); + gStream.close(); + + if (graphObj instanceof SvcLogicGraph) { + retval = (SvcLogicGraph) graphObj; + } else { + throw new ConfigurationException("invalid type for graph (" + + graphObj.getClass().getName()); + + } + + } else { + return (null); + } + } catch (SQLException e) { + throw new ConfigurationException("SQL query failed", e); + } catch (Exception e) { + throw new ConfigurationException("Graph processing failed", e); + } finally { + if (results != null) { + try { + results.close(); + } catch (SQLException x) { + } + } + try { + if (dbConn != null && !dbConn.isClosed()) { + dbConn.close(); + } + } catch (Throwable exc) { + // the exception not monitored + } finally { + dbConn = null; + } + + } + + return (retval); + + } + + public void store(SvcLogicGraph graph) throws SvcLogicException { + + DbLibService dbSvc = getDbLibService(); + + String storeGraphSql = "INSERT INTO SVC_LOGIC (module, rpc, version, mode, active, graph)" + + " VALUES(?, ?, ?, ?, ?, ?)"; + + if (graph == null) { + throw new SvcLogicException("graph cannot be null"); + } + + byte[] graphBytes = null; + + ByteArrayOutputStream byteStr = null; + ObjectOutputStream goutStr = null; + + try { + byteStr = new ByteArrayOutputStream(); + goutStr = new ObjectOutputStream(byteStr); + goutStr.writeObject(graph); + + graphBytes = byteStr.toByteArray(); + + } catch (Exception e) { + throw new SvcLogicException("could not serialize graph", e); + } finally { + + if (goutStr != null) { + try { + goutStr.close(); + } catch (IOException e) { + + } + } + + if (byteStr != null) { + try { + byteStr.close(); + } catch (IOException e) { + + } + } + } + + // If object already stored in database, delete it + if (hasGraph(graph.getModule(), graph.getRpc(), graph.getVersion(), + graph.getMode())) { + delete(graph.getModule(), graph.getRpc(), graph.getVersion(), + graph.getMode()); + } + + Connection dbConn = null; + + try { + dbConn = ((DBResourceManager) dbSvc).getConnection(); + boolean oldAutoCommit = dbConn.getAutoCommit(); + dbConn.setAutoCommit(false); + PreparedStatement storeGraphStmt = dbConn + .prepareStatement(storeGraphSql); + storeGraphStmt.setString(1, graph.getModule()); + storeGraphStmt.setString(2, graph.getRpc()); + storeGraphStmt.setString(3, graph.getVersion()); + storeGraphStmt.setString(4, graph.getMode()); + storeGraphStmt.setString(5, "N"); + storeGraphStmt.setBlob(6, new ByteArrayInputStream(graphBytes)); + + storeGraphStmt.executeUpdate(); + dbConn.commit(); + + dbConn.setAutoCommit(oldAutoCommit); + } catch (Exception e) { + throw new SvcLogicException("Could not write object to database", e); + } finally { + try { + if (dbConn != null && !dbConn.isClosed()) { + dbConn.close(); + } + } catch (Throwable exc) { + // the exception not monitored + } finally { + dbConn = null; + } + + } + } + + public void delete(String module, String rpc, String version, String mode) + throws SvcLogicException { + + DbLibService dbSvc = getDbLibService(); + + String deleteGraphSql = "DELETE FROM SVC_LOGIC WHERE module = ? AND rpc = ? AND version = ? AND mode = ?"; + + ArrayList args = new ArrayList(); + + args.add(module); + args.add(rpc); + args.add(version); + args.add(mode); + + try { + dbSvc.writeData(deleteGraphSql, args, null); + } catch (Exception e) { + throw new SvcLogicException( + "Could not delete object from database", e); + } + } + + public void activate(SvcLogicGraph graph) throws SvcLogicException { + DbLibService dbSvc = getDbLibService(); + + String deactivateSql = "UPDATE SVC_LOGIC SET active = 'N' WHERE module = ? AND rpc = ? AND mode = ?"; + + String activateSql = "UPDATE SVC_LOGIC SET active = 'Y' WHERE module = ? AND rpc = ? AND mode = ? AND version = ?"; + + ArrayList args = new ArrayList(); + + args.add(graph.getModule()); + args.add(graph.getRpc()); + args.add(graph.getMode()); + + try { + + dbSvc.writeData(deactivateSql, args, null); + + args.add(graph.getVersion()); + dbSvc.writeData(activateSql, args, null); + + } catch (Exception e) { + throw new SvcLogicException("Could not activate graph", e); + } + } + + @Override + public void registerNodeType(String nodeType) throws SvcLogicException { + + String registerNodeSql = "INSERT INTO NODE_TYPES (nodetype) VALUES(?)"; + + if (isValidNodeType(nodeType)) { + return; + } + + DbLibService dbSvc = getDbLibService(); + ArrayList args = new ArrayList(); + + args.add(nodeType); + + try { + dbSvc.writeData(registerNodeSql, args, null); + } catch (Exception e) { + throw new SvcLogicException("Could not add node type to database", + e); + } + + } + + @Override + public void unregisterNodeType(String nodeType) throws SvcLogicException { + + if (!isValidNodeType(nodeType)) { + return; + } + + String unregisterNodeSql = "DELETE FROM NODE_TYPES WHERE nodetype = ?"; + + DbLibService dbSvc = getDbLibService(); + ArrayList args = new ArrayList(); + + args.add(nodeType); + + try { + dbSvc.writeData(unregisterNodeSql, args, null); + } catch (Exception e) { + throw new SvcLogicException( + "Could not delete node type from database", e); + } + + } + + @Override + public boolean isValidNodeType(String nodeType) throws SvcLogicException { + + String validateNodeSql = "SELECT count(*) FROM NODE_TYPES WHERE nodetype = ?"; + + DbLibService dbSvc = getDbLibService(); + + ArrayList args = new ArrayList(); + + args.add(nodeType); + + boolean isValid = false; + + CachedRowSet results = null; + try { + results = dbSvc.getData(validateNodeSql, args, null); + if (results != null) { + if (results.next()) { + int cnt = results.getInt(1); + + if (cnt > 0) { + isValid = true; + } + } + } + } catch (Exception e) { + throw new SvcLogicException( + "Cannot select node type from database", e); + } finally { + if (results != null) { + try { + results.close(); + } catch (SQLException x) { + } + } + + } + + return (isValid); + } + + private DbLibService getDbLibService() { + + // Get DbLibService interface object. + DbLibService dblibSvc = null; + ServiceReference sref = null; + BundleContext bctx = null; + + Bundle bundle = FrameworkUtil.getBundle(SvcLogicDblibStore.class); + + if (bundle != null) { + bctx = bundle.getBundleContext(); + + if (bctx != null) { + sref = bctx.getServiceReference(DBLIB_SERVICE); + } + + if (sref == null) { + LOG.warn("Could not find service reference for DBLIB service (" + + DBLIB_SERVICE + ")"); + } else { + dblibSvc = (DbLibService) bctx.getService(sref); + if (dblibSvc == null) { + + LOG.warn("Could not find service reference for DBLIB service (" + + DBLIB_SERVICE + ")"); + } + } + } + + // initialize a stand-alone instance of dblib resource + else { + // Try to create a DbLibService object from dblib properties + if(JavaSingleton.getInstance() == null){ + Properties dblibProps = new Properties(); + + String propDir = System.getenv(SDNC_CONFIG_DIR); + if (propDir == null) { + + propDir = "/opt/sdnc/data/properties"; + } + String propPath = propDir + "/dblib.properties"; + + File propFile = new File(propPath); + + if (!propFile.exists()) { + + LOG.warn( + "Missing configuration properties file : " + + propFile); + return(null); + } + + try { + + dblibProps.load(new FileInputStream(propFile)); + } catch (Exception e) { + LOG.warn( + "Could not load properties file " + propPath, e); + return(null); + + } + + try { + dblibSvc = DBResourceManager.create(dblibProps); + JavaSingleton.setInstance(dblibSvc); + } catch (Exception e) { + LOG.warn("Caught exception trying to create DBResourceManager", e); + } + } else { + dblibSvc = JavaSingleton.getInstance(); + } + } + return (dblibSvc); + } + + + static class JavaSingleton { + /* Private constructor */ + private JavaSingleton() { + /* the body of the constructor here */ + } + + /* instance of the singleton declaration */ + private static volatile DbLibService INSTANCE ; + + /* Access point to the unique instance of the singleton */ + public static DbLibService getInstance() { + return INSTANCE; + } + + public static void setInstance(DbLibService dbresource) { + INSTANCE = dbresource; + } + } +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicException.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicException.java new file mode 100644 index 000000000..198f8d577 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicException.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +public class SvcLogicException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public SvcLogicException() + { + super(); + } + + public SvcLogicException(String message) + { + super(message); + } + + public SvcLogicException(String message, Throwable t) + { + super(message, t); + } + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExprListener.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExprListener.java new file mode 100644 index 000000000..0dda84697 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExprListener.java @@ -0,0 +1,315 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.util.LinkedList; +import java.util.List; + +import org.antlr.v4.runtime.tree.TerminalNode; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.AddExprContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.AtomContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.CompareExprContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.ConstantContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.ExprContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.FuncExprContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.MultExprContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.ParenExprContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.RelExprContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.VariableContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.VariableLeadContext; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.VariableTermContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SvcLogicExprListener extends ExprGrammarBaseListener +{ + + + + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicExprListener.class); + + private SvcLogicExpression curExpr; + private SvcLogicExpression topExpr; + private LinkedList exprStack; + + public SvcLogicExprListener() + { + exprStack = new LinkedList(); + } + + public SvcLogicExpression getParsedExpr() + { + return(curExpr); + } + + private void pushOperand(SvcLogicExpression operand) + { + if (curExpr == null) + { + curExpr = operand; + } + else + { + curExpr.addOperand(operand); + } + } + + private void pushExpr(SvcLogicExpression expr) + { + LOG.trace("Pushing expression ["+expr.getClass().getName()+"]"); + if (curExpr != null) + { + exprStack.push(curExpr); + } + curExpr = expr; + } + + private void popExpr() + { + if (exprStack.isEmpty()) + { + LOG.trace("Popping last expression"); + topExpr = curExpr; + } + else + { + SvcLogicExpression lastExpr = curExpr; + curExpr = exprStack.pop(); + curExpr.addOperand(lastExpr); + LOG.trace("New curExpr is ["+curExpr.getClass().getName()+"]"); + } + + } + + @Override + public void enterAtom(AtomContext ctx) { + + String atomText = ctx.getText(); + + LOG.trace("enterAtom: text = "+atomText); + + + SvcLogicAtom newAtom = new SvcLogicAtom(atomText); + + pushExpr(newAtom); + } + + + @Override + public void enterMultExpr(MultExprContext ctx) { + LOG.trace("enterMultExpr: text = "+ctx.getText()); + + SvcLogicBinaryExpression curBinExpr = new SvcLogicBinaryExpression(); + pushExpr(curBinExpr); + + List opList = ctx.MULTOP(); + + for (TerminalNode nd : opList) + { + LOG.trace("enterMultExpr: operator - "+nd.getText()); + curBinExpr.addOperator(nd.getText()); + } + + } + + @Override + public void exitMultExpr(MultExprContext ctx) { + + LOG.trace("exitMultExpr: text = "+ctx.getText()); + + popExpr(); + + } + + @Override + public void exitAtom(AtomContext ctx) { + LOG.trace("exitAtom: text = "+ctx.getText()); + popExpr(); + } + + @Override + public void enterAddExpr(AddExprContext ctx) { + LOG.trace("enterAddExpr: text = "+ctx.getText()); + List opList = ctx.ADDOP(); + + + SvcLogicBinaryExpression curBinExpr = new SvcLogicBinaryExpression(); + pushExpr(curBinExpr); + + + for (TerminalNode nd : opList) + { + LOG.trace("enterAddExpr: operator - "+nd.getText()); + curBinExpr.addOperator(nd.getText()); + } + + } + + @Override + public void exitAddExpr(AddExprContext ctx) { + LOG.trace("exitAddExpr: text = "+ctx.getText()); + + popExpr(); + } + + @Override + public void enterFuncExpr(FuncExprContext ctx) { + LOG.trace("enterFuncExpr: text = "+ctx.getText()); + LOG.trace("enterFuncExpr - IDENTIFIER : "+ctx.IDENTIFIER().getText()); + + for (ExprContext expr: ctx.expr()) + { + LOG.trace("enterFuncExpr - expr = "+expr.getText()); + } + + + pushExpr(new SvcLogicFunctionCall(ctx.IDENTIFIER().getText())); + } + + @Override + public void exitFuncExpr(FuncExprContext ctx) { + LOG.trace("exitFuncExpr: text = "+ctx.getText()); + + popExpr(); + } + + @Override + public void enterParenExpr(ParenExprContext ctx) { + LOG.trace("enterParenExpr: text = "+ctx.getText()); + LOG.trace("enterParenExpr: expr = "+ctx.expr().getText()); + } + + @Override + public void exitParenExpr(ParenExprContext ctx) { + LOG.trace("exitParenExpr: text = "+ctx.getText()); + } + + @Override + public void enterRelExpr(RelExprContext ctx) { + LOG.trace("enterRelExpr: text = "+ctx.getText()); + + List opList = ctx.RELOP(); + + + SvcLogicBinaryExpression curBinExpr = new SvcLogicBinaryExpression(); + pushExpr(curBinExpr); + + + for (TerminalNode nd : opList) + { + LOG.trace("enterRelExpr: operator - "+nd.getText()); + curBinExpr.addOperator(nd.getText()); + } + + } + + @Override + public void exitRelExpr(RelExprContext ctx) { + LOG.trace("exitRelExpr: text = "+ctx.getText()); + + popExpr(); + } + + @Override + public void enterCompareExpr(CompareExprContext ctx) { + LOG.trace("enterCompareExpr: text = "+ctx.getText()); + + TerminalNode nd = ctx.COMPAREOP(); + + SvcLogicBinaryExpression curBinExpr = new SvcLogicBinaryExpression(); + pushExpr(curBinExpr); + + LOG.trace("enterCompareExpr: operator - "+nd.getText()); + curBinExpr.addOperator(nd.getText()); + + } + + @Override + public void exitCompareExpr(CompareExprContext ctx) { + LOG.trace("exitCompareExpr : text = "+ctx.getText()); + + popExpr(); + } + + + + @Override + public void enterConstant(ConstantContext ctx) { + LOG.trace("enterConstant: text = "+ctx.getText()); + } + + @Override + public void exitConstant(ConstantContext ctx) { + LOG.trace("exitConstant: text = "+ctx.getText()); + } + + + @Override + public void enterVariable(VariableContext ctx) { + LOG.trace("enterVariable: text = "+ctx.getText()); + + + } + + @Override + public void exitVariable(VariableContext ctx) { + LOG.debug("exitVariable: text ="+ctx.getText()); + + } + + + @Override + public void enterVariableLead(VariableLeadContext ctx) { + + LOG.debug("enterVariableLead: text ="+ctx.getText()); + + + } + + @Override + public void exitVariableLead(VariableLeadContext ctx) { + + LOG.trace("exitVariableLead: text ="+ctx.getText()); + } + + @Override + public void enterVariableTerm(VariableTermContext ctx) { + LOG.trace("enterVariableTerm: text ="+ctx.getText()); + + String name = ctx.getText(); + + int subscrStart = name.indexOf("["); + if (subscrStart > -1) + { + name = name.substring(0, subscrStart); + } + SvcLogicVariableTerm vterm = new SvcLogicVariableTerm(name); + pushExpr(vterm); + } + + @Override + public void exitVariableTerm(VariableTermContext ctx) { + LOG.trace("exitVariableTerm: text="+ctx.getText()); + popExpr(); + } +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExprParserErrorListener.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExprParserErrorListener.java new file mode 100644 index 000000000..79979e75f --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExprParserErrorListener.java @@ -0,0 +1,43 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; +import org.antlr.v4.runtime.misc.ParseCancellationException; + +public class SvcLogicExprParserErrorListener extends BaseErrorListener { + + private static final SvcLogicExprParserErrorListener instance = new SvcLogicExprParserErrorListener(); + + public static SvcLogicExprParserErrorListener getInstance() { + return(instance); + } + + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, + String msg, RecognitionException e) throws ParseCancellationException { + throw new ParseCancellationException(msg); + } + + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpression.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpression.java new file mode 100644 index 000000000..72a438454 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpression.java @@ -0,0 +1,50 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.Serializable; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + + +public abstract class SvcLogicExpression implements Serializable { + + private List operands = new LinkedList(); + + + public void addOperand(SvcLogicExpression expr) + { + operands.add(expr); + } + + public List getOperands() { + return operands; + } + + public int numOperands() + { + return(operands.size()); + } + + public abstract String asParsedExpr(); + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpressionFactory.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpressionFactory.java new file mode 100644 index 000000000..18a433f64 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpressionFactory.java @@ -0,0 +1,98 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.antlr.v4.runtime.ANTLRInputStream; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.tree.ParseTreeWalker; +import org.onap.ccsdk.sli.core.sli.ExprGrammarParser.ExprContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class SvcLogicExpressionFactory { + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicExpressionFactory.class); + + + public static SvcLogicExpression parse(String exprStr) throws IOException + { + LOG.trace("parse("+exprStr+")"); + InputStream exprStream = new ByteArrayInputStream(exprStr.getBytes()); + CharStream input = new ANTLRInputStream(exprStream); + ExprGrammarLexer lexer = new ExprGrammarLexer(input); + CommonTokenStream tokens = new CommonTokenStream(lexer); + ExprGrammarParser parser = new ExprGrammarParser(tokens); + + lexer.removeErrorListeners(); + lexer.addErrorListener(SvcLogicExprParserErrorListener.getInstance()); + parser.removeErrorListeners(); + parser.addErrorListener(SvcLogicExprParserErrorListener.getInstance()); + + ExprContext expression = null; + + try { + expression = parser.expr(); + } catch (Exception e) { + String errorMsg = e.getMessage(); + + LOG.error(errorMsg); + throw new SvcLogicParserException(errorMsg); + } + + + ParseTreeWalker walker = new ParseTreeWalker(); + SvcLogicExprListener listener = new SvcLogicExprListener(); + walker.walk(listener, expression); + + + return(listener.getParsedExpr()); + } + + public static void main(String argv[]) { + + + System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "debug"); + + StringBuffer sbuff = new StringBuffer(); + + for (int i = 0 ; i < argv.length ; i++) + { + if (sbuff.length() > 0) + { + sbuff.append(" "); + } + sbuff.append(argv[i]); + } + + try { + SvcLogicExpressionFactory.parse(sbuff.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicFunctionCall.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicFunctionCall.java new file mode 100644 index 000000000..fc899704f --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicFunctionCall.java @@ -0,0 +1,79 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +public class SvcLogicFunctionCall extends SvcLogicExpression { + + private String functionName; + + public SvcLogicFunctionCall(String functionName) + { + this.functionName = functionName; + } + + public String getFunctionName() { + return functionName; + } + + public void setFunctionName(String functionName) { + this.functionName = functionName; + } + + public String toString() + { + StringBuffer sbuff = new StringBuffer(); + + sbuff.append(functionName); + sbuff.append("("); + boolean needComma = false; + for (SvcLogicExpression operand: getOperands()) + { + if (needComma) + { + sbuff.append(","); + } + else + { + needComma = true; + } + sbuff.append(operand.toString()); + + } + sbuff.append(")"); + return(sbuff.toString()); + } + + public String asParsedExpr() + { + StringBuffer sbuff = new StringBuffer(); + + sbuff.append("("); + sbuff.append(functionName); + for (SvcLogicExpression operand: getOperands()) + { + sbuff.append(" "); + sbuff.append(operand.asParsedExpr()); + } + sbuff.append(")"); + return(sbuff.toString()); + } + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicGraph.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicGraph.java new file mode 100644 index 000000000..158d815b0 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicGraph.java @@ -0,0 +1,183 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.PrintStream; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +public class SvcLogicGraph implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private String module = null; + private String rpc = null; + private String mode = null; + private String version = null; + + private Map attributes; + private Map namedNodes; + private SvcLogicNode rootNode; + + public SvcLogicGraph() + { + attributes = new HashMap(); + namedNodes = new HashMap(); + rootNode = null; + } + + + public String getModule() { + return module; + } + + + public void setModule(String module) { + this.module = module; + } + + + public String getRpc() { + return rpc; + } + + + public void setRpc(String rpc) { + this.rpc = rpc; + } + + + + + public String getMode() { + return mode; + } + + + public void setMode(String mode) { + this.mode = mode; + } + + + public String getVersion() { + return version; + } + + + public void setVersion(String version) { + this.version = version; + } + + + public void setRootNode(SvcLogicNode rootNode) + { + this.rootNode = rootNode; + } + + public SvcLogicNode getRootNode() + { + return(rootNode); + } + + public Serializable getAttribute(String name) + { + if (attributes.containsKey(name)) + { + return(attributes.get(name)); + } + else + { + return(null); + } + + } + + public void setAttribute(String name, Serializable value) throws DuplicateValueException + { + if (attributes.containsKey(name)) + { + throw new DuplicateValueException("Duplicate attribute "+name); + } + + attributes.put(name, value); + } + + public SvcLogicNode getNamedNode(String nodeName) + { + if (namedNodes.containsKey(nodeName)) + { + return(namedNodes.get(nodeName)); + } + else + { + return(null); + } + } + + public void setNamedNode(String nodeName, SvcLogicNode node) throws DuplicateValueException + { + if (namedNodes.containsKey(nodeName)) + { + throw new DuplicateValueException("Duplicate node name "+nodeName); + } + + namedNodes.put(nodeName, node); + } + + + + public void printAsGv(PrintStream pstr) + { + pstr.println("digraph g {"); + pstr.println("START [label=\"START\\n"+module+":"+rpc+"\"];"); + + if (rootNode != null) + { + pstr.println("START -> node"+rootNode.getNodeId()+";"); + rootNode.setVisited(false, true); + rootNode.printAsGv(pstr); + } + pstr.println("}"); + } + + public void printAsXml(PrintStream pstr) + { + pstr.println(""); + pstr.println(" "); + if (rootNode != null) + { + rootNode.setVisited(false, true); + rootNode.printAsXml(pstr, 2); + } + pstr.println(" "); + pstr.println(""); + } + + @Override + public String toString() { + return "SvcLogicGraph [module=" + module + ", rpc=" + rpc + ", mode=" + mode + ", version=" + version + "]"; + } + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicJavaPlugin.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicJavaPlugin.java new file mode 100644 index 000000000..eaf4c7196 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicJavaPlugin.java @@ -0,0 +1,33 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.util.Map; + +public interface SvcLogicJavaPlugin { + + /** + * A marker interface, used to indicate that a class exposes methods that can be + * called from an node. Such methods must have the signature: + * void methodName(Map, SvcLogicContext) + */ + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicJdbcStore.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicJdbcStore.java new file mode 100644 index 000000000..9aa0ddfb5 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicJdbcStore.java @@ -0,0 +1,894 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.sql.Blob; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class SvcLogicJdbcStore implements SvcLogicStore { + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicJdbcStore.class); + + private String dbUrl = null; + private String dbName = null; + private String dbUser = null; + private String dbPasswd = null; + private String dbDriver = null; + + private Connection dbConn; + private PreparedStatement hasActiveGraphStmt = null; + private PreparedStatement hasVersionGraphStmt = null; + private PreparedStatement fetchActiveGraphStmt = null; + private PreparedStatement fetchVersionGraphStmt = null; + private PreparedStatement storeGraphStmt = null; + private PreparedStatement deleteGraphStmt = null; + + private PreparedStatement deactivateStmt = null; + private PreparedStatement activateStmt = null; + + private PreparedStatement registerNodeStmt = null; + private PreparedStatement unregisterNodeStmt = null; + private PreparedStatement validateNodeStmt = null; + + private void getConnection() throws ConfigurationException + { + + Properties jdbcProps = new Properties(); + + jdbcProps.setProperty("user", dbUser); + jdbcProps.setProperty("password", dbPasswd); + + try { + Driver dvr = new com.mysql.jdbc.Driver(); + if (dvr.acceptsURL(dbUrl)) + { + LOG.debug("Driver com.mysql.jdbc.Driver accepts "+dbUrl); + } + else + { + LOG.warn("Driver com.mysql.jdbc.Driver does not accept "+dbUrl); + } + } catch (SQLException e1) { + LOG.error("Caught exception trying to load com.mysql.jdbc.Driver", e1); + + + } + + + try + { + this.dbConn = DriverManager.getConnection(dbUrl, jdbcProps); + } + catch (Exception e) + { + throw new ConfigurationException("failed to get database connection ["+dbUrl+"]", e); + } + + } + + private void createTable() throws ConfigurationException + { + + + DatabaseMetaData dbm = null; + + + try { + dbm = dbConn.getMetaData(); + } catch (SQLException e) { + + throw new ConfigurationException("could not get databse metadata", e); + } + + // See if table SVC_LOGIC exists. If not, create it. + try + { + + + ResultSet tables = dbm.getTables(null, null, "SVC_LOGIC", null); + if (tables.next()) { + // Table exists + } + else { + + String crTableCmd = "CREATE TABLE "+dbName+".SVC_LOGIC (" + + "module varchar(80) NOT NULL," + + "rpc varchar(80) NOT NULL," + + "version varchar(40) NOT NULL," + + "mode varchar(5) NOT NULL," + + "active varchar(1) NOT NULL," + + "graph BLOB," + + "CONSTRAINT P_SVC_LOGIC PRIMARY KEY(module, rpc, version, mode))"; + + Statement stmt = null; + ConfigurationException myExc = null; + try + { + stmt = dbConn.createStatement(); + stmt.executeUpdate(crTableCmd); + } + catch (SQLException e1) + { + myExc = new ConfigurationException("cannot create SVC_LOGIC table", e1); + } + finally + { + if (stmt != null) + { + stmt.close(); + } + } + + if (myExc != null) + { + throw myExc; + } + } + } + catch (Exception e) + { + throw new ConfigurationException("could not create SVC_LOGIC table", e); + } + + // See if NODE_TYPES table exists and, if not, create it + + try + { + + + ResultSet tables = dbm.getTables(null, null, "NODE_TYPES", null); + if (tables.next()) { + // Table exists + } + else { + + String crTableCmd = "CREATE TABLE "+dbName+".NODE_TYPES (" + + "nodetype varchar(80) NOT NULL," + + "CONSTRAINT P_NODE_TYPES PRIMARY KEY(nodetype))"; + + Statement stmt = null; + ConfigurationException myExc = null; + try + { + stmt = dbConn.createStatement(); + stmt.executeUpdate(crTableCmd); + } + catch (SQLException e1) + { + myExc = new ConfigurationException("cannot create SVC_LOGIC table", e1); + } + finally + { + if (stmt != null) + { + stmt.close(); + } + } + + if (myExc != null) + { + throw myExc; + } + } + } + catch (Exception e) + { + throw new ConfigurationException("could not create SVC_LOGIC table", e); + } + } + + private void prepStatements() throws ConfigurationException + { + + // Prepare statements + String hasVersionGraphSql = "SELECT count(*) FROM "+dbName+".SVC_LOGIC" + + " WHERE module = ? AND rpc = ? AND mode = ? AND version = ?"; + + try + { + hasVersionGraphStmt = dbConn.prepareStatement(hasVersionGraphSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+hasVersionGraphSql, e); + + } + + String hasActiveGraphSql = "SELECT count(*) FROM "+dbName+".SVC_LOGIC" + + " WHERE module = ? AND rpc = ? AND mode = ? AND active = 'Y'"; + + try + { + hasActiveGraphStmt = dbConn.prepareStatement(hasActiveGraphSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+hasVersionGraphSql, e); + + } + + String fetchVersionGraphSql = "SELECT graph FROM "+dbName+".SVC_LOGIC" + + " WHERE module = ? AND rpc = ? AND mode = ? AND version = ?"; + + try + { + fetchVersionGraphStmt = dbConn.prepareStatement(fetchVersionGraphSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+fetchVersionGraphSql, e); + + } + + String fetchActiveGraphSql = "SELECT graph FROM "+dbName+".SVC_LOGIC" + + " WHERE module = ? AND rpc = ? AND mode = ? AND active = 'Y'"; + + try + { + fetchActiveGraphStmt = dbConn.prepareStatement(fetchActiveGraphSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+fetchVersionGraphSql, e); + + } + + String storeGraphSql = "INSERT INTO "+dbName+".SVC_LOGIC (module, rpc, version, mode, active, graph)" + + " VALUES(?, ?, ?, ?, ?, ?)"; + + try + { + storeGraphStmt = dbConn.prepareStatement(storeGraphSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+storeGraphSql, e); + } + + String deleteGraphSql = "DELETE FROM "+dbName+".SVC_LOGIC WHERE module = ? AND rpc = ? AND version = ? AND mode = ?"; + + try + { + deleteGraphStmt = dbConn.prepareStatement(deleteGraphSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+deleteGraphSql, e); + } + + String deactivateSql = "UPDATE "+dbName+".SVC_LOGIC SET active = 'N' WHERE module = ? AND rpc = ? AND mode = ?"; + + try + { + deactivateStmt = dbConn.prepareStatement(deactivateSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+deactivateSql, e); + } + + String activateSql = "UPDATE "+dbName+".SVC_LOGIC SET active = 'Y' WHERE module = ? AND rpc = ? AND version = ? AND mode = ?"; + + try + { + activateStmt = dbConn.prepareStatement(activateSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+activateSql, e); + } + + String registerNodeSql = "INSERT INTO "+dbName+".NODE_TYPES (nodetype) VALUES(?)"; + try + { + registerNodeStmt = dbConn.prepareStatement(registerNodeSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+registerNodeSql, e); + } + + String unregisterNodeSql = "DELETE FROM "+dbName+".NODE_TYPES WHERE nodetype = ?"; + try + { + unregisterNodeStmt = dbConn.prepareStatement(unregisterNodeSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+unregisterNodeSql, e); + } + + String validateNodeSql = "SELECT count(*) FROM "+dbName+".NODE_TYPES WHERE nodetype = ?"; + try + { + validateNodeStmt = dbConn.prepareStatement(validateNodeSql); + } + catch (Exception e) + { + throw new ConfigurationException("could not prepare statement "+validateNodeSql, e); + } + } + + private void initDbResources() throws ConfigurationException + { + if ((dbDriver != null) && (dbDriver.length() > 0)) + { + + try + { + Class.forName(dbDriver); + } + catch (Exception e) + { + throw new ConfigurationException("could not load driver class "+dbDriver, e); + } + } + getConnection(); + createTable(); + prepStatements(); + } + + + public void init(Properties props) throws ConfigurationException { + + + dbUrl = props.getProperty("org.openecomp.sdnc.sli.jdbc.url"); + if ((dbUrl == null) || (dbUrl.length() == 0)) + { + throw new ConfigurationException("property org.openecomp.sdnc.sli.jdbc.url unset"); + } + + dbName = props.getProperty("org.openecomp.sdnc.sli.jdbc.database"); + if ((dbName == null) || (dbName.length() == 0)) + { + throw new ConfigurationException("property org.openecomp.sdnc.sli.jdbc.database unset"); + } + + dbUser = props.getProperty("org.openecomp.sdnc.sli.jdbc.user"); + if ((dbUser == null) || (dbUser.length() == 0)) + { + throw new ConfigurationException("property org.openecomp.sdnc.sli.jdbc.user unset"); + } + + + dbPasswd = props.getProperty("org.openecomp.sdnc.sli.jdbc.password"); + if ((dbPasswd == null) || (dbPasswd.length() == 0)) + { + throw new ConfigurationException("property org.openecomp.sdnc.sli.jdbc.password unset"); + } + + dbDriver = props.getProperty("org.openecomp.sdnc.sli.jdbc.driver"); + + + initDbResources(); + + } + + private boolean isDbConnValid() + { + + boolean isValid = false; + + try + { + if (dbConn != null) + { + isValid = dbConn.isValid(1); + } + } + catch (SQLException e) + {} + + return(isValid); + } +public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException { + + + + + if (!isDbConnValid()) + { + + // Try reinitializing + initDbResources(); + + if (!isDbConnValid()) + { + throw new ConfigurationException("no jdbc connection"); + } + } + + + + boolean retval = false; + ResultSet results = null; + + PreparedStatement hasGraphStmt = null; + if (version == null) + { + hasGraphStmt = hasActiveGraphStmt; + } + else + { + hasGraphStmt = hasVersionGraphStmt; + } + + + + try + { + hasGraphStmt.setString(1, module); + hasGraphStmt.setString(2, rpc); + hasGraphStmt.setString(3, mode); + + + if (version != null) + { + hasGraphStmt.setString(4, version); + } + boolean oldAutoCommit = dbConn.getAutoCommit(); + dbConn.setAutoCommit(false); + results = hasGraphStmt.executeQuery(); + dbConn.commit(); + dbConn.setAutoCommit(oldAutoCommit); + + if (results.next()) + { + int cnt = results.getInt(1); + + if (cnt > 0) + { + retval = true; + } + + } + } + catch (Exception e) + { + throw new ConfigurationException("SQL query failed", e); + } + finally + { + if (results != null) + { + try + { + + results.close(); + } + catch (SQLException x) + {} + } + + } + + + return(retval); + + + } + + public SvcLogicGraph fetch(String module, String rpc, String version, String mode) throws SvcLogicException { + + + + + if (!isDbConnValid()) + { + + // Try reinitializing + initDbResources(); + + if (!isDbConnValid()) + { + throw new ConfigurationException("no jdbc connection"); + } + } + + + + SvcLogicGraph retval = null; + ResultSet results = null; + + PreparedStatement fetchGraphStmt = null; + if (version == null) + { + fetchGraphStmt = fetchActiveGraphStmt; + } + else + { + fetchGraphStmt = fetchVersionGraphStmt; + } + try + { + fetchGraphStmt.setString(1, module); + fetchGraphStmt.setString(2, rpc); + fetchGraphStmt.setString(3, mode); + + + if (version != null) + { + fetchGraphStmt.setString(4, version); + } + boolean oldAutoCommit = dbConn.getAutoCommit(); + dbConn.setAutoCommit(false); + results = fetchGraphStmt.executeQuery(); + dbConn.commit(); + dbConn.setAutoCommit(oldAutoCommit); + + if (results.next()) + { + Blob graphBlob = results.getBlob("graph"); + + ObjectInputStream gStream = new ObjectInputStream(graphBlob.getBinaryStream()); + + Object graphObj = gStream.readObject(); + gStream.close(); + + if (graphObj instanceof SvcLogicGraph) + { + retval = (SvcLogicGraph) graphObj; + } + else + { + throw new ConfigurationException("invalid type for graph ("+graphObj.getClass().getName()); + + } + + } + else + { + return(null); + } + } + catch (Exception e) + { + throw new ConfigurationException("SQL query failed", e); + } + finally + { + if (results != null) + { + try + { + results.close(); + } + catch (SQLException x) + {} + } + + } + + + return(retval); + + + } + + public void store(SvcLogicGraph graph) throws SvcLogicException { + + + if (!isDbConnValid()) + { + + // Try reinitializing + initDbResources(); + + if (!isDbConnValid()) + { + throw new ConfigurationException("no jdbc connection"); + } + } + + if (graph == null) + { + throw new SvcLogicException("graph cannot be null"); + } + + byte[] graphBytes = null; + + ByteArrayOutputStream byteStr = null; + ObjectOutputStream goutStr = null; + + try + { + byteStr = new ByteArrayOutputStream(); + goutStr = new ObjectOutputStream(byteStr); + goutStr.writeObject(graph); + + graphBytes = byteStr.toByteArray(); + + } + catch (Exception e) + { + throw new SvcLogicException("could not serialize graph", e); + } + finally + { + + if (goutStr != null) + { + try { + goutStr.close(); + } catch (IOException e) { + + } + } + + if (byteStr != null) + { + try { + byteStr.close(); + } catch (IOException e) { + + } + } + } + + + // If object already stored in database, delete it + if (hasGraph(graph.getModule(), graph.getRpc(), graph.getVersion(), graph.getMode())) + { + delete(graph.getModule(), graph.getRpc(), graph.getVersion(), graph.getMode()); + } + + try + { + boolean oldAutoCommit = dbConn.getAutoCommit(); + dbConn.setAutoCommit(false); + storeGraphStmt.setString(1, graph.getModule()); + storeGraphStmt.setString(2, graph.getRpc()); + storeGraphStmt.setString(3, graph.getVersion()); + storeGraphStmt.setString(4, graph.getMode()); + storeGraphStmt.setString(5, "N"); + storeGraphStmt.setBlob(6, new ByteArrayInputStream(graphBytes)); + + storeGraphStmt.executeUpdate(); + dbConn.commit(); + + dbConn.setAutoCommit(oldAutoCommit); + } + catch (Exception e) + { + throw new SvcLogicException("Could not write object to database", e); + } + } + + public void delete(String module, String rpc, String version, String mode) throws SvcLogicException + { + if (!isDbConnValid()) + { + + // Try reinitializing + initDbResources(); + + if (!isDbConnValid()) + { + throw new ConfigurationException("no jdbc connection"); + } + } + + try + { + boolean oldAutoCommit = dbConn.getAutoCommit(); + dbConn.setAutoCommit(false); + deleteGraphStmt.setString(1, module); + deleteGraphStmt.setString(2, rpc); + deleteGraphStmt.setString(3, version); + deleteGraphStmt.setString(4, mode); + + + deleteGraphStmt.executeUpdate(); + dbConn.commit(); + dbConn.setAutoCommit(oldAutoCommit); + } + catch (Exception e) + { + throw new SvcLogicException("Could not delete object from database", e); + } + } + + public void activate(SvcLogicGraph graph) throws SvcLogicException + { + try + { + boolean oldAutoCommit = dbConn.getAutoCommit(); + + dbConn.setAutoCommit(false); + + // Deactivate any current active version + deactivateStmt.setString(1, graph.getModule()); + deactivateStmt.setString(2, graph.getRpc()); + deactivateStmt.setString(3, graph.getMode()); + deactivateStmt.executeUpdate(); + + // Activate this version + activateStmt.setString(1, graph.getModule()); + activateStmt.setString(2, graph.getRpc()); + activateStmt.setString(3, graph.getVersion()); + activateStmt.setString(4, graph.getMode()); + activateStmt.executeUpdate(); + + dbConn.commit(); + + dbConn.setAutoCommit(oldAutoCommit); + + } + catch (Exception e) + { + throw new SvcLogicException("Could not activate graph", e); + } + } + + @Override + public void registerNodeType(String nodeType) throws SvcLogicException { + + if (isValidNodeType(nodeType)) + { + return; + } + + if (!isDbConnValid()) + { + + // Try reinitializing + initDbResources(); + + if (!isDbConnValid()) + { + throw new ConfigurationException("no jdbc connection"); + } + } + + try + { + boolean oldAutoCommit = dbConn.getAutoCommit(); + dbConn.setAutoCommit(false); + registerNodeStmt.setString(1, nodeType); + registerNodeStmt.executeUpdate(); + dbConn.commit(); + dbConn.setAutoCommit(oldAutoCommit); + } + catch (Exception e) + { + throw new SvcLogicException("Could not add node type to database", e); + } + + } + + @Override + public void unregisterNodeType(String nodeType) throws SvcLogicException { + + if (!isValidNodeType(nodeType)) + { + return; + } + + if (!isDbConnValid()) + { + + // Try reinitializing + initDbResources(); + + if (!isDbConnValid()) + { + throw new ConfigurationException("no jdbc connection"); + } + } + + try + { + boolean oldAutoCommit = dbConn.getAutoCommit(); + dbConn.setAutoCommit(false); + unregisterNodeStmt.setString(1, nodeType); + unregisterNodeStmt.executeUpdate(); + dbConn.commit(); + dbConn.setAutoCommit(oldAutoCommit); + } + catch (Exception e) + { + throw new SvcLogicException("Could not delete node type from database", e); + } + + } + + @Override + public boolean isValidNodeType(String nodeType) throws SvcLogicException { + + boolean isValid = false; + + if (!isDbConnValid()) + { + + // Try reinitializing + initDbResources(); + + if (!isDbConnValid()) + { + throw new ConfigurationException("no jdbc connection"); + } + } + + ResultSet results = null; + try + { + validateNodeStmt.setString(1, nodeType); + + boolean oldAutoCommit = dbConn.getAutoCommit(); + dbConn.setAutoCommit(false); + results = validateNodeStmt.executeQuery(); + dbConn.commit(); + dbConn.setAutoCommit(oldAutoCommit); + + if (results != null) + { + if (results.next()) + { + int cnt = results.getInt(1); + + if (cnt > 0) + { + isValid = true; + } + } + } + + } + catch (Exception e) + { + throw new SvcLogicException("Cannot select node type from database", e); + } + finally + { + if (results != null) + { + try + { + results.close(); + } + catch (SQLException x) + {} + } + + } + + return(isValid); + } + + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicNode.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicNode.java new file mode 100644 index 000000000..3aab21f2f --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicNode.java @@ -0,0 +1,455 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.IOException; +import java.io.PrintStream; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +import org.apache.commons.lang3.StringEscapeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.Locator; + + +public class SvcLogicNode implements Serializable { + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicExprListener.class); + + private static final long serialVersionUID = 2L; + + private String nodeName; + private int nodeId; + private String nodeType; + private boolean visited; + private SvcLogicGraph graph; + + + private HashMap attributes; + private HashMap outcomes; + private HashMap parameters; + + public SvcLogicNode(int nodeId, String nodeType, SvcLogicGraph graph) + { + this.nodeId = nodeId; + nodeName = ""; + this.nodeType = nodeType; + this.graph = graph; + attributes = new HashMap (); + parameters = new HashMap (); + outcomes = null; + + } + + public SvcLogicNode(int nodeId, String nodeType, String nodeName, SvcLogicGraph graph) throws DuplicateValueException + { + this.nodeId = nodeId; + this.nodeName = nodeName; + this.nodeType = nodeType; + this.graph = graph; + attributes = new HashMap (); + parameters = new HashMap (); + outcomes = null; + graph.setNamedNode(nodeName, this); + } + + + public int getNodeId() + { + return nodeId; + } + + public String getNodeName() + { + return(nodeName); + } + + public String getNodeType() + { + return(nodeType); + } + + public SvcLogicGraph getGraph() + { + return(graph); + } + + public int getNumOutcomes() + { + if (outcomes == null) + { + return(0); + } + else + { + return(outcomes.size()); + } + } + + public SvcLogicExpression getAttribute(String name) + { + if (attributes.containsKey(name)) + { + return(attributes.get(name)); + } + else + { + return(null); + } + + } + + public void setAttribute(String name, String value) throws SvcLogicException + { + setAttribute(name, new SvcLogicAtom("STRING", value)); + } + + public void setAttribute(String name, SvcLogicExpression value) throws SvcLogicException + { + if (attributes.containsKey(name)) + { + throw new DuplicateValueException("Duplicate attribute "+name); + } + + attributes.put(name, value); + } + + + public void mapParameter(String name, String value) throws SvcLogicException + { + + if (parameters.containsKey(name)) + { + throw new DuplicateValueException("Duplicate parameter "+name); + } + try + { + SvcLogicExpression parmValue; + if ((value == null) || (value.length() == 0)) + { + parmValue = new SvcLogicAtom("STRING", ""); + } + else if (value.trim().startsWith("`")) + { + int lastParen = value.lastIndexOf("`"); + String evalExpr = value.trim().substring(1, lastParen); + parmValue = SvcLogicExpressionFactory.parse(evalExpr); + + } + else + { + if (Character.isDigit(value.charAt(0))) + { + parmValue = new SvcLogicAtom("NUMBER", value); + } + else + { + parmValue = new SvcLogicAtom("STRING", value); + } + } + LOG.debug("Setting parameter "+name+" = "+value+" = "+parmValue.asParsedExpr()); + parameters.put(name, parmValue); + } + catch (IOException e) { + + LOG.error("Invalid parameter value expression ("+value+")"); + throw new SvcLogicException(e.getMessage()); + } + } + + public SvcLogicExpression getParameter(String name) + { + if (parameters.containsKey(name)) + { + return(parameters.get(name)); + } + else + { + return(null); + } + } + + public boolean isVisited() { + return visited; + } + + public void setVisited(boolean visited, boolean recursive) { + this.visited = visited; + + if (recursive) + { + Set> outcomeSet = getOutcomeSet(); + + if (outcomeSet == null) + { + return; + } + + for (Iterator> iter = outcomeSet.iterator(); iter.hasNext();) + { + Map.Entry curOutcome = iter.next(); + SvcLogicNode outNode = curOutcome.getValue(); + outNode.setVisited(visited, recursive); + } + } + } + + public void addOutcome(String outcomeValue, SvcLogicNode node) throws SvcLogicException + { + if (outcomes == null) + { + outcomes = new HashMap(); + } + + if (outcomeValue.length() == 0) { + outcomeValue = "\"\""; + } + if (outcomes.containsKey(outcomeValue)) + { + throw new DuplicateValueException("Duplicate outcome value "+outcomeValue); + } + + outcomes.put(outcomeValue, node); + } + + public Set> getOutcomeSet() + { + if (outcomes == null) + { + return null; + } + + return(outcomes.entrySet()); + + } + + public Set> getParameterSet() + { + if (parameters == null) + { + return null; + } + + return(parameters.entrySet()); + + } + + public void printAsGv(PrintStream pstr) + { + + if (visited) + { + return; + } + else + { + visited = true; + } + + StringBuffer sbuff = new StringBuffer(); + + sbuff.append("node"); + sbuff.append(nodeId); + sbuff.append(" [ shape=none, margin=0, label=<"); + sbuff.append(""); + + if (nodeName.length() > 0) + { + sbuff.append(""); + } + + Set> attrSet = attributes.entrySet(); + for (Iterator> iter = attrSet.iterator() ; iter.hasNext();) + { + Map.Entry curAttr = iter.next(); + sbuff.append(""); + } + sbuff.append("
"); + sbuff.append(nodeId); + sbuff.append(" : "); + sbuff.append(nodeType); + sbuff.append("
AttributeValue
name"); + sbuff.append(nodeName); + sbuff.append("
"); + sbuff.append(curAttr.getKey()); + sbuff.append(""); + sbuff.append(StringEscapeUtils.escapeHtml3(curAttr.getValue().toString())); + sbuff.append("
>];"); + + pstr.println(sbuff.toString()); + + + if (outcomes != null) + { + TreeMap sortedOutcomes = new TreeMap(outcomes); + Set> outcomeSet = sortedOutcomes.entrySet(); + + for (Iterator> iter = outcomeSet.iterator(); iter.hasNext();) + { + Map.Entry curOutcome = iter.next(); + String outValue = curOutcome.getKey(); + SvcLogicNode outNode = curOutcome.getValue(); + pstr.println("node"+nodeId+" -> node"+outNode.getNodeId()+" [label=\""+outValue+"\"];"); + outNode.printAsGv(pstr); + } + } + } + + public void printAsXml(PrintStream pstr, int indentLvl) + { + if (visited) + { + return; + } + // Print node tag + for (int i = 0 ; i < indentLvl ; i++) + { + pstr.print(" "); + } + pstr.print("<"); + pstr.print(this.getNodeType()); + + Set> attrSet = attributes.entrySet(); + for (Iterator> iter = attrSet.iterator() ; iter.hasNext();) + { + Map.Entry curAttr = iter.next(); + pstr.print(" "); + pstr.print(curAttr.getKey()); + pstr.print("='`"); + pstr.print(curAttr.getValue()); + pstr.print("'`"); + } + + if (((parameters == null) || (parameters.isEmpty())) && + ((outcomes == null) || outcomes.isEmpty())) + { + pstr.print("/>\n"); + pstr.flush(); + return; + } + else + { + pstr.print(">\n"); + } + + // Print parameters (if any) + if (parameters != null) + { + Set> paramSet = parameters.entrySet(); + for (Iterator> iter = paramSet.iterator() ; iter.hasNext();) + { + for (int i = 0 ; i < indentLvl+1 ; i++) + { + pstr.print(" "); + } + pstr.print(" curAttr = iter.next(); + pstr.print(" name='"); + pstr.print(curAttr.getKey()); + pstr.print("' value='`"); + pstr.print(curAttr.getValue().toString()); + pstr.print("`'/>\n"); + } + } + + // Print outcomes (if any) + if (outcomes != null) + { + Set> outcomeSet = outcomes.entrySet(); + for (Iterator> iter = outcomeSet.iterator() ; iter.hasNext();) + { + for (int i = 0 ; i < indentLvl+1 ; i++) + { + pstr.print(" "); + } + pstr.print(" curAttr = iter.next(); + pstr.print(" value='"); + pstr.print(curAttr.getKey()); + pstr.print("'>\n"); + SvcLogicNode outNode = curAttr.getValue(); + outNode.printAsXml(pstr, indentLvl+2); + for (int i = 0 ; i < indentLvl+1 ; i++) + { + pstr.print(" "); + } + pstr.print("\n"); + } + } + + // Print node end tag + for (int i = 0 ; i < indentLvl ; i++) + { + pstr.print(" "); + } + pstr.print("\n"); + pstr.flush(); + + } + + + public SvcLogicNode getOutcomeValue(String value) + { + + if (value.length() == 0) { + value = "\"\""; + } + if (outcomes == null) + { + return(null); + } + + if (outcomes.containsKey(value)) + { + return(outcomes.get(value)); + } + else + { + StringBuffer keyBuffer = new StringBuffer(); + keyBuffer.append("{"); + for (String key : outcomes.keySet()) { + keyBuffer.append(" ("+key+")"); + } + keyBuffer.append("}"); + LOG.info("Outcome (" + value + ") not found, keys are " + keyBuffer.toString()); + + if (outcomes.containsKey("Other")) + { + return(outcomes.get("Other")); + } + else + { + return(null); + } + } + } +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicParser.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicParser.java new file mode 100644 index 000000000..9ba502666 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicParser.java @@ -0,0 +1,597 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.LinkedList; + +import javax.xml.XMLConstants; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.Attributes; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * @author dt5972 + * + */ +public class SvcLogicParser { + + SvcLogicStore store = null; + static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; + static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; + static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource"; + static final String JAXP_DYNAMIC_VALIDATION = "http://apache.org/xml/features/validation/dynamic"; + static final String JAXP_SCHEMA_VALIDATION = "http://apache.org/xml/features/validation/schema"; + + private static final String LOAD_MESSAGE = "Getting SvcLogicGraph from database - "; + private static final String LOAD_ERROR_MESSAGE = "SvcLogicGraph not found - "; + private static final String ACTIVATION_ERROR_MESSAGE = "Could not activate SvcLogicGraph - "; + private static final String PRINT_ERROR_MESSAGE = "Could not print SvcLogicGraph - "; + private static final String SVC_LOGIC_STORE_ERROR = "Could not get service logic store"; + + private static final Logger LOGGER = LoggerFactory.getLogger(SvcLogicParser.class); + private static final String SLI_VALIDATING_PARSER = "org.openecomp.sdnc.sli.parser.validate"; + private static final String SVCLOGIC_XSD = "/svclogic.xsd"; + + private class SvcLogicHandler extends DefaultHandler { + private Locator locator = null; + private String module = null; + private String version = null; + private LinkedList graphs = null; + private SvcLogicGraph curGraph = null; + private SvcLogicNode curNode = null; + private LinkedList nodeStack = null; + private int curNodeId = 0; + private String outcomeValue = null; + private LinkedList outcomeStack = null; + private SvcLogicStore svcLogicStore = null; + + public SvcLogicHandler(LinkedList graphs, SvcLogicStore store) { + this.graphs = graphs; + this.curNode = null; + this.nodeStack = new LinkedList<>(); + this.outcomeStack = new LinkedList<>(); + this.curNodeId = 1; + this.outcomeValue = null; + this.svcLogicStore = store; + + } + + @Override + public void setDocumentLocator(Locator locator) { + this.locator = locator; + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + + // Handle service-logic (graph) tag + if ("service-logic".equalsIgnoreCase(qName)) { + + module = attributes.getValue("module"); + if (module == null || module.length() == 0) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'module' attribute from service-logic tag"); + } + + version = attributes.getValue("version"); + if (version == null || version.length() == 0) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'version' attribute from service-logic tag"); + } + + return; + } + + if ("method".equalsIgnoreCase(qName)) { + if (curGraph != null) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot nest module tags"); + } + curGraph = new SvcLogicGraph(); + curGraph.setModule(module); + curGraph.setVersion(version); + this.curNodeId = 1; + + String attrValue = attributes.getValue("rpc"); + if (attrValue == null || attrValue.length() == 0) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'rpc' attribute for method tag"); + } + curGraph.setRpc(attrValue); + + attrValue = attributes.getValue("mode"); + if (attrValue == null || attrValue.length() == 0) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'mode' attribute for method tag"); + } + curGraph.setMode(attrValue); + + return; + + } + + // Handle outcome (edge) tag + if ("outcome".equalsIgnoreCase(qName)) { + String refValue = attributes.getValue("ref"); + + if (refValue != null) { + SvcLogicNode refNode = curGraph.getNamedNode(refValue); + + if (refNode != null) { + try { + curNode.addOutcome(attributes.getValue("value"), refNode); + } catch (SvcLogicException e) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot add outcome", e); + } + } else { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "ref to unknown node " + refValue); + } + return; + } + + if (outcomeValue != null) { + outcomeStack.push(outcomeValue); + } + outcomeValue = attributes.getValue("value"); + + return; + } + + // Handle parameter tag + if ("parameter".equalsIgnoreCase(qName)) { + String parmName = attributes.getValue("name"); + String parmValue = attributes.getValue("value"); + + if (parmName != null && parmName.length() > 0 && parmValue != null) { + try { + + curNode.mapParameter(parmName, parmValue); + } catch (Exception e) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + " cannot set parameter " + parmName + " to " + parmValue + " [" + e.getMessage() + "]"); + } + } + + return; + } + + // Handle node tags + + String nodeName = attributes.getValue("name"); + SvcLogicNode thisNode = null; + + try { + if (!svcLogicStore.isValidNodeType(qName)) { + throw new SAXNotRecognizedException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Unknown tag " + qName); + } + } catch (Exception e) { + throw new SAXNotRecognizedException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot validate node type " + qName); + } + + try { + if (nodeName != null && nodeName.length() > 0) { + thisNode = new SvcLogicNode(curNodeId++, qName, nodeName, curGraph); + } else { + thisNode = new SvcLogicNode(curNodeId++, qName, curGraph); + } + + if (curGraph.getRootNode() == null) { + curGraph.setRootNode(thisNode); + } + } catch (SvcLogicException e) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + e.getMessage()); + + } + + int numAttributes = attributes.getLength(); + + for (int i = 0; i < numAttributes; i++) { + String attrName = attributes.getQName(i); + if (!"name".equalsIgnoreCase(attrName)) { + try { + + String attrValueStr = attributes.getValue(i); + SvcLogicExpression attrValue = null; + if (attrValueStr.trim().startsWith("`")) { + int lastParen = attrValueStr.lastIndexOf("`"); + String evalExpr = attrValueStr.trim().substring(1, lastParen); + attrValue = SvcLogicExpressionFactory.parse(evalExpr); + + } else { + if (Character.isDigit(attrValueStr.charAt(0))) { + attrValue = new SvcLogicAtom("NUMBER", attrValueStr); + } else { + attrValue = new SvcLogicAtom("STRING", attrValueStr); + } + } + thisNode.setAttribute(attrName, attrValue); + } catch (Exception e) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot set attribute " + attrName, e); + } + } + } + + if (curNode != null) { + try { + if ("block".equalsIgnoreCase(curNode.getNodeType()) || "for".equalsIgnoreCase(curNode.getNodeType()) || "while".equalsIgnoreCase(curNode.getNodeType())) { + curNode.addOutcome("" + (curNode.getNumOutcomes() + 1), thisNode); + } else { + if (outcomeValue == null) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + curNode.getNodeType() + " node expects outcome, instead found " + thisNode.getNodeType()); + } + curNode.addOutcome(outcomeValue, thisNode); + } + } catch (SvcLogicException e) { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + e.getMessage()); + } + nodeStack.push(curNode); + } + curNode = thisNode; + + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + + // Handle close of service-logic tag + if ("service-logic".equalsIgnoreCase(qName)) { + // Nothing more to do + return; + } + + // Handle close of method tag + if ("method".equalsIgnoreCase(qName)) { + graphs.add(curGraph); + curGraph = null; + return; + } + + // Handle close of outcome tag + if ("outcome".equalsIgnoreCase(qName)) { + // Finished this outcome - pop the outcome stack + if (outcomeStack.isEmpty()) { + outcomeValue = null; + } else { + outcomeValue = outcomeStack.pop(); + } + return; + } + + // Handle close of parameter tag - do nothing + if ("parameter".equalsIgnoreCase(qName)) { + return; + } + + // Handle close of a node tag + if (nodeStack.isEmpty()) { + curNode = null; + } else { + curNode = nodeStack.pop(); + } + } + + @Override + public void error(SAXParseException arg0) throws SAXException { + throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + arg0.getMessage()); + } + + } + + public SvcLogicParser(SvcLogicStore store) { + this.store = store; + } + + public SvcLogicParser(String propFile) { + + try { + this.store = SvcLogicStoreFactory.getSvcLogicStore(propFile); + } catch (Exception e) { + LOGGER.error(SVC_LOGIC_STORE_ERROR, e); + + } + + } + + public SvcLogicParser(InputStream propStr) { + + try { + this.store = SvcLogicStoreFactory.getSvcLogicStore(propStr); + } catch (Exception e) { + LOGGER.error(SVC_LOGIC_STORE_ERROR, e); + + } + + } + + public LinkedList parse(String fileName) throws SvcLogicException { + LinkedList graphs = null; + + URL xsdUrl = null; + Schema schema = null; + String validateSchema = System.getProperty(SLI_VALIDATING_PARSER, "true"); + + if (validateSchema != null || validateSchema.equalsIgnoreCase("true")) { + xsdUrl = getClass().getResource(SVCLOGIC_XSD); + + } + + if (xsdUrl != null) { + try { + SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + schema = schemaFactory.newSchema(xsdUrl); + } catch (Exception e) { + LOGGER.warn("Could not validate using schema " + xsdUrl.getPath(), e); + } + } else { + LOGGER.warn("Could not find resource " + SVCLOGIC_XSD); + } + + try { + SAXParserFactory factory = SAXParserFactory.newInstance(); + + if (schema != null) { + factory.setNamespaceAware(true); + factory.setSchema(schema); + } + SAXParser saxParser = factory.newSAXParser(); + + if (saxParser.isValidating()) { + LOGGER.info("Validating against schema " + xsdUrl.getPath()); + } + graphs = new LinkedList<>(); + + saxParser.parse(fileName, new SvcLogicHandler(graphs, store)); + + } catch (Exception e) { + String msg = e.getMessage(); + if (msg != null) { + LOGGER.error(msg); + throw new SvcLogicException("Compiler error: " + fileName + " @ " + msg); + } else { + LOGGER.info("Caught exception parsing " + fileName, e); + throw new SvcLogicException("Compiler error: " + fileName, e); + } + } + + return graphs; + } + + public static void main(String argv[]) { + + if (argv.length == 0) { + SvcLogicParser.usage(); + } + + if ("load".equalsIgnoreCase(argv[0])) { + if (argv.length == 3) { + String xmlfile = argv[1]; + String propfile = argv[2]; + + SvcLogicStore store = SvcLogicParser.getStore(propfile); + try { + SvcLogicParser.load(xmlfile, store); + } catch (Exception e) { + LOGGER.error(e.getMessage(), e); + } + } else { + SvcLogicParser.usage(); + } + } else if ("print".equalsIgnoreCase(argv[0])) { + String version = null; + String propfile = null; + + switch (argv.length) { + case 6: + version = argv[4]; + propfile = argv[5]; + case 5: + if (propfile == null) { + propfile = argv[4]; + } + SvcLogicStore store = SvcLogicParser.getStore(propfile); + SvcLogicParser.print(argv[1], argv[2], argv[3], version, store); + break; + default: + SvcLogicParser.usage(); + } + } else if ("get-source".equalsIgnoreCase(argv[0])) { + + switch (argv.length) { + case 6: + SvcLogicStore store = SvcLogicParser.getStore(argv[5]); + SvcLogicParser.getSource(argv[1], argv[2], argv[3], argv[4], store); + break; + default: + SvcLogicParser.usage(); + } + } else if ("activate".equalsIgnoreCase(argv[0])) { + if (argv.length == 6) { + SvcLogicStore store = SvcLogicParser.getStore(argv[5]); + SvcLogicParser.activate(argv[1], argv[2], argv[3], argv[4], store); + } else { + SvcLogicParser.usage(); + } + } else if ("validate".equalsIgnoreCase(argv[0])) { + if (argv.length == 3) { + String xmlfile = argv[1]; + String propfile = argv[2]; + + System.setProperty(SLI_VALIDATING_PARSER, "true"); + SvcLogicStore store = SvcLogicParser.getStore(propfile); + try { + SvcLogicParser.validate(xmlfile, store); + } catch (Exception e) { + LOGGER.error(e.getMessage(), e); + } + } else { + SvcLogicParser.usage(); + } + } + + System.exit(0); + } + + private static SvcLogicStore getStore(String propfile) { + + SvcLogicStore store = null; + + try { + store = SvcLogicStoreFactory.getSvcLogicStore(propfile); + } catch (Exception e) { + LOGGER.error(SVC_LOGIC_STORE_ERROR, e); + System.exit(1); + } + + return store; + + } + + public static void load(String xmlfile, SvcLogicStore store) throws SvcLogicException { + File xmlFile = new File(xmlfile); + if (!xmlFile.canRead()) { + throw new ConfigurationException("Cannot read xml file (" + xmlfile + ")"); + } + + SvcLogicParser parser = new SvcLogicParser(store); + LinkedList graphs = null; + try { + graphs = parser.parse(xmlfile); + } catch (Exception e) { + throw new SvcLogicException(e.getMessage(), e); + } + + if (graphs == null) { + throw new SvcLogicException("Could not parse " + xmlfile); + } + + for (SvcLogicGraph graph : graphs) { + + String module = graph.getModule(); + String rpc = graph.getRpc(); + String version = graph.getVersion(); + String mode = graph.getMode(); + try { + LOGGER.info("Saving SvcLogicGraph to database (module:" + module + ",rpc:" + rpc + ",version:" + version + ",mode:" + mode + ")"); + store.store(graph); + } catch (Exception e) { + throw new SvcLogicException(e.getMessage(), e); + } + + } + + } + + public static void validate(String xmlfile, SvcLogicStore store) throws SvcLogicException { + File xmlFile = new File(xmlfile); + if (!xmlFile.canRead()) { + throw new ConfigurationException("Cannot read xml file (" + xmlfile + ")"); + } + + SvcLogicParser parser = new SvcLogicParser(store); + LinkedList graphs = null; + try { + LOGGER.info("Validating " + xmlfile); + graphs = parser.parse(xmlfile); + } catch (Exception e) { + throw new SvcLogicException(e.getMessage(), e); + } + + if (graphs == null) { + throw new SvcLogicException("Could not parse " + xmlfile); + } else { + LOGGER.info("Compilation successful for " + xmlfile); + } + + } + + private static void print(String module, String rpc, String mode, String version, SvcLogicStore store) { + String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")"; + + try { + LOGGER.info(LOAD_MESSAGE + details); + + SvcLogicGraph graph = store.fetch(module, rpc, version, mode); + if (graph == null) { + LOGGER.error(LOAD_ERROR_MESSAGE + details); + System.exit(1); + } + graph.printAsGv(System.out); + } catch (Exception e) { + LOGGER.error(PRINT_ERROR_MESSAGE + details, e); + System.exit(1); + } + + } + + private static void getSource(String module, String rpc, String mode, String version, SvcLogicStore store) { + String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")"; + + try { + LOGGER.info(LOAD_MESSAGE + details); + + SvcLogicGraph graph = store.fetch(module, rpc, version, mode); + if (graph == null) { + LOGGER.error(LOAD_ERROR_MESSAGE + details); + System.exit(1); + } + graph.printAsXml(System.out); + } catch (Exception e) { + LOGGER.error(PRINT_ERROR_MESSAGE + details, e); + System.exit(1); + } + + } + + private static void activate(String module, String rpc, String version, String mode, SvcLogicStore store) { + String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")"; + + try { + LOGGER.info(LOAD_MESSAGE + details); + + SvcLogicGraph graph = store.fetch(module, rpc, version, mode); + if (graph == null) { + LOGGER.error(LOAD_ERROR_MESSAGE + details); + System.exit(1); + } + store.activate(graph); + } catch (Exception e) { + LOGGER.error(ACTIVATION_ERROR_MESSAGE + details, e); + System.exit(1); + } + + } + + private static void usage() { + System.err.println("Usage: SvcLogicParser load "); + System.err.println(" OR SvcLogicParser print [] "); + System.err.println(" OR SvcLogicParser get-source "); + System.err.println(" OR SvcLogicParser activate "); + System.exit(1); + } + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicParserException.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicParserException.java new file mode 100644 index 000000000..a2d2ac4c4 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicParserException.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.IOException; + +public class SvcLogicParserException extends IOException { + + public SvcLogicParserException() { + super(); + } + + public SvcLogicParserException(String msg) { + super(msg); + } + + public SvcLogicParserException(Throwable t) { + super(t); + } + + public SvcLogicParserException(String msg, Throwable t) { + super(msg, t); + } +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicRecorder.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicRecorder.java new file mode 100644 index 000000000..1c85394b2 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicRecorder.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.util.Map; + +public interface SvcLogicRecorder { + + void record(Map parmMap) throws SvcLogicException; + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicResource.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicResource.java new file mode 100644 index 000000000..10d31f56e --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicResource.java @@ -0,0 +1,52 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.sql.SQLException; +import java.util.Map; + +public interface SvcLogicResource { + + public enum QueryStatus { + SUCCESS, + NOT_FOUND, + FAILURE + } + + public QueryStatus isAvailable(String resource, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException; + + public QueryStatus exists(String resource, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException; + + public QueryStatus query(String resource, boolean localOnly, String select, String key, String prefix, String orderBy, SvcLogicContext ctx) throws SvcLogicException; + + public QueryStatus reserve(String resource, String select, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException; + + public QueryStatus save(String resource, boolean force, boolean localOnly, String key, Map parms, String prefix, SvcLogicContext ctx) throws SvcLogicException; + + public QueryStatus release(String resource, String key, SvcLogicContext ctx) throws SvcLogicException; + + public QueryStatus delete(String resource, String key, SvcLogicContext ctx) throws SvcLogicException; + + public QueryStatus notify(String resource, String action, String key, SvcLogicContext ctx) throws SvcLogicException; + + public QueryStatus update(String resource, String key, Map parms, String prefix, SvcLogicContext ctx) throws SvcLogicException; + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicStore.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicStore.java new file mode 100644 index 000000000..6d2b99c57 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicStore.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.util.Properties; + +public interface SvcLogicStore { + + public void init(Properties props) throws SvcLogicException; + public void registerNodeType(String nodeType) throws SvcLogicException; + public void unregisterNodeType(String nodeType) throws SvcLogicException; + public boolean isValidNodeType(String nodeType) throws SvcLogicException; + public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException; + public SvcLogicGraph fetch(String module, String rpc, String version, String mode) throws SvcLogicException; + public void store(SvcLogicGraph graph) throws SvcLogicException; + public void delete(String module, String rpc, String version, String mode) throws SvcLogicException; + public void activate(SvcLogicGraph graph) throws SvcLogicException; +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicStoreFactory.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicStoreFactory.java new file mode 100644 index 000000000..38b5b69d6 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicStoreFactory.java @@ -0,0 +1,95 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Properties; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SvcLogicStoreFactory { + + private static final Logger LOG = LoggerFactory.getLogger(SvcLogicStoreFactory.class); + + public static SvcLogicStore getSvcLogicStore(String propfile) + throws SvcLogicException { + File propFile = new File(propfile); + if (!propFile.canRead()) { + throw new ConfigurationException("Cannot read property file " + + propfile); + + } + + try { + return (getSvcLogicStore(new FileInputStream(propFile))); + } catch (Exception e) { + throw new ConfigurationException( + "Could load service store from properties file " + propfile, + e); + } + + } + + public static SvcLogicStore getSvcLogicStore(InputStream inStr) throws SvcLogicException + { + Properties props = new Properties(); + + try { + props.load(inStr); + } catch (Exception e) { + throw new ConfigurationException("Could not get load properties from input stream", e); + } + + return(getSvcLogicStore(props)); + } + + public static SvcLogicStore getSvcLogicStore(Properties props) + throws SvcLogicException { + String storeType = props.getProperty("org.openecomp.sdnc.sli.dbtype"); + if ((storeType == null) || (storeType.length() == 0)) { + throw new ConfigurationException( + "property org.openecomp.sdnc.sli.dbtype unset"); + + } + + SvcLogicStore retval = null; + LOG.debug(String.format("Using org.openecomp.sdnc.sli.dbtype=%s", storeType)); + + if ("jdbc".equalsIgnoreCase(storeType)) { + retval = new SvcLogicJdbcStore(); + + } else if ("dblib".equalsIgnoreCase(storeType)) { + retval = new SvcLogicDblibStore(); + } else { + throw new ConfigurationException("unsupported dbtype (" + storeType + + ")"); + + } + + + retval.init(props); + return (retval); + } + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicVariableTerm.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicVariableTerm.java new file mode 100644 index 000000000..ac642a2d9 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicVariableTerm.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +public class SvcLogicVariableTerm extends SvcLogicExpression { + + private String name = null; + + public String getName() { + return name; + } + + + public SvcLogicVariableTerm(String identifier) + { + this.name = identifier; + } + + public SvcLogicExpression getSubscript() + { + if (numOperands() > 0) + { + return(getOperands().get(0)); + } + else + { + return(null); + } + } + + + public String toString() + { + String retval = ""; + + if (numOperands() > 0) + { + retval = name + "[" + getSubscript().toString() + "]"; + } + else + { + retval = name; + } + return(retval); + } + + @Override + public String asParsedExpr() { + if (numOperands() == 0) { + return("(variable-term "+name+")"); + } + else + { + return("(variable-term "+name+" "+getSubscript().asParsedExpr()+")"); + } + } + +} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/BreakNodeException.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/BreakNodeException.java deleted file mode 100644 index 3e355baad..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/BreakNodeException.java +++ /dev/null @@ -1,46 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -public class BreakNodeException extends SvcLogicException { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public BreakNodeException() - { - super(); - } - - public BreakNodeException(String message) - { - super(message); - } - - public BreakNodeException(String message, Throwable t) - { - super(message, t); - } - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/ConfigurationException.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/ConfigurationException.java deleted file mode 100644 index fa1308f0e..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/ConfigurationException.java +++ /dev/null @@ -1,45 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -public class ConfigurationException extends SvcLogicException { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public ConfigurationException() - { - super(); - } - - public ConfigurationException(String msg) - { - super(msg); - } - - public ConfigurationException(String msg, Throwable t) - { - super(msg, t); - } -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/DuplicateValueException.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/DuplicateValueException.java deleted file mode 100644 index beb22b0b8..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/DuplicateValueException.java +++ /dev/null @@ -1,45 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -public class DuplicateValueException extends SvcLogicException { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DuplicateValueException() - { - super(); - } - - public DuplicateValueException(String message) - { - super(message); - } - - public DuplicateValueException(String message, Throwable t) - { - super(message, t); - } -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/MessageWriter.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/MessageWriter.java deleted file mode 100644 index 5e5b621b0..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/MessageWriter.java +++ /dev/null @@ -1,302 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.File; -import java.io.FileInputStream; -import java.sql.SQLException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.Properties; - -import javax.sql.rowset.CachedRowSet; - -import org.openecomp.sdnc.sli.resource.dblib.DbLibService; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceReference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class MessageWriter { - - private static final Logger LOG = LoggerFactory.getLogger(MessageWriter.class); - - private static final String DBLIB_SERVICE = "org.openecomp.sdnc.sli.resource.dblib.DBResourceManager"; - private static final String SVCLOGIC_PROP_VAR = "SDNC_SLI_PROPERTIES"; - private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; - - private static final String INCOMING_PROPERTY_NAME = "org.openecomp.sdnc.sli.MessageWriter.writeIncomingRequests"; - private static final String OUTGOING_PROPERTY_NAME = "org.openecomp.sdnc.sli.MessageWriter.writeOutgoingRequests"; - - private static final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - - private static DbLibService dbLibService = null; - - private static boolean incomingEnabled = false; - private static boolean outgoingEnabled = false; - - private static boolean initialized = false; - - @SuppressWarnings({ "rawtypes", "unchecked" }) - private static void init() { - if (initialized) - return; - - initialized = true; - - // Read properties - Properties props = new Properties(); - String propPath = System.getenv(SVCLOGIC_PROP_VAR); - - if (propPath == null) { - String propDir = System.getenv(SDNC_CONFIG_DIR); - if (propDir == null) { - propDir = "/opt/sdnc/data/properties"; - } - propPath = propDir + "/svclogic.properties"; - LOG.warn("Environment variable " + SVCLOGIC_PROP_VAR + " unset - defaulting to " + propPath); - } - - File propFile = new File(propPath); - - if (!propFile.exists()) { - LOG.warn("Property file does not exist: " + propPath); - } - - try { - props.load(new FileInputStream(propFile)); - } catch (Exception e) { - LOG.warn("Error loading property file: " + propPath, e); - } - - incomingEnabled = Boolean.valueOf(props.getProperty(INCOMING_PROPERTY_NAME, "false")); - outgoingEnabled = Boolean.valueOf(props.getProperty(OUTGOING_PROPERTY_NAME, "false")); - - LOG.info(INCOMING_PROPERTY_NAME + ": " + incomingEnabled); - LOG.info(OUTGOING_PROPERTY_NAME + ": " + outgoingEnabled); - - if (dbLibService != null) - return; - - BundleContext bctx = FrameworkUtil.getBundle(MessageWriter.class).getBundleContext(); - - ServiceReference sref = bctx.getServiceReference(DBLIB_SERVICE); - - if (sref == null) { - LOG.warn("Could not find service reference for DBLIB service (" + DBLIB_SERVICE + ")"); - } else { - dbLibService = (DbLibService) bctx.getService(sref); - if (dbLibService == null) { - LOG.warn("Could not find service reference for DBLIB service (" + DBLIB_SERVICE + ")"); - } - } - } - - public static void saveOutgoingRequest( - String requestId, - String serviceInstanceId, - String targetUrl, - String request) { - try { - init(); - - if (!outgoingEnabled) - return; - - if (serviceInstanceId == null || serviceInstanceId.trim().length() == 0) - serviceInstanceId = "NA"; - - int seqnum = getLastSequenceNumber("OUTGOING_MESSAGE", requestId) + 1; - String now = df.format(new Date()); - - String sql = "INSERT INTO OUTGOING_MESSAGE (\n" + - " request_id, sequence_number, service_instance_id, target_url, request, start_time)\n" + - "VALUES (?, ?, ?, ?, ?, ?)"; - - ArrayList data = new ArrayList<>(); - data.add(requestId); - data.add(String.valueOf(seqnum)); - data.add(serviceInstanceId); - data.add(targetUrl); - data.add(request); - data.add(now); - - dbLibService.writeData(sql, data, null); - - } catch (Exception e) { - LOG.warn("Failed to save outgoing request for request-id: " + requestId, e); - } - } - - public static void saveOutgoingResponse(String requestId, int httpResponseCode, String response) { - try { - init(); - - if (!outgoingEnabled) - return; - - int seqnum = getLastSequenceNumber("OUTGOING_MESSAGE", requestId); - if (seqnum == 0) { - LOG.warn("Failed to save outgoing response for request-id: " + requestId + - ": Request record not found in OUTGOING_MESSAGE"); - return; - } - - String now = df.format(new Date()); - - String sql = "UPDATE OUTGOING_MESSAGE SET http_response_code = ?, response = ?,\n" + - " duration = timestampdiff(MICROSECOND, start_time, ?) / 1000\n" + - "WHERE request_id = ? AND sequence_number = ?"; - - ArrayList data = new ArrayList<>(); - data.add(String.valueOf(httpResponseCode)); - data.add(response); - data.add(now); - data.add(requestId); - data.add(String.valueOf(seqnum)); - - dbLibService.writeData(sql, data, null); - - } catch (Exception e) { - LOG.warn("Failed to save outgoing response for request-id: " + requestId, e); - } - } - - public static void saveIncomingRequest( - String requestId, - String serviceInstanceId, - String requestHost, - String request) { - try { - init(); - - if (!incomingEnabled) - return; - - if (serviceInstanceId == null || serviceInstanceId.trim().length() == 0) - serviceInstanceId = "NA"; - - int seqnum = getLastSequenceNumber("INCOMING_MESSAGE", requestId) + 1; - String now = df.format(new Date()); - - String sql = "INSERT INTO INCOMING_MESSAGE (\n" + - " request_id, sequence_number, service_instance_id, request_host, request, start_time)\n" + - "VALUES (?, ?, ?, ?, ?, ?)"; - - ArrayList data = new ArrayList<>(); - data.add(requestId); - data.add(String.valueOf(seqnum)); - data.add(serviceInstanceId); - data.add(requestHost); - data.add(request); - data.add(now); - - dbLibService.writeData(sql, data, null); - - } catch (Exception e) { - LOG.warn("Failed to save incoming request for request-id: " + requestId, e); - } - } - - public static void saveIncomingResponse(String requestId, int httpResponseCode, String response) { - try { - init(); - - if (!incomingEnabled) - return; - - int seqnum = getLastSequenceNumber("INCOMING_MESSAGE", requestId); - if (seqnum == 0) { - LOG.warn("Failed to save response for request-id: " + requestId + - ": Request record not found in INCOMING_MESSAGE"); - return; - } - - String now = df.format(new Date()); - - String sql = "UPDATE INCOMING_MESSAGE SET http_response_code = ?, response = ?,\n" + - " duration = timestampdiff(MICROSECOND, start_time, ?) / 1000\n" + - "WHERE request_id = ? AND sequence_number = ?"; - - ArrayList data = new ArrayList<>(); - data.add(String.valueOf(httpResponseCode)); - data.add(response); - data.add(now); - data.add(requestId); - data.add(String.valueOf(seqnum)); - - dbLibService.writeData(sql, data, null); - - } catch (Exception e) { - LOG.warn("Failed to save response for request-id: " + requestId, e); - } - } - - public static String getServiceInstanceId(String requestId) throws SQLException { - init(); - - String sql = "SELECT service_instance_id FROM OUTGOING_MESSAGE WHERE request_id = '" + requestId + - "' ORDER BY sequence_number DESC"; - - CachedRowSet rs = null; - try { - rs = dbLibService.getData(sql, null, null); - if (rs.next()) { - return rs.getString("service_instance_id"); - } - } finally { - if (rs != null) { - try { - rs.close(); - } catch (Exception e) { - LOG.warn("Failed to close CachedRowSet", e); - } - } - } - return null; - } - - private static int getLastSequenceNumber(String tableName, String requestId) throws SQLException { - String sql = "SELECT sequence_number FROM " + tableName + " WHERE request_id = '" + requestId + - "' ORDER BY sequence_number DESC"; - - CachedRowSet rs = null; - try { - rs = dbLibService.getData(sql, null, null); - if (rs.next()) { - return rs.getInt("sequence_number"); - } - } finally { - if (rs != null) { - try { - rs.close(); - } catch (Exception e) { - LOG.warn("Failed to close CachedRowSet", e); - } - } - } - return 0; - } -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/MetricLogger.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/MetricLogger.java deleted file mode 100644 index 14b1f008b..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/MetricLogger.java +++ /dev/null @@ -1,301 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.net.InetAddress; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -/** - * @author dt5972 - * - */ -public class MetricLogger { - - private static final Logger KARAF = LoggerFactory.getLogger(MetricLogger.class); - private static final Logger METRIC = LoggerFactory.getLogger("org.openecomp.sdnc.filters.metric"); - - public static final String BEGIN_TIMESTAMP = "X-ECOMP-BeginTimestamp"; - public static final String END_TIMESTAMP = "X-ECOMP-EndTimestamp"; - public static final String REQUEST_ID = "X-ECOMP-RequestID"; - public static final String SERVICE_INSTANCE_ID = "X-ECOMP-ServiceInstanceID"; - public static final String SERVICE_NAME = "X-ECOMP-ServiceName"; - public static final String PARTNER_NAME = "X-ECOMP-PartnerName"; - public static final String TARGET_ENTITY = "X-ECOMP-TargetEntity"; - public static final String TARGET_SERVICE_NAME = "X-ECOMP-TargetServiceName"; - public static final String STATUS_CODE = "X-ECOMP-StatusCode"; - public static final String RESPONSE_CODE = "X-ECOMP-ResponseCode"; - public static final String RESPONSE_DESCRIPTION = "X-ECOMP-ResponseDescription"; - public static final String INSTANCE_UUID = "X-ECOMP-InstanceUUID"; - public static final String CATEGORY_LOG_LEVEL = "X-ECOMP-CategoryLogLevel"; - public static final String SEVERITY = "X-ECOMP-Severity"; - public static final String SERVER_IP_ADDRESS = "X-ECOMP-ServerIpAddress"; - public static final String ELAPSED_TIME = "X-ECOMP-ElapsedTime"; - public static final String SERVER = "X-ECOMP-Server"; - public static final String CLIENT_IP = "X-ECOMP-ClientIp"; - public static final String CLASS_NAME = "X-ECOMP-ClassName"; - public static final String TARGET_VIRTUAL_ENTITY = "X-ECOMP-TargetVirtualEntity"; - - private long beginTimestamp; - private String lastMsg = null; - - public MetricLogger() { - beginTimestamp = System.currentTimeMillis(); - - try { - InetAddress localhost = InetAddress.getLocalHost(); - setServerIpAddress(localhost.getHostAddress()); - setServer(localhost.getCanonicalHostName()); - } catch (Exception e) { - KARAF.error("Could not get localhost", e); - } - - } - - - public String getBeginTimestamp() { - return MDC.get(BEGIN_TIMESTAMP); - } - - private void setBeginTimestamp(long beginTimestamp) { - this.beginTimestamp = beginTimestamp; - MDC.put(BEGIN_TIMESTAMP, MetricLogger.asIso8601(beginTimestamp)); - } - - public String getEndTimestamp() { - return MDC.get(END_TIMESTAMP); - } - - private void setEndTimestamp(long endTimestamp) { - // Set MDC with formatted time stamp - MDC.put(END_TIMESTAMP, MetricLogger.asIso8601(endTimestamp)); - - // Set elapsed time - setElapsedTime(endTimestamp - beginTimestamp); - - } - - public String getRequestID() { - return MDC.get(REQUEST_ID); - } - - - public String getServiceInstanceID() { - return MDC.get(SERVICE_INSTANCE_ID); - } - - private void setServiceInstanceID(String svcInstanceId) { - MDC.put(SERVICE_INSTANCE_ID, svcInstanceId); - } - - public String getServiceName() { - return MDC.get(SERVICE_NAME); - } - - private void setServiceName(String svcName) { - MDC.put(SERVICE_NAME, svcName); - } - - public String getPartnerName() { - return MDC.get(PARTNER_NAME); - } - - private void setPartnerName(String partnerName) { - MDC.put(PARTNER_NAME, partnerName); - } - - public String getTargetEntity() { - return MDC.get(TARGET_ENTITY); - } - - private void setTargetEntity(String targetEntity) { - MDC.put(TARGET_ENTITY, targetEntity); - } - - public String getTargetServiceName() { - return MDC.get(TARGET_SERVICE_NAME); - } - - private void setTargetServiceName(String targetServiceName) { - MDC.put(TARGET_SERVICE_NAME, targetServiceName); - } - - public String getStatusCode() { - return MDC.get(STATUS_CODE); - } - - private void setStatusCode(String statusCode) { - MDC.put(STATUS_CODE, statusCode); - } - - public String getResponseCode() { - return MDC.get(RESPONSE_CODE); - } - - private void setResponseCode(String responseCode) { - MDC.put(RESPONSE_CODE, responseCode); - } - - public String getResponseDescription() { - return MDC.get(RESPONSE_DESCRIPTION); - } - - private void setResponseDescription(String responseDesc) { - MDC.put(RESPONSE_DESCRIPTION, responseDesc); - } - - public String getInstanceUUID() { - return MDC.get(INSTANCE_UUID); - } - - private void setInstanceUUID(String instanceUUID) { - MDC.put(INSTANCE_UUID, instanceUUID); - } - - public String getCategoryLogLevel() { - return MDC.get(CATEGORY_LOG_LEVEL); - } - - private void setCategoryLogLevel(String categoryLogLevel) { - MDC.put(CATEGORY_LOG_LEVEL, categoryLogLevel); - } - - public String getSeverity() { - return MDC.get(SEVERITY); - } - - private void setSeverity(String severity) { - MDC.put(SEVERITY, severity); - } - - public String getServerIpAddress() { - return MDC.get(SERVER_IP_ADDRESS); - } - - private void setServerIpAddress(String serverIpAddress) { - MDC.put(SERVER_IP_ADDRESS, serverIpAddress); - } - - public String getElapsedTime() { - return MDC.get(ELAPSED_TIME); - } - - private void setElapsedTime(long elapsedTime) { - MDC.put(ELAPSED_TIME, ""+elapsedTime); - } - - public String getServer() { - return MDC.get(SERVER); - } - - private void setServer(String server) { - MDC.put(SERVER, server); - } - - public String getClientIp() { - return MDC.get(CLIENT_IP); - } - - private void setClientIp(String clientIp) { - MDC.put(CLIENT_IP, clientIp); - } - - public String getClassName() { - return MDC.get(CLASS_NAME); - } - - private void setClassName(String className) { - MDC.put(CLASS_NAME, className); - } - - public String getTargetVirtualEntity() { - return MDC.get(TARGET_VIRTUAL_ENTITY); - } - - private void setTargetVirtualEntity(String targetVirtualEntity) { - MDC.put(TARGET_VIRTUAL_ENTITY, targetVirtualEntity); - } - - public static String asIso8601(Date date) { - TimeZone tz = TimeZone.getTimeZone("UTC"); - DateFormat df = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss:SS'+00:00'"); - df.setTimeZone(tz); - return df.format(date); - } - - public static String asIso8601(long tsInMillis) { - return MetricLogger.asIso8601(new Date(tsInMillis)); - } - - public void logRequest(String svcInstanceId, String svcName, String partnerName, String targetEntity, String targetServiceName, String targetVirtualEntity, String msg) { - - setBeginTimestamp(System.currentTimeMillis()); - - if (svcInstanceId != null) { - setServiceInstanceID(svcInstanceId); - } - - if (svcName != null) { - setServiceName(svcName); - } - - if (partnerName != null) { - setPartnerName(partnerName); - } - - if (targetEntity != null) { - setTargetEntity(targetEntity); - } - - if (targetServiceName != null) { - setTargetServiceName(targetServiceName); - } - - if (targetVirtualEntity != null) { - setTargetVirtualEntity(targetVirtualEntity); - } - - this.lastMsg = msg; - - - } - - public void logResponse(String statusCode, String responseCode, String responseDescription) { - setEndTimestamp(System.currentTimeMillis()); - - setStatusCode(statusCode); - setResponseCode(responseCode); - setResponseDescription(responseDescription); - - METRIC.info(lastMsg); - - } -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicAdaptor.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicAdaptor.java deleted file mode 100644 index b4d62ab48..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicAdaptor.java +++ /dev/null @@ -1,42 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.util.Map; - -public interface SvcLogicAdaptor { - - public enum ConfigStatus { - SUCCESS, - ALREADY_ACTIVE, - NOT_FOUND, - NOT_READY, - FAILURE - } - - public ConfigStatus configure(String key, Map parameters, SvcLogicContext ctx); - - public ConfigStatus activate(String key, SvcLogicContext ctx); - - public ConfigStatus deactivate(String key, SvcLogicContext ctx); - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicAtom.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicAtom.java deleted file mode 100644 index 9ac648933..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicAtom.java +++ /dev/null @@ -1,174 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.Serializable; -import java.util.LinkedList; -import java.util.List; - -public class SvcLogicAtom extends SvcLogicExpression { - - public enum AtomType { - NUMBER, - STRING, - IDENTIFIER, - CONTEXT_VAR - - } - - private AtomType atomType; - private String atom; - - - public SvcLogicAtom(String atomType, String atom) - { - this.atomType = AtomType.valueOf(atomType); - this.atom = atom; - - } - - public SvcLogicAtom(String atom) - { - - if (atom == null) - { - this.atomType = null; - this.atom = null; - } - else - { - if (atom.startsWith("$")) - { - this.atomType = AtomType.CONTEXT_VAR; - this.atom = atom.substring(1); - } - else - { - if (Character.isDigit(atom.charAt(0))) - { - this.atomType = AtomType.NUMBER; - this.atom = atom; - } - else if (atom.charAt(0) == '\'') - { - this.atomType = AtomType.STRING; - this.atom = atom.substring(1, atom.length()-1); - } - else - { - this.atomType = AtomType.IDENTIFIER; - this.atom = atom; - - } - - } - } - } - - public AtomType getAtomType() { - return atomType; - } - - public void setAtomType(String newType) - { - atomType = AtomType.valueOf(newType); - } - - public String getAtom() { - return atom; - } - - - - public void setAtomType(AtomType atomType) { - this.atomType = atomType; - } - - public void setAtom(String atom) { - this.atom = atom; - } - - - - public String toString() - { - StringBuffer sbuff = new StringBuffer(); - switch(getAtomType()) - { - case CONTEXT_VAR: - sbuff.append("$"); - case IDENTIFIER: - boolean needDot = false; - for (SvcLogicExpression term: this.getOperands()) - { - if (needDot) - { - sbuff.append("."); - } - sbuff.append(term.toString()); - needDot = true; - } - return(sbuff.toString()); - case STRING: - case NUMBER: - default: - return(atom); - } - } - - public String asParsedExpr() - { - // simplify debugging output for NUMBER type - if (atomType == AtomType.NUMBER) { - return atom; - } - - StringBuffer sbuff = new StringBuffer(); - - sbuff.append("(atom"); - sbuff.append("<"); - sbuff.append(atomType.toString()); - sbuff.append(">"); - - switch(atomType) - { - case IDENTIFIER: - case CONTEXT_VAR: - for (SvcLogicExpression term : getOperands()) - { - sbuff.append(" "); - sbuff.append(term.asParsedExpr()); - - } - break; - default: - sbuff.append(" "); - sbuff.append(atom); - } - - sbuff.append(")"); - return(sbuff.toString()); - } - - - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicBinaryExpression.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicBinaryExpression.java deleted file mode 100644 index 1d780d7e7..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicBinaryExpression.java +++ /dev/null @@ -1,149 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.util.LinkedList; -import java.util.List; - -public class SvcLogicBinaryExpression extends SvcLogicExpression { - - - public enum OperatorType { - addOp("+"), - subOp("-"), - multOp("*"), - divOp("/"), - equalOp("=="), - ltOp("<"), - leOp("<="), - gtOp(">"), - geOp(">="), - neOp("!="), - andOp("and"), - orOp("or"); - - private String text; - - private OperatorType(String text) - { - this.text = text; - } - - public String getText() - { - return(text); - } - - public static OperatorType fromString(String text) - { - if (text != null) - { - for (OperatorType t : OperatorType.values()) - { - if (text.equalsIgnoreCase(t.getText())) { - - return(t); - } - } - } - return(null); - } - - public String toString() - { - return(text); - } - } - private List operators; - - public List getOperators() { - return operators; - } - - public SvcLogicBinaryExpression() - { - operators = new LinkedList(); - } - - public void addOperator(String operator) - { - operators.add(OperatorType.fromString(operator)); - } - - - public String toString() - { - - Listoperands = getOperands(); - StringBuffer sbuff = new StringBuffer(); - - sbuff.append(operands.get(0).toString()); - for (int i = 0 ; i < operators.size(); i++) - { - sbuff.append(" "); - sbuff.append(operators.get(i)); - sbuff.append(" "); - if (i + 1 < operands.size()) { - sbuff.append(operands.get(i + 1).toString()); - } else { - // expression incomplete; operand not bound yet - sbuff.append("?"); - } - } - - return(sbuff.toString()); - - } - - public String asParsedExpr() { - - List operands = getOperands(); - - if (operators.isEmpty()) { - return operands.get(0).asParsedExpr(); - } else { - StringBuffer sbuff = new StringBuffer(); - // operators in reverse order for left associativity - for (int i = operators.size() - 1; i >= 0; --i) { - sbuff.append("("); - sbuff.append(operators.get(i).getText()); - sbuff.append(" "); - } - for (int i = 0; i < operators.size() + 1; ++i) { - if (i < operands.size()) { - sbuff.append(operands.get(i).asParsedExpr()); - } else { - // expression incomplete; operand not bound yet - sbuff.append("?"); - } - if (i != 0) { - sbuff.append(")"); - } - if (i < operators.size()) { - sbuff.append(" "); - } - } - return sbuff.toString(); - } - } - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicContext.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicContext.java deleted file mode 100644 index 79082af29..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicContext.java +++ /dev/null @@ -1,248 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.Text; - - -public class SvcLogicContext { - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicContext.class); - - private HashMap attributes; - - private DOMDataBroker domDataBroker; - - private String status = "success"; - - public SvcLogicContext() - { - this.attributes = new HashMap (); - - } - - public SvcLogicContext(Properties props) - { - this.attributes = new HashMap (); - - if (props.containsKey("SvcLogic.status")) - { - this.status = props.getProperty("SvcLogic.status"); - } - - for (Object nameObj : props.keySet()) - { - String propName = (String) nameObj; - attributes.put(propName, props.getProperty(propName)); - } - } - - - - public DOMDataBroker getDomDataBroker() { - return domDataBroker; - } - - public void setDomDataBroker(DOMDataBroker domDataBroker) { - this.domDataBroker = domDataBroker; - } - - public String getAttribute(String name) - { - if (attributes.containsKey(name)) - { - return(attributes.get(name)); - } - else - { - return(null); - } - } - - public void setAttribute(String name, String value) - { - if (value == null) { - if (attributes.containsKey(name)) { - attributes.remove(name); - } - } else { - attributes.put(name, value); - } - } - - public Set getAttributeKeySet() - { - return(attributes.keySet()); - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public Properties toProperties() - { - Properties props = new Properties(); - - if (status != null) - { - props.setProperty("SvcLogic.status", status); - } - - for (String attrName : attributes.keySet()) - { - String attrVal = attributes.get(attrName); - if (attrVal == null) { - LOG.warn("attribute " + attrName - + "null - setting to empty string"); - props.setProperty(attrName, ""); - } else { - props.setProperty(attrName, attributes.get(attrName)); - } - } - - return(props); - } - - public void mergeDocument(String pfx, Document doc) { - String prefix = ""; - - if (pfx != null) { - prefix = pfx; - } - - Element root = doc.getDocumentElement(); - - mergeElement(prefix, root, null); - } - - public void mergeElement(String pfx, Element element, Map nodeMap) { - - // In XML, cannot tell the difference between containers and lists. - // So, have to treat each element as both (ugly but necessary). - // We do this by passing a nodeMap to be used to count instance of each tag, - // which will be used to set _length and to set index - - LOG.trace("mergeElement("+pfx+","+element.getTagName()+","+nodeMap+")"); - - String curTagName = element.getTagName(); - String prefix = curTagName; - - if (pfx != null) { - prefix = pfx + "." + prefix; - } - - int myIdx = 0; - - if (nodeMap != null) { - if (nodeMap.containsKey(curTagName)) { - myIdx = nodeMap.get(curTagName).intValue(); - } - - nodeMap.put(curTagName, new Integer(myIdx+1)); - this.setAttribute(prefix+"_length", ""+(myIdx+1)); - } - - NodeList children = element.getChildNodes(); - - int numChildren = children.getLength(); - - Map childMap = new HashMap(); - Map idxChildMap = new HashMap(); - - for (int i = 0 ; i < numChildren ; i++) { - Node curNode = children.item(i); - - if (curNode instanceof Text) { - Text curText = (Text) curNode; - String curTextValue = curText.getTextContent(); - LOG.trace("Setting ctx variable "+prefix+" = "+curTextValue); - this.setAttribute(prefix, curText.getTextContent()); - - - } else if (curNode instanceof Element) { - mergeElement(prefix, (Element) curNode, childMap); - if (nodeMap != null) { - - mergeElement(prefix+"["+myIdx+"]", (Element)curNode, idxChildMap); - - } - } - } - - } - - public String resolve(String ctxVarName) { - - if (ctxVarName.indexOf('[') == -1) { - // Ctx variable contains no arrays - return (this.getAttribute(ctxVarName)); - } - - // Resolve any array references - StringBuffer sbuff = new StringBuffer(); - String[] ctxVarParts = ctxVarName.split("\\["); - sbuff.append(ctxVarParts[0]); - for (int i = 1; i < ctxVarParts.length; i++) { - if (ctxVarParts[i].startsWith("$")) { - int endBracketLoc = ctxVarParts[i].indexOf("]"); - if (endBracketLoc == -1) { - // Missing end bracket ... give up parsing - LOG.warn("Variable reference " + ctxVarName - + " seems to be missing a ']'"); - return (this.getAttribute(ctxVarName)); - } - - String idxVarName = ctxVarParts[i].substring(1, endBracketLoc); - String remainder = ctxVarParts[i].substring(endBracketLoc); - - sbuff.append("["); - sbuff.append(this.getAttribute(idxVarName)); - sbuff.append(remainder); - - } else { - // Index is not a variable reference - sbuff.append("["); - sbuff.append(ctxVarParts[i]); - } - } - - return (this.getAttribute(sbuff.toString())); - } - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicDblibStore.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicDblibStore.java deleted file mode 100644 index d494eaab2..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicDblibStore.java +++ /dev/null @@ -1,533 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.sql.Blob; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Properties; - -import javax.sql.rowset.CachedRowSet; - -import org.openecomp.sdnc.sli.resource.dblib.DBResourceManager; -import org.openecomp.sdnc.sli.resource.dblib.DbLibService; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceReference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SvcLogicDblibStore implements SvcLogicStore { - - private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicDblibStore.class); - - private static final String DBLIB_SERVICE = - // "org.openecomp.sdnc.sli.resource.dblib.DBLibService"; - "org.openecomp.sdnc.sli.resource.dblib.DBResourceManager"; - - Properties props = null; - - public void init(Properties props) throws ConfigurationException { - - DbLibService dbSvc = getDbLibService(); - if(dbSvc == null) { - LOG.error("SvcLogic cannot acquire DBLIB_SERVICE"); - return; - } - try { - dbSvc.getData("select 1 from DUAL", new ArrayList(), null); - LOG.debug("SQL test was successful"); - } catch (SQLException e) { - LOG.error("Failed SQL test", e); - } - } - - public boolean hasGraph(String module, String rpc, String version, - String mode) throws SvcLogicException { - - DbLibService dbSvc = getDbLibService(); - - boolean retval = false; - CachedRowSet results = null; - String hasVersionGraphSql = "SELECT count(*) FROM SVC_LOGIC" - + " WHERE module = ? AND rpc = ? AND mode = ? AND version = ?"; - - String hasActiveGraphSql = "SELECT count(*) FROM SVC_LOGIC" - + " WHERE module = ? AND rpc = ? AND mode = ? AND active = 'Y'"; - - PreparedStatement hasGraphStmt = null; - - ArrayList args = new ArrayList(); - args.add(module); - args.add(rpc); - args.add(mode); - - try { - - if (version == null) { - results = dbSvc.getData(hasActiveGraphSql, args, null); - } else { - args.add(version); - results = dbSvc.getData(hasVersionGraphSql, args, null); - } - - if (results.next()) { - int cnt = results.getInt(1); - - if (cnt > 0) { - retval = true; - } - - } - } catch (Exception e) { - throw new ConfigurationException("SQL query failed", e); - } finally { - if (results != null) { - try { - - results.close(); - } catch (SQLException x) { - } - } - - } - - return (retval); - - } - - public SvcLogicGraph fetch(String module, String rpc, String version, - String mode) throws SvcLogicException { - - DbLibService dbSvc = getDbLibService(); - - Connection dbConn = null; - SvcLogicGraph retval = null; - ResultSet results = null; - - String fetchVersionGraphSql = "SELECT graph FROM SVC_LOGIC" - + " WHERE module = ? AND rpc = ? AND mode = ? AND version = ?"; - - String fetchActiveGraphSql = "SELECT graph FROM SVC_LOGIC" - + " WHERE module = ? AND rpc = ? AND mode = ? AND active = 'Y'"; - - - try { - dbConn = ((DBResourceManager) dbSvc).getConnection(); - PreparedStatement fetchGraphStmt; - - ArrayList args = new ArrayList(); - args.add(module); - args.add(rpc); - args.add(mode); - - if (version == null) { - fetchGraphStmt = dbConn.prepareStatement(fetchActiveGraphSql); - } else { - fetchGraphStmt = dbConn.prepareStatement(fetchVersionGraphSql); - } - - fetchGraphStmt.setString(1, module); - fetchGraphStmt.setString(2, rpc); - fetchGraphStmt.setString(3, mode); - if (version != null) { - fetchGraphStmt.setString(4,version); - } - - results = fetchGraphStmt.executeQuery(); - - if (results.next()) { - Blob graphBlob = results.getBlob("graph"); - - ObjectInputStream gStream = new ObjectInputStream( - graphBlob.getBinaryStream()); - - Object graphObj = gStream.readObject(); - gStream.close(); - - if (graphObj instanceof SvcLogicGraph) { - retval = (SvcLogicGraph) graphObj; - } else { - throw new ConfigurationException("invalid type for graph (" - + graphObj.getClass().getName()); - - } - - } else { - return (null); - } - } catch (SQLException e) { - throw new ConfigurationException("SQL query failed", e); - } catch (Exception e) { - throw new ConfigurationException("Graph processing failed", e); - } finally { - if (results != null) { - try { - results.close(); - } catch (SQLException x) { - } - } - try { - if (dbConn != null && !dbConn.isClosed()) { - dbConn.close(); - } - } catch (Throwable exc) { - // the exception not monitored - } finally { - dbConn = null; - } - - } - - return (retval); - - } - - public void store(SvcLogicGraph graph) throws SvcLogicException { - - DbLibService dbSvc = getDbLibService(); - - String storeGraphSql = "INSERT INTO SVC_LOGIC (module, rpc, version, mode, active, graph)" - + " VALUES(?, ?, ?, ?, ?, ?)"; - - if (graph == null) { - throw new SvcLogicException("graph cannot be null"); - } - - byte[] graphBytes = null; - - ByteArrayOutputStream byteStr = null; - ObjectOutputStream goutStr = null; - - try { - byteStr = new ByteArrayOutputStream(); - goutStr = new ObjectOutputStream(byteStr); - goutStr.writeObject(graph); - - graphBytes = byteStr.toByteArray(); - - } catch (Exception e) { - throw new SvcLogicException("could not serialize graph", e); - } finally { - - if (goutStr != null) { - try { - goutStr.close(); - } catch (IOException e) { - - } - } - - if (byteStr != null) { - try { - byteStr.close(); - } catch (IOException e) { - - } - } - } - - // If object already stored in database, delete it - if (hasGraph(graph.getModule(), graph.getRpc(), graph.getVersion(), - graph.getMode())) { - delete(graph.getModule(), graph.getRpc(), graph.getVersion(), - graph.getMode()); - } - - Connection dbConn = null; - - try { - dbConn = ((DBResourceManager) dbSvc).getConnection(); - boolean oldAutoCommit = dbConn.getAutoCommit(); - dbConn.setAutoCommit(false); - PreparedStatement storeGraphStmt = dbConn - .prepareStatement(storeGraphSql); - storeGraphStmt.setString(1, graph.getModule()); - storeGraphStmt.setString(2, graph.getRpc()); - storeGraphStmt.setString(3, graph.getVersion()); - storeGraphStmt.setString(4, graph.getMode()); - storeGraphStmt.setString(5, "N"); - storeGraphStmt.setBlob(6, new ByteArrayInputStream(graphBytes)); - - storeGraphStmt.executeUpdate(); - dbConn.commit(); - - dbConn.setAutoCommit(oldAutoCommit); - } catch (Exception e) { - throw new SvcLogicException("Could not write object to database", e); - } finally { - try { - if (dbConn != null && !dbConn.isClosed()) { - dbConn.close(); - } - } catch (Throwable exc) { - // the exception not monitored - } finally { - dbConn = null; - } - - } - } - - public void delete(String module, String rpc, String version, String mode) - throws SvcLogicException { - - DbLibService dbSvc = getDbLibService(); - - String deleteGraphSql = "DELETE FROM SVC_LOGIC WHERE module = ? AND rpc = ? AND version = ? AND mode = ?"; - - ArrayList args = new ArrayList(); - - args.add(module); - args.add(rpc); - args.add(version); - args.add(mode); - - try { - dbSvc.writeData(deleteGraphSql, args, null); - } catch (Exception e) { - throw new SvcLogicException( - "Could not delete object from database", e); - } - } - - public void activate(SvcLogicGraph graph) throws SvcLogicException { - DbLibService dbSvc = getDbLibService(); - - String deactivateSql = "UPDATE SVC_LOGIC SET active = 'N' WHERE module = ? AND rpc = ? AND mode = ?"; - - String activateSql = "UPDATE SVC_LOGIC SET active = 'Y' WHERE module = ? AND rpc = ? AND mode = ? AND version = ?"; - - ArrayList args = new ArrayList(); - - args.add(graph.getModule()); - args.add(graph.getRpc()); - args.add(graph.getMode()); - - try { - - dbSvc.writeData(deactivateSql, args, null); - - args.add(graph.getVersion()); - dbSvc.writeData(activateSql, args, null); - - } catch (Exception e) { - throw new SvcLogicException("Could not activate graph", e); - } - } - - @Override - public void registerNodeType(String nodeType) throws SvcLogicException { - - String registerNodeSql = "INSERT INTO NODE_TYPES (nodetype) VALUES(?)"; - - if (isValidNodeType(nodeType)) { - return; - } - - DbLibService dbSvc = getDbLibService(); - ArrayList args = new ArrayList(); - - args.add(nodeType); - - try { - dbSvc.writeData(registerNodeSql, args, null); - } catch (Exception e) { - throw new SvcLogicException("Could not add node type to database", - e); - } - - } - - @Override - public void unregisterNodeType(String nodeType) throws SvcLogicException { - - if (!isValidNodeType(nodeType)) { - return; - } - - String unregisterNodeSql = "DELETE FROM NODE_TYPES WHERE nodetype = ?"; - - DbLibService dbSvc = getDbLibService(); - ArrayList args = new ArrayList(); - - args.add(nodeType); - - try { - dbSvc.writeData(unregisterNodeSql, args, null); - } catch (Exception e) { - throw new SvcLogicException( - "Could not delete node type from database", e); - } - - } - - @Override - public boolean isValidNodeType(String nodeType) throws SvcLogicException { - - String validateNodeSql = "SELECT count(*) FROM NODE_TYPES WHERE nodetype = ?"; - - DbLibService dbSvc = getDbLibService(); - - ArrayList args = new ArrayList(); - - args.add(nodeType); - - boolean isValid = false; - - CachedRowSet results = null; - try { - results = dbSvc.getData(validateNodeSql, args, null); - if (results != null) { - if (results.next()) { - int cnt = results.getInt(1); - - if (cnt > 0) { - isValid = true; - } - } - } - } catch (Exception e) { - throw new SvcLogicException( - "Cannot select node type from database", e); - } finally { - if (results != null) { - try { - results.close(); - } catch (SQLException x) { - } - } - - } - - return (isValid); - } - - private DbLibService getDbLibService() { - - // Get DbLibService interface object. - DbLibService dblibSvc = null; - ServiceReference sref = null; - BundleContext bctx = null; - - Bundle bundle = FrameworkUtil.getBundle(SvcLogicDblibStore.class); - - if (bundle != null) { - bctx = bundle.getBundleContext(); - - if (bctx != null) { - sref = bctx.getServiceReference(DBLIB_SERVICE); - } - - if (sref == null) { - LOG.warn("Could not find service reference for DBLIB service (" - + DBLIB_SERVICE + ")"); - } else { - dblibSvc = (DbLibService) bctx.getService(sref); - if (dblibSvc == null) { - - LOG.warn("Could not find service reference for DBLIB service (" - + DBLIB_SERVICE + ")"); - } - } - } - - // initialize a stand-alone instance of dblib resource - else { - // Try to create a DbLibService object from dblib properties - if(JavaSingleton.getInstance() == null){ - Properties dblibProps = new Properties(); - - String propDir = System.getenv(SDNC_CONFIG_DIR); - if (propDir == null) { - - propDir = "/opt/sdnc/data/properties"; - } - String propPath = propDir + "/dblib.properties"; - - File propFile = new File(propPath); - - if (!propFile.exists()) { - - LOG.warn( - "Missing configuration properties file : " - + propFile); - return(null); - } - - try { - - dblibProps.load(new FileInputStream(propFile)); - } catch (Exception e) { - LOG.warn( - "Could not load properties file " + propPath, e); - return(null); - - } - - try { - dblibSvc = DBResourceManager.create(dblibProps); - JavaSingleton.setInstance(dblibSvc); - } catch (Exception e) { - LOG.warn("Caught exception trying to create DBResourceManager", e); - } - } else { - dblibSvc = JavaSingleton.getInstance(); - } - } - return (dblibSvc); - } - - - static class JavaSingleton { - /* Private constructor */ - private JavaSingleton() { - /* the body of the constructor here */ - } - - /* instance of the singleton declaration */ - private static volatile DbLibService INSTANCE ; - - /* Access point to the unique instance of the singleton */ - public static DbLibService getInstance() { - return INSTANCE; - } - - public static void setInstance(DbLibService dbresource) { - INSTANCE = dbresource; - } - } -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicException.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicException.java deleted file mode 100644 index c087b8ad8..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicException.java +++ /dev/null @@ -1,46 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -public class SvcLogicException extends Exception { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public SvcLogicException() - { - super(); - } - - public SvcLogicException(String message) - { - super(message); - } - - public SvcLogicException(String message, Throwable t) - { - super(message, t); - } - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExprListener.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExprListener.java deleted file mode 100644 index 4fef12fbc..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExprListener.java +++ /dev/null @@ -1,316 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.util.LinkedList; -import java.util.List; - -import org.antlr.v4.runtime.tree.TerminalNode; -import org.openecomp.sdnc.sli.ExprGrammarParser.AddExprContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.AtomContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.CompareExprContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.ConstantContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.ExprContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.FuncExprContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.MultExprContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.ParenExprContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.RelExprContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.VariableContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.VariableLeadContext; -import org.openecomp.sdnc.sli.ExprGrammarParser.VariableTermContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SvcLogicExprListener extends ExprGrammarBaseListener -{ - - - - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicExprListener.class); - - private SvcLogicExpression curExpr; - private SvcLogicExpression topExpr; - private LinkedList exprStack; - - public SvcLogicExprListener() - { - exprStack = new LinkedList(); - } - - public SvcLogicExpression getParsedExpr() - { - return(curExpr); - } - - private void pushOperand(SvcLogicExpression operand) - { - if (curExpr == null) - { - curExpr = operand; - } - else - { - curExpr.addOperand(operand); - } - } - - private void pushExpr(SvcLogicExpression expr) - { - LOG.trace("Pushing expression ["+expr.getClass().getName()+"]"); - if (curExpr != null) - { - exprStack.push(curExpr); - } - curExpr = expr; - } - - private void popExpr() - { - if (exprStack.isEmpty()) - { - LOG.trace("Popping last expression"); - topExpr = curExpr; - } - else - { - SvcLogicExpression lastExpr = curExpr; - curExpr = exprStack.pop(); - curExpr.addOperand(lastExpr); - LOG.trace("New curExpr is ["+curExpr.getClass().getName()+"]"); - } - - } - - @Override - public void enterAtom(AtomContext ctx) { - - String atomText = ctx.getText(); - - LOG.trace("enterAtom: text = "+atomText); - - - SvcLogicAtom newAtom = new SvcLogicAtom(atomText); - - pushExpr(newAtom); - } - - - @Override - public void enterMultExpr(MultExprContext ctx) { - LOG.trace("enterMultExpr: text = "+ctx.getText()); - - SvcLogicBinaryExpression curBinExpr = new SvcLogicBinaryExpression(); - pushExpr(curBinExpr); - - List opList = ctx.MULTOP(); - - for (TerminalNode nd : opList) - { - LOG.trace("enterMultExpr: operator - "+nd.getText()); - curBinExpr.addOperator(nd.getText()); - } - - } - - @Override - public void exitMultExpr(MultExprContext ctx) { - - LOG.trace("exitMultExpr: text = "+ctx.getText()); - - popExpr(); - - } - - @Override - public void exitAtom(AtomContext ctx) { - LOG.trace("exitAtom: text = "+ctx.getText()); - popExpr(); - } - - @Override - public void enterAddExpr(AddExprContext ctx) { - LOG.trace("enterAddExpr: text = "+ctx.getText()); - List opList = ctx.ADDOP(); - - - SvcLogicBinaryExpression curBinExpr = new SvcLogicBinaryExpression(); - pushExpr(curBinExpr); - - - for (TerminalNode nd : opList) - { - LOG.trace("enterAddExpr: operator - "+nd.getText()); - curBinExpr.addOperator(nd.getText()); - } - - } - - @Override - public void exitAddExpr(AddExprContext ctx) { - LOG.trace("exitAddExpr: text = "+ctx.getText()); - - popExpr(); - } - - @Override - public void enterFuncExpr(FuncExprContext ctx) { - LOG.trace("enterFuncExpr: text = "+ctx.getText()); - LOG.trace("enterFuncExpr - IDENTIFIER : "+ctx.IDENTIFIER().getText()); - - for (ExprContext expr: ctx.expr()) - { - LOG.trace("enterFuncExpr - expr = "+expr.getText()); - } - - - pushExpr(new SvcLogicFunctionCall(ctx.IDENTIFIER().getText())); - } - - @Override - public void exitFuncExpr(FuncExprContext ctx) { - LOG.trace("exitFuncExpr: text = "+ctx.getText()); - - popExpr(); - } - - @Override - public void enterParenExpr(ParenExprContext ctx) { - LOG.trace("enterParenExpr: text = "+ctx.getText()); - LOG.trace("enterParenExpr: expr = "+ctx.expr().getText()); - } - - @Override - public void exitParenExpr(ParenExprContext ctx) { - LOG.trace("exitParenExpr: text = "+ctx.getText()); - } - - @Override - public void enterRelExpr(RelExprContext ctx) { - LOG.trace("enterRelExpr: text = "+ctx.getText()); - - List opList = ctx.RELOP(); - - - SvcLogicBinaryExpression curBinExpr = new SvcLogicBinaryExpression(); - pushExpr(curBinExpr); - - - for (TerminalNode nd : opList) - { - LOG.trace("enterRelExpr: operator - "+nd.getText()); - curBinExpr.addOperator(nd.getText()); - } - - } - - @Override - public void exitRelExpr(RelExprContext ctx) { - LOG.trace("exitRelExpr: text = "+ctx.getText()); - - popExpr(); - } - - @Override - public void enterCompareExpr(CompareExprContext ctx) { - LOG.trace("enterCompareExpr: text = "+ctx.getText()); - - TerminalNode nd = ctx.COMPAREOP(); - - SvcLogicBinaryExpression curBinExpr = new SvcLogicBinaryExpression(); - pushExpr(curBinExpr); - - LOG.trace("enterCompareExpr: operator - "+nd.getText()); - curBinExpr.addOperator(nd.getText()); - - } - - @Override - public void exitCompareExpr(CompareExprContext ctx) { - LOG.trace("exitCompareExpr : text = "+ctx.getText()); - - popExpr(); - } - - - - @Override - public void enterConstant(ConstantContext ctx) { - LOG.trace("enterConstant: text = "+ctx.getText()); - } - - @Override - public void exitConstant(ConstantContext ctx) { - LOG.trace("exitConstant: text = "+ctx.getText()); - } - - - @Override - public void enterVariable(VariableContext ctx) { - LOG.trace("enterVariable: text = "+ctx.getText()); - - - } - - @Override - public void exitVariable(VariableContext ctx) { - LOG.debug("exitVariable: text ="+ctx.getText()); - - } - - - @Override - public void enterVariableLead(VariableLeadContext ctx) { - - LOG.debug("enterVariableLead: text ="+ctx.getText()); - - - } - - @Override - public void exitVariableLead(VariableLeadContext ctx) { - - LOG.trace("exitVariableLead: text ="+ctx.getText()); - } - - @Override - public void enterVariableTerm(VariableTermContext ctx) { - LOG.trace("enterVariableTerm: text ="+ctx.getText()); - - String name = ctx.getText(); - - int subscrStart = name.indexOf("["); - if (subscrStart > -1) - { - name = name.substring(0, subscrStart); - } - SvcLogicVariableTerm vterm = new SvcLogicVariableTerm(name); - pushExpr(vterm); - } - - @Override - public void exitVariableTerm(VariableTermContext ctx) { - LOG.trace("exitVariableTerm: text="+ctx.getText()); - popExpr(); - } -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExprParserErrorListener.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExprParserErrorListener.java deleted file mode 100644 index 4c7dd22be..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExprParserErrorListener.java +++ /dev/null @@ -1,44 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import org.antlr.v4.runtime.BaseErrorListener; -import org.antlr.v4.runtime.RecognitionException; -import org.antlr.v4.runtime.Recognizer; -import org.antlr.v4.runtime.misc.ParseCancellationException; - -public class SvcLogicExprParserErrorListener extends BaseErrorListener { - - private static final SvcLogicExprParserErrorListener instance = new SvcLogicExprParserErrorListener(); - - public static SvcLogicExprParserErrorListener getInstance() { - return(instance); - } - - @Override - public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, - String msg, RecognitionException e) throws ParseCancellationException { - throw new ParseCancellationException(msg); - } - - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExpression.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExpression.java deleted file mode 100644 index a6af82018..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExpression.java +++ /dev/null @@ -1,51 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.Serializable; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - - -public abstract class SvcLogicExpression implements Serializable { - - private List operands = new LinkedList(); - - - public void addOperand(SvcLogicExpression expr) - { - operands.add(expr); - } - - public List getOperands() { - return operands; - } - - public int numOperands() - { - return(operands.size()); - } - - public abstract String asParsedExpr(); - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExpressionFactory.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExpressionFactory.java deleted file mode 100644 index cce8e044d..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicExpressionFactory.java +++ /dev/null @@ -1,99 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.antlr.v4.runtime.ANTLRInputStream; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.tree.ParseTreeWalker; -import org.openecomp.sdnc.sli.ExprGrammarParser.ExprContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class SvcLogicExpressionFactory { - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicExpressionFactory.class); - - - public static SvcLogicExpression parse(String exprStr) throws IOException - { - LOG.trace("parse("+exprStr+")"); - InputStream exprStream = new ByteArrayInputStream(exprStr.getBytes()); - CharStream input = new ANTLRInputStream(exprStream); - ExprGrammarLexer lexer = new ExprGrammarLexer(input); - CommonTokenStream tokens = new CommonTokenStream(lexer); - ExprGrammarParser parser = new ExprGrammarParser(tokens); - - lexer.removeErrorListeners(); - lexer.addErrorListener(SvcLogicExprParserErrorListener.getInstance()); - parser.removeErrorListeners(); - parser.addErrorListener(SvcLogicExprParserErrorListener.getInstance()); - - ExprContext expression = null; - - try { - expression = parser.expr(); - } catch (Exception e) { - String errorMsg = e.getMessage(); - - LOG.error(errorMsg); - throw new SvcLogicParserException(errorMsg); - } - - - ParseTreeWalker walker = new ParseTreeWalker(); - SvcLogicExprListener listener = new SvcLogicExprListener(); - walker.walk(listener, expression); - - - return(listener.getParsedExpr()); - } - - public static void main(String argv[]) { - - - System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "debug"); - - StringBuffer sbuff = new StringBuffer(); - - for (int i = 0 ; i < argv.length ; i++) - { - if (sbuff.length() > 0) - { - sbuff.append(" "); - } - sbuff.append(argv[i]); - } - - try { - SvcLogicExpressionFactory.parse(sbuff.toString()); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicFunctionCall.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicFunctionCall.java deleted file mode 100644 index a98cf6b22..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicFunctionCall.java +++ /dev/null @@ -1,80 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -public class SvcLogicFunctionCall extends SvcLogicExpression { - - private String functionName; - - public SvcLogicFunctionCall(String functionName) - { - this.functionName = functionName; - } - - public String getFunctionName() { - return functionName; - } - - public void setFunctionName(String functionName) { - this.functionName = functionName; - } - - public String toString() - { - StringBuffer sbuff = new StringBuffer(); - - sbuff.append(functionName); - sbuff.append("("); - boolean needComma = false; - for (SvcLogicExpression operand: getOperands()) - { - if (needComma) - { - sbuff.append(","); - } - else - { - needComma = true; - } - sbuff.append(operand.toString()); - - } - sbuff.append(")"); - return(sbuff.toString()); - } - - public String asParsedExpr() - { - StringBuffer sbuff = new StringBuffer(); - - sbuff.append("("); - sbuff.append(functionName); - for (SvcLogicExpression operand: getOperands()) - { - sbuff.append(" "); - sbuff.append(operand.asParsedExpr()); - } - sbuff.append(")"); - return(sbuff.toString()); - } - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicGraph.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicGraph.java deleted file mode 100644 index d3d6d9504..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicGraph.java +++ /dev/null @@ -1,184 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.PrintStream; -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -public class SvcLogicGraph implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - private String module = null; - private String rpc = null; - private String mode = null; - private String version = null; - - private Map attributes; - private Map namedNodes; - private SvcLogicNode rootNode; - - public SvcLogicGraph() - { - attributes = new HashMap(); - namedNodes = new HashMap(); - rootNode = null; - } - - - public String getModule() { - return module; - } - - - public void setModule(String module) { - this.module = module; - } - - - public String getRpc() { - return rpc; - } - - - public void setRpc(String rpc) { - this.rpc = rpc; - } - - - - - public String getMode() { - return mode; - } - - - public void setMode(String mode) { - this.mode = mode; - } - - - public String getVersion() { - return version; - } - - - public void setVersion(String version) { - this.version = version; - } - - - public void setRootNode(SvcLogicNode rootNode) - { - this.rootNode = rootNode; - } - - public SvcLogicNode getRootNode() - { - return(rootNode); - } - - public Serializable getAttribute(String name) - { - if (attributes.containsKey(name)) - { - return(attributes.get(name)); - } - else - { - return(null); - } - - } - - public void setAttribute(String name, Serializable value) throws DuplicateValueException - { - if (attributes.containsKey(name)) - { - throw new DuplicateValueException("Duplicate attribute "+name); - } - - attributes.put(name, value); - } - - public SvcLogicNode getNamedNode(String nodeName) - { - if (namedNodes.containsKey(nodeName)) - { - return(namedNodes.get(nodeName)); - } - else - { - return(null); - } - } - - public void setNamedNode(String nodeName, SvcLogicNode node) throws DuplicateValueException - { - if (namedNodes.containsKey(nodeName)) - { - throw new DuplicateValueException("Duplicate node name "+nodeName); - } - - namedNodes.put(nodeName, node); - } - - - - public void printAsGv(PrintStream pstr) - { - pstr.println("digraph g {"); - pstr.println("START [label=\"START\\n"+module+":"+rpc+"\"];"); - - if (rootNode != null) - { - pstr.println("START -> node"+rootNode.getNodeId()+";"); - rootNode.setVisited(false, true); - rootNode.printAsGv(pstr); - } - pstr.println("}"); - } - - public void printAsXml(PrintStream pstr) - { - pstr.println(""); - pstr.println(" "); - if (rootNode != null) - { - rootNode.setVisited(false, true); - rootNode.printAsXml(pstr, 2); - } - pstr.println(" "); - pstr.println(""); - } - - @Override - public String toString() { - return "SvcLogicGraph [module=" + module + ", rpc=" + rpc + ", mode=" + mode + ", version=" + version + "]"; - } - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicJavaPlugin.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicJavaPlugin.java deleted file mode 100644 index ac14cacc1..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicJavaPlugin.java +++ /dev/null @@ -1,34 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.util.Map; - -public interface SvcLogicJavaPlugin { - - /** - * A marker interface, used to indicate that a class exposes methods that can be - * called from an node. Such methods must have the signature: - * void methodName(Map, SvcLogicContext) - */ - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicJdbcStore.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicJdbcStore.java deleted file mode 100644 index b9e7f80ec..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicJdbcStore.java +++ /dev/null @@ -1,895 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.sql.Blob; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Properties; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class SvcLogicJdbcStore implements SvcLogicStore { - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicJdbcStore.class); - - private String dbUrl = null; - private String dbName = null; - private String dbUser = null; - private String dbPasswd = null; - private String dbDriver = null; - - private Connection dbConn; - private PreparedStatement hasActiveGraphStmt = null; - private PreparedStatement hasVersionGraphStmt = null; - private PreparedStatement fetchActiveGraphStmt = null; - private PreparedStatement fetchVersionGraphStmt = null; - private PreparedStatement storeGraphStmt = null; - private PreparedStatement deleteGraphStmt = null; - - private PreparedStatement deactivateStmt = null; - private PreparedStatement activateStmt = null; - - private PreparedStatement registerNodeStmt = null; - private PreparedStatement unregisterNodeStmt = null; - private PreparedStatement validateNodeStmt = null; - - private void getConnection() throws ConfigurationException - { - - Properties jdbcProps = new Properties(); - - jdbcProps.setProperty("user", dbUser); - jdbcProps.setProperty("password", dbPasswd); - - try { - Driver dvr = new com.mysql.jdbc.Driver(); - if (dvr.acceptsURL(dbUrl)) - { - LOG.debug("Driver com.mysql.jdbc.Driver accepts "+dbUrl); - } - else - { - LOG.warn("Driver com.mysql.jdbc.Driver does not accept "+dbUrl); - } - } catch (SQLException e1) { - LOG.error("Caught exception trying to load com.mysql.jdbc.Driver", e1); - - - } - - - try - { - this.dbConn = DriverManager.getConnection(dbUrl, jdbcProps); - } - catch (Exception e) - { - throw new ConfigurationException("failed to get database connection ["+dbUrl+"]", e); - } - - } - - private void createTable() throws ConfigurationException - { - - - DatabaseMetaData dbm = null; - - - try { - dbm = dbConn.getMetaData(); - } catch (SQLException e) { - - throw new ConfigurationException("could not get databse metadata", e); - } - - // See if table SVC_LOGIC exists. If not, create it. - try - { - - - ResultSet tables = dbm.getTables(null, null, "SVC_LOGIC", null); - if (tables.next()) { - // Table exists - } - else { - - String crTableCmd = "CREATE TABLE "+dbName+".SVC_LOGIC (" - + "module varchar(80) NOT NULL," - + "rpc varchar(80) NOT NULL," - + "version varchar(40) NOT NULL," - + "mode varchar(5) NOT NULL," - + "active varchar(1) NOT NULL," - + "graph BLOB," - + "CONSTRAINT P_SVC_LOGIC PRIMARY KEY(module, rpc, version, mode))"; - - Statement stmt = null; - ConfigurationException myExc = null; - try - { - stmt = dbConn.createStatement(); - stmt.executeUpdate(crTableCmd); - } - catch (SQLException e1) - { - myExc = new ConfigurationException("cannot create SVC_LOGIC table", e1); - } - finally - { - if (stmt != null) - { - stmt.close(); - } - } - - if (myExc != null) - { - throw myExc; - } - } - } - catch (Exception e) - { - throw new ConfigurationException("could not create SVC_LOGIC table", e); - } - - // See if NODE_TYPES table exists and, if not, create it - - try - { - - - ResultSet tables = dbm.getTables(null, null, "NODE_TYPES", null); - if (tables.next()) { - // Table exists - } - else { - - String crTableCmd = "CREATE TABLE "+dbName+".NODE_TYPES (" - + "nodetype varchar(80) NOT NULL," - + "CONSTRAINT P_NODE_TYPES PRIMARY KEY(nodetype))"; - - Statement stmt = null; - ConfigurationException myExc = null; - try - { - stmt = dbConn.createStatement(); - stmt.executeUpdate(crTableCmd); - } - catch (SQLException e1) - { - myExc = new ConfigurationException("cannot create SVC_LOGIC table", e1); - } - finally - { - if (stmt != null) - { - stmt.close(); - } - } - - if (myExc != null) - { - throw myExc; - } - } - } - catch (Exception e) - { - throw new ConfigurationException("could not create SVC_LOGIC table", e); - } - } - - private void prepStatements() throws ConfigurationException - { - - // Prepare statements - String hasVersionGraphSql = "SELECT count(*) FROM "+dbName+".SVC_LOGIC" - + " WHERE module = ? AND rpc = ? AND mode = ? AND version = ?"; - - try - { - hasVersionGraphStmt = dbConn.prepareStatement(hasVersionGraphSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+hasVersionGraphSql, e); - - } - - String hasActiveGraphSql = "SELECT count(*) FROM "+dbName+".SVC_LOGIC" - + " WHERE module = ? AND rpc = ? AND mode = ? AND active = 'Y'"; - - try - { - hasActiveGraphStmt = dbConn.prepareStatement(hasActiveGraphSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+hasVersionGraphSql, e); - - } - - String fetchVersionGraphSql = "SELECT graph FROM "+dbName+".SVC_LOGIC" - + " WHERE module = ? AND rpc = ? AND mode = ? AND version = ?"; - - try - { - fetchVersionGraphStmt = dbConn.prepareStatement(fetchVersionGraphSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+fetchVersionGraphSql, e); - - } - - String fetchActiveGraphSql = "SELECT graph FROM "+dbName+".SVC_LOGIC" - + " WHERE module = ? AND rpc = ? AND mode = ? AND active = 'Y'"; - - try - { - fetchActiveGraphStmt = dbConn.prepareStatement(fetchActiveGraphSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+fetchVersionGraphSql, e); - - } - - String storeGraphSql = "INSERT INTO "+dbName+".SVC_LOGIC (module, rpc, version, mode, active, graph)" - + " VALUES(?, ?, ?, ?, ?, ?)"; - - try - { - storeGraphStmt = dbConn.prepareStatement(storeGraphSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+storeGraphSql, e); - } - - String deleteGraphSql = "DELETE FROM "+dbName+".SVC_LOGIC WHERE module = ? AND rpc = ? AND version = ? AND mode = ?"; - - try - { - deleteGraphStmt = dbConn.prepareStatement(deleteGraphSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+deleteGraphSql, e); - } - - String deactivateSql = "UPDATE "+dbName+".SVC_LOGIC SET active = 'N' WHERE module = ? AND rpc = ? AND mode = ?"; - - try - { - deactivateStmt = dbConn.prepareStatement(deactivateSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+deactivateSql, e); - } - - String activateSql = "UPDATE "+dbName+".SVC_LOGIC SET active = 'Y' WHERE module = ? AND rpc = ? AND version = ? AND mode = ?"; - - try - { - activateStmt = dbConn.prepareStatement(activateSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+activateSql, e); - } - - String registerNodeSql = "INSERT INTO "+dbName+".NODE_TYPES (nodetype) VALUES(?)"; - try - { - registerNodeStmt = dbConn.prepareStatement(registerNodeSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+registerNodeSql, e); - } - - String unregisterNodeSql = "DELETE FROM "+dbName+".NODE_TYPES WHERE nodetype = ?"; - try - { - unregisterNodeStmt = dbConn.prepareStatement(unregisterNodeSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+unregisterNodeSql, e); - } - - String validateNodeSql = "SELECT count(*) FROM "+dbName+".NODE_TYPES WHERE nodetype = ?"; - try - { - validateNodeStmt = dbConn.prepareStatement(validateNodeSql); - } - catch (Exception e) - { - throw new ConfigurationException("could not prepare statement "+validateNodeSql, e); - } - } - - private void initDbResources() throws ConfigurationException - { - if ((dbDriver != null) && (dbDriver.length() > 0)) - { - - try - { - Class.forName(dbDriver); - } - catch (Exception e) - { - throw new ConfigurationException("could not load driver class "+dbDriver, e); - } - } - getConnection(); - createTable(); - prepStatements(); - } - - - public void init(Properties props) throws ConfigurationException { - - - dbUrl = props.getProperty("org.openecomp.sdnc.sli.jdbc.url"); - if ((dbUrl == null) || (dbUrl.length() == 0)) - { - throw new ConfigurationException("property org.openecomp.sdnc.sli.jdbc.url unset"); - } - - dbName = props.getProperty("org.openecomp.sdnc.sli.jdbc.database"); - if ((dbName == null) || (dbName.length() == 0)) - { - throw new ConfigurationException("property org.openecomp.sdnc.sli.jdbc.database unset"); - } - - dbUser = props.getProperty("org.openecomp.sdnc.sli.jdbc.user"); - if ((dbUser == null) || (dbUser.length() == 0)) - { - throw new ConfigurationException("property org.openecomp.sdnc.sli.jdbc.user unset"); - } - - - dbPasswd = props.getProperty("org.openecomp.sdnc.sli.jdbc.password"); - if ((dbPasswd == null) || (dbPasswd.length() == 0)) - { - throw new ConfigurationException("property org.openecomp.sdnc.sli.jdbc.password unset"); - } - - dbDriver = props.getProperty("org.openecomp.sdnc.sli.jdbc.driver"); - - - initDbResources(); - - } - - private boolean isDbConnValid() - { - - boolean isValid = false; - - try - { - if (dbConn != null) - { - isValid = dbConn.isValid(1); - } - } - catch (SQLException e) - {} - - return(isValid); - } -public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException { - - - - - if (!isDbConnValid()) - { - - // Try reinitializing - initDbResources(); - - if (!isDbConnValid()) - { - throw new ConfigurationException("no jdbc connection"); - } - } - - - - boolean retval = false; - ResultSet results = null; - - PreparedStatement hasGraphStmt = null; - if (version == null) - { - hasGraphStmt = hasActiveGraphStmt; - } - else - { - hasGraphStmt = hasVersionGraphStmt; - } - - - - try - { - hasGraphStmt.setString(1, module); - hasGraphStmt.setString(2, rpc); - hasGraphStmt.setString(3, mode); - - - if (version != null) - { - hasGraphStmt.setString(4, version); - } - boolean oldAutoCommit = dbConn.getAutoCommit(); - dbConn.setAutoCommit(false); - results = hasGraphStmt.executeQuery(); - dbConn.commit(); - dbConn.setAutoCommit(oldAutoCommit); - - if (results.next()) - { - int cnt = results.getInt(1); - - if (cnt > 0) - { - retval = true; - } - - } - } - catch (Exception e) - { - throw new ConfigurationException("SQL query failed", e); - } - finally - { - if (results != null) - { - try - { - - results.close(); - } - catch (SQLException x) - {} - } - - } - - - return(retval); - - - } - - public SvcLogicGraph fetch(String module, String rpc, String version, String mode) throws SvcLogicException { - - - - - if (!isDbConnValid()) - { - - // Try reinitializing - initDbResources(); - - if (!isDbConnValid()) - { - throw new ConfigurationException("no jdbc connection"); - } - } - - - - SvcLogicGraph retval = null; - ResultSet results = null; - - PreparedStatement fetchGraphStmt = null; - if (version == null) - { - fetchGraphStmt = fetchActiveGraphStmt; - } - else - { - fetchGraphStmt = fetchVersionGraphStmt; - } - try - { - fetchGraphStmt.setString(1, module); - fetchGraphStmt.setString(2, rpc); - fetchGraphStmt.setString(3, mode); - - - if (version != null) - { - fetchGraphStmt.setString(4, version); - } - boolean oldAutoCommit = dbConn.getAutoCommit(); - dbConn.setAutoCommit(false); - results = fetchGraphStmt.executeQuery(); - dbConn.commit(); - dbConn.setAutoCommit(oldAutoCommit); - - if (results.next()) - { - Blob graphBlob = results.getBlob("graph"); - - ObjectInputStream gStream = new ObjectInputStream(graphBlob.getBinaryStream()); - - Object graphObj = gStream.readObject(); - gStream.close(); - - if (graphObj instanceof SvcLogicGraph) - { - retval = (SvcLogicGraph) graphObj; - } - else - { - throw new ConfigurationException("invalid type for graph ("+graphObj.getClass().getName()); - - } - - } - else - { - return(null); - } - } - catch (Exception e) - { - throw new ConfigurationException("SQL query failed", e); - } - finally - { - if (results != null) - { - try - { - results.close(); - } - catch (SQLException x) - {} - } - - } - - - return(retval); - - - } - - public void store(SvcLogicGraph graph) throws SvcLogicException { - - - if (!isDbConnValid()) - { - - // Try reinitializing - initDbResources(); - - if (!isDbConnValid()) - { - throw new ConfigurationException("no jdbc connection"); - } - } - - if (graph == null) - { - throw new SvcLogicException("graph cannot be null"); - } - - byte[] graphBytes = null; - - ByteArrayOutputStream byteStr = null; - ObjectOutputStream goutStr = null; - - try - { - byteStr = new ByteArrayOutputStream(); - goutStr = new ObjectOutputStream(byteStr); - goutStr.writeObject(graph); - - graphBytes = byteStr.toByteArray(); - - } - catch (Exception e) - { - throw new SvcLogicException("could not serialize graph", e); - } - finally - { - - if (goutStr != null) - { - try { - goutStr.close(); - } catch (IOException e) { - - } - } - - if (byteStr != null) - { - try { - byteStr.close(); - } catch (IOException e) { - - } - } - } - - - // If object already stored in database, delete it - if (hasGraph(graph.getModule(), graph.getRpc(), graph.getVersion(), graph.getMode())) - { - delete(graph.getModule(), graph.getRpc(), graph.getVersion(), graph.getMode()); - } - - try - { - boolean oldAutoCommit = dbConn.getAutoCommit(); - dbConn.setAutoCommit(false); - storeGraphStmt.setString(1, graph.getModule()); - storeGraphStmt.setString(2, graph.getRpc()); - storeGraphStmt.setString(3, graph.getVersion()); - storeGraphStmt.setString(4, graph.getMode()); - storeGraphStmt.setString(5, "N"); - storeGraphStmt.setBlob(6, new ByteArrayInputStream(graphBytes)); - - storeGraphStmt.executeUpdate(); - dbConn.commit(); - - dbConn.setAutoCommit(oldAutoCommit); - } - catch (Exception e) - { - throw new SvcLogicException("Could not write object to database", e); - } - } - - public void delete(String module, String rpc, String version, String mode) throws SvcLogicException - { - if (!isDbConnValid()) - { - - // Try reinitializing - initDbResources(); - - if (!isDbConnValid()) - { - throw new ConfigurationException("no jdbc connection"); - } - } - - try - { - boolean oldAutoCommit = dbConn.getAutoCommit(); - dbConn.setAutoCommit(false); - deleteGraphStmt.setString(1, module); - deleteGraphStmt.setString(2, rpc); - deleteGraphStmt.setString(3, version); - deleteGraphStmt.setString(4, mode); - - - deleteGraphStmt.executeUpdate(); - dbConn.commit(); - dbConn.setAutoCommit(oldAutoCommit); - } - catch (Exception e) - { - throw new SvcLogicException("Could not delete object from database", e); - } - } - - public void activate(SvcLogicGraph graph) throws SvcLogicException - { - try - { - boolean oldAutoCommit = dbConn.getAutoCommit(); - - dbConn.setAutoCommit(false); - - // Deactivate any current active version - deactivateStmt.setString(1, graph.getModule()); - deactivateStmt.setString(2, graph.getRpc()); - deactivateStmt.setString(3, graph.getMode()); - deactivateStmt.executeUpdate(); - - // Activate this version - activateStmt.setString(1, graph.getModule()); - activateStmt.setString(2, graph.getRpc()); - activateStmt.setString(3, graph.getVersion()); - activateStmt.setString(4, graph.getMode()); - activateStmt.executeUpdate(); - - dbConn.commit(); - - dbConn.setAutoCommit(oldAutoCommit); - - } - catch (Exception e) - { - throw new SvcLogicException("Could not activate graph", e); - } - } - - @Override - public void registerNodeType(String nodeType) throws SvcLogicException { - - if (isValidNodeType(nodeType)) - { - return; - } - - if (!isDbConnValid()) - { - - // Try reinitializing - initDbResources(); - - if (!isDbConnValid()) - { - throw new ConfigurationException("no jdbc connection"); - } - } - - try - { - boolean oldAutoCommit = dbConn.getAutoCommit(); - dbConn.setAutoCommit(false); - registerNodeStmt.setString(1, nodeType); - registerNodeStmt.executeUpdate(); - dbConn.commit(); - dbConn.setAutoCommit(oldAutoCommit); - } - catch (Exception e) - { - throw new SvcLogicException("Could not add node type to database", e); - } - - } - - @Override - public void unregisterNodeType(String nodeType) throws SvcLogicException { - - if (!isValidNodeType(nodeType)) - { - return; - } - - if (!isDbConnValid()) - { - - // Try reinitializing - initDbResources(); - - if (!isDbConnValid()) - { - throw new ConfigurationException("no jdbc connection"); - } - } - - try - { - boolean oldAutoCommit = dbConn.getAutoCommit(); - dbConn.setAutoCommit(false); - unregisterNodeStmt.setString(1, nodeType); - unregisterNodeStmt.executeUpdate(); - dbConn.commit(); - dbConn.setAutoCommit(oldAutoCommit); - } - catch (Exception e) - { - throw new SvcLogicException("Could not delete node type from database", e); - } - - } - - @Override - public boolean isValidNodeType(String nodeType) throws SvcLogicException { - - boolean isValid = false; - - if (!isDbConnValid()) - { - - // Try reinitializing - initDbResources(); - - if (!isDbConnValid()) - { - throw new ConfigurationException("no jdbc connection"); - } - } - - ResultSet results = null; - try - { - validateNodeStmt.setString(1, nodeType); - - boolean oldAutoCommit = dbConn.getAutoCommit(); - dbConn.setAutoCommit(false); - results = validateNodeStmt.executeQuery(); - dbConn.commit(); - dbConn.setAutoCommit(oldAutoCommit); - - if (results != null) - { - if (results.next()) - { - int cnt = results.getInt(1); - - if (cnt > 0) - { - isValid = true; - } - } - } - - } - catch (Exception e) - { - throw new SvcLogicException("Cannot select node type from database", e); - } - finally - { - if (results != null) - { - try - { - results.close(); - } - catch (SQLException x) - {} - } - - } - - return(isValid); - } - - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicNode.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicNode.java deleted file mode 100644 index 6828e9ad1..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicNode.java +++ /dev/null @@ -1,456 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.IOException; -import java.io.PrintStream; -import java.io.Serializable; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; - -import org.apache.commons.lang3.StringEscapeUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.xml.sax.Locator; - - -public class SvcLogicNode implements Serializable { - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicExprListener.class); - - private static final long serialVersionUID = 2L; - - private String nodeName; - private int nodeId; - private String nodeType; - private boolean visited; - private SvcLogicGraph graph; - - - private HashMap attributes; - private HashMap outcomes; - private HashMap parameters; - - public SvcLogicNode(int nodeId, String nodeType, SvcLogicGraph graph) - { - this.nodeId = nodeId; - nodeName = ""; - this.nodeType = nodeType; - this.graph = graph; - attributes = new HashMap (); - parameters = new HashMap (); - outcomes = null; - - } - - public SvcLogicNode(int nodeId, String nodeType, String nodeName, SvcLogicGraph graph) throws DuplicateValueException - { - this.nodeId = nodeId; - this.nodeName = nodeName; - this.nodeType = nodeType; - this.graph = graph; - attributes = new HashMap (); - parameters = new HashMap (); - outcomes = null; - graph.setNamedNode(nodeName, this); - } - - - public int getNodeId() - { - return nodeId; - } - - public String getNodeName() - { - return(nodeName); - } - - public String getNodeType() - { - return(nodeType); - } - - public SvcLogicGraph getGraph() - { - return(graph); - } - - public int getNumOutcomes() - { - if (outcomes == null) - { - return(0); - } - else - { - return(outcomes.size()); - } - } - - public SvcLogicExpression getAttribute(String name) - { - if (attributes.containsKey(name)) - { - return(attributes.get(name)); - } - else - { - return(null); - } - - } - - public void setAttribute(String name, String value) throws SvcLogicException - { - setAttribute(name, new SvcLogicAtom("STRING", value)); - } - - public void setAttribute(String name, SvcLogicExpression value) throws SvcLogicException - { - if (attributes.containsKey(name)) - { - throw new DuplicateValueException("Duplicate attribute "+name); - } - - attributes.put(name, value); - } - - - public void mapParameter(String name, String value) throws SvcLogicException - { - - if (parameters.containsKey(name)) - { - throw new DuplicateValueException("Duplicate parameter "+name); - } - try - { - SvcLogicExpression parmValue; - if ((value == null) || (value.length() == 0)) - { - parmValue = new SvcLogicAtom("STRING", ""); - } - else if (value.trim().startsWith("`")) - { - int lastParen = value.lastIndexOf("`"); - String evalExpr = value.trim().substring(1, lastParen); - parmValue = SvcLogicExpressionFactory.parse(evalExpr); - - } - else - { - if (Character.isDigit(value.charAt(0))) - { - parmValue = new SvcLogicAtom("NUMBER", value); - } - else - { - parmValue = new SvcLogicAtom("STRING", value); - } - } - LOG.debug("Setting parameter "+name+" = "+value+" = "+parmValue.asParsedExpr()); - parameters.put(name, parmValue); - } - catch (IOException e) { - - LOG.error("Invalid parameter value expression ("+value+")"); - throw new SvcLogicException(e.getMessage()); - } - } - - public SvcLogicExpression getParameter(String name) - { - if (parameters.containsKey(name)) - { - return(parameters.get(name)); - } - else - { - return(null); - } - } - - public boolean isVisited() { - return visited; - } - - public void setVisited(boolean visited, boolean recursive) { - this.visited = visited; - - if (recursive) - { - Set> outcomeSet = getOutcomeSet(); - - if (outcomeSet == null) - { - return; - } - - for (Iterator> iter = outcomeSet.iterator(); iter.hasNext();) - { - Map.Entry curOutcome = iter.next(); - SvcLogicNode outNode = curOutcome.getValue(); - outNode.setVisited(visited, recursive); - } - } - } - - public void addOutcome(String outcomeValue, SvcLogicNode node) throws SvcLogicException - { - if (outcomes == null) - { - outcomes = new HashMap(); - } - - if (outcomeValue.length() == 0) { - outcomeValue = "\"\""; - } - if (outcomes.containsKey(outcomeValue)) - { - throw new DuplicateValueException("Duplicate outcome value "+outcomeValue); - } - - outcomes.put(outcomeValue, node); - } - - public Set> getOutcomeSet() - { - if (outcomes == null) - { - return null; - } - - return(outcomes.entrySet()); - - } - - public Set> getParameterSet() - { - if (parameters == null) - { - return null; - } - - return(parameters.entrySet()); - - } - - public void printAsGv(PrintStream pstr) - { - - if (visited) - { - return; - } - else - { - visited = true; - } - - StringBuffer sbuff = new StringBuffer(); - - sbuff.append("node"); - sbuff.append(nodeId); - sbuff.append(" [ shape=none, margin=0, label=<"); - sbuff.append(""); - - if (nodeName.length() > 0) - { - sbuff.append(""); - } - - Set> attrSet = attributes.entrySet(); - for (Iterator> iter = attrSet.iterator() ; iter.hasNext();) - { - Map.Entry curAttr = iter.next(); - sbuff.append(""); - } - sbuff.append("
"); - sbuff.append(nodeId); - sbuff.append(" : "); - sbuff.append(nodeType); - sbuff.append("
AttributeValue
name"); - sbuff.append(nodeName); - sbuff.append("
"); - sbuff.append(curAttr.getKey()); - sbuff.append(""); - sbuff.append(StringEscapeUtils.escapeHtml3(curAttr.getValue().toString())); - sbuff.append("
>];"); - - pstr.println(sbuff.toString()); - - - if (outcomes != null) - { - TreeMap sortedOutcomes = new TreeMap(outcomes); - Set> outcomeSet = sortedOutcomes.entrySet(); - - for (Iterator> iter = outcomeSet.iterator(); iter.hasNext();) - { - Map.Entry curOutcome = iter.next(); - String outValue = curOutcome.getKey(); - SvcLogicNode outNode = curOutcome.getValue(); - pstr.println("node"+nodeId+" -> node"+outNode.getNodeId()+" [label=\""+outValue+"\"];"); - outNode.printAsGv(pstr); - } - } - } - - public void printAsXml(PrintStream pstr, int indentLvl) - { - if (visited) - { - return; - } - // Print node tag - for (int i = 0 ; i < indentLvl ; i++) - { - pstr.print(" "); - } - pstr.print("<"); - pstr.print(this.getNodeType()); - - Set> attrSet = attributes.entrySet(); - for (Iterator> iter = attrSet.iterator() ; iter.hasNext();) - { - Map.Entry curAttr = iter.next(); - pstr.print(" "); - pstr.print(curAttr.getKey()); - pstr.print("='`"); - pstr.print(curAttr.getValue()); - pstr.print("'`"); - } - - if (((parameters == null) || (parameters.isEmpty())) && - ((outcomes == null) || outcomes.isEmpty())) - { - pstr.print("/>\n"); - pstr.flush(); - return; - } - else - { - pstr.print(">\n"); - } - - // Print parameters (if any) - if (parameters != null) - { - Set> paramSet = parameters.entrySet(); - for (Iterator> iter = paramSet.iterator() ; iter.hasNext();) - { - for (int i = 0 ; i < indentLvl+1 ; i++) - { - pstr.print(" "); - } - pstr.print(" curAttr = iter.next(); - pstr.print(" name='"); - pstr.print(curAttr.getKey()); - pstr.print("' value='`"); - pstr.print(curAttr.getValue().toString()); - pstr.print("`'/>\n"); - } - } - - // Print outcomes (if any) - if (outcomes != null) - { - Set> outcomeSet = outcomes.entrySet(); - for (Iterator> iter = outcomeSet.iterator() ; iter.hasNext();) - { - for (int i = 0 ; i < indentLvl+1 ; i++) - { - pstr.print(" "); - } - pstr.print(" curAttr = iter.next(); - pstr.print(" value='"); - pstr.print(curAttr.getKey()); - pstr.print("'>\n"); - SvcLogicNode outNode = curAttr.getValue(); - outNode.printAsXml(pstr, indentLvl+2); - for (int i = 0 ; i < indentLvl+1 ; i++) - { - pstr.print(" "); - } - pstr.print("\n"); - } - } - - // Print node end tag - for (int i = 0 ; i < indentLvl ; i++) - { - pstr.print(" "); - } - pstr.print("\n"); - pstr.flush(); - - } - - - public SvcLogicNode getOutcomeValue(String value) - { - - if (value.length() == 0) { - value = "\"\""; - } - if (outcomes == null) - { - return(null); - } - - if (outcomes.containsKey(value)) - { - return(outcomes.get(value)); - } - else - { - StringBuffer keyBuffer = new StringBuffer(); - keyBuffer.append("{"); - for (String key : outcomes.keySet()) { - keyBuffer.append(" ("+key+")"); - } - keyBuffer.append("}"); - LOG.info("Outcome (" + value + ") not found, keys are " + keyBuffer.toString()); - - if (outcomes.containsKey("Other")) - { - return(outcomes.get("Other")); - } - else - { - return(null); - } - } - } -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParser.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParser.java deleted file mode 100644 index 398c28de7..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParser.java +++ /dev/null @@ -1,598 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.File; -import java.io.InputStream; -import java.net.URL; -import java.util.LinkedList; - -import javax.xml.XMLConstants; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.validation.Schema; -import javax.xml.validation.SchemaFactory; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.xml.sax.Attributes; -import org.xml.sax.Locator; -import org.xml.sax.SAXException; -import org.xml.sax.SAXNotRecognizedException; -import org.xml.sax.SAXParseException; -import org.xml.sax.helpers.DefaultHandler; - -/** - * @author dt5972 - * - */ -public class SvcLogicParser { - - SvcLogicStore store = null; - static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; - static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; - static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource"; - static final String JAXP_DYNAMIC_VALIDATION = "http://apache.org/xml/features/validation/dynamic"; - static final String JAXP_SCHEMA_VALIDATION = "http://apache.org/xml/features/validation/schema"; - - private static final String LOAD_MESSAGE = "Getting SvcLogicGraph from database - "; - private static final String LOAD_ERROR_MESSAGE = "SvcLogicGraph not found - "; - private static final String ACTIVATION_ERROR_MESSAGE = "Could not activate SvcLogicGraph - "; - private static final String PRINT_ERROR_MESSAGE = "Could not print SvcLogicGraph - "; - private static final String SVC_LOGIC_STORE_ERROR = "Could not get service logic store"; - - private static final Logger LOGGER = LoggerFactory.getLogger(SvcLogicParser.class); - private static final String SLI_VALIDATING_PARSER = "org.openecomp.sdnc.sli.parser.validate"; - private static final String SVCLOGIC_XSD = "/svclogic.xsd"; - - private class SvcLogicHandler extends DefaultHandler { - private Locator locator = null; - private String module = null; - private String version = null; - private LinkedList graphs = null; - private SvcLogicGraph curGraph = null; - private SvcLogicNode curNode = null; - private LinkedList nodeStack = null; - private int curNodeId = 0; - private String outcomeValue = null; - private LinkedList outcomeStack = null; - private SvcLogicStore svcLogicStore = null; - - public SvcLogicHandler(LinkedList graphs, SvcLogicStore store) { - this.graphs = graphs; - this.curNode = null; - this.nodeStack = new LinkedList<>(); - this.outcomeStack = new LinkedList<>(); - this.curNodeId = 1; - this.outcomeValue = null; - this.svcLogicStore = store; - - } - - @Override - public void setDocumentLocator(Locator locator) { - this.locator = locator; - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - - // Handle service-logic (graph) tag - if ("service-logic".equalsIgnoreCase(qName)) { - - module = attributes.getValue("module"); - if (module == null || module.length() == 0) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'module' attribute from service-logic tag"); - } - - version = attributes.getValue("version"); - if (version == null || version.length() == 0) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'version' attribute from service-logic tag"); - } - - return; - } - - if ("method".equalsIgnoreCase(qName)) { - if (curGraph != null) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot nest module tags"); - } - curGraph = new SvcLogicGraph(); - curGraph.setModule(module); - curGraph.setVersion(version); - this.curNodeId = 1; - - String attrValue = attributes.getValue("rpc"); - if (attrValue == null || attrValue.length() == 0) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'rpc' attribute for method tag"); - } - curGraph.setRpc(attrValue); - - attrValue = attributes.getValue("mode"); - if (attrValue == null || attrValue.length() == 0) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Missing 'mode' attribute for method tag"); - } - curGraph.setMode(attrValue); - - return; - - } - - // Handle outcome (edge) tag - if ("outcome".equalsIgnoreCase(qName)) { - String refValue = attributes.getValue("ref"); - - if (refValue != null) { - SvcLogicNode refNode = curGraph.getNamedNode(refValue); - - if (refNode != null) { - try { - curNode.addOutcome(attributes.getValue("value"), refNode); - } catch (SvcLogicException e) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot add outcome", e); - } - } else { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "ref to unknown node " + refValue); - } - return; - } - - if (outcomeValue != null) { - outcomeStack.push(outcomeValue); - } - outcomeValue = attributes.getValue("value"); - - return; - } - - // Handle parameter tag - if ("parameter".equalsIgnoreCase(qName)) { - String parmName = attributes.getValue("name"); - String parmValue = attributes.getValue("value"); - - if (parmName != null && parmName.length() > 0 && parmValue != null) { - try { - - curNode.mapParameter(parmName, parmValue); - } catch (Exception e) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + " cannot set parameter " + parmName + " to " + parmValue + " [" + e.getMessage() + "]"); - } - } - - return; - } - - // Handle node tags - - String nodeName = attributes.getValue("name"); - SvcLogicNode thisNode = null; - - try { - if (!svcLogicStore.isValidNodeType(qName)) { - throw new SAXNotRecognizedException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Unknown tag " + qName); - } - } catch (Exception e) { - throw new SAXNotRecognizedException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot validate node type " + qName); - } - - try { - if (nodeName != null && nodeName.length() > 0) { - thisNode = new SvcLogicNode(curNodeId++, qName, nodeName, curGraph); - } else { - thisNode = new SvcLogicNode(curNodeId++, qName, curGraph); - } - - if (curGraph.getRootNode() == null) { - curGraph.setRootNode(thisNode); - } - } catch (SvcLogicException e) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + e.getMessage()); - - } - - int numAttributes = attributes.getLength(); - - for (int i = 0; i < numAttributes; i++) { - String attrName = attributes.getQName(i); - if (!"name".equalsIgnoreCase(attrName)) { - try { - - String attrValueStr = attributes.getValue(i); - SvcLogicExpression attrValue = null; - if (attrValueStr.trim().startsWith("`")) { - int lastParen = attrValueStr.lastIndexOf("`"); - String evalExpr = attrValueStr.trim().substring(1, lastParen); - attrValue = SvcLogicExpressionFactory.parse(evalExpr); - - } else { - if (Character.isDigit(attrValueStr.charAt(0))) { - attrValue = new SvcLogicAtom("NUMBER", attrValueStr); - } else { - attrValue = new SvcLogicAtom("STRING", attrValueStr); - } - } - thisNode.setAttribute(attrName, attrValue); - } catch (Exception e) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + "Cannot set attribute " + attrName, e); - } - } - } - - if (curNode != null) { - try { - if ("block".equalsIgnoreCase(curNode.getNodeType()) || "for".equalsIgnoreCase(curNode.getNodeType()) || "while".equalsIgnoreCase(curNode.getNodeType())) { - curNode.addOutcome("" + (curNode.getNumOutcomes() + 1), thisNode); - } else { - if (outcomeValue == null) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + curNode.getNodeType() + " node expects outcome, instead found " + thisNode.getNodeType()); - } - curNode.addOutcome(outcomeValue, thisNode); - } - } catch (SvcLogicException e) { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + e.getMessage()); - } - nodeStack.push(curNode); - } - curNode = thisNode; - - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - - // Handle close of service-logic tag - if ("service-logic".equalsIgnoreCase(qName)) { - // Nothing more to do - return; - } - - // Handle close of method tag - if ("method".equalsIgnoreCase(qName)) { - graphs.add(curGraph); - curGraph = null; - return; - } - - // Handle close of outcome tag - if ("outcome".equalsIgnoreCase(qName)) { - // Finished this outcome - pop the outcome stack - if (outcomeStack.isEmpty()) { - outcomeValue = null; - } else { - outcomeValue = outcomeStack.pop(); - } - return; - } - - // Handle close of parameter tag - do nothing - if ("parameter".equalsIgnoreCase(qName)) { - return; - } - - // Handle close of a node tag - if (nodeStack.isEmpty()) { - curNode = null; - } else { - curNode = nodeStack.pop(); - } - } - - @Override - public void error(SAXParseException arg0) throws SAXException { - throw new SAXException("line " + locator.getLineNumber() + ":" + locator.getColumnNumber() + " " + arg0.getMessage()); - } - - } - - public SvcLogicParser(SvcLogicStore store) { - this.store = store; - } - - public SvcLogicParser(String propFile) { - - try { - this.store = SvcLogicStoreFactory.getSvcLogicStore(propFile); - } catch (Exception e) { - LOGGER.error(SVC_LOGIC_STORE_ERROR, e); - - } - - } - - public SvcLogicParser(InputStream propStr) { - - try { - this.store = SvcLogicStoreFactory.getSvcLogicStore(propStr); - } catch (Exception e) { - LOGGER.error(SVC_LOGIC_STORE_ERROR, e); - - } - - } - - public LinkedList parse(String fileName) throws SvcLogicException { - LinkedList graphs = null; - - URL xsdUrl = null; - Schema schema = null; - String validateSchema = System.getProperty(SLI_VALIDATING_PARSER, "true"); - - if (validateSchema != null || validateSchema.equalsIgnoreCase("true")) { - xsdUrl = getClass().getResource(SVCLOGIC_XSD); - - } - - if (xsdUrl != null) { - try { - SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - schema = schemaFactory.newSchema(xsdUrl); - } catch (Exception e) { - LOGGER.warn("Could not validate using schema " + xsdUrl.getPath(), e); - } - } else { - LOGGER.warn("Could not find resource " + SVCLOGIC_XSD); - } - - try { - SAXParserFactory factory = SAXParserFactory.newInstance(); - - if (schema != null) { - factory.setNamespaceAware(true); - factory.setSchema(schema); - } - SAXParser saxParser = factory.newSAXParser(); - - if (saxParser.isValidating()) { - LOGGER.info("Validating against schema " + xsdUrl.getPath()); - } - graphs = new LinkedList<>(); - - saxParser.parse(fileName, new SvcLogicHandler(graphs, store)); - - } catch (Exception e) { - String msg = e.getMessage(); - if (msg != null) { - LOGGER.error(msg); - throw new SvcLogicException("Compiler error: " + fileName + " @ " + msg); - } else { - LOGGER.info("Caught exception parsing " + fileName, e); - throw new SvcLogicException("Compiler error: " + fileName, e); - } - } - - return graphs; - } - - public static void main(String argv[]) { - - if (argv.length == 0) { - SvcLogicParser.usage(); - } - - if ("load".equalsIgnoreCase(argv[0])) { - if (argv.length == 3) { - String xmlfile = argv[1]; - String propfile = argv[2]; - - SvcLogicStore store = SvcLogicParser.getStore(propfile); - try { - SvcLogicParser.load(xmlfile, store); - } catch (Exception e) { - LOGGER.error(e.getMessage(), e); - } - } else { - SvcLogicParser.usage(); - } - } else if ("print".equalsIgnoreCase(argv[0])) { - String version = null; - String propfile = null; - - switch (argv.length) { - case 6: - version = argv[4]; - propfile = argv[5]; - case 5: - if (propfile == null) { - propfile = argv[4]; - } - SvcLogicStore store = SvcLogicParser.getStore(propfile); - SvcLogicParser.print(argv[1], argv[2], argv[3], version, store); - break; - default: - SvcLogicParser.usage(); - } - } else if ("get-source".equalsIgnoreCase(argv[0])) { - - switch (argv.length) { - case 6: - SvcLogicStore store = SvcLogicParser.getStore(argv[5]); - SvcLogicParser.getSource(argv[1], argv[2], argv[3], argv[4], store); - break; - default: - SvcLogicParser.usage(); - } - } else if ("activate".equalsIgnoreCase(argv[0])) { - if (argv.length == 6) { - SvcLogicStore store = SvcLogicParser.getStore(argv[5]); - SvcLogicParser.activate(argv[1], argv[2], argv[3], argv[4], store); - } else { - SvcLogicParser.usage(); - } - } else if ("validate".equalsIgnoreCase(argv[0])) { - if (argv.length == 3) { - String xmlfile = argv[1]; - String propfile = argv[2]; - - System.setProperty(SLI_VALIDATING_PARSER, "true"); - SvcLogicStore store = SvcLogicParser.getStore(propfile); - try { - SvcLogicParser.validate(xmlfile, store); - } catch (Exception e) { - LOGGER.error(e.getMessage(), e); - } - } else { - SvcLogicParser.usage(); - } - } - - System.exit(0); - } - - private static SvcLogicStore getStore(String propfile) { - - SvcLogicStore store = null; - - try { - store = SvcLogicStoreFactory.getSvcLogicStore(propfile); - } catch (Exception e) { - LOGGER.error(SVC_LOGIC_STORE_ERROR, e); - System.exit(1); - } - - return store; - - } - - public static void load(String xmlfile, SvcLogicStore store) throws SvcLogicException { - File xmlFile = new File(xmlfile); - if (!xmlFile.canRead()) { - throw new ConfigurationException("Cannot read xml file (" + xmlfile + ")"); - } - - SvcLogicParser parser = new SvcLogicParser(store); - LinkedList graphs = null; - try { - graphs = parser.parse(xmlfile); - } catch (Exception e) { - throw new SvcLogicException(e.getMessage(), e); - } - - if (graphs == null) { - throw new SvcLogicException("Could not parse " + xmlfile); - } - - for (SvcLogicGraph graph : graphs) { - - String module = graph.getModule(); - String rpc = graph.getRpc(); - String version = graph.getVersion(); - String mode = graph.getMode(); - try { - LOGGER.info("Saving SvcLogicGraph to database (module:" + module + ",rpc:" + rpc + ",version:" + version + ",mode:" + mode + ")"); - store.store(graph); - } catch (Exception e) { - throw new SvcLogicException(e.getMessage(), e); - } - - } - - } - - public static void validate(String xmlfile, SvcLogicStore store) throws SvcLogicException { - File xmlFile = new File(xmlfile); - if (!xmlFile.canRead()) { - throw new ConfigurationException("Cannot read xml file (" + xmlfile + ")"); - } - - SvcLogicParser parser = new SvcLogicParser(store); - LinkedList graphs = null; - try { - LOGGER.info("Validating " + xmlfile); - graphs = parser.parse(xmlfile); - } catch (Exception e) { - throw new SvcLogicException(e.getMessage(), e); - } - - if (graphs == null) { - throw new SvcLogicException("Could not parse " + xmlfile); - } else { - LOGGER.info("Compilation successful for " + xmlfile); - } - - } - - private static void print(String module, String rpc, String mode, String version, SvcLogicStore store) { - String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")"; - - try { - LOGGER.info(LOAD_MESSAGE + details); - - SvcLogicGraph graph = store.fetch(module, rpc, version, mode); - if (graph == null) { - LOGGER.error(LOAD_ERROR_MESSAGE + details); - System.exit(1); - } - graph.printAsGv(System.out); - } catch (Exception e) { - LOGGER.error(PRINT_ERROR_MESSAGE + details, e); - System.exit(1); - } - - } - - private static void getSource(String module, String rpc, String mode, String version, SvcLogicStore store) { - String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")"; - - try { - LOGGER.info(LOAD_MESSAGE + details); - - SvcLogicGraph graph = store.fetch(module, rpc, version, mode); - if (graph == null) { - LOGGER.error(LOAD_ERROR_MESSAGE + details); - System.exit(1); - } - graph.printAsXml(System.out); - } catch (Exception e) { - LOGGER.error(PRINT_ERROR_MESSAGE + details, e); - System.exit(1); - } - - } - - private static void activate(String module, String rpc, String version, String mode, SvcLogicStore store) { - String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")"; - - try { - LOGGER.info(LOAD_MESSAGE + details); - - SvcLogicGraph graph = store.fetch(module, rpc, version, mode); - if (graph == null) { - LOGGER.error(LOAD_ERROR_MESSAGE + details); - System.exit(1); - } - store.activate(graph); - } catch (Exception e) { - LOGGER.error(ACTIVATION_ERROR_MESSAGE + details, e); - System.exit(1); - } - - } - - private static void usage() { - System.err.println("Usage: SvcLogicParser load "); - System.err.println(" OR SvcLogicParser print [] "); - System.err.println(" OR SvcLogicParser get-source "); - System.err.println(" OR SvcLogicParser activate "); - System.exit(1); - } - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParserException.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParserException.java deleted file mode 100644 index ac9c515e9..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicParserException.java +++ /dev/null @@ -1,43 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.IOException; - -public class SvcLogicParserException extends IOException { - - public SvcLogicParserException() { - super(); - } - - public SvcLogicParserException(String msg) { - super(msg); - } - - public SvcLogicParserException(Throwable t) { - super(t); - } - - public SvcLogicParserException(String msg, Throwable t) { - super(msg, t); - } -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicRecorder.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicRecorder.java deleted file mode 100644 index 8a23adf1a..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicRecorder.java +++ /dev/null @@ -1,30 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.util.Map; - -public interface SvcLogicRecorder { - - void record(Map parmMap) throws SvcLogicException; - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicResource.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicResource.java deleted file mode 100644 index 5fc00f87b..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicResource.java +++ /dev/null @@ -1,53 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.sql.SQLException; -import java.util.Map; - -public interface SvcLogicResource { - - public enum QueryStatus { - SUCCESS, - NOT_FOUND, - FAILURE - } - - public QueryStatus isAvailable(String resource, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException; - - public QueryStatus exists(String resource, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException; - - public QueryStatus query(String resource, boolean localOnly, String select, String key, String prefix, String orderBy, SvcLogicContext ctx) throws SvcLogicException; - - public QueryStatus reserve(String resource, String select, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException; - - public QueryStatus save(String resource, boolean force, boolean localOnly, String key, Map parms, String prefix, SvcLogicContext ctx) throws SvcLogicException; - - public QueryStatus release(String resource, String key, SvcLogicContext ctx) throws SvcLogicException; - - public QueryStatus delete(String resource, String key, SvcLogicContext ctx) throws SvcLogicException; - - public QueryStatus notify(String resource, String action, String key, SvcLogicContext ctx) throws SvcLogicException; - - public QueryStatus update(String resource, String key, Map parms, String prefix, SvcLogicContext ctx) throws SvcLogicException; - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicStore.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicStore.java deleted file mode 100644 index 6959c86a8..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicStore.java +++ /dev/null @@ -1,37 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.util.Properties; - -public interface SvcLogicStore { - - public void init(Properties props) throws SvcLogicException; - public void registerNodeType(String nodeType) throws SvcLogicException; - public void unregisterNodeType(String nodeType) throws SvcLogicException; - public boolean isValidNodeType(String nodeType) throws SvcLogicException; - public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException; - public SvcLogicGraph fetch(String module, String rpc, String version, String mode) throws SvcLogicException; - public void store(SvcLogicGraph graph) throws SvcLogicException; - public void delete(String module, String rpc, String version, String mode) throws SvcLogicException; - public void activate(SvcLogicGraph graph) throws SvcLogicException; -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicStoreFactory.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicStoreFactory.java deleted file mode 100644 index 8b6618bef..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicStoreFactory.java +++ /dev/null @@ -1,96 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.util.Properties; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SvcLogicStoreFactory { - - private static final Logger LOG = LoggerFactory.getLogger(SvcLogicStoreFactory.class); - - public static SvcLogicStore getSvcLogicStore(String propfile) - throws SvcLogicException { - File propFile = new File(propfile); - if (!propFile.canRead()) { - throw new ConfigurationException("Cannot read property file " - + propfile); - - } - - try { - return (getSvcLogicStore(new FileInputStream(propFile))); - } catch (Exception e) { - throw new ConfigurationException( - "Could load service store from properties file " + propfile, - e); - } - - } - - public static SvcLogicStore getSvcLogicStore(InputStream inStr) throws SvcLogicException - { - Properties props = new Properties(); - - try { - props.load(inStr); - } catch (Exception e) { - throw new ConfigurationException("Could not get load properties from input stream", e); - } - - return(getSvcLogicStore(props)); - } - - public static SvcLogicStore getSvcLogicStore(Properties props) - throws SvcLogicException { - String storeType = props.getProperty("org.openecomp.sdnc.sli.dbtype"); - if ((storeType == null) || (storeType.length() == 0)) { - throw new ConfigurationException( - "property org.openecomp.sdnc.sli.dbtype unset"); - - } - - SvcLogicStore retval = null; - LOG.debug(String.format("Using org.openecomp.sdnc.sli.dbtype=%s", storeType)); - - if ("jdbc".equalsIgnoreCase(storeType)) { - retval = new SvcLogicJdbcStore(); - - } else if ("dblib".equalsIgnoreCase(storeType)) { - retval = new SvcLogicDblibStore(); - } else { - throw new ConfigurationException("unsupported dbtype (" + storeType - + ")"); - - } - - - retval.init(props); - return (retval); - } - -} diff --git a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicVariableTerm.java b/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicVariableTerm.java deleted file mode 100644 index 9ddc3c0b8..000000000 --- a/sli/common/src/main/java/org/openecomp/sdnc/sli/SvcLogicVariableTerm.java +++ /dev/null @@ -1,77 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -public class SvcLogicVariableTerm extends SvcLogicExpression { - - private String name = null; - - public String getName() { - return name; - } - - - public SvcLogicVariableTerm(String identifier) - { - this.name = identifier; - } - - public SvcLogicExpression getSubscript() - { - if (numOperands() > 0) - { - return(getOperands().get(0)); - } - else - { - return(null); - } - } - - - public String toString() - { - String retval = ""; - - if (numOperands() > 0) - { - retval = name + "[" + getSubscript().toString() + "]"; - } - else - { - retval = name; - } - return(retval); - } - - @Override - public String asParsedExpr() { - if (numOperands() == 0) { - return("(variable-term "+name+")"); - } - else - { - return("(variable-term "+name+" "+getSubscript().asParsedExpr()+")"); - } - } - -} diff --git a/sli/common/src/main/resources/crAseNetwork.sql b/sli/common/src/main/resources/crAseNetwork.sql index 412311761..d95891ae1 100644 --- a/sli/common/src/main/resources/crAseNetwork.sql +++ b/sli/common/src/main/resources/crAseNetwork.sql @@ -1,9 +1,8 @@ --- -- ============LICENSE_START======================================================= --- openECOMP : SDN-C +-- ONAP : CCSDK -- ================================================================================ --- Copyright (C) 2017 AT&T Intellectual Property. All rights --- reserved. +-- Copyright (C) 2017 ONAP -- ================================================================================ -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. diff --git a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java new file mode 100644 index 000000000..123083a74 --- /dev/null +++ b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java @@ -0,0 +1,68 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Enumeration; +import java.util.Properties; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; + +import junit.framework.TestCase; + +public class SvcLogicContextTest extends TestCase { + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicContext.class); + + public void testMerge() { + + try { + InputStream testStr = getClass().getResourceAsStream("/mergetest.xml"); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + + Document theDocument = db.parse(testStr); + SvcLogicContext ctx = new SvcLogicContext(); + ctx.mergeDocument("test-merge", theDocument); + Properties props = ctx.toProperties(); + LOG.info("SvcLogicContext contains the following : "); + for (Enumeration e = props.propertyNames(); e.hasMoreElements() ; ) { + String propName = (String) e.nextElement(); + LOG.info(propName+" = "+props.getProperty(propName)); + + } + } catch (Exception e) { + LOG.error("Caught exception trying to merge", e); + fail("Caught exception trying to merge"); + } + + } + +} diff --git a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpressionParserTest.java b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpressionParserTest.java new file mode 100644 index 000000000..543bb1be3 --- /dev/null +++ b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicExpressionParserTest.java @@ -0,0 +1,68 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.onap.ccsdk.sli.core.sli.SvcLogicExprListener; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpressionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import junit.framework.TestCase; + +public class SvcLogicExpressionParserTest extends TestCase { + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicExprListener.class); + + public void testParse() { + try + { + InputStream testStr = getClass().getResourceAsStream("/expression.tests"); + BufferedReader testsReader = new BufferedReader(new InputStreamReader(testStr)); + + String testExpr = null; + while ((testExpr = testsReader.readLine()) != null) { + + SvcLogicExpression parsedExpr = SvcLogicExpressionFactory.parse(testExpr); + if (parsedExpr == null) + { + fail("parse("+testExpr+") returned null"); + } + else + { + LOG.info("test expression = ["+testExpr+"] ; parsed expression = ["+parsedExpr.asParsedExpr()+"]"); + + } + } + } + catch (Exception e) + { + e.printStackTrace(); + fail("Caught exception processing test cases"); + } + } + +} diff --git a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicParserTest.java b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicParserTest.java new file mode 100644 index 000000000..2da8dd4f8 --- /dev/null +++ b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicParserTest.java @@ -0,0 +1,162 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.LinkedList; + +import org.onap.ccsdk.sli.core.sli.SvcLogicParser; +import org.onap.ccsdk.sli.core.sli.SvcLogicParserException; +import org.onap.ccsdk.sli.core.sli.SvcLogicStore; +import org.onap.ccsdk.sli.core.sli.SvcLogicStoreFactory; + +import junit.framework.TestCase; + +/** + * @author dt5972 + * + */ +public class SvcLogicParserTest extends TestCase { + + /** + * Test method for {@link org.onap.ccsdk.sli.core.sli.SvcLogicParser#parse(java.lang.String)}. + */ + + + public void testParse() { + + + try + { + + URL propUrl = getClass().getResource("/svclogic.properties"); + + InputStream propStr = getClass().getResourceAsStream("/svclogic.properties"); + + SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(propStr); + + assertNotNull(store); + + store.registerNodeType("switch"); + store.registerNodeType("block"); + store.registerNodeType("get-resource"); + store.registerNodeType("reserve"); + store.registerNodeType("is-available"); + store.registerNodeType("exists"); + store.registerNodeType("configure"); + store.registerNodeType("return"); + store.registerNodeType("record"); + store.registerNodeType("allocate"); + store.registerNodeType("release"); + store.registerNodeType("for"); + store.registerNodeType("set"); + + + InputStream testStr = getClass().getResourceAsStream("/parser-good.tests"); + BufferedReader testsReader = new BufferedReader(new InputStreamReader(testStr)); + String testCaseFile = null; + while ((testCaseFile = testsReader.readLine()) != null) { + + testCaseFile = testCaseFile.trim(); + + if (testCaseFile.length() > 0) + { + if (!testCaseFile.startsWith("/")) + { + testCaseFile = "/"+testCaseFile; + } + URL testCaseUrl = getClass().getResource(testCaseFile); + if (testCaseUrl == null) + { + fail("Could not resolve test case file "+testCaseFile); + } + + try { + SvcLogicParser.validate(testCaseUrl.getPath(), store); + } catch (Exception e) { + fail("Validation failure ["+e.getMessage()+"]"); + + } + + + + + + } + } + + testStr = getClass().getResourceAsStream("/parser-bad.tests"); + testsReader = new BufferedReader(new InputStreamReader(testStr)); + testCaseFile = null; + while ((testCaseFile = testsReader.readLine()) != null) { + + testCaseFile = testCaseFile.trim(); + + if (testCaseFile.length() > 0) + { + if (!testCaseFile.startsWith("/")) + { + testCaseFile = "/"+testCaseFile; + } + URL testCaseUrl = getClass().getResource(testCaseFile); + if (testCaseUrl == null) + { + fail("Could not resolve test case file "+testCaseFile); + } + + boolean valid = true; + try { + SvcLogicParser.load(testCaseUrl.getPath(), store); + } catch (Exception e) { + System.out.println(e.getMessage()); + valid = false; + } + + if (valid) { + fail("Expected compiler error on "+testCaseFile+", but got success"); + } + + + } + } + } + catch (SvcLogicParserException e) + { + fail("Parser error : "+e.getMessage()); + } + catch (Exception e) + { + e.printStackTrace(); + fail("Caught exception processing test cases"); + } + + + } + + + +} diff --git a/sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicContextTest.java b/sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicContextTest.java deleted file mode 100644 index 6e6656e89..000000000 --- a/sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicContextTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.Enumeration; -import java.util.Properties; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; - -import junit.framework.TestCase; - -public class SvcLogicContextTest extends TestCase { - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicContext.class); - - public void testMerge() { - - try { - InputStream testStr = getClass().getResourceAsStream("/mergetest.xml"); - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - - Document theDocument = db.parse(testStr); - SvcLogicContext ctx = new SvcLogicContext(); - ctx.mergeDocument("test-merge", theDocument); - Properties props = ctx.toProperties(); - LOG.info("SvcLogicContext contains the following : "); - for (Enumeration e = props.propertyNames(); e.hasMoreElements() ; ) { - String propName = (String) e.nextElement(); - LOG.info(propName+" = "+props.getProperty(propName)); - - } - } catch (Exception e) { - LOG.error("Caught exception trying to merge", e); - fail("Caught exception trying to merge"); - } - - } - -} diff --git a/sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicExpressionParserTest.java b/sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicExpressionParserTest.java deleted file mode 100644 index d6503b60c..000000000 --- a/sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicExpressionParserTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; - -import org.openecomp.sdnc.sli.SvcLogicExprListener; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicExpressionFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import junit.framework.TestCase; - -public class SvcLogicExpressionParserTest extends TestCase { - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicExprListener.class); - - public void testParse() { - try - { - InputStream testStr = getClass().getResourceAsStream("/expression.tests"); - BufferedReader testsReader = new BufferedReader(new InputStreamReader(testStr)); - - String testExpr = null; - while ((testExpr = testsReader.readLine()) != null) { - - SvcLogicExpression parsedExpr = SvcLogicExpressionFactory.parse(testExpr); - if (parsedExpr == null) - { - fail("parse("+testExpr+") returned null"); - } - else - { - LOG.info("test expression = ["+testExpr+"] ; parsed expression = ["+parsedExpr.asParsedExpr()+"]"); - - } - } - } - catch (Exception e) - { - e.printStackTrace(); - fail("Caught exception processing test cases"); - } - } - -} diff --git a/sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicParserTest.java b/sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicParserTest.java deleted file mode 100644 index e8ff2feeb..000000000 --- a/sli/common/src/test/java/org/openecomp/sdnc/sli/SvcLogicParserTest.java +++ /dev/null @@ -1,163 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.URL; -import java.util.LinkedList; - -import org.openecomp.sdnc.sli.SvcLogicParser; -import org.openecomp.sdnc.sli.SvcLogicParserException; -import org.openecomp.sdnc.sli.SvcLogicStore; -import org.openecomp.sdnc.sli.SvcLogicStoreFactory; - -import junit.framework.TestCase; - -/** - * @author dt5972 - * - */ -public class SvcLogicParserTest extends TestCase { - - /** - * Test method for {@link org.openecomp.sdnc.sli.SvcLogicParser#parse(java.lang.String)}. - */ - - - public void testParse() { - - - try - { - - URL propUrl = getClass().getResource("/svclogic.properties"); - - InputStream propStr = getClass().getResourceAsStream("/svclogic.properties"); - - SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(propStr); - - assertNotNull(store); - - store.registerNodeType("switch"); - store.registerNodeType("block"); - store.registerNodeType("get-resource"); - store.registerNodeType("reserve"); - store.registerNodeType("is-available"); - store.registerNodeType("exists"); - store.registerNodeType("configure"); - store.registerNodeType("return"); - store.registerNodeType("record"); - store.registerNodeType("allocate"); - store.registerNodeType("release"); - store.registerNodeType("for"); - store.registerNodeType("set"); - - - InputStream testStr = getClass().getResourceAsStream("/parser-good.tests"); - BufferedReader testsReader = new BufferedReader(new InputStreamReader(testStr)); - String testCaseFile = null; - while ((testCaseFile = testsReader.readLine()) != null) { - - testCaseFile = testCaseFile.trim(); - - if (testCaseFile.length() > 0) - { - if (!testCaseFile.startsWith("/")) - { - testCaseFile = "/"+testCaseFile; - } - URL testCaseUrl = getClass().getResource(testCaseFile); - if (testCaseUrl == null) - { - fail("Could not resolve test case file "+testCaseFile); - } - - try { - SvcLogicParser.validate(testCaseUrl.getPath(), store); - } catch (Exception e) { - fail("Validation failure ["+e.getMessage()+"]"); - - } - - - - - - } - } - - testStr = getClass().getResourceAsStream("/parser-bad.tests"); - testsReader = new BufferedReader(new InputStreamReader(testStr)); - testCaseFile = null; - while ((testCaseFile = testsReader.readLine()) != null) { - - testCaseFile = testCaseFile.trim(); - - if (testCaseFile.length() > 0) - { - if (!testCaseFile.startsWith("/")) - { - testCaseFile = "/"+testCaseFile; - } - URL testCaseUrl = getClass().getResource(testCaseFile); - if (testCaseUrl == null) - { - fail("Could not resolve test case file "+testCaseFile); - } - - boolean valid = true; - try { - SvcLogicParser.load(testCaseUrl.getPath(), store); - } catch (Exception e) { - System.out.println(e.getMessage()); - valid = false; - } - - if (valid) { - fail("Expected compiler error on "+testCaseFile+", but got success"); - } - - - } - } - } - catch (SvcLogicParserException e) - { - fail("Parser error : "+e.getMessage()); - } - catch (Exception e) - { - e.printStackTrace(); - fail("Caught exception processing test cases"); - } - - - } - - - -} diff --git a/sli/common/src/test/resources/EvcActivateSvcLogic_v100.xml b/sli/common/src/test/resources/EvcActivateSvcLogic_v100.xml index 097078a8a..308bda1e9 100644 --- a/sli/common/src/test/resources/EvcActivateSvcLogic_v100.xml +++ b/sli/common/src/test/resources/EvcActivateSvcLogic_v100.xml @@ -1,10 +1,9 @@ - org.openecomp.sdnc.sli;version="${project.version}",* + org.onap.ccsdk.sli.core.sli;version="${project.version}",* diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/BlockNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/BlockNodeExecutor.java new file mode 100644 index 000000000..7132950f3 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/BlockNodeExecutor.java @@ -0,0 +1,74 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BlockNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(BlockNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) + throws SvcLogicException { + + SvcLogicExpression atomicExpr = node.getAttribute("atomic"); + String atomicStr = SvcLogicExpressionResolver.evaluate(atomicExpr, node, ctx); + boolean isAtomic = "true".equalsIgnoreCase(atomicStr); + + // Initialize status to success so that at least one outcome will execute + ctx.setStatus("success"); + + int numOutcomes = node.getNumOutcomes(); + + for (int i = 0; i < numOutcomes; i++) { + if ("failure".equals(ctx.getStatus()) && isAtomic) { + LOG.info("Block - stopped executing nodes due to failure status"); + return(null); + } + + SvcLogicNode nextNode = node.getOutcomeValue("" + (i + 1)); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("Block - executing outcome " + (i + 1)); + } + while (nextNode != null) + { + nextNode = svc.executeNode(nextNode, ctx); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("Block - done: no outcome " + (i + 1)); + } + } + } + + return (null); + } + + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/BreakNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/BreakNodeExecutor.java new file mode 100644 index 000000000..ec0a5daa0 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/BreakNodeExecutor.java @@ -0,0 +1,41 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.BreakNodeException; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BreakNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory.getLogger(BreakNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException { + String message = "BreakNodeExecutor encountered break with nodeId " + node.getNodeId(); + LOG.debug(message); + throw new BreakNodeException(message); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/CallNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/CallNodeExecutor.java new file mode 100644 index 000000000..9498d6768 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/CallNodeExecutor.java @@ -0,0 +1,164 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicGraph; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicStore; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CallNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(CallNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) + throws SvcLogicException { + + String outValue = "not-found"; + + SvcLogicGraph myGraph = node.getGraph(); + + if (myGraph == null) + { + LOG.debug("execute: getGraph returned null"); + } + else + { + LOG.debug("execute: got SvcLogicGraph"); + } + + SvcLogicExpression moduleExpr = null; + + String module = null; + + moduleExpr = node.getAttribute("module"); + if (moduleExpr != null) + { + module = SvcLogicExpressionResolver.evaluate(moduleExpr, node, ctx); + } + + if ((module == null) || (module.length() == 0)) + { + if (myGraph != null) + { + module = myGraph.getModule(); + LOG.debug("myGraph.getModule() returned "+module); + } + } + + SvcLogicExpression rpcExpr = null; + String rpc = null; + rpcExpr = node.getAttribute("rpc"); + if (rpcExpr != null) + { + rpc = SvcLogicExpressionResolver.evaluate(rpcExpr, node, ctx); + } + + if ((rpc == null) || (rpc.length() == 0)) + { + if (myGraph != null) + { + rpc = myGraph.getRpc(); + LOG.debug("myGraph.getRpc() returned "+rpc); + } + } + + String mode = null; + + moduleExpr = node.getAttribute("mode"); + if (moduleExpr != null) + { + mode = SvcLogicExpressionResolver.evaluate(moduleExpr, node, ctx); + } + + if ((mode == null) || (mode.length() == 0)) + { + if (myGraph != null) + { + mode = myGraph.getMode(); + + LOG.debug("myGraph.getMode() returned "+mode); + } + } + + String version = null; + + moduleExpr = node.getAttribute("version"); + if (moduleExpr != null) + { + version = SvcLogicExpressionResolver.evaluate(moduleExpr, node, ctx); + } + + String parentGraph = ctx.getAttribute("currentGraph"); + ctx.setAttribute("parentGraph", parentGraph); + + SvcLogicStore store = getStore(); + + if (store != null) { + SvcLogicGraph calledGraph = store.fetch(module, rpc, version, mode); + LOG.debug("Parent " + parentGraph + " is calling child " + calledGraph.toString()); + ctx.setAttribute("currentGraph", calledGraph.toString()); + if (calledGraph != null) { + svc.execute(calledGraph, ctx); + + outValue = ctx.getStatus(); + } else { + LOG.error("Could not find service logic for [" + module + "," + rpc + "," + version + "," + mode + "]"); + } + } + else + { + LOG.debug("Could not get SvcLogicStore reference"); + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + ctx.setAttribute("currentGraph", parentGraph); + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("no " + outValue + " or Other branch found"); + } + } + ctx.setAttribute("currentGraph", parentGraph); + ctx.setAttribute("parentGraph", null); + + return (nextNode); + + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ConfigureNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ConfigureNodeExecutor.java new file mode 100644 index 000000000..21b63d4fa --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ConfigureNodeExecutor.java @@ -0,0 +1,247 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.onap.ccsdk.sli.core.sli.SvcLogicAdaptor; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ConfigureNodeExecutor extends SvcLogicNodeExecutor { + private static final Logger LOG = LoggerFactory + .getLogger(ConfigureNodeExecutor.class); + + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String adaptorName = SvcLogicExpressionResolver.evaluate( + node.getAttribute("adaptor"), node, ctx); + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug("configure node encountered - looking for adaptor " + + adaptorName); + } + + SvcLogicAdaptor adaptor = getAdaptor(adaptorName); + + if (adaptor != null) { + String activate = SvcLogicExpressionResolver.evaluate( + node.getAttribute("activate"), node, ctx); + String key = SvcLogicExpressionResolver.evaluate( + node.getAttribute("key"), node, ctx); + + Map parmMap = new HashMap(); + + Set> parmSet = node + .getParameterSet(); + boolean hasParms = false; + + for (Iterator> iter = parmSet + .iterator(); iter.hasNext();) { + hasParms = true; + Map.Entry curEnt = iter.next(); + String curName = curEnt.getKey(); + SvcLogicExpression curExpr = curEnt.getValue(); + String curExprValue = SvcLogicExpressionResolver.evaluate(curExpr, node, ctx); + + LOG.debug("Parameter "+curName+" = "+curExpr.asParsedExpr()+" resolves to "+curExprValue); + + parmMap.put(curName,curExprValue); + } + + if (hasParms) { + SvcLogicAdaptor.ConfigStatus confStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; + + try { + confStatus = adaptor.configure(key, parmMap, ctx); + } catch (Exception e) { + LOG.warn("Caught exception from "+adaptorName+".configure", e); + confStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; + } + + switch (confStatus) { + case SUCCESS: + outValue = "success"; + if ((activate != null) && (activate.length() > 0)) { + if ("true".equalsIgnoreCase(activate)) { + SvcLogicAdaptor.ConfigStatus activateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; + + try { + activateStatus = adaptor.activate(key, ctx); + } catch (Exception e) { + + LOG.warn("Caught exception from "+adaptorName+".activate", e); + activateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; + } + switch (activateStatus) { + case SUCCESS: + break; + case ALREADY_ACTIVE: + outValue = "already-active"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case NOT_READY: + outValue = "not-ready"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } else if ("false".equalsIgnoreCase(activate)) { + SvcLogicAdaptor.ConfigStatus deactivateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; + + try { + deactivateStatus = adaptor.deactivate(key, ctx); + } catch (Exception e) { + + LOG.warn("Caught exception from "+adaptorName+".deactivate", e); + deactivateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; + } + switch (deactivateStatus) { + case SUCCESS: + break; + case ALREADY_ACTIVE: + outValue = "already-active"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case NOT_READY: + outValue = "not-ready"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } + } + break; + case ALREADY_ACTIVE: + outValue = "already-active"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case NOT_READY: + outValue = "not-ready"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } else { + if ((activate != null) && (activate.length() > 0)) { + if ("true".equalsIgnoreCase(activate)) { + SvcLogicAdaptor.ConfigStatus activateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; + try { + activateStatus = adaptor.activate(key, ctx); + } catch (Exception e) { + LOG.warn("Caught exception from "+adaptorName+".activate", e); + activateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; + } + switch (activateStatus) { + case SUCCESS: + outValue = "success"; + break; + case ALREADY_ACTIVE: + outValue = "already-active"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case NOT_READY: + outValue = "not-ready"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } else if ("false".equalsIgnoreCase(activate)) { + SvcLogicAdaptor.ConfigStatus deactivateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; + + try { + deactivateStatus = adaptor.deactivate(key, ctx); + } catch (Exception e) { + LOG.warn("Caught exception from "+adaptorName+".deactivate", e); + deactivateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; + } + switch (deactivateStatus) { + case SUCCESS: + outValue = "success"; + break; + case ALREADY_ACTIVE: + outValue = "already-active"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case NOT_READY: + outValue = "not-ready"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } + } else { + LOG.warn("Nothing to configure - no parameters passed, and activate attribute is not set"); + outValue = "success"; + } + } + } else { + if (LOG.isWarnEnabled()) { + LOG.warn("Adaptor for " + adaptorName + " not found"); + } + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("no " + outValue + " or Other branch found"); + } + } + return (nextNode); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/DeleteNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/DeleteNodeExecutor.java new file mode 100644 index 000000000..caba0943f --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/DeleteNodeExecutor.java @@ -0,0 +1,100 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DeleteNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(DeleteNodeExecutor.class); + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String plugin = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String resourceType = SvcLogicExpressionResolver.evaluate( + node.getAttribute("resource"), node, ctx); + String key = SvcLogicExpressionResolver.evaluateAsKey( + node.getAttribute("key"), node, ctx); + + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug("delete node encountered - looking for resource class " + + plugin); + } + + + SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); + if (resourcePlugin != null) { + + try { + + switch (resourcePlugin.delete(resourceType, key, ctx)) { + case SUCCESS: + outValue = "success"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } catch (SvcLogicException e) { + LOG.error("Caught exception from resource plugin", e); + outValue = "failure"; + } + } else { + LOG.warn("Could not find SvcLogicResource object for plugin " + + plugin); + } + + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("no "+outValue+" or Other branch found"); + } + } + return (nextNode); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutor.java new file mode 100644 index 000000000..19868ed75 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutor.java @@ -0,0 +1,160 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ExecuteNodeExecutor extends SvcLogicNodeExecutor { + private static final Logger LOG = LoggerFactory + .getLogger(ExecuteNodeExecutor.class); + + private static final String pluginErrorMessage = "Could not execute plugin. SvcLogic status will be set to failure."; + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String pluginName = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug("execute node encountered - looking for plugin " + + pluginName); + } + + SvcLogicJavaPlugin plugin = getSvcLogicJavaPlugin(pluginName); + + if (plugin == null) { + outValue = "not-found"; + } else { + + String methodName = evaluate(node.getAttribute("method"), node, ctx); + + Class pluginClass = plugin.getClass(); + + Method pluginMethod = null; + + try { + pluginMethod = pluginClass.getMethod(methodName, Map.class, SvcLogicContext.class); + } catch (NoSuchMethodException e) { + LOG.error(pluginErrorMessage, e); + } + + if (pluginMethod == null) { + outValue = "unsupported-method"; + } else { + try { + + Map parmMap = new HashMap(); + + Set> parmSet = node + .getParameterSet(); + + for (Iterator> iter = parmSet + .iterator(); iter.hasNext();) { + Map.Entry curEnt = iter.next(); + String curName = curEnt.getKey(); + SvcLogicExpression curExpr = curEnt.getValue(); + String curExprValue = SvcLogicExpressionResolver.evaluate(curExpr, node, ctx); + + LOG.debug("Parameter "+curName+" = "+curExpr.asParsedExpr()+" resolves to "+curExprValue); + + parmMap.put(curName,curExprValue); + } + + Object o = pluginMethod.invoke(plugin, parmMap, ctx); + String emitsOutcome = SvcLogicExpressionResolver.evaluate(node.getAttribute("emitsOutcome"), node, ctx); + + outValue = mapOutcome(o, emitsOutcome); + + } catch (InvocationTargetException e) { + if(e.getCause() != null){ + LOG.error(pluginErrorMessage, e.getCause()); + }else{ + LOG.error(pluginErrorMessage, e); + } + outValue = "failure"; + ctx.setStatus("failure"); + } catch (IllegalAccessException e) { + LOG.error(pluginErrorMessage, e); + outValue = "failure"; + ctx.setStatus("failure"); + } catch (IllegalArgumentException e) { + LOG.error(pluginErrorMessage, e); + outValue = "failure"; + ctx.setStatus("failure"); + } + } + + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("no " + outValue + " or Other branch found"); + } + } + return (nextNode); + } + + protected String evaluate(SvcLogicExpression expr, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException { + return SvcLogicExpressionResolver.evaluate(node.getAttribute("method"), node, ctx); + } + + public String mapOutcome(Object o, String emitsOutcome) { + if (emitsOutcome != null) { + Boolean nodeEmitsOutcome = Boolean.valueOf(emitsOutcome); + if (nodeEmitsOutcome) { + return (String) o; + } else { + return "success"; + } + + } else { + return "success"; + } + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExistsNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExistsNodeExecutor.java new file mode 100644 index 000000000..1798d50a9 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ExistsNodeExecutor.java @@ -0,0 +1,104 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ExistsNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(ExistsNodeExecutor.class); + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String plugin = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String resourceType = SvcLogicExpressionResolver.evaluate( + node.getAttribute("resource"), node, ctx); + String key = SvcLogicExpressionResolver.evaluateAsKey( + node.getAttribute("key"), node, ctx); + String pfx = SvcLogicExpressionResolver.evaluate( + node.getAttribute("pfx"), node, ctx); + + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug("exists node encountered - looking for resource class " + + plugin); + } + + + + SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); + + if (resourcePlugin != null) { + + try { + + switch (resourcePlugin.exists(resourceType, key, pfx, ctx)) { + case SUCCESS: + outValue = "true"; + break; + case NOT_FOUND: + outValue = "false"; + break; + case FAILURE: + default: + outValue = "false"; + } + } catch (SvcLogicException e) { + LOG.error("Caught exception from resource plugin", e); + outValue = "failure"; + } + } else { + LOG.warn("Could not find SvcLogicResource object for plugin " + + plugin); + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + + LOG.debug("no "+outValue+" or Other branch found"); + } + } + return (nextNode); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ForNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ForNodeExecutor.java new file mode 100644 index 000000000..a9ee00768 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ForNodeExecutor.java @@ -0,0 +1,108 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.BreakNodeException; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ForNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(ForNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + SvcLogicExpression atomicExpr = node.getAttribute("atomic"); + String atomicStr = SvcLogicExpressionResolver.evaluate(atomicExpr, node, ctx); + boolean isAtomic = !("false".equalsIgnoreCase(atomicStr)); + + int numOutcomes = node.getNumOutcomes(); + String idxVar = SvcLogicExpressionResolver.evaluate( + node.getAttribute("index"), node, ctx); + String startVal = SvcLogicExpressionResolver.evaluate( + node.getAttribute("start"), node, ctx); + String endVal = SvcLogicExpressionResolver.evaluate( + node.getAttribute("end"), node, ctx); + + LOG.debug("Executing "+ (isAtomic ? "atomic" : "non-atomic") + " for loop - for (int " + idxVar + " = " + startVal + + "; " + idxVar + " < " + endVal + "; " + idxVar + "++)"); + + int startIdx = 0; + int endIdx = 0; + + try { + startIdx = Integer.parseInt(startVal); + endIdx = Integer.parseInt(endVal); + } catch (NumberFormatException e) { + SvcLogicExpression silentFailureExpr = node.getAttribute("silentFailure"); + String silentFailure = SvcLogicExpressionResolver.evaluate(silentFailureExpr, node, ctx); + boolean isSilentFailure = Boolean.parseBoolean(silentFailure); + String message = "Invalid index values [" + startVal + "," + endVal + "]"; + if(!isSilentFailure){ + throw new SvcLogicException(message); + }else{ + LOG.debug(message + ". Not exiting because silentFailure was set to true."); + return(null); + } + } + + try { + for (int ctr = startIdx; ctr < endIdx; ctr++) { + + ctx.setAttribute(idxVar, "" + ctr); + + for (int i = 0; i < numOutcomes; i++) { + + if ("failure".equals(ctx.getStatus()) && isAtomic) { + LOG.info("For - stopped executing nodes due to failure status"); + return(null); + } + + SvcLogicNode nextNode = node.getOutcomeValue("" + (i + 1)); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("For - executing outcome " + (i + 1)); + } + SvcLogicNode innerNextNode = nextNode; + while (innerNextNode != null) { + innerNextNode = svc.executeNode(innerNextNode, ctx); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("For - done: no outcome " + (i + 1)); + } + } + } + } + } catch (BreakNodeException br) { + LOG.debug("ForNodeExecutor caught break"); + } + return (null); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/GetResourceNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/GetResourceNodeExecutor.java new file mode 100644 index 000000000..7ecc76c51 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/GetResourceNodeExecutor.java @@ -0,0 +1,133 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GetResourceNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(GetResourceNodeExecutor.class); + + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String plugin = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String resourceType = SvcLogicExpressionResolver.evaluate( + node.getAttribute("resource"), node, ctx); + String key = SvcLogicExpressionResolver.evaluateAsKey( + node.getAttribute("key"), node, ctx); + String pfx = SvcLogicExpressionResolver.evaluate( + node.getAttribute("pfx"), node, ctx); + + String localOnlyStr = SvcLogicExpressionResolver.evaluate( + node.getAttribute("local-only"), node, ctx); + + // Note: for get-resource, only refresh from A&AI if the DG explicitly set + // local-only to false. Otherwise, just read from local database. + boolean localOnly = true; + + if ("false".equalsIgnoreCase(localOnlyStr)) { + localOnly = false; + } + + SvcLogicExpression selectExpr = node.getAttribute("select"); + String select = null; + + if (selectExpr != null) { + select = SvcLogicExpressionResolver.evaluateAsKey(selectExpr, node, + ctx); + } + + SvcLogicExpression orderByExpr = node.getAttribute("order-by"); + String orderBy = null; + + if (orderByExpr != null) { + orderBy = SvcLogicExpressionResolver.evaluateAsKey(orderByExpr, node, + ctx); + } + + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug(node.getNodeType() + + " node encountered - looking for resource class " + + plugin); + } + + + SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); + + if (resourcePlugin != null) { + + try { + switch (resourcePlugin.query(resourceType, localOnly, select, key, + pfx, orderBy, ctx)) { + case SUCCESS: + outValue = "success"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } catch (SvcLogicException e) { + LOG.error("Caught exception from resource plugin", e); + outValue = "failure"; + } + } else { + LOG.warn("Could not find SvcLogicResource object for plugin " + + plugin); + } + + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + + LOG.debug("no "+outValue+" or Other branch found"); + } + } + return (nextNode); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/IsAvailableNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/IsAvailableNodeExecutor.java new file mode 100644 index 000000000..7bc15d8a2 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/IsAvailableNodeExecutor.java @@ -0,0 +1,102 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IsAvailableNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(IsAvailableNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String plugin = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String resourceType = SvcLogicExpressionResolver.evaluate( + node.getAttribute("resource"), node, ctx); + String key = SvcLogicExpressionResolver.evaluateAsKey( + node.getAttribute("key"), node, ctx); + String pfx = SvcLogicExpressionResolver.evaluate( + node.getAttribute("pfx"), node, ctx); + + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug("is-available node encountered - looking for resource class " + + plugin); + } + + SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); + + + if (resourcePlugin != null) { + try { + switch (resourcePlugin.isAvailable(resourceType, key, pfx, ctx)) { + case SUCCESS: + outValue = "true"; + break; + case NOT_FOUND: + outValue = "false"; + break; + case FAILURE: + default: + outValue = "false"; + } + } catch (SvcLogicException e) { + LOG.error("Caught exception from resource plugin", e); + outValue = "failure"; + } + } else { + LOG.warn("Could not find SvcLogicResource object for plugin " + + plugin); + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + + LOG.debug("no "+outValue+" or Other branch found"); + } + } + return (nextNode); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelper.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelper.java new file mode 100644 index 000000000..a35c05243 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelper.java @@ -0,0 +1,1185 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; + +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddressBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefixBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address; +import org.opendaylight.yangtools.yang.binding.Identifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MdsalHelper { + + private static final Logger LOG = LoggerFactory.getLogger(MdsalHelper.class); + private static Properties yangMappingProperties = new Properties(); + + @Deprecated + public static void setProperties(Properties input) { + setYangMappingProperties(input); + } + + public static void setYangMappingProperties(Properties properties) { + for (Object propNameObj : properties.keySet()) { + String propName = (String) propNameObj; + MdsalHelper.yangMappingProperties.setProperty(propName, properties.getProperty(propName)); + } + } + + public static void loadProperties(String propertiesFile) { + File file = new File(propertiesFile); + Properties properties = new Properties(); + InputStream input = null; + if (file.isFile() && file.canRead()) { + try { + input = new FileInputStream(file); + properties.load(input); + MdsalHelper.setYangMappingProperties(properties); + LOG.info("Loaded properties from " + propertiesFile); + } catch (Exception e) { + LOG.error("Failed to load properties " + propertiesFile + "\n", e); + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + LOG.error("Failed to close properties file " + propertiesFile + "\n", e); + } + } + } + }else{ + LOG.error("Failed to load the properties file " + propertiesFile + "\n"); + LOG.error("Either isFile or canRead returned false for " + propertiesFile + "\n"); + } + } + + public static Properties toProperties(Properties props, Object fromObj) { + Class fromClass = null; + + if (fromObj != null) { + fromClass = fromObj.getClass(); + } + return (toProperties(props, "", fromObj, fromClass)); + } + + public static Properties toProperties(Properties props, String pfx, Object fromObj) { + Class fromClass = null; + + if (fromObj != null) { + fromClass = fromObj.getClass(); + } + + return (toProperties(props, pfx, fromObj, fromClass)); + } + + public static Properties toProperties(Properties props, String pfx, Object fromObj, Class fromClass) { + + if (fromObj == null) { + return (props); + } + + String simpleName = fromClass.getSimpleName(); + + LOG.trace("Extracting properties from " + fromClass.getName() + " class"); + if (fromObj instanceof List) { + + // Class is a List. List should contain yang-generated classes. + LOG.trace(fromClass.getName() + " is a List"); + + List fromList = (List) fromObj; + + for (int i = 0; i < fromList.size(); i++) { + toProperties(props, pfx + "[" + i + "]", fromList.get(i), fromClass); + } + props.setProperty(pfx + "_length", "" + fromList.size()); + + } else if (isYangGenerated(fromClass)) { + // Class is yang generated. + LOG.trace(fromClass.getName() + " is a Yang-generated class"); + + String propNamePfx = null; + + // If called from a list (so prefix ends in ']'), don't + // add class name again + if (pfx.endsWith("]")) { + propNamePfx = pfx; + } else { + if ((pfx != null) && (pfx.length() > 0)) { + propNamePfx = pfx; + } else { + propNamePfx = toLowerHyphen(fromClass.getSimpleName()); + } + + if (propNamePfx.endsWith("-builder")) { + propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-builder".length()); + } + + if (propNamePfx.endsWith("-impl")) { + propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-impl".length()); + } + } + + // Iterate through getter methods to figure out values we need to + // save from + + int numGetters = 0; + String lastGetterName = null; + String propVal = null; + + for (Method m : fromClass.getMethods()) { + if (isGetter(m)) { + + numGetters++; + lastGetterName = m.getName(); + + Class returnType = m.getReturnType(); + String fieldName; + if (m.getName().startsWith("get")) { + fieldName = toLowerHyphen(m.getName().substring(3)); + } else { + + fieldName = toLowerHyphen(m.getName().substring(2)); + } + + fieldName = fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1); + + // Is the return type a yang generated class? + if (isYangGenerated(returnType)) { + // Is it an enum? + if (returnType.isEnum()) { + // Return type is a typedef. Save its value. + try { + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + + Object retValue = m.invoke(fromObj); + + if (!isAccessible) { + m.setAccessible(isAccessible); + } + if (retValue != null) { + String propName = propNamePfx + "." + fieldName; + propVal = retValue.toString(); + props.setProperty(propName, mapEnumeratedValue(fieldName, propVal)); + } + } catch (Exception e) { + LOG.error("Caught exception trying to convert Yang-generated enum returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + } else if (isIpv4Address(returnType)) { + // Save its value + try { + String propName = propNamePfx + "." + fieldName; + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + Ipv4Address retValue = (Ipv4Address) m.invoke(fromObj); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + + if (retValue != null) { + propVal = retValue.getValue().toString(); + LOG.debug("Setting property " + propName + " to " + propVal); + props.setProperty(propName, propVal); + + } + } catch (Exception e) { + LOG.error("Caught exception trying to convert value returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + } else if (isIpv6Address(returnType)) { + // Save its value + try { + String propName = propNamePfx + "." + fieldName; + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + Ipv6Address retValue = (Ipv6Address) m.invoke(fromObj); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + + if (retValue != null) { + propVal = retValue.getValue().toString(); + LOG.debug("Setting property " + propName + " to " + propVal); + props.setProperty(propName, propVal); + + } + } catch (Exception e) { + LOG.error("Caught exception trying to convert value returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + } else if (isIpAddress(returnType)) { + // Save its value + try { + String propName = propNamePfx + "." + fieldName; + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + IpAddress retValue = (IpAddress) m.invoke(fromObj); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + + if (retValue != null) { + propVal = new String(retValue.getValue()); + LOG.debug("Setting property " + propName + " to " + propVal); + props.setProperty(propName, propVal); + + } + } catch (Exception e) { + LOG.error("Caught exception trying to convert value returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + } else if (isIpPrefix(returnType)) { + // Save its value + try { + String propName = propNamePfx + "." + fieldName; + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + IpPrefix retValue = (IpPrefix) m.invoke(fromObj); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + + if (retValue != null) { + propVal = new String(retValue.getValue()); + LOG.debug("Setting property " + propName + " to " + propVal); + props.setProperty(propName, propVal); + + } + } catch (Exception e) { + LOG.error("Caught exception trying to convert value returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + } else { + try { + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + Object retValue = m.invoke(fromObj); + + if (retValue instanceof byte[]) { + LOG.trace(m.getName() + " returns a byte[]"); + retValue = new String((byte[]) retValue, "UTF-8"); + LOG.trace("Converted byte array " + propNamePfx + "." + fieldName + "to string " + retValue); + } + if (!isAccessible) { + m.setAccessible(isAccessible); + } + if (retValue != null) { + toProperties(props, propNamePfx + "." + fieldName, retValue, returnType); + } + } catch (Exception e) { + + if (m.getName().equals("getKey")) { + LOG.trace("Caught " + e.getClass().getName() + " exception trying to convert results from getKey() - ignoring"); + } else { + LOG.error("Caught exception trying to convert Yang-generated class returned by" + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + } + } + } else if (returnType.equals(Class.class)) { + + LOG.trace(m.getName() + " returns a Class object - not interested"); + + } else if (List.class.isAssignableFrom(returnType)) { + + // This getter method returns a list. + try { + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + Object retList = m.invoke(fromObj); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + // Figure out what type of elements are stored in + // this array. + Type paramType = m.getGenericReturnType(); + Type elementType = ((ParameterizedType) paramType).getActualTypeArguments()[0]; + toProperties(props, propNamePfx + "." + fieldName, retList, (Class) elementType); + } catch (Exception e) { + LOG.error("Caught exception trying to convert List returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + + } else { + + // Method returns something that is not a List and not + // yang-generated. + // Save its value + try { + String propName = propNamePfx + "." + fieldName; + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + Object propValObj = m.invoke(fromObj); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + + if (propValObj != null) { + if (propValObj instanceof byte[]) { + LOG.trace(m.getName() + " returns a byte[]"); + propVal = new String((byte[]) propValObj, "UTF-8"); + LOG.trace("Converted byte array " + propNamePfx + "." + fieldName + "to string " + propVal); + + } else { + propVal = propValObj.toString(); + } + LOG.debug("Setting property " + propName + " to " + propVal); + props.setProperty(propName, propVal); + + } + } catch (Exception e) { + if (m.getName().equals("getKey")) { + LOG.trace("Caught " + e.getClass().getName() + " exception trying to convert results from getKey() - ignoring"); + } else { + LOG.error("Caught exception trying to convert value returned by" + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + } + } + + } + } + + // End of method loop. If there was only one getter, named + // "getValue", then + // set value identified by "prefix" to that one value. + if ((numGetters == 1) && ("getValue".equals(lastGetterName))) { + LOG.trace("getValueFIX : " + propNamePfx + " only has getValue() getter - setting " + propNamePfx + " = " + propVal); + props.setProperty(propNamePfx, propVal); + } else { + LOG.trace("getValueFIX : " + propNamePfx + " has " + numGetters + " getter(s), last one found was " + lastGetterName); + + } + + } else { + // Class is not yang generated and not a list + // It must be an element of a leaf list - set "prefix" to value + String fromVal = null; + if (fromObj instanceof byte[]) { + try { + fromVal = new String((byte[]) fromObj, "UTF-8"); + LOG.trace("Converted byte array " + pfx + "to string " + fromVal); + } catch (Exception e) { + LOG.warn("Caught exception trying to convert " + pfx + " from byte[] to String", e); + fromVal = fromObj.toString(); + } + + } else { + fromVal = fromObj.toString(); + } + LOG.debug("Setting property " + pfx + " to " + fromVal); + props.setProperty(pfx, fromVal); + } + + return (props); + } + + public static Object toBuilder(Properties props, Object toObj) { + + return (toBuilder(props, "", toObj)); + } + + public static List toList(Properties props, String pfx, List toObj, Class elemType) { + + int maxIdx = -1; + boolean foundValue = false; + + LOG.trace("Saving properties to List<" + elemType.getName() + "> from " + pfx); + + if (props.contains(pfx + "_length")) { + try { + int listLength = Integer.parseInt(props.getProperty(pfx + "_length")); + + if (listLength > 0) { + maxIdx = listLength - 1; + } + } catch (Exception e) { + // Ignore exception + } + } + + if (maxIdx == -1) { + // Figure out array size + for (Object pNameObj : props.keySet()) { + String key = (String) pNameObj; + + if (key.startsWith(pfx + "[")) { + String idxStr = key.substring(pfx.length() + 1); + int endloc = idxStr.indexOf("]"); + if (endloc != -1) { + idxStr = idxStr.substring(0, endloc); + } + + try { + int curIdx = Integer.parseInt(idxStr); + if (curIdx > maxIdx) { + maxIdx = curIdx; + } + } catch (Exception e) { + LOG.error("Illegal subscript in property " + key); + } + + } + } + } + + LOG.trace(pfx + " has max index of " + maxIdx); + for (int i = 0; i <= maxIdx; i++) { + + String curBase = pfx + "[" + i + "]"; + + if (isYangGenerated(elemType)) { + String builderName = elemType.getName() + "Builder"; + try { + Class builderClass = Class.forName(builderName); + Object builderObj = builderClass.newInstance(); + Method buildMethod = builderClass.getMethod("build"); + builderObj = toBuilder(props, curBase, builderObj, true); + if (builderObj != null) { + LOG.trace("Calling " + builderObj.getClass().getName() + "." + buildMethod.getName() + "()"); + Object builtObj = buildMethod.invoke(builderObj); + toObj.add(builtObj); + foundValue = true; + } + + } catch (ClassNotFoundException e) { + LOG.warn("Could not find builder class " + builderName, e); + } catch (Exception e) { + LOG.error("Caught exception trying to populate list from " + pfx); + } + } else { + // Must be a leaf list + String curValue = props.getProperty(curBase, ""); + + toObj.add(curValue); + + if ((curValue != null) && (curValue.length() > 0)) { + foundValue = true; + } + } + + } + + if (foundValue) { + return (toObj); + } else { + return (null); + } + + } + + public static Object toBuilder(Properties props, String pfx, Object toObj) { + return (toBuilder(props, pfx, toObj, false)); + } + + public static Object toBuilder(Properties props, String pfx, Object toObj, boolean preservePfx) { + Class toClass = toObj.getClass(); + boolean foundValue = false; + + LOG.trace("Saving properties to " + toClass.getName() + " class from " + pfx); + + Ipv4Address addr; + + if (isYangGenerated(toClass)) { + // Class is yang generated. + LOG.trace(toClass.getName() + " is a Yang-generated class"); + + String propNamePfx = null; + if (preservePfx) { + propNamePfx = pfx; + } else { + + if ((pfx != null) && (pfx.length() > 0)) { + propNamePfx = pfx + "." + toLowerHyphen(toClass.getSimpleName()); + } else { + propNamePfx = toLowerHyphen(toClass.getSimpleName()); + } + + if (propNamePfx.endsWith("-builder")) { + propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-builder".length()); + } + + if (propNamePfx.endsWith("-impl")) { + propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-impl".length()); + } + } + + if (toObj instanceof Identifier) { + LOG.trace(toClass.getName() + " is a Key - skipping"); + return (toObj); + } + + // Iterate through getter methods to figure out values we need to + // set + + for (Method m : toClass.getMethods()) { + if (isSetter(m)) { + Class paramTypes[] = m.getParameterTypes(); + Class paramClass = paramTypes[0]; + + String fieldName = toLowerHyphen(m.getName().substring(3)); + fieldName = fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1); + + String propName = propNamePfx + "." + fieldName; + + String paramValue = props.getProperty(propName); + if (paramValue == null) { + LOG.trace(propName + " is unset"); + } else { + LOG.trace(propName + " = " + paramValue); + } + + // Is the return type a yang generated class? + if (isYangGenerated(paramClass)) { + // Is it an enum? + if (paramClass.isEnum()) { + + LOG.trace(m.getName() + " expects an Enum"); + // Param type is a typedef. + if ((paramValue != null) && (paramValue.length() > 0)) { + Object paramObj = null; + + try { + paramObj = Enum.valueOf(paramClass, toJavaEnum(paramValue)); + } catch (Exception e) { + LOG.error("Caught exception trying to convert field " + propName + " to enum " + paramClass.getName(), e); + } + + try { + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + + LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + paramValue + ")"); + m.invoke(toObj, paramObj); + + if (!isAccessible) { + m.setAccessible(isAccessible); + } + foundValue = true; + + } catch (Exception e) { + LOG.error("Caught exception trying to create Yang-generated enum expected by" + toClass.getName() + "." + m.getName() + "() from Properties entry", e); + } + } + } else { + + String simpleName = paramClass.getSimpleName(); + + if ("Ipv4Address".equals(simpleName) || "Ipv6Address".equals(simpleName) || "IpAddress".equals(simpleName)) { + + if ((paramValue != null) && (paramValue.length() > 0)) { + try { + IpAddress ipAddr = IpAddressBuilder.getDefaultInstance(paramValue); + + if ("Ipv4Address".equals(simpleName)) { + m.invoke(toObj, ipAddr.getIpv4Address()); + } else if ("Ipv6Address".equals(simpleName)) { + m.invoke(toObj, ipAddr.getIpv6Address()); + + } else { + m.invoke(toObj, ipAddr); + } + foundValue = true; + } catch (Exception e) { + LOG.error("Caught exception calling " + toClass.getName() + "." + m.getName() + "(" + paramValue + ")", e); + + } + } else { + try { + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + paramValue + ")"); + m.invoke(toObj, paramValue); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + foundValue = true; + + } catch (Exception e) { + LOG.error("Caught exception trying to call " + toClass.getName() + "." + m.getName() + "() with Properties entry", e); + } + } + } else if ("IpPrefix".equals(simpleName)) { + if ((paramValue != null) && (paramValue.length() > 0)) { + try { + IpPrefix ipPrefix = IpPrefixBuilder.getDefaultInstance(paramValue); + m.invoke(toObj, ipPrefix); + foundValue = true; + } catch (Exception e) { + LOG.error("Caught exception calling " + toClass.getName() + "." + m.getName() + "(" + paramValue + ")", e); + } + } + } else { + // setter expects a yang-generated class. Need + // to + // create a builder to set it. + + String builderName = paramClass.getName() + "Builder"; + Class builderClass = null; + Object builderObj = null; + Object paramObj = null; + + Object constObj = null; + + LOG.trace(m.getName() + " expects a yang-generated class - looking for builder " + builderName); + try { + builderClass = Class.forName(builderName); + builderObj = builderClass.newInstance(); + paramObj = toBuilder(props, propNamePfx, builderObj); + } catch (ClassNotFoundException e) { + + if (paramValue == null) { + try { + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(null)"); + m.invoke(toObj, new Object[] { null }); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + foundValue = true; + + } catch (Exception e1) { + LOG.error("Caught exception trying to cally" + toClass.getName() + "." + m.getName() + "() with Properties entry", e1); + } + } else { + try { + // See if I can find a constructor I + // can + // use + Constructor[] constructors = paramClass.getConstructors(); + // Is there a String constructor? + for (Constructor c : constructors) { + Class[] cParms = c.getParameterTypes(); + if ((cParms != null) && (cParms.length == 1)) { + if (String.class.isAssignableFrom(cParms[0])) { + constObj = c.newInstance(paramValue); + } + } + } + + if (constObj == null) { + // Is there a Long constructor? + for (Constructor c : constructors) { + Class[] cParms = c.getParameterTypes(); + if ((cParms != null) && (cParms.length == 1)) { + if (Long.class.isAssignableFrom(cParms[0])) { + constObj = c.newInstance(Long.parseLong(paramValue)); + } + } + } + + } + + if (constObj == null) { + + // Last chance - see if + // parameter class has a static + // method + // getDefaultInstance(String) + try { + Method gm = paramClass.getMethod("getDefaultInstance", String.class); + + int gmodifier = gm.getModifiers(); + if (Modifier.isStatic(gmodifier)) { + // Invoke static + // getDefaultInstance(String) + paramObj = gm.invoke(null, paramValue); + } + + } catch (Exception gme) { + // Ignore exceptions + } + } + + } catch (Exception e1) { + LOG.warn("Could not find a suitable constructor for " + paramClass.getName(), e1); + } + + if (constObj == null) { + LOG.warn("Could not find builder class " + builderName + " and could not find a String or Long constructor or static getDefaultInstance(String) - trying just to set passing paramValue"); + + } + } + } catch (Exception e) { + LOG.error("Caught exception trying to create builder " + builderName, e); + } + + if (paramObj != null) { + + try { + + Method buildMethod = builderClass.getMethod("build"); + LOG.trace("Calling " + paramObj.getClass().getName() + "." + buildMethod.getName() + "()"); + Object builtObj = buildMethod.invoke(paramObj); + + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + + LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "()"); + m.invoke(toObj, builtObj); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + foundValue = true; + + } catch (Exception e) { + LOG.error("Caught exception trying to set Yang-generated class expected by" + toClass.getName() + "." + m.getName() + "() from Properties entry", e); + } + } else { + try { + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + + if (constObj != null) { + + LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + constObj.toString() + ")"); + m.invoke(toObj, constObj); + } else { + LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + paramValue + ")"); + m.invoke(toObj, paramValue); + + } + if (!isAccessible) { + m.setAccessible(isAccessible); + } + foundValue = true; + + } catch (Exception e) { + LOG.error("Caught exception trying to convert value returned by" + toClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + } + } + } + } else { + + // Setter's argument is not a yang-generated class. See + // if it is a List. + + if (List.class.isAssignableFrom(paramClass)) { + + LOG.trace("Parameter class " + paramClass.getName() + " is a List"); + + // Figure out what type of args are in List and pass + // that to toList(). + + Type paramType = m.getGenericParameterTypes()[0]; + Type elementType = ((ParameterizedType) paramType).getActualTypeArguments()[0]; + Object paramObj = new LinkedList(); + try { + paramObj = toList(props, propName, (List) paramObj, (Class) elementType); + } catch (Exception e) { + LOG.error("Caught exception trying to create list expected as argument to " + toClass.getName() + "." + m.getName()); + } + + if (paramObj != null) { + try { + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + paramValue + ")"); + m.invoke(toObj, paramObj); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + foundValue = true; + + } catch (Exception e) { + LOG.error("Caught exception trying to convert List returned by" + toClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + } + } else { + + // Setter expects something that is not a List and + // not yang-generated. Just pass the parameter value + + LOG.trace("Parameter class " + paramClass.getName() + " is not a yang-generated class or a List"); + + if ((paramValue != null) && (paramValue.length() > 0)) { + + Object constObj = null; + + try { + // See if I can find a constructor I can use + Constructor[] constructors = paramClass.getConstructors(); + // Is there a String constructor? + for (Constructor c : constructors) { + Class[] cParms = c.getParameterTypes(); + if ((cParms != null) && (cParms.length == 1)) { + if (String.class.isAssignableFrom(cParms[0])) { + constObj = c.newInstance(paramValue); + } + } + } + + if (constObj == null) { + // Is there a Long constructor? + for (Constructor c : constructors) { + Class[] cParms = c.getParameterTypes(); + if ((cParms != null) && (cParms.length == 1)) { + if (Long.class.isAssignableFrom(cParms[0])) { + constObj = c.newInstance(Long.parseLong(paramValue)); + } + } + } + + } + + if (constObj != null) { + try { + LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + constObj + ")"); + m.invoke(toObj, constObj); + foundValue = true; + } catch (Exception e2) { + LOG.error("Caught exception trying to call " + m.getName(), e2); + } + } else { + try { + boolean isAccessible = m.isAccessible(); + if (!isAccessible) { + m.setAccessible(true); + } + LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + paramValue + ")"); + m.invoke(toObj, paramValue); + if (!isAccessible) { + m.setAccessible(isAccessible); + } + foundValue = true; + + } catch (Exception e) { + LOG.error("Caught exception trying to convert value returned by" + toClass.getName() + "." + m.getName() + "() to Properties entry", e); + } + } + } catch (Exception e1) { + LOG.warn("Could not find a suitable constructor for " + paramClass.getName(), e1); + } + + } + } + } + } // End of section handling "setter" method + } // End of loop through Methods + } // End of section handling yang-generated class + + if (foundValue) { + return (toObj); + } else { + return (null); + } + } + + public static void printPropertyList(PrintStream pstr, String pfx, Class toClass) { + boolean foundValue = false; + + LOG.trace("Analyzing " + toClass.getName() + " class : pfx " + pfx); + + if (isYangGenerated(toClass) && (!Identifier.class.isAssignableFrom(toClass))) { + // Class is yang generated. + LOG.trace(toClass.getName() + " is a Yang-generated class"); + + if (toClass.getName().endsWith("Key")) { + if (Identifier.class.isAssignableFrom(toClass)) { + LOG.trace(Identifier.class.getName() + " is assignable from " + toClass.getName()); + } else { + + LOG.trace(Identifier.class.getName() + " is NOT assignable from " + toClass.getName()); + } + } + + String propNamePfx = null; + if (pfx.endsWith("]")) { + propNamePfx = pfx; + } else { + + if ((pfx != null) && (pfx.length() > 0)) { + propNamePfx = pfx + "." + toLowerHyphen(toClass.getSimpleName()); + } else { + propNamePfx = toLowerHyphen(toClass.getSimpleName()); + } + + if (propNamePfx.endsWith("-builder")) { + propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-builder".length()); + } + + if (propNamePfx.endsWith("-impl")) { + propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-impl".length()); + } + } + + // Iterate through getter methods to figure out values we need to + // set + + for (Method m : toClass.getMethods()) { + LOG.trace("Is " + m.getName() + " method a getter?"); + if (isGetter(m)) { + LOG.trace(m.getName() + " is a getter"); + Class returnClass = m.getReturnType(); + + String fieldName = toLowerHyphen(m.getName().substring(3)); + fieldName = fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1); + + String propName = propNamePfx + "." + fieldName; + + // Is the return type a yang generated class? + if (isYangGenerated(returnClass)) { + // Is it an enum? + if (returnClass.isEnum()) { + + LOG.trace(m.getName() + " is an Enum"); + pstr.print("\n\n * " + propName); + + } else { + + String simpleName = returnClass.getSimpleName(); + + if ("Ipv4Address".equals(simpleName) || "Ipv6Address".equals(simpleName) || "IpAddress".equals(simpleName) || "IpPrefix".equals(simpleName)) { + LOG.trace(m.getName() + " is an " + simpleName); + pstr.print("\n\n * " + propName); + } else { + printPropertyList(pstr, propNamePfx, returnClass); + } + + } + } else { + + // Setter's argument is not a yang-generated class. See + // if it is a List. + + if (List.class.isAssignableFrom(returnClass)) { + + LOG.trace("Parameter class " + returnClass.getName() + " is a List"); + + // Figure out what type of args are in List and pass + // that to toList(). + + Type returnType = m.getGenericReturnType(); + Type elementType = ((ParameterizedType) returnType).getActualTypeArguments()[0]; + Class elementClass = (Class) elementType; + LOG.trace("Calling printPropertyList on list type (" + elementClass.getName() + "), pfx is (" + pfx + "), toClass is (" + toClass.getName() + ")"); + printPropertyList(pstr, propNamePfx + "." + toLowerHyphen(elementClass.getSimpleName()) + "[]", elementClass); + + } else if (!returnClass.equals(Class.class)) { + + // Setter expects something that is not a List and + // not yang-generated. Just pass the parameter value + + LOG.trace("Parameter class " + returnClass.getName() + " is not a yang-generated class or a List"); + + pstr.print("\n\n * " + propName); + + } + } + } // End of section handling "setter" method + } // End of loop through Methods + } // End of section handling yang-generated class + + } + + public static boolean isYangGenerated(Class c) { + if (c == null) { + return (false); + } else { + return (c.getName().startsWith("org.opendaylight.yang.gen.")); + } + } + + public static boolean isIpPrefix(Class c) { + + if (c == null) { + return (false); + } + String simpleName = c.getSimpleName(); + return ("IpPrefix".equals(simpleName)); + } + + public static boolean isIpv4Address(Class c) { + + if (c == null) { + return (false); + } + String simpleName = c.getSimpleName(); + return ("Ipv4Address".equals(simpleName)); + } + + public static boolean isIpv6Address(Class c) { + + if (c == null) { + return (false); + } + String simpleName = c.getSimpleName(); + return ("Ipv6Address".equals(simpleName)); + } + + public static boolean isIpAddress(Class c) { + + if (c == null) { + return (false); + } + String simpleName = c.getSimpleName(); + return ("IpAddress".equals(simpleName)); + } + + public static String toLowerHyphen(String inStr) { + if (inStr == null) { + return (null); + } + + String str = inStr.substring(0, 1).toLowerCase(); + if (inStr.length() > 1) { + str = str + inStr.substring(1); + } + + String regex = "(([a-z0-9])([A-Z]))"; + String replacement = "$2-$3"; + + String retval = str.replaceAll(regex, replacement).toLowerCase(); + + LOG.trace("Converting " + inStr + " => " + str + " => " + retval); + return (retval); + } + + //This is called when mapping the yang value back to a valid java enumeration + public static String toJavaEnum(String inStr) { + if (inStr == null) { + return (null); + } else if (inStr.length() == 0) { + return (inStr); + } + + //This will strip out all periods, which cannot be in a java enum + inStr = inStr.replaceAll("\\.", ""); + + String[] terms = inStr.split("-"); + StringBuffer sbuff = new StringBuffer(); + + //appends an _ if the string starts with a digit to make it a valid java enum + if (Character.isDigit(inStr.charAt(0))) { + sbuff.append('_'); + } + //If the string contains hyphens it will convert the string to upperCamelCase without hyphens + for (String term : terms) { + sbuff.append(term.substring(0, 1).toUpperCase()); + if (term.length() > 1) { + sbuff.append(term.substring(1)); + } + } + return (sbuff.toString()); + + } + + public static boolean isGetter(Method m) { + if (m == null) { + return (false); + } + + if (Modifier.isPublic(m.getModifiers()) && (m.getParameterTypes().length == 0)) { + if (m.getName().matches("^get[A-Z].*") && !m.getReturnType().equals(void.class)) { + if (!"getClass".equals(m.getName())) { + return (true); + } + } + + if (m.getName().matches("^get[A-Z].*") && m.getReturnType().equals(boolean.class)) { + return (true); + } + + if (m.getName().matches("^is[A-Z].*") && m.getReturnType().equals(Boolean.class)) { + return (true); + } + } + + return (false); + } + + public static boolean isSetter(Method m) { + if (m == null) { + return (false); + } + + if (Modifier.isPublic(m.getModifiers()) && (m.getParameterTypes().length == 1)) { + if (m.getName().matches("^set[A-Z].*")) { + Class[] paramTypes = m.getParameterTypes(); + if (paramTypes[0].isAssignableFrom(Identifier.class) || Identifier.class.isAssignableFrom(paramTypes[0])) { + return (false); + } else { + return (true); + } + } + + } + + return (false); + } + + public static String getFullPropertiesPath(String propertiesFileName) { + return "/opt/bvc/controller/configuration/" + propertiesFileName; + } + + //This is called when mapping a valid java enumeration back to the yang model value + public static String mapEnumeratedValue(String propertyName, String propertyValue) { + LOG.info("mapEnumeratedValue called with propertyName=" + propertyName + " and value=" + propertyValue); + String mappingKey = "yang." + propertyName + "." + propertyValue; + if (yangMappingProperties.containsKey(mappingKey)) { + return (yangMappingProperties.getProperty(mappingKey)); + } else { + LOG.info("yangMappingProperties did not contain the key " + mappingKey + " returning the original value."); + return propertyValue; + } + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/NotifyNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/NotifyNodeExecutor.java new file mode 100644 index 000000000..9f50547bd --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/NotifyNodeExecutor.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class NotifyNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(NotifyNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String plugin = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String resourceType = SvcLogicExpressionResolver.evaluate( + node.getAttribute("resource"), node, ctx); + String action = SvcLogicExpressionResolver.evaluateAsKey( + node.getAttribute("action"), node, ctx); + String key = SvcLogicExpressionResolver.evaluateAsKey( + node.getAttribute("key"), node, ctx); + + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug("release node encountered - looking for resource class " + + plugin); + } + + SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); + if (resourcePlugin != null) { + + try { + + switch (resourcePlugin.notify(resourceType, action, key, ctx)) { + case SUCCESS: + outValue = "success"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } catch (SvcLogicException e) { + LOG.error("Caught exception from resource plugin", e); + outValue = "failure"; + } + } else { + LOG.warn("Could not find SvcLogicResource object for plugin " + + plugin); + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("no "+outValue+" or Other branch found"); + } + } + return (nextNode); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/RecordNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/RecordNodeExecutor.java new file mode 100644 index 000000000..3c8c4c06d --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/RecordNodeExecutor.java @@ -0,0 +1,118 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicRecorder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RecordNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(RecordNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String plugin = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String outValue = "failure"; + + if (LOG.isTraceEnabled()) { + LOG.trace(node.getNodeType() + + " node encountered - looking for recorder class " + + plugin); + } + + Map parmMap = new HashMap(); + + Set> parmSet = node + .getParameterSet(); + boolean hasParms = false; + + for (Iterator> iter = parmSet + .iterator(); iter.hasNext();) { + hasParms = true; + Map.Entry curEnt = iter.next(); + String curName = curEnt.getKey(); + SvcLogicExpression curExpr = curEnt.getValue(); + String curExprValue = SvcLogicExpressionResolver.evaluate(curExpr, + node, ctx); + + if (LOG.isTraceEnabled()) { + LOG.trace("executeRecordNode : parameter " + curName + " = " + + curExpr + " => " + curExprValue); + } + parmMap.put(curName, curExprValue); + } + + + SvcLogicRecorder recorder = getSvcLogicRecorder(plugin); + + if (recorder != null) { + + try { + recorder.record(parmMap); + } catch (SvcLogicException e) { + LOG.error("Caught exception from recorder plugin", e); + outValue = "failure"; + } + } else { + LOG.warn("Could not find SvcLogicRecorder object for plugin " + + plugin); + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isTraceEnabled()) { + LOG.trace("no failure or Other branch found"); + } + } + return (nextNode); + } + + + + + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReleaseNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReleaseNodeExecutor.java new file mode 100644 index 000000000..4fee9aa8c --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReleaseNodeExecutor.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ReleaseNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(ReleaseNodeExecutor.class); + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String plugin = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String resourceType = SvcLogicExpressionResolver.evaluate( + node.getAttribute("resource"), node, ctx); + String key = SvcLogicExpressionResolver.evaluateAsKey( + node.getAttribute("key"), node, ctx); + + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug("release node encountered - looking for resource class " + + plugin); + } + + SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); + if (resourcePlugin != null) { + + try { + + switch (resourcePlugin.release(resourceType, key, ctx)) { + case SUCCESS: + outValue = "success"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } catch (SvcLogicException e) { + LOG.error("Caught exception from resource plugin", e); + outValue = "failure"; + } + } else { + LOG.warn("Could not find SvcLogicResource object for plugin " + + plugin); + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + + LOG.debug("no "+outValue+" or Other branch found"); + } + } + return (nextNode); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReserveNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReserveNodeExecutor.java new file mode 100644 index 000000000..6d8035e2a --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReserveNodeExecutor.java @@ -0,0 +1,113 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ReserveNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(ReserveNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String plugin = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String resourceType = SvcLogicExpressionResolver.evaluate( + node.getAttribute("resource"), node, ctx); + String key = SvcLogicExpressionResolver.evaluateAsKey( + node.getAttribute("key"), node, ctx); + String pfx = SvcLogicExpressionResolver.evaluate(node.getAttribute("pfx"),node,ctx); + + + SvcLogicExpression selectExpr = node.getAttribute("select"); + String select = null; + + if (selectExpr != null) + { + select = SvcLogicExpressionResolver.evaluateAsKey(selectExpr, node, ctx); + } + + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug("reserve node encountered - looking for resource class " + + plugin); + } + + + + SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); + + if (resourcePlugin != null) { + + try { + switch (resourcePlugin.reserve(resourceType, select, key, pfx, ctx)) { + case SUCCESS: + outValue = "success"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } catch (SvcLogicException e) { + LOG.error("Caught exception from resource plugin", e); + outValue = "failure"; + } + } else { + LOG.warn("Could not find SvcLogicResource object for plugin " + + plugin); + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + + LOG.debug("no "+outValue+" or Other branch found"); + } + } + return (nextNode); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReturnNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReturnNodeExecutor.java new file mode 100644 index 000000000..b1a2b9020 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/ReturnNodeExecutor.java @@ -0,0 +1,77 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ReturnNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(ReturnNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String status = SvcLogicExpressionResolver.evaluate( + node.getAttribute("status"), node, ctx); + + if (status != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("Returning status " + status); + } + ctx.setStatus(status); + } else { + if (LOG.isWarnEnabled()) { + LOG.warn("Return node has no status attribute set"); + } + } + + Set> parameterSet = node + .getParameterSet(); + + for (Iterator> iter = parameterSet + .iterator(); iter.hasNext();) { + Map.Entry curEnt = iter.next(); + String curName = curEnt.getKey(); + String curValue = SvcLogicExpressionResolver.evaluate( + curEnt.getValue(), node, ctx); + + if (LOG.isDebugEnabled()) { + LOG.debug("Setting context attribute " + curName + " to " + + curValue); + } + ctx.setAttribute(curName, curValue); + } + return null; + } + + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SaveNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SaveNodeExecutor.java new file mode 100644 index 000000000..0dd555250 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SaveNodeExecutor.java @@ -0,0 +1,141 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SaveNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(SaveNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String plugin = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String resourceType = SvcLogicExpressionResolver.evaluate( + node.getAttribute("resource"), node, ctx); + String key = SvcLogicExpressionResolver.evaluateAsKey( + node.getAttribute("key"), node, ctx); + String forceStr = SvcLogicExpressionResolver.evaluate( + node.getAttribute("force"), node, ctx); + String localOnlyStr = SvcLogicExpressionResolver.evaluate( + node.getAttribute("local-only"), node, ctx); + String pfx = SvcLogicExpressionResolver.evaluate( + node.getAttribute("pfx"), node, ctx); + + boolean force = "true".equalsIgnoreCase(forceStr); + boolean localOnly = "true".equalsIgnoreCase(localOnlyStr); + + Map parmMap = new HashMap(); + + Set> parmSet = node + .getParameterSet(); + boolean hasParms = false; + + for (Iterator> iter = parmSet + .iterator(); iter.hasNext();) { + hasParms = true; + Map.Entry curEnt = iter.next(); + String curName = curEnt.getKey(); + SvcLogicExpression curExpr = curEnt.getValue(); + if (curExpr != null) { + String curExprValue = SvcLogicExpressionResolver.evaluate( + curExpr, node, ctx); + + LOG.debug("Parameter " + curName + " = " + + curExpr.asParsedExpr() + " resolves to " + + curExprValue); + + parmMap.put(curName, curExprValue); + } + } + + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug("save node encountered - looking for resource class " + + plugin); + } + + + + SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); + + if (resourcePlugin != null) { + + try { + switch (resourcePlugin.save(resourceType, force, localOnly, key, + parmMap, pfx, ctx)) { + case SUCCESS: + outValue = "success"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } catch (SvcLogicException e) { + LOG.error("Caught exception from resource plugin", e); + outValue = "failure"; + } + } else { + LOG.warn("Could not find SvcLogicResource object for plugin " + + plugin); + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("no "+outValue+" or Other branch found"); + } + } + return (nextNode); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutor.java new file mode 100644 index 000000000..18ca3d0d2 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SetNodeExecutor.java @@ -0,0 +1,188 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Map; +import java.util.Set; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpressionFactory; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SetNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(SetNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String ifunsetStr = SvcLogicExpressionResolver.evaluate( + node.getAttribute("only-if-unset"), node, ctx); + + boolean ifunset = "true".equalsIgnoreCase(ifunsetStr); + + Set> parameterSet = node + .getParameterSet(); + + for (Iterator> iter = parameterSet + .iterator(); iter.hasNext();) { + Map.Entry curEnt = iter.next(); + String curName = curEnt.getKey(); + String lhsVarName = curName; + + // Resolve LHS of assignment (could contain index variables) + try { + SvcLogicExpression lhsExpr = SvcLogicExpressionFactory.parse(curName); + lhsVarName = SvcLogicExpressionResolver.resolveVariableName(lhsExpr, node, ctx); + } catch (Exception e) { + LOG.warn("Caught exception trying to resolve variable name ("+curName+")", e); + } + + + boolean setValue = true; + + if (curName.endsWith(".")) { + + // Copy subtree - value should be a variable name + SvcLogicExpression curValue = curEnt.getValue(); + + if (curValue != null) { + String rhsRoot = curValue.toString(); + + if ((rhsRoot != null) && (rhsRoot.length() > 0)) { + if (rhsRoot.endsWith(".")) { + rhsRoot = rhsRoot + .substring(0, rhsRoot.length() - 1); + } + + + // SDNGC-2321 : rhsRoot is variable name, possibly with subscript(s) to be resolved + try { + SvcLogicExpression rhsExpr = SvcLogicExpressionFactory.parse(rhsRoot); + rhsRoot = SvcLogicExpressionResolver.resolveVariableName(rhsExpr, node, ctx); + } catch (Exception e) { + LOG.warn("Caught exception trying to resolve variable name ("+rhsRoot+")", e); + } + + // See if the parameters are reversed (copying service-data to input) .. this + // was done as a workaround to earlier issue + if (curName.endsWith("-input.") && rhsRoot.startsWith("service-data")) { + LOG.warn("Arguments appear to be reversed .. will copy input to service-data instead"); + lhsVarName = rhsRoot + "."; + rhsRoot = curName.substring(0, curName.length()-1); + } + + rhsRoot = rhsRoot + "."; + String lhsPrefix = lhsVarName; + + if (lhsPrefix.endsWith(".")) { + lhsPrefix = lhsPrefix.substring(0, + lhsPrefix.length()-1); + } + int lhsPfxLength = lhsPrefix.length(); + HashMap parmsToAdd = new HashMap(); + + for (String sourceVarName : ctx.getAttributeKeySet()) { + + if (sourceVarName.startsWith(rhsRoot)) { + + String targetVar = lhsPrefix + + "." + + sourceVarName + .substring(rhsRoot.length()); + + LOG.debug("Copying " + sourceVarName + + " value to " + targetVar); + + parmsToAdd.put(targetVar, + ctx.getAttribute(sourceVarName)); + } + } + + for (String newParmName : parmsToAdd.keySet()) { + ctx.setAttribute(newParmName, parmsToAdd.get(newParmName)); + } + + } else { + // If RHS is empty, unset attributes in LHS + String lhsPrefix = lhsVarName.substring(0, + lhsVarName.length() - 1); + int lhsPfxLength = lhsPrefix.length(); + + LinkedList parmsToRemove = new LinkedList (); + + for (String curCtxVarname : ctx.getAttributeKeySet()) { + + if (curCtxVarname.startsWith(lhsPrefix)) { + LOG.debug("Unsetting " + curCtxVarname); + parmsToRemove.add(curCtxVarname); + } + } + + for (String parmName : parmsToRemove) { + ctx.setAttribute(parmName, null); + } + + } + } + + } else { + + if (ifunset) { + String ctxValue = ctx.getAttribute(lhsVarName); + + if ((ctxValue != null) && (ctxValue.length() > 0)) { + setValue = false; + LOG.debug("Attribute " + + lhsVarName + + " already set and only-if-unset is true, so not overriding"); + } + } + + if (setValue) { + String curValue = SvcLogicExpressionResolver.evaluate( + curEnt.getValue(), node, ctx); + + if (LOG.isDebugEnabled()) { + LOG.trace("Parameter value " + + curEnt.getValue().asParsedExpr() + + " resolves to " + curValue); + LOG.debug("Setting context attribute " + lhsVarName + + " to " + curValue); + } + ctx.setAttribute(lhsVarName, curValue); + } + } + } + + return null; + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicActivator.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicActivator.java new file mode 100644 index 000000000..3bc8f0922 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicActivator.java @@ -0,0 +1,224 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.io.File; +import java.io.FileInputStream; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.LinkedList; +import java.util.Map; +import java.util.Properties; + +import org.onap.ccsdk.sli.core.sli.ConfigurationException; +import org.onap.ccsdk.sli.core.sli.SvcLogicAdaptor; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicStore; +import org.onap.ccsdk.sli.core.sli.SvcLogicStoreFactory; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.mysql.jdbc.Driver; + +public class SvcLogicActivator implements BundleActivator { + + private static final String SVCLOGIC_PROP_VAR = "SDNC_SLI_PROPERTIES"; + private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; + + private static final Map BUILTIN_NODES = new HashMap() { + { + put("block", new BlockNodeExecutor()); + put("call", new CallNodeExecutor()); + put("configure", new ConfigureNodeExecutor()); + put("delete", new DeleteNodeExecutor()); + put("execute", new ExecuteNodeExecutor()); + put("exists", new ExistsNodeExecutor()); + put("for", new ForNodeExecutor()); + put("get-resource", new GetResourceNodeExecutor()); + put("is-available", new IsAvailableNodeExecutor()); + put("notify", new NotifyNodeExecutor()); + put("record", new RecordNodeExecutor()); + put("release", new ReleaseNodeExecutor()); + put("reserve", new ReserveNodeExecutor()); + put("return", new ReturnNodeExecutor()); + put("save", new SaveNodeExecutor()); + put("set", new SetNodeExecutor()); + put("switch", new SwitchNodeExecutor()); + put("update", new UpdateNodeExecutor()); + put("break", new BreakNodeExecutor()); + + } + }; + + private static LinkedList registrations = new LinkedList(); + + private static HashMap adaptorMap = null; + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicActivator.class); + + private static Properties props = null; + + private static BundleContext bundleCtx = null; + + private static SvcLogicService svcLogicServiceImpl = null; + + @Override + public void start(BundleContext ctx) throws Exception { + + LOG.info("Activating SLI"); + + bundleCtx = ctx; + + // Read properties + props = new Properties(); + String propPath = System.getenv(SVCLOGIC_PROP_VAR); + + if (propPath == null) { + String propDir = System.getenv(SDNC_CONFIG_DIR); + if (propDir == null) { + + propDir = "/opt/sdnc/data/properties"; + } + propPath = propDir + "/svclogic.properties"; + LOG.warn("Environment variable "+SVCLOGIC_PROP_VAR+" unset - defaulting to "+propPath); + } + + File propFile = new File(propPath); + + if (!propFile.exists()) { + + throw new ConfigurationException( + "Missing configuration properties file : " + + propFile); + } + try { + + props.load(new FileInputStream(propFile)); + } catch (Exception e) { + throw new ConfigurationException( + "Could not load properties file " + propPath, e); + + } + + + if (registrations == null) { + + registrations = new LinkedList(); + } + + // Advertise SvcLogicService + svcLogicServiceImpl = new SvcLogicServiceImpl(); + + LOG.info("SLI: Registering service " + SvcLogicService.NAME + + " in bundle " + ctx.getBundle().getSymbolicName()); + ServiceRegistration reg = ctx.registerService(SvcLogicService.NAME, + svcLogicServiceImpl, null); + registrations.add(reg); + + // Initialize SvcLogicStore + try { + SvcLogicStore store = getStore(); + registerNodeTypes(store); + } catch (ConfigurationException e) { + LOG.warn("Could not initialize SvcLogicScore", e); + } + + LOG.info("SLI - done registering services"); + } + + @Override + public void stop(BundleContext ctx) throws Exception { + + if (registrations != null) { + for (ServiceRegistration reg : registrations) { + ServiceReference regRef = reg.getReference(); + /* Don't bother to remove node types from table + String nodeType = (String) regRef.getProperty("nodeType"); + if (nodeType != null) { + LOG.info("SLI - unregistering node type " + nodeType); + store.unregisterNodeType(nodeType); + } + */ + reg.unregister(); + } + registrations = null; + } + } + + public static SvcLogicStore getStore() throws SvcLogicException { + // Create and initialize SvcLogicStore object - used to access + // saved service logic. + + SvcLogicStore store = null; + + try { + Driver dvr = new Driver(); + store = SvcLogicStoreFactory.getSvcLogicStore(props); + } catch (Exception e) { + throw new ConfigurationException( + "Could not get service logic store", e); + + } + + try { + store.init(props); + } catch (Exception e) { + throw new ConfigurationException( + "Could not get service logic store", e); + } + + return(store); + } + + private static void registerNodeTypes(SvcLogicStore store) throws SvcLogicException { + + if (store == null) { + return; + } + // Advertise built-in node executors + LOG.info("SLI : Registering built-in node executors"); + Hashtable propTable = new Hashtable(); + + for (String nodeType : BUILTIN_NODES.keySet()) { + LOG.info("SLI - registering node type " + nodeType); + propTable.clear(); + propTable.put("nodeType", nodeType); + + ServiceRegistration reg = bundleCtx.registerService(SvcLogicNodeExecutor.class.getName(), + BUILTIN_NODES.get(nodeType), propTable); + registrations.add(reg); + + store.registerNodeType(nodeType); + + LOG.info("SLI - registering node executor"); + + ((SvcLogicServiceImpl)svcLogicServiceImpl).registerExecutor(nodeType, BUILTIN_NODES.get(nodeType)); + + } + + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicAdaptorFactory.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicAdaptorFactory.java new file mode 100644 index 000000000..1bc8e0f8d --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicAdaptorFactory.java @@ -0,0 +1,85 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.HashMap; + +import org.onap.ccsdk.sli.core.sli.SvcLogicAdaptor; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SvcLogicAdaptorFactory { + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicAdaptorFactory.class); + + private static HashMap adaptorMap = new HashMap(); + + public static void registerAdaptor(SvcLogicAdaptor adaptor) { + String name = adaptor.getClass().getName(); + LOG.info("Registering adaptor " + name); + adaptorMap.put(name, adaptor); + + } + + public static void unregisterAdaptor(String name) { + if (adaptorMap.containsKey(name)) { + LOG.info("Unregistering " + name); + adaptorMap.remove(name); + } + } + + public static SvcLogicAdaptor getInstance(String name) { + if (adaptorMap.containsKey(name)) { + return (adaptorMap.get(name)); + } else { + BundleContext bctx = null; + try + { + bctx = FrameworkUtil.getBundle(SvcLogicAdaptorFactory.class) + .getBundleContext(); + } + catch (Exception e) + { + LOG.debug("Caught exception trying to locate device adaptor "+name, e); + return(null); + } + + ServiceReference sref = bctx.getServiceReference(name); + + if (sref != null) { + SvcLogicAdaptor adaptor = (SvcLogicAdaptor) bctx + .getService(sref); + + if (adaptor != null) { + registerAdaptor(adaptor); + + return (adaptor); + } + return (null); + } + } + return(null); + } +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicExpressionResolver.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicExpressionResolver.java new file mode 100644 index 000000000..01851cc62 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicExpressionResolver.java @@ -0,0 +1,604 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.onap.ccsdk.sli.core.sli.SvcLogicAtom; +import org.onap.ccsdk.sli.core.sli.SvcLogicBinaryExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicFunctionCall; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicVariableTerm; +import org.onap.ccsdk.sli.core.sli.SvcLogicAtom.AtomType; +import org.onap.ccsdk.sli.core.sli.SvcLogicBinaryExpression.OperatorType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SvcLogicExpressionResolver { + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicExpressionResolver.class); + + public static String evaluate(SvcLogicExpression expr, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + if (expr == null) { + return (null); + } + + + + if (expr instanceof SvcLogicAtom) { + SvcLogicAtom atom = (SvcLogicAtom) expr; + + AtomType atomType = atom.getAtomType(); + switch (atomType) { + case NUMBER: + case STRING: + return (atom.toString()); + case CONTEXT_VAR: + case IDENTIFIER: + + String varName = resolveVariableName(atom, node, ctx); + + if (atomType == AtomType.CONTEXT_VAR) + { + LOG.trace("Evaluating context variable $"+varName); + + String varValue = ctx.getAttribute(varName); + + if (varValue == null) { + LOG.trace("Context variable $"+varName+" unset - treating as empty string"); + varValue = ""; + } + + return (varValue); + } + SvcLogicExpression parm = node.getParameter(varName); + if (parm != null) { + LOG.trace("Evaluating value of parameter "+varName+": "+parm.asParsedExpr()); + + return (evaluate(parm, node, ctx)); + } + else + { + return(varName); + } + default: + return(null); + } + + } else if (expr instanceof SvcLogicBinaryExpression) { + SvcLogicBinaryExpression binExpr = (SvcLogicBinaryExpression) expr; + List operators = binExpr.getOperators(); + if (operators.isEmpty()) + { + List operands = binExpr.getOperands(); + if (operands.size() == 1) + { + LOG.trace("SvcLogicBinaryExpression as no operator and one operand - evaluating its operand"); + return(evaluate(operands.get(0), node, ctx)); + } + else + { + if (operands.isEmpty()) + { + LOG.error("SvcLogicBinaryExpression has no operators and no operands - evaluating value as null"); + } + else + { + LOG.error("SvcLogicBinaryExpression has no operators and "+operands.size()+" operands - evaluating value as null"); + } + return(null); + } + } + switch (operators.get(0)) { + case addOp: + case subOp: + case multOp: + case divOp: + return(evalArithExpression(binExpr, node, ctx)); + case equalOp: + case neOp: + case ltOp: + case leOp: + case gtOp: + case geOp: + return (evalCompareExpression(binExpr, node, ctx)); + case andOp: + case orOp: + return(evalLogicExpression(binExpr, node, ctx)); + + default: + return(null); + } + } + else if (expr instanceof SvcLogicFunctionCall) + { + return(evalFunctionCall((SvcLogicFunctionCall)expr, node, ctx)); + } + else + { + throw new SvcLogicException("Unrecognized expression type ["+expr+"]"); + } + } + + private static String evalArithExpression(SvcLogicBinaryExpression binExpr, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException { + List operands = binExpr.getOperands(); + List operators = binExpr.getOperators(); + if (operands.size() != (operators.size()+1)) + { + throw new SvcLogicException("Invalid expression ("+binExpr+")"); + } + String retval = evaluate(operands.get(0), node, ctx); + String retsval = retval; + long retlval = 0; + boolean valueIsLong = false; + + int i = 1; + try + { + + if ((retval.length() > 0) && StringUtils.isNumeric(retval)) + { + retlval = Long.parseLong(retval); + valueIsLong = true; + } + for (OperatorType operator: operators) + { + String curOperandValue = evaluate(operands.get(i++), node, ctx); + switch(operator) { + case addOp: + retsval = retsval + curOperandValue; + if (valueIsLong) + { + if ((curOperandValue.length() > 0) && StringUtils.isNumeric(curOperandValue) ) + { + retlval = retlval + Long.parseLong(curOperandValue); + } + else + { + valueIsLong = false; + } + } + break; + case subOp: + retlval = retlval - Long.parseLong(curOperandValue); + break; + case multOp: + retlval = retlval * Long.parseLong(curOperandValue); + break; + case divOp: + retlval = retlval / Long.parseLong(curOperandValue); + break; + } + + } + } + catch (NumberFormatException e1) + { + throw new SvcLogicException("Illegal value in arithmetic expression", e1); + } + + if (valueIsLong) + { + return("" + retlval); + } + else + { + return(retsval); + } + + } + + + + private static String evalCompareExpression(SvcLogicBinaryExpression expr, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException + { + + List operators = expr.getOperators(); + List operands = expr.getOperands(); + + if ((operators.size() != 1) || (operands.size() != 2)) + { + throw new SvcLogicException ("Invalid comparison expression : "+expr); + } + + OperatorType operator = operators.get(0); + String op1Value = evaluate(operands.get(0), node, ctx); + String op2Value = evaluate(operands.get(1), node, ctx); + + if ((StringUtils.isNotEmpty(op1Value) && StringUtils.isNumeric(op1Value) && StringUtils.isNotEmpty(op2Value) && StringUtils.isNumeric(op2Value))) + { + try + { + double op1dbl = Double.parseDouble(op1Value); + double op2dbl = Double.parseDouble(op2Value); + + switch(operator) + { + case equalOp: + return(Boolean.toString(op1dbl == op2dbl)); + case neOp: + return(Boolean.toString(op1dbl != op2dbl)); + case ltOp: + return(Boolean.toString(op1dbl < op2dbl)); + case leOp: + return(Boolean.toString(op1dbl <= op2dbl)); + case gtOp: + return(Boolean.toString(op1dbl > op2dbl)); + case geOp: + return(Boolean.toString(op1dbl >= op2dbl)); + default: + return(null); + } + } + catch (NumberFormatException e) + { + throw new SvcLogicException("Caught exception trying to compare numeric values", e); + } + } + else + { + + int compResult = 0; + + if (op1Value == null) { + compResult = -1; + } else if (op2Value == null ) { + compResult = 1; + } else { + compResult = op1Value.compareToIgnoreCase(op2Value); + } + + switch(operator) + { + case equalOp: + return(Boolean.toString(compResult == 0)); + case neOp: + return(Boolean.toString(compResult != 0)); + case ltOp: + return(Boolean.toString(compResult < 0)); + case leOp: + return(Boolean.toString(compResult <= 0)); + case gtOp: + return(Boolean.toString(compResult > 0)); + case geOp: + return(Boolean.toString(compResult >= 0)); + default: + return(null); + } + } + + } + + private static String evalLogicExpression(SvcLogicBinaryExpression expr, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException + { + boolean retval; + + List operands = expr.getOperands(); + List operators = expr.getOperators(); + + if (operands.size() != (operators.size()+1)) + { + throw new SvcLogicException("Invalid expression ("+expr+")"); + } + + try + { + retval = Boolean.parseBoolean(evaluate(operands.get(0), node, ctx)); + int i = 1; + for (OperatorType operator : operators) + { + if (operator == OperatorType.andOp) + { + retval = retval && Boolean.parseBoolean(evaluate(operands.get(i++), node, ctx)); + } + else + { + + retval = retval || Boolean.parseBoolean(evaluate(operands.get(i++), node, ctx)); + } + + } + } + catch (Exception e) + { + throw new SvcLogicException("Invalid expression ("+expr+")"); + } + + + return(Boolean.toString(retval)); + } + + private static String evalFunctionCall(SvcLogicFunctionCall func, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException + { + String funcName = func.getFunctionName(); + List operands = func.getOperands(); + + if ("length".equalsIgnoreCase(funcName)) + { + + if (operands.size() == 1) + { + String opValue = evaluate(operands.get(0), node, ctx); + return(""+opValue.length()); + } + else + { + throw new SvcLogicException("Invalid call to length() function"); + } + } + else if ("substr".equalsIgnoreCase(funcName)) + { + if (operands.size() == 3) + { + String op1Value = evaluate(operands.get(0), node, ctx); + String op2Value = evaluate(operands.get(1), node, ctx); + String op3Value = evaluate(operands.get(2), node, ctx); + + if (!StringUtils.isNumeric(op2Value) || !StringUtils.isNumeric(op3Value)) + { + throw new SvcLogicException("Invalid arguments to substr() function"); + } + + try + { + return(op1Value.substring(Integer.parseInt(op2Value), Integer.parseInt(op3Value))); + } + catch (Exception e) + { + throw new SvcLogicException("Caught exception trying to take substring", e); + } + } + else + { + + throw new SvcLogicException("Invalid call to substr() function"); + } + + } + else if ("toUpperCase".equalsIgnoreCase(funcName)) + { + if (operands.size() == 1) + { + String opValue = evaluate(operands.get(0), node, ctx); + if (opValue != null) { + return(opValue.toUpperCase()); + } else { + return(""); + } + } + else + { + throw new SvcLogicException("Invalid call to toUpperCase() function"); + } + } + else if ("toLowerCase".equalsIgnoreCase(funcName)) + { + if (operands.size() == 1) + { + String opValue = evaluate(operands.get(0), node, ctx); + if (opValue != null) { + return(opValue.toLowerCase()); + } else { + return(""); + } + } + else + { + throw new SvcLogicException("Invalid call to toLowerCase() function"); + } + } + else if ("convertBase".equalsIgnoreCase(funcName)) { + int fromBase = 10; + int toBase = 10; + String srcString = ""; + + if (operands.size() == 2) + { + fromBase = 10; + srcString = evaluate(operands.get(0), node, ctx); + toBase = Integer.parseInt(evaluate(operands.get(1), node, ctx)); + } else if (operands.size() == 3) { + + srcString = evaluate(operands.get(0), node, ctx); + fromBase = Integer.parseInt(evaluate(operands.get(1), node, ctx)); + toBase = Integer.parseInt(evaluate(operands.get(2), node, ctx)); + } else { + throw new SvcLogicException("Invalid call to convertBase() function"); + } + + long srcValue = Long.parseLong(srcString, fromBase); + return(Long.toString(srcValue, toBase)); + } + else + { + throw new SvcLogicException("Unrecognized function ("+funcName+")"); + } + + } + + public static String evaluateAsKey(SvcLogicExpression expr, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + if (expr == null) { + return (null); + } + + + + if (expr instanceof SvcLogicAtom) { + SvcLogicAtom atom = (SvcLogicAtom) expr; + + AtomType atomType = atom.getAtomType(); + StringBuffer varNameBuff = new StringBuffer(); + switch (atomType) { + case NUMBER: + return (atom.toString()); + case STRING: + return("'"+atom.toString()+"'"); + case CONTEXT_VAR: + case IDENTIFIER: + boolean needDot = false; + for (SvcLogicExpression term : atom.getOperands()) + { + if (needDot) + { + varNameBuff.append("."); + } + if (term instanceof SvcLogicVariableTerm) + { + SvcLogicVariableTerm vterm = (SvcLogicVariableTerm) term; + varNameBuff.append(vterm.getName()); + if (vterm.numOperands() > 0) + { + varNameBuff.append("["); + varNameBuff.append(evaluate(vterm.getSubscript(), node, ctx)); + varNameBuff.append("]"); + + } + } + else + { + varNameBuff.append(term.toString()); + } + needDot = true; + } + + String varName = varNameBuff.toString(); + LOG.debug("Evaluating context variable $"+varName); + String ctxValue = ctx.getAttribute(varName); + if (ctxValue == null) + { + return(null); + } + if (StringUtils.isNumeric(ctxValue)) + { + return(ctxValue); + } + else + { + return("'"+ctxValue+"'"); + } + + default: + return(null); + } + + } else if (expr instanceof SvcLogicBinaryExpression) { + SvcLogicBinaryExpression binExpr = (SvcLogicBinaryExpression) expr; + List operators = binExpr.getOperators(); + List operands = binExpr.getOperands(); + if (operators.isEmpty()) + { + if (operands.size() == 1) + { + LOG.debug("SvcLogicBinaryExpression as no operator and one operand - evaluating its operand"); + return(evaluateAsKey(operands.get(0), node, ctx)); + } + else + { + if (operands.isEmpty()) + { + LOG.error("SvcLogicBinaryExpression has no operators and no operands - evaluating value as null"); + } + else + { + LOG.error("SvcLogicBinaryExpression has no operators and "+operands.size()+" operands - evaluating value as null"); + } + return(null); + } + } + StringBuffer sbuff = new StringBuffer(); + sbuff.append(evaluateAsKey(operands.get(0), node, ctx)); + int i = 1; + for (OperatorType operator : operators) + { + sbuff.append(" "); + sbuff.append(operator.toString()); + sbuff.append(" "); + sbuff.append(evaluateAsKey(operands.get(i++), node,ctx)); + } + return(sbuff.toString()); + } + else if (expr instanceof SvcLogicFunctionCall) + { + StringBuffer sbuff = new StringBuffer(); + SvcLogicFunctionCall funcCall = (SvcLogicFunctionCall) expr; + sbuff.append(funcCall.getFunctionName()); + sbuff.append("("); + boolean needComma = false; + for (SvcLogicExpression operand : funcCall.getOperands()) + { + if (needComma) + { + sbuff.append(","); + } + else + { + needComma = true; + } + sbuff.append(evaluateAsKey(operand, node, ctx)); + } + sbuff.append(")"); + return(sbuff.toString()); + } + else + { + throw new SvcLogicException("Unrecognized expression type ["+expr+"]"); + } + } + + public static String resolveVariableName(SvcLogicExpression atom, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException + { + StringBuffer varNameBuff = new StringBuffer(); + + boolean needDot = false; + for (SvcLogicExpression term : atom.getOperands()) + { + if (needDot) + { + varNameBuff.append("."); + } + if (term instanceof SvcLogicVariableTerm) + { + SvcLogicVariableTerm vterm = (SvcLogicVariableTerm) term; + varNameBuff.append(vterm.getName()); + if (vterm.numOperands() > 0) + { + varNameBuff.append("["); + varNameBuff.append(evaluate(vterm.getSubscript(), node, ctx)); + varNameBuff.append("]"); + } + } + else + { + varNameBuff.append(term.toString()); + } + needDot = true; + } + return(varNameBuff.toString()); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicNodeExecutor.java new file mode 100644 index 000000000..8d72f7a8b --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicNodeExecutor.java @@ -0,0 +1,109 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicAdaptor; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicRecorder; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.onap.ccsdk.sli.core.sli.SvcLogicStore; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class SvcLogicNodeExecutor { + + public abstract SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException; + + private static final Logger LOG = LoggerFactory.getLogger(SvcLogicNodeExecutor.class); + + protected String evaluateNodeTest(SvcLogicNode node, SvcLogicContext ctx) + throws SvcLogicException { + if (node == null) { + return null; + } + + return (SvcLogicExpressionResolver.evaluate(node.getAttribute("test"), + node, ctx)); + + } + + protected SvcLogicStore getStore() throws SvcLogicException { + return SvcLogicActivator.getStore(); + } + + protected SvcLogicAdaptor getAdaptor(String adaptorName) { + return SvcLogicAdaptorFactory.getInstance(adaptorName); + } + + protected SvcLogicResource getSvcLogicResource(String plugin) { + BundleContext bctx = FrameworkUtil.getBundle(this.getClass()) + .getBundleContext(); + + ServiceReference sref = bctx.getServiceReference(plugin); + if (sref != null) { + SvcLogicResource resourcePlugin = (SvcLogicResource) bctx + .getService(sref); + return resourcePlugin; + } + else { + LOG.warn("Could not find service reference object for plugin " + plugin); + return null; + } + } + + protected SvcLogicRecorder getSvcLogicRecorder(String plugin) { + BundleContext bctx = FrameworkUtil.getBundle(this.getClass()) + .getBundleContext(); + + ServiceReference sref = bctx.getServiceReference(plugin); + if (sref != null) { + SvcLogicRecorder resourcePlugin = (SvcLogicRecorder) bctx + .getService(sref); + return resourcePlugin; + } + else { + return null; + } + } + + protected SvcLogicJavaPlugin getSvcLogicJavaPlugin(String pluginName){ + BundleContext bctx = FrameworkUtil.getBundle(this.getClass()) + .getBundleContext(); + + ServiceReference sref = bctx.getServiceReference(pluginName); + + if (sref == null) { + LOG.warn("Could not find service reference object for plugin " + pluginName); + return null; + } else { + SvcLogicJavaPlugin plugin = (SvcLogicJavaPlugin) bctx + .getService(sref); + return plugin; + } + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicService.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicService.java new file mode 100644 index 000000000..cfba5866e --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicService.java @@ -0,0 +1,75 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.Properties; + +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; + +public interface SvcLogicService { + + public static final String NAME = "org.openecomp.sdnc.sli.provider.SvcLogicService"; + + // public SvcLogicContext execute(SvcLogicGraph graph, SvcLogicContext ctx) throws SvcLogicException; + /** + * Check for existence of a directed graph + * @param module - module name + * @param rpc - rpc name + * @param version - version. If null, looks for active version + * @param mode - mode (sync/async) + * @return true if directed graph found, false otherwise + * @throws SvcLogicException + */ + public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException; + + /** + * Execute a directed graph + * + * @param module - module name + * @param rpc - rpc name + * @param version - version. If null, use active version + * @param mode - mode (sync/async) + * @param parms - parameters, used to set SvcLogicContext attributes + * @return final values of attributes from SvcLogicContext, as Properties + * @throws SvcLogicException + * + * + * @deprecated use execute(String module, String rpc, String version, String mode, DOMDataBroker dataBroker) instead + */ + @Deprecated + public Properties execute(String module, String rpc, String version, String mode, Properties parms) throws SvcLogicException; + + /** + * Execute a directed graph + * + * @param module - module name + * @param rpc - rpc name + * @param version - version. If null, use active version + * @param mode - mode (sync/async) + * @param parms - parameters, used to set SvcLogicContext attributes + * @param domDataBroker - DOMDataBroker object + * @return final values of attributes from SvcLogicContext, as Properties + * @throws SvcLogicException + */ + public Properties execute(String module, String rpc, String version, String mode, Properties parms, DOMDataBroker domDataBroker) throws SvcLogicException; + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicServiceImpl.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicServiceImpl.java new file mode 100644 index 000000000..c0ee4c2c1 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicServiceImpl.java @@ -0,0 +1,272 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.HashMap; +import java.util.Properties; + +import org.onap.ccsdk.sli.core.sli.MetricLogger; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicGraph; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicStore; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceEvent; +import org.osgi.framework.ServiceListener; +import org.osgi.framework.ServiceReference; +import org.osgi.util.tracker.ServiceTracker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + +public class SvcLogicServiceImpl implements SvcLogicService { + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicServiceImpl.class); + + private HashMap nodeExecutors = null; + + private BundleContext bctx = null; + + private void registerExecutors() { + + LOG.info("Entered register executors"); + if (bctx == null) { + bctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); + } + + if (nodeExecutors == null) { + nodeExecutors = new HashMap(); + } + + LOG.info("Opening service tracker"); + ServiceTracker tracker = new ServiceTracker(bctx, + SvcLogicNodeExecutor.class.getName(), null); + + tracker.open(); + + ServiceListener listener = new ServiceListener() { + + public void serviceChanged(ServiceEvent ev) { + ServiceReference sr = ev.getServiceReference(); + switch (ev.getType()) { + case ServiceEvent.REGISTERED: { + registerExecutor(sr); + } + break; + case ServiceEvent.UNREGISTERING: { + unregisterExecutor(sr); + } + break; + } + } + }; + + LOG.info("Adding service listener"); + String filter = "(objectclass=" + SvcLogicNodeExecutor.class.getName() + + ")"; + try { + bctx.addServiceListener(listener, filter); + ServiceReference[] srl = bctx.getServiceReferences( + SvcLogicNodeExecutor.class.getName(), null); + for (int i = 0; srl != null && i < srl.length; i++) { + listener.serviceChanged(new ServiceEvent( + ServiceEvent.REGISTERED, srl[i])); + } + } catch (InvalidSyntaxException e) { + e.printStackTrace(); + } + LOG.info("Done registerExecutors"); + } + + public void registerExecutor(ServiceReference sr) { + + String nodeName = (String) sr.getProperty("nodeType"); + if (nodeName != null) { + + SvcLogicNodeExecutor executor = null; + + try { + executor = (SvcLogicNodeExecutor) bctx.getService(sr); + } catch (Exception e) { + LOG.error("Cannot get service executor for " + nodeName); + return; + } + + registerExecutor(nodeName, executor); + + } + } + + public void registerExecutor(String nodeName, SvcLogicNodeExecutor executor) + { + if (nodeExecutors == null) { + nodeExecutors = new HashMap(); + } + LOG.info("SLI - registering executor for node type "+nodeName); + nodeExecutors.put(nodeName, executor); + } + + public void unregisterExecutor(ServiceReference sr) { + String nodeName = (String) sr.getProperty("nodeType"); + + if (nodeName != null) { + + unregisterExecutor(nodeName); + + } + + } + + public void unregisterExecutor(String nodeName) + { + + LOG.info("SLI - unregistering executor for node type "+nodeName); + nodeExecutors.remove(nodeName); + } + + + + + public SvcLogicContext execute(SvcLogicGraph graph, SvcLogicContext ctx) + throws SvcLogicException { + + if (nodeExecutors == null) { + registerExecutors(); + } + + // Set service name in MDC to reference current working directed graph + MDC.put(MetricLogger.SERVICE_NAME, graph.getModule()+":"+graph.getRpc()+"/v"+graph.getVersion()); + + SvcLogicNode curNode = graph.getRootNode(); + LOG.info("About to execute graph " + graph.toString()); + + + + while (curNode != null) { + LOG.info("About to execute node # "+curNode.getNodeId()+" ("+curNode.getNodeType()+")"); + + SvcLogicNode nextNode = executeNode(curNode, ctx); + curNode = nextNode; + } + + return (ctx); + } + + + public SvcLogicNode executeNode(SvcLogicNode node, SvcLogicContext ctx) + throws SvcLogicException { + if (node == null) { + return (null); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("Executing node " + node.getNodeId()); + } + + SvcLogicNodeExecutor executor = nodeExecutors.get(node.getNodeType()); + + if (executor != null) { + LOG.debug("Executing node executor for node type "+node.getNodeType()+" - "+executor.getClass().getName()); + return (executor.execute(this, node, ctx)); + } else { + if (LOG.isDebugEnabled()) { + LOG.debug(node.getNodeType() + " node not implemented"); + } + SvcLogicNode nextNode = node.getOutcomeValue("failure"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute failure branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("no failure or Other branch found"); + } + } + return (nextNode); + } + + } + + @Override + public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException + { + SvcLogicStore store = SvcLogicActivator.getStore(); + + return (store.hasGraph(module, rpc, version, mode)); + } + + @Override + public Properties execute(String module, String rpc, String version, String mode, Properties props) + throws SvcLogicException { + return(execute(module, rpc, version, mode, props, null)); + } + + + @Override + public Properties execute(String module, String rpc, String version, String mode, + Properties props, DOMDataBroker domDataBroker) throws SvcLogicException { + + + // See if there is a service logic defined + // + SvcLogicStore store = SvcLogicActivator.getStore(); + + LOG.info("Fetching service logic from data store"); + SvcLogicGraph graph = store.fetch(module, rpc, version, mode); + + + + if (graph == null) + { + Properties retProps = new Properties(); + retProps.setProperty("error-code", "401"); + retProps.setProperty("error-message", "No service logic found for ["+module+","+rpc+","+version+","+mode+"]"); + return(retProps); + + } + + SvcLogicContext ctx = new SvcLogicContext(props); + ctx.setAttribute("currentGraph", graph.toString()); + ctx.setAttribute("X-ECOMP-RequestID", MDC.get("X-ECOMP-RequestID")); + ctx.setDomDataBroker(domDataBroker); + + execute(graph, ctx); + + return(ctx.toProperties()); + } + + + + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SwitchNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SwitchNodeExecutor.java new file mode 100644 index 000000000..ac0c428b3 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SwitchNodeExecutor.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SwitchNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(SwitchNodeExecutor.class); + + @Override + + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + + String testResult = evaluateNodeTest(node, ctx); + + if (LOG.isDebugEnabled()) { + LOG.debug("Executing switch node"); + + + LOG.debug("test expression (" + node.getAttribute("test") + + ") evaluates to " + testResult); + } + + SvcLogicNode nextNode = node.getOutcomeValue(testResult); + + if (LOG.isDebugEnabled()) { + if (nextNode != null) { + LOG.debug("Next node to execute is node " + nextNode.getNodeId()); + } else { + LOG.debug("No next node found"); + } + } + return (nextNode); + + } +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/UpdateNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/UpdateNodeExecutor.java new file mode 100644 index 000000000..48510e60f --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/UpdateNodeExecutor.java @@ -0,0 +1,135 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UpdateNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory + .getLogger(UpdateNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + + String plugin = SvcLogicExpressionResolver.evaluate( + node.getAttribute("plugin"), node, ctx); + String resourceType = SvcLogicExpressionResolver.evaluate( + node.getAttribute("resource"), node, ctx); + String key = SvcLogicExpressionResolver.evaluateAsKey( + node.getAttribute("key"), node, ctx); + String pfx = SvcLogicExpressionResolver.evaluate( + node.getAttribute("pfx"), node, ctx); + + + Map parmMap = new HashMap(); + + Set> parmSet = node + .getParameterSet(); + boolean hasParms = false; + + for (Iterator> iter = parmSet + .iterator(); iter.hasNext();) { + hasParms = true; + Map.Entry curEnt = iter.next(); + String curName = curEnt.getKey(); + SvcLogicExpression curExpr = curEnt.getValue(); + if (curExpr != null) { + String curExprValue = SvcLogicExpressionResolver.evaluate( + curExpr, node, ctx); + + LOG.debug("Parameter " + curName + " = " + + curExpr.asParsedExpr() + " resolves to " + + curExprValue); + + parmMap.put(curName, curExprValue); + } + } + + String outValue = "failure"; + + if (LOG.isDebugEnabled()) { + LOG.debug("save node encountered - looking for resource class " + + plugin); + } + + + SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); + + + if (resourcePlugin != null) { + + try { + switch (resourcePlugin.update(resourceType, key, + parmMap, pfx, ctx)) { + case SUCCESS: + outValue = "success"; + break; + case NOT_FOUND: + outValue = "not-found"; + break; + case FAILURE: + default: + outValue = "failure"; + } + } catch (SvcLogicException e) { + LOG.error("Caught exception from resource plugin", e); + outValue = "failure"; + } + } else { + LOG.warn("Could not find SvcLogicResource object for plugin " + + plugin); + } + + SvcLogicNode nextNode = node.getOutcomeValue(outValue); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute " + outValue + " branch"); + } + return (nextNode); + } + + nextNode = node.getOutcomeValue("Other"); + if (nextNode != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("about to execute Other branch"); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("no "+outValue+" or Other branch found"); + } + } + return (nextNode); + } + +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/WhileNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/WhileNodeExecutor.java new file mode 100644 index 000000000..bc3cc773b --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/WhileNodeExecutor.java @@ -0,0 +1,74 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.BreakNodeException; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class WhileNodeExecutor extends SvcLogicNodeExecutor { + + private static final Logger LOG = LoggerFactory.getLogger(WhileNodeExecutor.class); + + @Override + public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException { + + String testResult = evaluateNodeTest(node, ctx); + SvcLogicExpression silentFailureExpr = node.getAttribute("do"); + String doWhile = SvcLogicExpressionResolver.evaluate(silentFailureExpr, node, ctx); + if ("true".equals(doWhile)) { + LOG.debug("While loop will execute once regardless of expression because do is set to true"); + } + + try { + while ("true".equals(testResult) || "true".equals(doWhile)) { + if (!"true".equals(doWhile)) { + LOG.debug("Test expression (" + node.getAttribute("test") + ") evaluates to true, executing loop."); + } + int numOutcomes = node.getNumOutcomes() + 1; + for (int i = 0; i < numOutcomes; i++) { + SvcLogicNode nextNode = node.getOutcomeValue("" + (i + 1)); + if (nextNode != null) { + while (nextNode != null) { + nextNode = svc.executeNode(nextNode, ctx); + } + } else { + if ("true".equals(doWhile)) { + LOG.debug("Do executed, will only execute again if test expression is true."); + doWhile = "false"; + } + testResult = evaluateNodeTest(node, ctx); + LOG.debug("test expression (" + node.getAttribute("test") + ") evaluates to " + testResult); + } + } + } + LOG.debug("testResult was " + testResult + " which is not equal to true, exiting while loop."); + } catch (BreakNodeException e) { + LOG.debug("WhileNodeExecutor caught break"); + } + return (null); + } + +} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/BlockNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/BlockNodeExecutor.java deleted file mode 100644 index f83154d9e..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/BlockNodeExecutor.java +++ /dev/null @@ -1,75 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class BlockNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(BlockNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) - throws SvcLogicException { - - SvcLogicExpression atomicExpr = node.getAttribute("atomic"); - String atomicStr = SvcLogicExpressionResolver.evaluate(atomicExpr, node, ctx); - boolean isAtomic = "true".equalsIgnoreCase(atomicStr); - - // Initialize status to success so that at least one outcome will execute - ctx.setStatus("success"); - - int numOutcomes = node.getNumOutcomes(); - - for (int i = 0; i < numOutcomes; i++) { - if ("failure".equals(ctx.getStatus()) && isAtomic) { - LOG.info("Block - stopped executing nodes due to failure status"); - return(null); - } - - SvcLogicNode nextNode = node.getOutcomeValue("" + (i + 1)); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("Block - executing outcome " + (i + 1)); - } - while (nextNode != null) - { - nextNode = svc.executeNode(nextNode, ctx); - } - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("Block - done: no outcome " + (i + 1)); - } - } - } - - return (null); - } - - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/BreakNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/BreakNodeExecutor.java deleted file mode 100644 index 0f8719c8a..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/BreakNodeExecutor.java +++ /dev/null @@ -1,42 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.BreakNodeException; -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class BreakNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory.getLogger(BreakNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException { - String message = "BreakNodeExecutor encountered break with nodeId " + node.getNodeId(); - LOG.debug(message); - throw new BreakNodeException(message); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/CallNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/CallNodeExecutor.java deleted file mode 100644 index 7b79c19f6..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/CallNodeExecutor.java +++ /dev/null @@ -1,165 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicGraph; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicStore; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class CallNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(CallNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) - throws SvcLogicException { - - String outValue = "not-found"; - - SvcLogicGraph myGraph = node.getGraph(); - - if (myGraph == null) - { - LOG.debug("execute: getGraph returned null"); - } - else - { - LOG.debug("execute: got SvcLogicGraph"); - } - - SvcLogicExpression moduleExpr = null; - - String module = null; - - moduleExpr = node.getAttribute("module"); - if (moduleExpr != null) - { - module = SvcLogicExpressionResolver.evaluate(moduleExpr, node, ctx); - } - - if ((module == null) || (module.length() == 0)) - { - if (myGraph != null) - { - module = myGraph.getModule(); - LOG.debug("myGraph.getModule() returned "+module); - } - } - - SvcLogicExpression rpcExpr = null; - String rpc = null; - rpcExpr = node.getAttribute("rpc"); - if (rpcExpr != null) - { - rpc = SvcLogicExpressionResolver.evaluate(rpcExpr, node, ctx); - } - - if ((rpc == null) || (rpc.length() == 0)) - { - if (myGraph != null) - { - rpc = myGraph.getRpc(); - LOG.debug("myGraph.getRpc() returned "+rpc); - } - } - - String mode = null; - - moduleExpr = node.getAttribute("mode"); - if (moduleExpr != null) - { - mode = SvcLogicExpressionResolver.evaluate(moduleExpr, node, ctx); - } - - if ((mode == null) || (mode.length() == 0)) - { - if (myGraph != null) - { - mode = myGraph.getMode(); - - LOG.debug("myGraph.getMode() returned "+mode); - } - } - - String version = null; - - moduleExpr = node.getAttribute("version"); - if (moduleExpr != null) - { - version = SvcLogicExpressionResolver.evaluate(moduleExpr, node, ctx); - } - - String parentGraph = ctx.getAttribute("currentGraph"); - ctx.setAttribute("parentGraph", parentGraph); - - SvcLogicStore store = getStore(); - - if (store != null) { - SvcLogicGraph calledGraph = store.fetch(module, rpc, version, mode); - LOG.debug("Parent " + parentGraph + " is calling child " + calledGraph.toString()); - ctx.setAttribute("currentGraph", calledGraph.toString()); - if (calledGraph != null) { - svc.execute(calledGraph, ctx); - - outValue = ctx.getStatus(); - } else { - LOG.error("Could not find service logic for [" + module + "," + rpc + "," + version + "," + mode + "]"); - } - } - else - { - LOG.debug("Could not get SvcLogicStore reference"); - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - ctx.setAttribute("currentGraph", parentGraph); - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("no " + outValue + " or Other branch found"); - } - } - ctx.setAttribute("currentGraph", parentGraph); - ctx.setAttribute("parentGraph", null); - - return (nextNode); - - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ConfigureNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ConfigureNodeExecutor.java deleted file mode 100644 index a3f2874fb..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ConfigureNodeExecutor.java +++ /dev/null @@ -1,248 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.openecomp.sdnc.sli.SvcLogicAdaptor; -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ConfigureNodeExecutor extends SvcLogicNodeExecutor { - private static final Logger LOG = LoggerFactory - .getLogger(ConfigureNodeExecutor.class); - - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String adaptorName = SvcLogicExpressionResolver.evaluate( - node.getAttribute("adaptor"), node, ctx); - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug("configure node encountered - looking for adaptor " - + adaptorName); - } - - SvcLogicAdaptor adaptor = getAdaptor(adaptorName); - - if (adaptor != null) { - String activate = SvcLogicExpressionResolver.evaluate( - node.getAttribute("activate"), node, ctx); - String key = SvcLogicExpressionResolver.evaluate( - node.getAttribute("key"), node, ctx); - - Map parmMap = new HashMap(); - - Set> parmSet = node - .getParameterSet(); - boolean hasParms = false; - - for (Iterator> iter = parmSet - .iterator(); iter.hasNext();) { - hasParms = true; - Map.Entry curEnt = iter.next(); - String curName = curEnt.getKey(); - SvcLogicExpression curExpr = curEnt.getValue(); - String curExprValue = SvcLogicExpressionResolver.evaluate(curExpr, node, ctx); - - LOG.debug("Parameter "+curName+" = "+curExpr.asParsedExpr()+" resolves to "+curExprValue); - - parmMap.put(curName,curExprValue); - } - - if (hasParms) { - SvcLogicAdaptor.ConfigStatus confStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; - - try { - confStatus = adaptor.configure(key, parmMap, ctx); - } catch (Exception e) { - LOG.warn("Caught exception from "+adaptorName+".configure", e); - confStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; - } - - switch (confStatus) { - case SUCCESS: - outValue = "success"; - if ((activate != null) && (activate.length() > 0)) { - if ("true".equalsIgnoreCase(activate)) { - SvcLogicAdaptor.ConfigStatus activateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; - - try { - activateStatus = adaptor.activate(key, ctx); - } catch (Exception e) { - - LOG.warn("Caught exception from "+adaptorName+".activate", e); - activateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; - } - switch (activateStatus) { - case SUCCESS: - break; - case ALREADY_ACTIVE: - outValue = "already-active"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case NOT_READY: - outValue = "not-ready"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } else if ("false".equalsIgnoreCase(activate)) { - SvcLogicAdaptor.ConfigStatus deactivateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; - - try { - deactivateStatus = adaptor.deactivate(key, ctx); - } catch (Exception e) { - - LOG.warn("Caught exception from "+adaptorName+".deactivate", e); - deactivateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; - } - switch (deactivateStatus) { - case SUCCESS: - break; - case ALREADY_ACTIVE: - outValue = "already-active"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case NOT_READY: - outValue = "not-ready"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } - } - break; - case ALREADY_ACTIVE: - outValue = "already-active"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case NOT_READY: - outValue = "not-ready"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } else { - if ((activate != null) && (activate.length() > 0)) { - if ("true".equalsIgnoreCase(activate)) { - SvcLogicAdaptor.ConfigStatus activateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; - try { - activateStatus = adaptor.activate(key, ctx); - } catch (Exception e) { - LOG.warn("Caught exception from "+adaptorName+".activate", e); - activateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; - } - switch (activateStatus) { - case SUCCESS: - outValue = "success"; - break; - case ALREADY_ACTIVE: - outValue = "already-active"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case NOT_READY: - outValue = "not-ready"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } else if ("false".equalsIgnoreCase(activate)) { - SvcLogicAdaptor.ConfigStatus deactivateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; - - try { - deactivateStatus = adaptor.deactivate(key, ctx); - } catch (Exception e) { - LOG.warn("Caught exception from "+adaptorName+".deactivate", e); - deactivateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; - } - switch (deactivateStatus) { - case SUCCESS: - outValue = "success"; - break; - case ALREADY_ACTIVE: - outValue = "already-active"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case NOT_READY: - outValue = "not-ready"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } - } else { - LOG.warn("Nothing to configure - no parameters passed, and activate attribute is not set"); - outValue = "success"; - } - } - } else { - if (LOG.isWarnEnabled()) { - LOG.warn("Adaptor for " + adaptorName + " not found"); - } - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("no " + outValue + " or Other branch found"); - } - } - return (nextNode); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/DeleteNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/DeleteNodeExecutor.java deleted file mode 100644 index 081cbcfa1..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/DeleteNodeExecutor.java +++ /dev/null @@ -1,101 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DeleteNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(DeleteNodeExecutor.class); - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String plugin = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String resourceType = SvcLogicExpressionResolver.evaluate( - node.getAttribute("resource"), node, ctx); - String key = SvcLogicExpressionResolver.evaluateAsKey( - node.getAttribute("key"), node, ctx); - - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug("delete node encountered - looking for resource class " - + plugin); - } - - - SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); - if (resourcePlugin != null) { - - try { - - switch (resourcePlugin.delete(resourceType, key, ctx)) { - case SUCCESS: - outValue = "success"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } catch (SvcLogicException e) { - LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; - } - } else { - LOG.warn("Could not find SvcLogicResource object for plugin " - + plugin); - } - - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("no "+outValue+" or Other branch found"); - } - } - return (nextNode); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ExecuteNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ExecuteNodeExecutor.java deleted file mode 100644 index 7ae4d0db9..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ExecuteNodeExecutor.java +++ /dev/null @@ -1,161 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ExecuteNodeExecutor extends SvcLogicNodeExecutor { - private static final Logger LOG = LoggerFactory - .getLogger(ExecuteNodeExecutor.class); - - private static final String pluginErrorMessage = "Could not execute plugin. SvcLogic status will be set to failure."; - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String pluginName = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug("execute node encountered - looking for plugin " - + pluginName); - } - - SvcLogicJavaPlugin plugin = getSvcLogicJavaPlugin(pluginName); - - if (plugin == null) { - outValue = "not-found"; - } else { - - String methodName = evaluate(node.getAttribute("method"), node, ctx); - - Class pluginClass = plugin.getClass(); - - Method pluginMethod = null; - - try { - pluginMethod = pluginClass.getMethod(methodName, Map.class, SvcLogicContext.class); - } catch (NoSuchMethodException e) { - LOG.error(pluginErrorMessage, e); - } - - if (pluginMethod == null) { - outValue = "unsupported-method"; - } else { - try { - - Map parmMap = new HashMap(); - - Set> parmSet = node - .getParameterSet(); - - for (Iterator> iter = parmSet - .iterator(); iter.hasNext();) { - Map.Entry curEnt = iter.next(); - String curName = curEnt.getKey(); - SvcLogicExpression curExpr = curEnt.getValue(); - String curExprValue = SvcLogicExpressionResolver.evaluate(curExpr, node, ctx); - - LOG.debug("Parameter "+curName+" = "+curExpr.asParsedExpr()+" resolves to "+curExprValue); - - parmMap.put(curName,curExprValue); - } - - Object o = pluginMethod.invoke(plugin, parmMap, ctx); - String emitsOutcome = SvcLogicExpressionResolver.evaluate(node.getAttribute("emitsOutcome"), node, ctx); - - outValue = mapOutcome(o, emitsOutcome); - - } catch (InvocationTargetException e) { - if(e.getCause() != null){ - LOG.error(pluginErrorMessage, e.getCause()); - }else{ - LOG.error(pluginErrorMessage, e); - } - outValue = "failure"; - ctx.setStatus("failure"); - } catch (IllegalAccessException e) { - LOG.error(pluginErrorMessage, e); - outValue = "failure"; - ctx.setStatus("failure"); - } catch (IllegalArgumentException e) { - LOG.error(pluginErrorMessage, e); - outValue = "failure"; - ctx.setStatus("failure"); - } - } - - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("no " + outValue + " or Other branch found"); - } - } - return (nextNode); - } - - protected String evaluate(SvcLogicExpression expr, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException { - return SvcLogicExpressionResolver.evaluate(node.getAttribute("method"), node, ctx); - } - - public String mapOutcome(Object o, String emitsOutcome) { - if (emitsOutcome != null) { - Boolean nodeEmitsOutcome = Boolean.valueOf(emitsOutcome); - if (nodeEmitsOutcome) { - return (String) o; - } else { - return "success"; - } - - } else { - return "success"; - } - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ExistsNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ExistsNodeExecutor.java deleted file mode 100644 index 688a86e53..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ExistsNodeExecutor.java +++ /dev/null @@ -1,105 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ExistsNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(ExistsNodeExecutor.class); - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String plugin = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String resourceType = SvcLogicExpressionResolver.evaluate( - node.getAttribute("resource"), node, ctx); - String key = SvcLogicExpressionResolver.evaluateAsKey( - node.getAttribute("key"), node, ctx); - String pfx = SvcLogicExpressionResolver.evaluate( - node.getAttribute("pfx"), node, ctx); - - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug("exists node encountered - looking for resource class " - + plugin); - } - - - - SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); - - if (resourcePlugin != null) { - - try { - - switch (resourcePlugin.exists(resourceType, key, pfx, ctx)) { - case SUCCESS: - outValue = "true"; - break; - case NOT_FOUND: - outValue = "false"; - break; - case FAILURE: - default: - outValue = "false"; - } - } catch (SvcLogicException e) { - LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; - } - } else { - LOG.warn("Could not find SvcLogicResource object for plugin " - + plugin); - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - - LOG.debug("no "+outValue+" or Other branch found"); - } - } - return (nextNode); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ForNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ForNodeExecutor.java deleted file mode 100644 index e9fdc55ef..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ForNodeExecutor.java +++ /dev/null @@ -1,109 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.BreakNodeException; -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ForNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(ForNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - SvcLogicExpression atomicExpr = node.getAttribute("atomic"); - String atomicStr = SvcLogicExpressionResolver.evaluate(atomicExpr, node, ctx); - boolean isAtomic = !("false".equalsIgnoreCase(atomicStr)); - - int numOutcomes = node.getNumOutcomes(); - String idxVar = SvcLogicExpressionResolver.evaluate( - node.getAttribute("index"), node, ctx); - String startVal = SvcLogicExpressionResolver.evaluate( - node.getAttribute("start"), node, ctx); - String endVal = SvcLogicExpressionResolver.evaluate( - node.getAttribute("end"), node, ctx); - - LOG.debug("Executing "+ (isAtomic ? "atomic" : "non-atomic") + " for loop - for (int " + idxVar + " = " + startVal - + "; " + idxVar + " < " + endVal + "; " + idxVar + "++)"); - - int startIdx = 0; - int endIdx = 0; - - try { - startIdx = Integer.parseInt(startVal); - endIdx = Integer.parseInt(endVal); - } catch (NumberFormatException e) { - SvcLogicExpression silentFailureExpr = node.getAttribute("silentFailure"); - String silentFailure = SvcLogicExpressionResolver.evaluate(silentFailureExpr, node, ctx); - boolean isSilentFailure = Boolean.parseBoolean(silentFailure); - String message = "Invalid index values [" + startVal + "," + endVal + "]"; - if(!isSilentFailure){ - throw new SvcLogicException(message); - }else{ - LOG.debug(message + ". Not exiting because silentFailure was set to true."); - return(null); - } - } - - try { - for (int ctr = startIdx; ctr < endIdx; ctr++) { - - ctx.setAttribute(idxVar, "" + ctr); - - for (int i = 0; i < numOutcomes; i++) { - - if ("failure".equals(ctx.getStatus()) && isAtomic) { - LOG.info("For - stopped executing nodes due to failure status"); - return(null); - } - - SvcLogicNode nextNode = node.getOutcomeValue("" + (i + 1)); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("For - executing outcome " + (i + 1)); - } - SvcLogicNode innerNextNode = nextNode; - while (innerNextNode != null) { - innerNextNode = svc.executeNode(innerNextNode, ctx); - } - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("For - done: no outcome " + (i + 1)); - } - } - } - } - } catch (BreakNodeException br) { - LOG.debug("ForNodeExecutor caught break"); - } - return (null); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/GetResourceNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/GetResourceNodeExecutor.java deleted file mode 100644 index d431a18af..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/GetResourceNodeExecutor.java +++ /dev/null @@ -1,134 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GetResourceNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(GetResourceNodeExecutor.class); - - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String plugin = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String resourceType = SvcLogicExpressionResolver.evaluate( - node.getAttribute("resource"), node, ctx); - String key = SvcLogicExpressionResolver.evaluateAsKey( - node.getAttribute("key"), node, ctx); - String pfx = SvcLogicExpressionResolver.evaluate( - node.getAttribute("pfx"), node, ctx); - - String localOnlyStr = SvcLogicExpressionResolver.evaluate( - node.getAttribute("local-only"), node, ctx); - - // Note: for get-resource, only refresh from A&AI if the DG explicitly set - // local-only to false. Otherwise, just read from local database. - boolean localOnly = true; - - if ("false".equalsIgnoreCase(localOnlyStr)) { - localOnly = false; - } - - SvcLogicExpression selectExpr = node.getAttribute("select"); - String select = null; - - if (selectExpr != null) { - select = SvcLogicExpressionResolver.evaluateAsKey(selectExpr, node, - ctx); - } - - SvcLogicExpression orderByExpr = node.getAttribute("order-by"); - String orderBy = null; - - if (orderByExpr != null) { - orderBy = SvcLogicExpressionResolver.evaluateAsKey(orderByExpr, node, - ctx); - } - - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug(node.getNodeType() - + " node encountered - looking for resource class " - + plugin); - } - - - SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); - - if (resourcePlugin != null) { - - try { - switch (resourcePlugin.query(resourceType, localOnly, select, key, - pfx, orderBy, ctx)) { - case SUCCESS: - outValue = "success"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } catch (SvcLogicException e) { - LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; - } - } else { - LOG.warn("Could not find SvcLogicResource object for plugin " - + plugin); - } - - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - - LOG.debug("no "+outValue+" or Other branch found"); - } - } - return (nextNode); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/IsAvailableNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/IsAvailableNodeExecutor.java deleted file mode 100644 index 0df73682c..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/IsAvailableNodeExecutor.java +++ /dev/null @@ -1,103 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class IsAvailableNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(IsAvailableNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String plugin = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String resourceType = SvcLogicExpressionResolver.evaluate( - node.getAttribute("resource"), node, ctx); - String key = SvcLogicExpressionResolver.evaluateAsKey( - node.getAttribute("key"), node, ctx); - String pfx = SvcLogicExpressionResolver.evaluate( - node.getAttribute("pfx"), node, ctx); - - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug("is-available node encountered - looking for resource class " - + plugin); - } - - SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); - - - if (resourcePlugin != null) { - try { - switch (resourcePlugin.isAvailable(resourceType, key, pfx, ctx)) { - case SUCCESS: - outValue = "true"; - break; - case NOT_FOUND: - outValue = "false"; - break; - case FAILURE: - default: - outValue = "false"; - } - } catch (SvcLogicException e) { - LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; - } - } else { - LOG.warn("Could not find SvcLogicResource object for plugin " - + plugin); - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - - LOG.debug("no "+outValue+" or Other branch found"); - } - } - return (nextNode); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/MdsalHelper.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/MdsalHelper.java deleted file mode 100644 index 4c5ee0686..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/MdsalHelper.java +++ /dev/null @@ -1,1186 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintStream; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; - -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddressBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefixBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address; -import org.opendaylight.yangtools.yang.binding.Identifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MdsalHelper { - - private static final Logger LOG = LoggerFactory.getLogger(MdsalHelper.class); - private static Properties yangMappingProperties = new Properties(); - - @Deprecated - public static void setProperties(Properties input) { - setYangMappingProperties(input); - } - - public static void setYangMappingProperties(Properties properties) { - for (Object propNameObj : properties.keySet()) { - String propName = (String) propNameObj; - MdsalHelper.yangMappingProperties.setProperty(propName, properties.getProperty(propName)); - } - } - - public static void loadProperties(String propertiesFile) { - File file = new File(propertiesFile); - Properties properties = new Properties(); - InputStream input = null; - if (file.isFile() && file.canRead()) { - try { - input = new FileInputStream(file); - properties.load(input); - MdsalHelper.setYangMappingProperties(properties); - LOG.info("Loaded properties from " + propertiesFile); - } catch (Exception e) { - LOG.error("Failed to load properties " + propertiesFile + "\n", e); - } finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - LOG.error("Failed to close properties file " + propertiesFile + "\n", e); - } - } - } - }else{ - LOG.error("Failed to load the properties file " + propertiesFile + "\n"); - LOG.error("Either isFile or canRead returned false for " + propertiesFile + "\n"); - } - } - - public static Properties toProperties(Properties props, Object fromObj) { - Class fromClass = null; - - if (fromObj != null) { - fromClass = fromObj.getClass(); - } - return (toProperties(props, "", fromObj, fromClass)); - } - - public static Properties toProperties(Properties props, String pfx, Object fromObj) { - Class fromClass = null; - - if (fromObj != null) { - fromClass = fromObj.getClass(); - } - - return (toProperties(props, pfx, fromObj, fromClass)); - } - - public static Properties toProperties(Properties props, String pfx, Object fromObj, Class fromClass) { - - if (fromObj == null) { - return (props); - } - - String simpleName = fromClass.getSimpleName(); - - LOG.trace("Extracting properties from " + fromClass.getName() + " class"); - if (fromObj instanceof List) { - - // Class is a List. List should contain yang-generated classes. - LOG.trace(fromClass.getName() + " is a List"); - - List fromList = (List) fromObj; - - for (int i = 0; i < fromList.size(); i++) { - toProperties(props, pfx + "[" + i + "]", fromList.get(i), fromClass); - } - props.setProperty(pfx + "_length", "" + fromList.size()); - - } else if (isYangGenerated(fromClass)) { - // Class is yang generated. - LOG.trace(fromClass.getName() + " is a Yang-generated class"); - - String propNamePfx = null; - - // If called from a list (so prefix ends in ']'), don't - // add class name again - if (pfx.endsWith("]")) { - propNamePfx = pfx; - } else { - if ((pfx != null) && (pfx.length() > 0)) { - propNamePfx = pfx; - } else { - propNamePfx = toLowerHyphen(fromClass.getSimpleName()); - } - - if (propNamePfx.endsWith("-builder")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-builder".length()); - } - - if (propNamePfx.endsWith("-impl")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-impl".length()); - } - } - - // Iterate through getter methods to figure out values we need to - // save from - - int numGetters = 0; - String lastGetterName = null; - String propVal = null; - - for (Method m : fromClass.getMethods()) { - if (isGetter(m)) { - - numGetters++; - lastGetterName = m.getName(); - - Class returnType = m.getReturnType(); - String fieldName; - if (m.getName().startsWith("get")) { - fieldName = toLowerHyphen(m.getName().substring(3)); - } else { - - fieldName = toLowerHyphen(m.getName().substring(2)); - } - - fieldName = fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1); - - // Is the return type a yang generated class? - if (isYangGenerated(returnType)) { - // Is it an enum? - if (returnType.isEnum()) { - // Return type is a typedef. Save its value. - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - - Object retValue = m.invoke(fromObj); - - if (!isAccessible) { - m.setAccessible(isAccessible); - } - if (retValue != null) { - String propName = propNamePfx + "." + fieldName; - propVal = retValue.toString(); - props.setProperty(propName, mapEnumeratedValue(fieldName, propVal)); - } - } catch (Exception e) { - LOG.error("Caught exception trying to convert Yang-generated enum returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - } else if (isIpv4Address(returnType)) { - // Save its value - try { - String propName = propNamePfx + "." + fieldName; - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - Ipv4Address retValue = (Ipv4Address) m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - - if (retValue != null) { - propVal = retValue.getValue().toString(); - LOG.debug("Setting property " + propName + " to " + propVal); - props.setProperty(propName, propVal); - - } - } catch (Exception e) { - LOG.error("Caught exception trying to convert value returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - } else if (isIpv6Address(returnType)) { - // Save its value - try { - String propName = propNamePfx + "." + fieldName; - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - Ipv6Address retValue = (Ipv6Address) m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - - if (retValue != null) { - propVal = retValue.getValue().toString(); - LOG.debug("Setting property " + propName + " to " + propVal); - props.setProperty(propName, propVal); - - } - } catch (Exception e) { - LOG.error("Caught exception trying to convert value returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - } else if (isIpAddress(returnType)) { - // Save its value - try { - String propName = propNamePfx + "." + fieldName; - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - IpAddress retValue = (IpAddress) m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - - if (retValue != null) { - propVal = new String(retValue.getValue()); - LOG.debug("Setting property " + propName + " to " + propVal); - props.setProperty(propName, propVal); - - } - } catch (Exception e) { - LOG.error("Caught exception trying to convert value returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - } else if (isIpPrefix(returnType)) { - // Save its value - try { - String propName = propNamePfx + "." + fieldName; - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - IpPrefix retValue = (IpPrefix) m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - - if (retValue != null) { - propVal = new String(retValue.getValue()); - LOG.debug("Setting property " + propName + " to " + propVal); - props.setProperty(propName, propVal); - - } - } catch (Exception e) { - LOG.error("Caught exception trying to convert value returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - } else { - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - Object retValue = m.invoke(fromObj); - - if (retValue instanceof byte[]) { - LOG.trace(m.getName() + " returns a byte[]"); - retValue = new String((byte[]) retValue, "UTF-8"); - LOG.trace("Converted byte array " + propNamePfx + "." + fieldName + "to string " + retValue); - } - if (!isAccessible) { - m.setAccessible(isAccessible); - } - if (retValue != null) { - toProperties(props, propNamePfx + "." + fieldName, retValue, returnType); - } - } catch (Exception e) { - - if (m.getName().equals("getKey")) { - LOG.trace("Caught " + e.getClass().getName() + " exception trying to convert results from getKey() - ignoring"); - } else { - LOG.error("Caught exception trying to convert Yang-generated class returned by" + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - } - } - } else if (returnType.equals(Class.class)) { - - LOG.trace(m.getName() + " returns a Class object - not interested"); - - } else if (List.class.isAssignableFrom(returnType)) { - - // This getter method returns a list. - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - Object retList = m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - // Figure out what type of elements are stored in - // this array. - Type paramType = m.getGenericReturnType(); - Type elementType = ((ParameterizedType) paramType).getActualTypeArguments()[0]; - toProperties(props, propNamePfx + "." + fieldName, retList, (Class) elementType); - } catch (Exception e) { - LOG.error("Caught exception trying to convert List returned by " + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - - } else { - - // Method returns something that is not a List and not - // yang-generated. - // Save its value - try { - String propName = propNamePfx + "." + fieldName; - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - Object propValObj = m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - - if (propValObj != null) { - if (propValObj instanceof byte[]) { - LOG.trace(m.getName() + " returns a byte[]"); - propVal = new String((byte[]) propValObj, "UTF-8"); - LOG.trace("Converted byte array " + propNamePfx + "." + fieldName + "to string " + propVal); - - } else { - propVal = propValObj.toString(); - } - LOG.debug("Setting property " + propName + " to " + propVal); - props.setProperty(propName, propVal); - - } - } catch (Exception e) { - if (m.getName().equals("getKey")) { - LOG.trace("Caught " + e.getClass().getName() + " exception trying to convert results from getKey() - ignoring"); - } else { - LOG.error("Caught exception trying to convert value returned by" + fromClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - } - } - - } - } - - // End of method loop. If there was only one getter, named - // "getValue", then - // set value identified by "prefix" to that one value. - if ((numGetters == 1) && ("getValue".equals(lastGetterName))) { - LOG.trace("getValueFIX : " + propNamePfx + " only has getValue() getter - setting " + propNamePfx + " = " + propVal); - props.setProperty(propNamePfx, propVal); - } else { - LOG.trace("getValueFIX : " + propNamePfx + " has " + numGetters + " getter(s), last one found was " + lastGetterName); - - } - - } else { - // Class is not yang generated and not a list - // It must be an element of a leaf list - set "prefix" to value - String fromVal = null; - if (fromObj instanceof byte[]) { - try { - fromVal = new String((byte[]) fromObj, "UTF-8"); - LOG.trace("Converted byte array " + pfx + "to string " + fromVal); - } catch (Exception e) { - LOG.warn("Caught exception trying to convert " + pfx + " from byte[] to String", e); - fromVal = fromObj.toString(); - } - - } else { - fromVal = fromObj.toString(); - } - LOG.debug("Setting property " + pfx + " to " + fromVal); - props.setProperty(pfx, fromVal); - } - - return (props); - } - - public static Object toBuilder(Properties props, Object toObj) { - - return (toBuilder(props, "", toObj)); - } - - public static List toList(Properties props, String pfx, List toObj, Class elemType) { - - int maxIdx = -1; - boolean foundValue = false; - - LOG.trace("Saving properties to List<" + elemType.getName() + "> from " + pfx); - - if (props.contains(pfx + "_length")) { - try { - int listLength = Integer.parseInt(props.getProperty(pfx + "_length")); - - if (listLength > 0) { - maxIdx = listLength - 1; - } - } catch (Exception e) { - // Ignore exception - } - } - - if (maxIdx == -1) { - // Figure out array size - for (Object pNameObj : props.keySet()) { - String key = (String) pNameObj; - - if (key.startsWith(pfx + "[")) { - String idxStr = key.substring(pfx.length() + 1); - int endloc = idxStr.indexOf("]"); - if (endloc != -1) { - idxStr = idxStr.substring(0, endloc); - } - - try { - int curIdx = Integer.parseInt(idxStr); - if (curIdx > maxIdx) { - maxIdx = curIdx; - } - } catch (Exception e) { - LOG.error("Illegal subscript in property " + key); - } - - } - } - } - - LOG.trace(pfx + " has max index of " + maxIdx); - for (int i = 0; i <= maxIdx; i++) { - - String curBase = pfx + "[" + i + "]"; - - if (isYangGenerated(elemType)) { - String builderName = elemType.getName() + "Builder"; - try { - Class builderClass = Class.forName(builderName); - Object builderObj = builderClass.newInstance(); - Method buildMethod = builderClass.getMethod("build"); - builderObj = toBuilder(props, curBase, builderObj, true); - if (builderObj != null) { - LOG.trace("Calling " + builderObj.getClass().getName() + "." + buildMethod.getName() + "()"); - Object builtObj = buildMethod.invoke(builderObj); - toObj.add(builtObj); - foundValue = true; - } - - } catch (ClassNotFoundException e) { - LOG.warn("Could not find builder class " + builderName, e); - } catch (Exception e) { - LOG.error("Caught exception trying to populate list from " + pfx); - } - } else { - // Must be a leaf list - String curValue = props.getProperty(curBase, ""); - - toObj.add(curValue); - - if ((curValue != null) && (curValue.length() > 0)) { - foundValue = true; - } - } - - } - - if (foundValue) { - return (toObj); - } else { - return (null); - } - - } - - public static Object toBuilder(Properties props, String pfx, Object toObj) { - return (toBuilder(props, pfx, toObj, false)); - } - - public static Object toBuilder(Properties props, String pfx, Object toObj, boolean preservePfx) { - Class toClass = toObj.getClass(); - boolean foundValue = false; - - LOG.trace("Saving properties to " + toClass.getName() + " class from " + pfx); - - Ipv4Address addr; - - if (isYangGenerated(toClass)) { - // Class is yang generated. - LOG.trace(toClass.getName() + " is a Yang-generated class"); - - String propNamePfx = null; - if (preservePfx) { - propNamePfx = pfx; - } else { - - if ((pfx != null) && (pfx.length() > 0)) { - propNamePfx = pfx + "." + toLowerHyphen(toClass.getSimpleName()); - } else { - propNamePfx = toLowerHyphen(toClass.getSimpleName()); - } - - if (propNamePfx.endsWith("-builder")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-builder".length()); - } - - if (propNamePfx.endsWith("-impl")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-impl".length()); - } - } - - if (toObj instanceof Identifier) { - LOG.trace(toClass.getName() + " is a Key - skipping"); - return (toObj); - } - - // Iterate through getter methods to figure out values we need to - // set - - for (Method m : toClass.getMethods()) { - if (isSetter(m)) { - Class paramTypes[] = m.getParameterTypes(); - Class paramClass = paramTypes[0]; - - String fieldName = toLowerHyphen(m.getName().substring(3)); - fieldName = fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1); - - String propName = propNamePfx + "." + fieldName; - - String paramValue = props.getProperty(propName); - if (paramValue == null) { - LOG.trace(propName + " is unset"); - } else { - LOG.trace(propName + " = " + paramValue); - } - - // Is the return type a yang generated class? - if (isYangGenerated(paramClass)) { - // Is it an enum? - if (paramClass.isEnum()) { - - LOG.trace(m.getName() + " expects an Enum"); - // Param type is a typedef. - if ((paramValue != null) && (paramValue.length() > 0)) { - Object paramObj = null; - - try { - paramObj = Enum.valueOf(paramClass, toJavaEnum(paramValue)); - } catch (Exception e) { - LOG.error("Caught exception trying to convert field " + propName + " to enum " + paramClass.getName(), e); - } - - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - - LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + paramValue + ")"); - m.invoke(toObj, paramObj); - - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error("Caught exception trying to create Yang-generated enum expected by" + toClass.getName() + "." + m.getName() + "() from Properties entry", e); - } - } - } else { - - String simpleName = paramClass.getSimpleName(); - - if ("Ipv4Address".equals(simpleName) || "Ipv6Address".equals(simpleName) || "IpAddress".equals(simpleName)) { - - if ((paramValue != null) && (paramValue.length() > 0)) { - try { - IpAddress ipAddr = IpAddressBuilder.getDefaultInstance(paramValue); - - if ("Ipv4Address".equals(simpleName)) { - m.invoke(toObj, ipAddr.getIpv4Address()); - } else if ("Ipv6Address".equals(simpleName)) { - m.invoke(toObj, ipAddr.getIpv6Address()); - - } else { - m.invoke(toObj, ipAddr); - } - foundValue = true; - } catch (Exception e) { - LOG.error("Caught exception calling " + toClass.getName() + "." + m.getName() + "(" + paramValue + ")", e); - - } - } else { - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + paramValue + ")"); - m.invoke(toObj, paramValue); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error("Caught exception trying to call " + toClass.getName() + "." + m.getName() + "() with Properties entry", e); - } - } - } else if ("IpPrefix".equals(simpleName)) { - if ((paramValue != null) && (paramValue.length() > 0)) { - try { - IpPrefix ipPrefix = IpPrefixBuilder.getDefaultInstance(paramValue); - m.invoke(toObj, ipPrefix); - foundValue = true; - } catch (Exception e) { - LOG.error("Caught exception calling " + toClass.getName() + "." + m.getName() + "(" + paramValue + ")", e); - } - } - } else { - // setter expects a yang-generated class. Need - // to - // create a builder to set it. - - String builderName = paramClass.getName() + "Builder"; - Class builderClass = null; - Object builderObj = null; - Object paramObj = null; - - Object constObj = null; - - LOG.trace(m.getName() + " expects a yang-generated class - looking for builder " + builderName); - try { - builderClass = Class.forName(builderName); - builderObj = builderClass.newInstance(); - paramObj = toBuilder(props, propNamePfx, builderObj); - } catch (ClassNotFoundException e) { - - if (paramValue == null) { - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(null)"); - m.invoke(toObj, new Object[] { null }); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e1) { - LOG.error("Caught exception trying to cally" + toClass.getName() + "." + m.getName() + "() with Properties entry", e1); - } - } else { - try { - // See if I can find a constructor I - // can - // use - Constructor[] constructors = paramClass.getConstructors(); - // Is there a String constructor? - for (Constructor c : constructors) { - Class[] cParms = c.getParameterTypes(); - if ((cParms != null) && (cParms.length == 1)) { - if (String.class.isAssignableFrom(cParms[0])) { - constObj = c.newInstance(paramValue); - } - } - } - - if (constObj == null) { - // Is there a Long constructor? - for (Constructor c : constructors) { - Class[] cParms = c.getParameterTypes(); - if ((cParms != null) && (cParms.length == 1)) { - if (Long.class.isAssignableFrom(cParms[0])) { - constObj = c.newInstance(Long.parseLong(paramValue)); - } - } - } - - } - - if (constObj == null) { - - // Last chance - see if - // parameter class has a static - // method - // getDefaultInstance(String) - try { - Method gm = paramClass.getMethod("getDefaultInstance", String.class); - - int gmodifier = gm.getModifiers(); - if (Modifier.isStatic(gmodifier)) { - // Invoke static - // getDefaultInstance(String) - paramObj = gm.invoke(null, paramValue); - } - - } catch (Exception gme) { - // Ignore exceptions - } - } - - } catch (Exception e1) { - LOG.warn("Could not find a suitable constructor for " + paramClass.getName(), e1); - } - - if (constObj == null) { - LOG.warn("Could not find builder class " + builderName + " and could not find a String or Long constructor or static getDefaultInstance(String) - trying just to set passing paramValue"); - - } - } - } catch (Exception e) { - LOG.error("Caught exception trying to create builder " + builderName, e); - } - - if (paramObj != null) { - - try { - - Method buildMethod = builderClass.getMethod("build"); - LOG.trace("Calling " + paramObj.getClass().getName() + "." + buildMethod.getName() + "()"); - Object builtObj = buildMethod.invoke(paramObj); - - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - - LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "()"); - m.invoke(toObj, builtObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error("Caught exception trying to set Yang-generated class expected by" + toClass.getName() + "." + m.getName() + "() from Properties entry", e); - } - } else { - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - - if (constObj != null) { - - LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + constObj.toString() + ")"); - m.invoke(toObj, constObj); - } else { - LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + paramValue + ")"); - m.invoke(toObj, paramValue); - - } - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error("Caught exception trying to convert value returned by" + toClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - } - } - } - } else { - - // Setter's argument is not a yang-generated class. See - // if it is a List. - - if (List.class.isAssignableFrom(paramClass)) { - - LOG.trace("Parameter class " + paramClass.getName() + " is a List"); - - // Figure out what type of args are in List and pass - // that to toList(). - - Type paramType = m.getGenericParameterTypes()[0]; - Type elementType = ((ParameterizedType) paramType).getActualTypeArguments()[0]; - Object paramObj = new LinkedList(); - try { - paramObj = toList(props, propName, (List) paramObj, (Class) elementType); - } catch (Exception e) { - LOG.error("Caught exception trying to create list expected as argument to " + toClass.getName() + "." + m.getName()); - } - - if (paramObj != null) { - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + paramValue + ")"); - m.invoke(toObj, paramObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error("Caught exception trying to convert List returned by" + toClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - } - } else { - - // Setter expects something that is not a List and - // not yang-generated. Just pass the parameter value - - LOG.trace("Parameter class " + paramClass.getName() + " is not a yang-generated class or a List"); - - if ((paramValue != null) && (paramValue.length() > 0)) { - - Object constObj = null; - - try { - // See if I can find a constructor I can use - Constructor[] constructors = paramClass.getConstructors(); - // Is there a String constructor? - for (Constructor c : constructors) { - Class[] cParms = c.getParameterTypes(); - if ((cParms != null) && (cParms.length == 1)) { - if (String.class.isAssignableFrom(cParms[0])) { - constObj = c.newInstance(paramValue); - } - } - } - - if (constObj == null) { - // Is there a Long constructor? - for (Constructor c : constructors) { - Class[] cParms = c.getParameterTypes(); - if ((cParms != null) && (cParms.length == 1)) { - if (Long.class.isAssignableFrom(cParms[0])) { - constObj = c.newInstance(Long.parseLong(paramValue)); - } - } - } - - } - - if (constObj != null) { - try { - LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + constObj + ")"); - m.invoke(toObj, constObj); - foundValue = true; - } catch (Exception e2) { - LOG.error("Caught exception trying to call " + m.getName(), e2); - } - } else { - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - LOG.trace("Calling " + toObj.getClass().getName() + "." + m.getName() + "(" + paramValue + ")"); - m.invoke(toObj, paramValue); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error("Caught exception trying to convert value returned by" + toClass.getName() + "." + m.getName() + "() to Properties entry", e); - } - } - } catch (Exception e1) { - LOG.warn("Could not find a suitable constructor for " + paramClass.getName(), e1); - } - - } - } - } - } // End of section handling "setter" method - } // End of loop through Methods - } // End of section handling yang-generated class - - if (foundValue) { - return (toObj); - } else { - return (null); - } - } - - public static void printPropertyList(PrintStream pstr, String pfx, Class toClass) { - boolean foundValue = false; - - LOG.trace("Analyzing " + toClass.getName() + " class : pfx " + pfx); - - if (isYangGenerated(toClass) && (!Identifier.class.isAssignableFrom(toClass))) { - // Class is yang generated. - LOG.trace(toClass.getName() + " is a Yang-generated class"); - - if (toClass.getName().endsWith("Key")) { - if (Identifier.class.isAssignableFrom(toClass)) { - LOG.trace(Identifier.class.getName() + " is assignable from " + toClass.getName()); - } else { - - LOG.trace(Identifier.class.getName() + " is NOT assignable from " + toClass.getName()); - } - } - - String propNamePfx = null; - if (pfx.endsWith("]")) { - propNamePfx = pfx; - } else { - - if ((pfx != null) && (pfx.length() > 0)) { - propNamePfx = pfx + "." + toLowerHyphen(toClass.getSimpleName()); - } else { - propNamePfx = toLowerHyphen(toClass.getSimpleName()); - } - - if (propNamePfx.endsWith("-builder")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-builder".length()); - } - - if (propNamePfx.endsWith("-impl")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - "-impl".length()); - } - } - - // Iterate through getter methods to figure out values we need to - // set - - for (Method m : toClass.getMethods()) { - LOG.trace("Is " + m.getName() + " method a getter?"); - if (isGetter(m)) { - LOG.trace(m.getName() + " is a getter"); - Class returnClass = m.getReturnType(); - - String fieldName = toLowerHyphen(m.getName().substring(3)); - fieldName = fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1); - - String propName = propNamePfx + "." + fieldName; - - // Is the return type a yang generated class? - if (isYangGenerated(returnClass)) { - // Is it an enum? - if (returnClass.isEnum()) { - - LOG.trace(m.getName() + " is an Enum"); - pstr.print("\n\n * " + propName); - - } else { - - String simpleName = returnClass.getSimpleName(); - - if ("Ipv4Address".equals(simpleName) || "Ipv6Address".equals(simpleName) || "IpAddress".equals(simpleName) || "IpPrefix".equals(simpleName)) { - LOG.trace(m.getName() + " is an " + simpleName); - pstr.print("\n\n * " + propName); - } else { - printPropertyList(pstr, propNamePfx, returnClass); - } - - } - } else { - - // Setter's argument is not a yang-generated class. See - // if it is a List. - - if (List.class.isAssignableFrom(returnClass)) { - - LOG.trace("Parameter class " + returnClass.getName() + " is a List"); - - // Figure out what type of args are in List and pass - // that to toList(). - - Type returnType = m.getGenericReturnType(); - Type elementType = ((ParameterizedType) returnType).getActualTypeArguments()[0]; - Class elementClass = (Class) elementType; - LOG.trace("Calling printPropertyList on list type (" + elementClass.getName() + "), pfx is (" + pfx + "), toClass is (" + toClass.getName() + ")"); - printPropertyList(pstr, propNamePfx + "." + toLowerHyphen(elementClass.getSimpleName()) + "[]", elementClass); - - } else if (!returnClass.equals(Class.class)) { - - // Setter expects something that is not a List and - // not yang-generated. Just pass the parameter value - - LOG.trace("Parameter class " + returnClass.getName() + " is not a yang-generated class or a List"); - - pstr.print("\n\n * " + propName); - - } - } - } // End of section handling "setter" method - } // End of loop through Methods - } // End of section handling yang-generated class - - } - - public static boolean isYangGenerated(Class c) { - if (c == null) { - return (false); - } else { - return (c.getName().startsWith("org.opendaylight.yang.gen.")); - } - } - - public static boolean isIpPrefix(Class c) { - - if (c == null) { - return (false); - } - String simpleName = c.getSimpleName(); - return ("IpPrefix".equals(simpleName)); - } - - public static boolean isIpv4Address(Class c) { - - if (c == null) { - return (false); - } - String simpleName = c.getSimpleName(); - return ("Ipv4Address".equals(simpleName)); - } - - public static boolean isIpv6Address(Class c) { - - if (c == null) { - return (false); - } - String simpleName = c.getSimpleName(); - return ("Ipv6Address".equals(simpleName)); - } - - public static boolean isIpAddress(Class c) { - - if (c == null) { - return (false); - } - String simpleName = c.getSimpleName(); - return ("IpAddress".equals(simpleName)); - } - - public static String toLowerHyphen(String inStr) { - if (inStr == null) { - return (null); - } - - String str = inStr.substring(0, 1).toLowerCase(); - if (inStr.length() > 1) { - str = str + inStr.substring(1); - } - - String regex = "(([a-z0-9])([A-Z]))"; - String replacement = "$2-$3"; - - String retval = str.replaceAll(regex, replacement).toLowerCase(); - - LOG.trace("Converting " + inStr + " => " + str + " => " + retval); - return (retval); - } - - //This is called when mapping the yang value back to a valid java enumeration - public static String toJavaEnum(String inStr) { - if (inStr == null) { - return (null); - } else if (inStr.length() == 0) { - return (inStr); - } - - //This will strip out all periods, which cannot be in a java enum - inStr = inStr.replaceAll("\\.", ""); - - String[] terms = inStr.split("-"); - StringBuffer sbuff = new StringBuffer(); - - //appends an _ if the string starts with a digit to make it a valid java enum - if (Character.isDigit(inStr.charAt(0))) { - sbuff.append('_'); - } - //If the string contains hyphens it will convert the string to upperCamelCase without hyphens - for (String term : terms) { - sbuff.append(term.substring(0, 1).toUpperCase()); - if (term.length() > 1) { - sbuff.append(term.substring(1)); - } - } - return (sbuff.toString()); - - } - - public static boolean isGetter(Method m) { - if (m == null) { - return (false); - } - - if (Modifier.isPublic(m.getModifiers()) && (m.getParameterTypes().length == 0)) { - if (m.getName().matches("^get[A-Z].*") && !m.getReturnType().equals(void.class)) { - if (!"getClass".equals(m.getName())) { - return (true); - } - } - - if (m.getName().matches("^get[A-Z].*") && m.getReturnType().equals(boolean.class)) { - return (true); - } - - if (m.getName().matches("^is[A-Z].*") && m.getReturnType().equals(Boolean.class)) { - return (true); - } - } - - return (false); - } - - public static boolean isSetter(Method m) { - if (m == null) { - return (false); - } - - if (Modifier.isPublic(m.getModifiers()) && (m.getParameterTypes().length == 1)) { - if (m.getName().matches("^set[A-Z].*")) { - Class[] paramTypes = m.getParameterTypes(); - if (paramTypes[0].isAssignableFrom(Identifier.class) || Identifier.class.isAssignableFrom(paramTypes[0])) { - return (false); - } else { - return (true); - } - } - - } - - return (false); - } - - public static String getFullPropertiesPath(String propertiesFileName) { - return "/opt/bvc/controller/configuration/" + propertiesFileName; - } - - //This is called when mapping a valid java enumeration back to the yang model value - public static String mapEnumeratedValue(String propertyName, String propertyValue) { - LOG.info("mapEnumeratedValue called with propertyName=" + propertyName + " and value=" + propertyValue); - String mappingKey = "yang." + propertyName + "." + propertyValue; - if (yangMappingProperties.containsKey(mappingKey)) { - return (yangMappingProperties.getProperty(mappingKey)); - } else { - LOG.info("yangMappingProperties did not contain the key " + mappingKey + " returning the original value."); - return propertyValue; - } - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/NotifyNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/NotifyNodeExecutor.java deleted file mode 100644 index 706014a32..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/NotifyNodeExecutor.java +++ /dev/null @@ -1,102 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class NotifyNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(NotifyNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String plugin = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String resourceType = SvcLogicExpressionResolver.evaluate( - node.getAttribute("resource"), node, ctx); - String action = SvcLogicExpressionResolver.evaluateAsKey( - node.getAttribute("action"), node, ctx); - String key = SvcLogicExpressionResolver.evaluateAsKey( - node.getAttribute("key"), node, ctx); - - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug("release node encountered - looking for resource class " - + plugin); - } - - SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); - if (resourcePlugin != null) { - - try { - - switch (resourcePlugin.notify(resourceType, action, key, ctx)) { - case SUCCESS: - outValue = "success"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } catch (SvcLogicException e) { - LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; - } - } else { - LOG.warn("Could not find SvcLogicResource object for plugin " - + plugin); - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("no "+outValue+" or Other branch found"); - } - } - return (nextNode); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/RecordNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/RecordNodeExecutor.java deleted file mode 100644 index 8ba14d276..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/RecordNodeExecutor.java +++ /dev/null @@ -1,119 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicRecorder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RecordNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(RecordNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String plugin = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String outValue = "failure"; - - if (LOG.isTraceEnabled()) { - LOG.trace(node.getNodeType() - + " node encountered - looking for recorder class " - + plugin); - } - - Map parmMap = new HashMap(); - - Set> parmSet = node - .getParameterSet(); - boolean hasParms = false; - - for (Iterator> iter = parmSet - .iterator(); iter.hasNext();) { - hasParms = true; - Map.Entry curEnt = iter.next(); - String curName = curEnt.getKey(); - SvcLogicExpression curExpr = curEnt.getValue(); - String curExprValue = SvcLogicExpressionResolver.evaluate(curExpr, - node, ctx); - - if (LOG.isTraceEnabled()) { - LOG.trace("executeRecordNode : parameter " + curName + " = " - + curExpr + " => " + curExprValue); - } - parmMap.put(curName, curExprValue); - } - - - SvcLogicRecorder recorder = getSvcLogicRecorder(plugin); - - if (recorder != null) { - - try { - recorder.record(parmMap); - } catch (SvcLogicException e) { - LOG.error("Caught exception from recorder plugin", e); - outValue = "failure"; - } - } else { - LOG.warn("Could not find SvcLogicRecorder object for plugin " - + plugin); - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isTraceEnabled()) { - LOG.trace("no failure or Other branch found"); - } - } - return (nextNode); - } - - - - - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReleaseNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReleaseNodeExecutor.java deleted file mode 100644 index 0d8416cdd..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReleaseNodeExecutor.java +++ /dev/null @@ -1,100 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ReleaseNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(ReleaseNodeExecutor.class); - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String plugin = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String resourceType = SvcLogicExpressionResolver.evaluate( - node.getAttribute("resource"), node, ctx); - String key = SvcLogicExpressionResolver.evaluateAsKey( - node.getAttribute("key"), node, ctx); - - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug("release node encountered - looking for resource class " - + plugin); - } - - SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); - if (resourcePlugin != null) { - - try { - - switch (resourcePlugin.release(resourceType, key, ctx)) { - case SUCCESS: - outValue = "success"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } catch (SvcLogicException e) { - LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; - } - } else { - LOG.warn("Could not find SvcLogicResource object for plugin " - + plugin); - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - - LOG.debug("no "+outValue+" or Other branch found"); - } - } - return (nextNode); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReserveNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReserveNodeExecutor.java deleted file mode 100644 index f0bbda88f..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReserveNodeExecutor.java +++ /dev/null @@ -1,114 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ReserveNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(ReserveNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String plugin = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String resourceType = SvcLogicExpressionResolver.evaluate( - node.getAttribute("resource"), node, ctx); - String key = SvcLogicExpressionResolver.evaluateAsKey( - node.getAttribute("key"), node, ctx); - String pfx = SvcLogicExpressionResolver.evaluate(node.getAttribute("pfx"),node,ctx); - - - SvcLogicExpression selectExpr = node.getAttribute("select"); - String select = null; - - if (selectExpr != null) - { - select = SvcLogicExpressionResolver.evaluateAsKey(selectExpr, node, ctx); - } - - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug("reserve node encountered - looking for resource class " - + plugin); - } - - - - SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); - - if (resourcePlugin != null) { - - try { - switch (resourcePlugin.reserve(resourceType, select, key, pfx, ctx)) { - case SUCCESS: - outValue = "success"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } catch (SvcLogicException e) { - LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; - } - } else { - LOG.warn("Could not find SvcLogicResource object for plugin " - + plugin); - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - - LOG.debug("no "+outValue+" or Other branch found"); - } - } - return (nextNode); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReturnNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReturnNodeExecutor.java deleted file mode 100644 index 5cca47128..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/ReturnNodeExecutor.java +++ /dev/null @@ -1,78 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ReturnNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(ReturnNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String status = SvcLogicExpressionResolver.evaluate( - node.getAttribute("status"), node, ctx); - - if (status != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("Returning status " + status); - } - ctx.setStatus(status); - } else { - if (LOG.isWarnEnabled()) { - LOG.warn("Return node has no status attribute set"); - } - } - - Set> parameterSet = node - .getParameterSet(); - - for (Iterator> iter = parameterSet - .iterator(); iter.hasNext();) { - Map.Entry curEnt = iter.next(); - String curName = curEnt.getKey(); - String curValue = SvcLogicExpressionResolver.evaluate( - curEnt.getValue(), node, ctx); - - if (LOG.isDebugEnabled()) { - LOG.debug("Setting context attribute " + curName + " to " - + curValue); - } - ctx.setAttribute(curName, curValue); - } - return null; - } - - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SaveNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SaveNodeExecutor.java deleted file mode 100644 index 57eac7f7b..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SaveNodeExecutor.java +++ /dev/null @@ -1,142 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SaveNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(SaveNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String plugin = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String resourceType = SvcLogicExpressionResolver.evaluate( - node.getAttribute("resource"), node, ctx); - String key = SvcLogicExpressionResolver.evaluateAsKey( - node.getAttribute("key"), node, ctx); - String forceStr = SvcLogicExpressionResolver.evaluate( - node.getAttribute("force"), node, ctx); - String localOnlyStr = SvcLogicExpressionResolver.evaluate( - node.getAttribute("local-only"), node, ctx); - String pfx = SvcLogicExpressionResolver.evaluate( - node.getAttribute("pfx"), node, ctx); - - boolean force = "true".equalsIgnoreCase(forceStr); - boolean localOnly = "true".equalsIgnoreCase(localOnlyStr); - - Map parmMap = new HashMap(); - - Set> parmSet = node - .getParameterSet(); - boolean hasParms = false; - - for (Iterator> iter = parmSet - .iterator(); iter.hasNext();) { - hasParms = true; - Map.Entry curEnt = iter.next(); - String curName = curEnt.getKey(); - SvcLogicExpression curExpr = curEnt.getValue(); - if (curExpr != null) { - String curExprValue = SvcLogicExpressionResolver.evaluate( - curExpr, node, ctx); - - LOG.debug("Parameter " + curName + " = " - + curExpr.asParsedExpr() + " resolves to " - + curExprValue); - - parmMap.put(curName, curExprValue); - } - } - - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug("save node encountered - looking for resource class " - + plugin); - } - - - - SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); - - if (resourcePlugin != null) { - - try { - switch (resourcePlugin.save(resourceType, force, localOnly, key, - parmMap, pfx, ctx)) { - case SUCCESS: - outValue = "success"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } catch (SvcLogicException e) { - LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; - } - } else { - LOG.warn("Could not find SvcLogicResource object for plugin " - + plugin); - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("no "+outValue+" or Other branch found"); - } - } - return (nextNode); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SetNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SetNodeExecutor.java deleted file mode 100644 index 013997eda..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SetNodeExecutor.java +++ /dev/null @@ -1,189 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.Map; -import java.util.Set; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicExpressionFactory; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SetNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(SetNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String ifunsetStr = SvcLogicExpressionResolver.evaluate( - node.getAttribute("only-if-unset"), node, ctx); - - boolean ifunset = "true".equalsIgnoreCase(ifunsetStr); - - Set> parameterSet = node - .getParameterSet(); - - for (Iterator> iter = parameterSet - .iterator(); iter.hasNext();) { - Map.Entry curEnt = iter.next(); - String curName = curEnt.getKey(); - String lhsVarName = curName; - - // Resolve LHS of assignment (could contain index variables) - try { - SvcLogicExpression lhsExpr = SvcLogicExpressionFactory.parse(curName); - lhsVarName = SvcLogicExpressionResolver.resolveVariableName(lhsExpr, node, ctx); - } catch (Exception e) { - LOG.warn("Caught exception trying to resolve variable name ("+curName+")", e); - } - - - boolean setValue = true; - - if (curName.endsWith(".")) { - - // Copy subtree - value should be a variable name - SvcLogicExpression curValue = curEnt.getValue(); - - if (curValue != null) { - String rhsRoot = curValue.toString(); - - if ((rhsRoot != null) && (rhsRoot.length() > 0)) { - if (rhsRoot.endsWith(".")) { - rhsRoot = rhsRoot - .substring(0, rhsRoot.length() - 1); - } - - - // SDNGC-2321 : rhsRoot is variable name, possibly with subscript(s) to be resolved - try { - SvcLogicExpression rhsExpr = SvcLogicExpressionFactory.parse(rhsRoot); - rhsRoot = SvcLogicExpressionResolver.resolveVariableName(rhsExpr, node, ctx); - } catch (Exception e) { - LOG.warn("Caught exception trying to resolve variable name ("+rhsRoot+")", e); - } - - // See if the parameters are reversed (copying service-data to input) .. this - // was done as a workaround to earlier issue - if (curName.endsWith("-input.") && rhsRoot.startsWith("service-data")) { - LOG.warn("Arguments appear to be reversed .. will copy input to service-data instead"); - lhsVarName = rhsRoot + "."; - rhsRoot = curName.substring(0, curName.length()-1); - } - - rhsRoot = rhsRoot + "."; - String lhsPrefix = lhsVarName; - - if (lhsPrefix.endsWith(".")) { - lhsPrefix = lhsPrefix.substring(0, - lhsPrefix.length()-1); - } - int lhsPfxLength = lhsPrefix.length(); - HashMap parmsToAdd = new HashMap(); - - for (String sourceVarName : ctx.getAttributeKeySet()) { - - if (sourceVarName.startsWith(rhsRoot)) { - - String targetVar = lhsPrefix - + "." - + sourceVarName - .substring(rhsRoot.length()); - - LOG.debug("Copying " + sourceVarName - + " value to " + targetVar); - - parmsToAdd.put(targetVar, - ctx.getAttribute(sourceVarName)); - } - } - - for (String newParmName : parmsToAdd.keySet()) { - ctx.setAttribute(newParmName, parmsToAdd.get(newParmName)); - } - - } else { - // If RHS is empty, unset attributes in LHS - String lhsPrefix = lhsVarName.substring(0, - lhsVarName.length() - 1); - int lhsPfxLength = lhsPrefix.length(); - - LinkedList parmsToRemove = new LinkedList (); - - for (String curCtxVarname : ctx.getAttributeKeySet()) { - - if (curCtxVarname.startsWith(lhsPrefix)) { - LOG.debug("Unsetting " + curCtxVarname); - parmsToRemove.add(curCtxVarname); - } - } - - for (String parmName : parmsToRemove) { - ctx.setAttribute(parmName, null); - } - - } - } - - } else { - - if (ifunset) { - String ctxValue = ctx.getAttribute(lhsVarName); - - if ((ctxValue != null) && (ctxValue.length() > 0)) { - setValue = false; - LOG.debug("Attribute " - + lhsVarName - + " already set and only-if-unset is true, so not overriding"); - } - } - - if (setValue) { - String curValue = SvcLogicExpressionResolver.evaluate( - curEnt.getValue(), node, ctx); - - if (LOG.isDebugEnabled()) { - LOG.trace("Parameter value " - + curEnt.getValue().asParsedExpr() - + " resolves to " + curValue); - LOG.debug("Setting context attribute " + lhsVarName - + " to " + curValue); - } - ctx.setAttribute(lhsVarName, curValue); - } - } - } - - return null; - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicActivator.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicActivator.java deleted file mode 100644 index ae42e2c7e..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicActivator.java +++ /dev/null @@ -1,225 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.io.File; -import java.io.FileInputStream; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.LinkedList; -import java.util.Map; -import java.util.Properties; - -import org.openecomp.sdnc.sli.ConfigurationException; -import org.openecomp.sdnc.sli.SvcLogicAdaptor; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicStore; -import org.openecomp.sdnc.sli.SvcLogicStoreFactory; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.framework.ServiceRegistration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.mysql.jdbc.Driver; - -public class SvcLogicActivator implements BundleActivator { - - private static final String SVCLOGIC_PROP_VAR = "SDNC_SLI_PROPERTIES"; - private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; - - private static final Map BUILTIN_NODES = new HashMap() { - { - put("block", new BlockNodeExecutor()); - put("call", new CallNodeExecutor()); - put("configure", new ConfigureNodeExecutor()); - put("delete", new DeleteNodeExecutor()); - put("execute", new ExecuteNodeExecutor()); - put("exists", new ExistsNodeExecutor()); - put("for", new ForNodeExecutor()); - put("get-resource", new GetResourceNodeExecutor()); - put("is-available", new IsAvailableNodeExecutor()); - put("notify", new NotifyNodeExecutor()); - put("record", new RecordNodeExecutor()); - put("release", new ReleaseNodeExecutor()); - put("reserve", new ReserveNodeExecutor()); - put("return", new ReturnNodeExecutor()); - put("save", new SaveNodeExecutor()); - put("set", new SetNodeExecutor()); - put("switch", new SwitchNodeExecutor()); - put("update", new UpdateNodeExecutor()); - put("break", new BreakNodeExecutor()); - - } - }; - - private static LinkedList registrations = new LinkedList(); - - private static HashMap adaptorMap = null; - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicActivator.class); - - private static Properties props = null; - - private static BundleContext bundleCtx = null; - - private static SvcLogicService svcLogicServiceImpl = null; - - @Override - public void start(BundleContext ctx) throws Exception { - - LOG.info("Activating SLI"); - - bundleCtx = ctx; - - // Read properties - props = new Properties(); - String propPath = System.getenv(SVCLOGIC_PROP_VAR); - - if (propPath == null) { - String propDir = System.getenv(SDNC_CONFIG_DIR); - if (propDir == null) { - - propDir = "/opt/sdnc/data/properties"; - } - propPath = propDir + "/svclogic.properties"; - LOG.warn("Environment variable "+SVCLOGIC_PROP_VAR+" unset - defaulting to "+propPath); - } - - File propFile = new File(propPath); - - if (!propFile.exists()) { - - throw new ConfigurationException( - "Missing configuration properties file : " - + propFile); - } - try { - - props.load(new FileInputStream(propFile)); - } catch (Exception e) { - throw new ConfigurationException( - "Could not load properties file " + propPath, e); - - } - - - if (registrations == null) { - - registrations = new LinkedList(); - } - - // Advertise SvcLogicService - svcLogicServiceImpl = new SvcLogicServiceImpl(); - - LOG.info("SLI: Registering service " + SvcLogicService.NAME - + " in bundle " + ctx.getBundle().getSymbolicName()); - ServiceRegistration reg = ctx.registerService(SvcLogicService.NAME, - svcLogicServiceImpl, null); - registrations.add(reg); - - // Initialize SvcLogicStore - try { - SvcLogicStore store = getStore(); - registerNodeTypes(store); - } catch (ConfigurationException e) { - LOG.warn("Could not initialize SvcLogicScore", e); - } - - LOG.info("SLI - done registering services"); - } - - @Override - public void stop(BundleContext ctx) throws Exception { - - if (registrations != null) { - for (ServiceRegistration reg : registrations) { - ServiceReference regRef = reg.getReference(); - /* Don't bother to remove node types from table - String nodeType = (String) regRef.getProperty("nodeType"); - if (nodeType != null) { - LOG.info("SLI - unregistering node type " + nodeType); - store.unregisterNodeType(nodeType); - } - */ - reg.unregister(); - } - registrations = null; - } - } - - public static SvcLogicStore getStore() throws SvcLogicException { - // Create and initialize SvcLogicStore object - used to access - // saved service logic. - - SvcLogicStore store = null; - - try { - Driver dvr = new Driver(); - store = SvcLogicStoreFactory.getSvcLogicStore(props); - } catch (Exception e) { - throw new ConfigurationException( - "Could not get service logic store", e); - - } - - try { - store.init(props); - } catch (Exception e) { - throw new ConfigurationException( - "Could not get service logic store", e); - } - - return(store); - } - - private static void registerNodeTypes(SvcLogicStore store) throws SvcLogicException { - - if (store == null) { - return; - } - // Advertise built-in node executors - LOG.info("SLI : Registering built-in node executors"); - Hashtable propTable = new Hashtable(); - - for (String nodeType : BUILTIN_NODES.keySet()) { - LOG.info("SLI - registering node type " + nodeType); - propTable.clear(); - propTable.put("nodeType", nodeType); - - ServiceRegistration reg = bundleCtx.registerService(SvcLogicNodeExecutor.class.getName(), - BUILTIN_NODES.get(nodeType), propTable); - registrations.add(reg); - - store.registerNodeType(nodeType); - - LOG.info("SLI - registering node executor"); - - ((SvcLogicServiceImpl)svcLogicServiceImpl).registerExecutor(nodeType, BUILTIN_NODES.get(nodeType)); - - } - - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicAdaptorFactory.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicAdaptorFactory.java deleted file mode 100644 index aa8c005a6..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicAdaptorFactory.java +++ /dev/null @@ -1,86 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.HashMap; - -import org.openecomp.sdnc.sli.SvcLogicAdaptor; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceReference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SvcLogicAdaptorFactory { - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicAdaptorFactory.class); - - private static HashMap adaptorMap = new HashMap(); - - public static void registerAdaptor(SvcLogicAdaptor adaptor) { - String name = adaptor.getClass().getName(); - LOG.info("Registering adaptor " + name); - adaptorMap.put(name, adaptor); - - } - - public static void unregisterAdaptor(String name) { - if (adaptorMap.containsKey(name)) { - LOG.info("Unregistering " + name); - adaptorMap.remove(name); - } - } - - public static SvcLogicAdaptor getInstance(String name) { - if (adaptorMap.containsKey(name)) { - return (adaptorMap.get(name)); - } else { - BundleContext bctx = null; - try - { - bctx = FrameworkUtil.getBundle(SvcLogicAdaptorFactory.class) - .getBundleContext(); - } - catch (Exception e) - { - LOG.debug("Caught exception trying to locate device adaptor "+name, e); - return(null); - } - - ServiceReference sref = bctx.getServiceReference(name); - - if (sref != null) { - SvcLogicAdaptor adaptor = (SvcLogicAdaptor) bctx - .getService(sref); - - if (adaptor != null) { - registerAdaptor(adaptor); - - return (adaptor); - } - return (null); - } - } - return(null); - } -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicExpressionResolver.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicExpressionResolver.java deleted file mode 100644 index 5c17c7997..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicExpressionResolver.java +++ /dev/null @@ -1,605 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.List; - -import org.apache.commons.lang.StringUtils; -import org.openecomp.sdnc.sli.SvcLogicAtom; -import org.openecomp.sdnc.sli.SvcLogicAtom.AtomType; -import org.openecomp.sdnc.sli.SvcLogicBinaryExpression; -import org.openecomp.sdnc.sli.SvcLogicBinaryExpression.OperatorType; -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicFunctionCall; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicVariableTerm; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SvcLogicExpressionResolver { - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicExpressionResolver.class); - - public static String evaluate(SvcLogicExpression expr, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - if (expr == null) { - return (null); - } - - - - if (expr instanceof SvcLogicAtom) { - SvcLogicAtom atom = (SvcLogicAtom) expr; - - AtomType atomType = atom.getAtomType(); - switch (atomType) { - case NUMBER: - case STRING: - return (atom.toString()); - case CONTEXT_VAR: - case IDENTIFIER: - - String varName = resolveVariableName(atom, node, ctx); - - if (atomType == AtomType.CONTEXT_VAR) - { - LOG.trace("Evaluating context variable $"+varName); - - String varValue = ctx.getAttribute(varName); - - if (varValue == null) { - LOG.trace("Context variable $"+varName+" unset - treating as empty string"); - varValue = ""; - } - - return (varValue); - } - SvcLogicExpression parm = node.getParameter(varName); - if (parm != null) { - LOG.trace("Evaluating value of parameter "+varName+": "+parm.asParsedExpr()); - - return (evaluate(parm, node, ctx)); - } - else - { - return(varName); - } - default: - return(null); - } - - } else if (expr instanceof SvcLogicBinaryExpression) { - SvcLogicBinaryExpression binExpr = (SvcLogicBinaryExpression) expr; - List operators = binExpr.getOperators(); - if (operators.isEmpty()) - { - List operands = binExpr.getOperands(); - if (operands.size() == 1) - { - LOG.trace("SvcLogicBinaryExpression as no operator and one operand - evaluating its operand"); - return(evaluate(operands.get(0), node, ctx)); - } - else - { - if (operands.isEmpty()) - { - LOG.error("SvcLogicBinaryExpression has no operators and no operands - evaluating value as null"); - } - else - { - LOG.error("SvcLogicBinaryExpression has no operators and "+operands.size()+" operands - evaluating value as null"); - } - return(null); - } - } - switch (operators.get(0)) { - case addOp: - case subOp: - case multOp: - case divOp: - return(evalArithExpression(binExpr, node, ctx)); - case equalOp: - case neOp: - case ltOp: - case leOp: - case gtOp: - case geOp: - return (evalCompareExpression(binExpr, node, ctx)); - case andOp: - case orOp: - return(evalLogicExpression(binExpr, node, ctx)); - - default: - return(null); - } - } - else if (expr instanceof SvcLogicFunctionCall) - { - return(evalFunctionCall((SvcLogicFunctionCall)expr, node, ctx)); - } - else - { - throw new SvcLogicException("Unrecognized expression type ["+expr+"]"); - } - } - - private static String evalArithExpression(SvcLogicBinaryExpression binExpr, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException { - List operands = binExpr.getOperands(); - List operators = binExpr.getOperators(); - if (operands.size() != (operators.size()+1)) - { - throw new SvcLogicException("Invalid expression ("+binExpr+")"); - } - String retval = evaluate(operands.get(0), node, ctx); - String retsval = retval; - long retlval = 0; - boolean valueIsLong = false; - - int i = 1; - try - { - - if ((retval.length() > 0) && StringUtils.isNumeric(retval)) - { - retlval = Long.parseLong(retval); - valueIsLong = true; - } - for (OperatorType operator: operators) - { - String curOperandValue = evaluate(operands.get(i++), node, ctx); - switch(operator) { - case addOp: - retsval = retsval + curOperandValue; - if (valueIsLong) - { - if ((curOperandValue.length() > 0) && StringUtils.isNumeric(curOperandValue) ) - { - retlval = retlval + Long.parseLong(curOperandValue); - } - else - { - valueIsLong = false; - } - } - break; - case subOp: - retlval = retlval - Long.parseLong(curOperandValue); - break; - case multOp: - retlval = retlval * Long.parseLong(curOperandValue); - break; - case divOp: - retlval = retlval / Long.parseLong(curOperandValue); - break; - } - - } - } - catch (NumberFormatException e1) - { - throw new SvcLogicException("Illegal value in arithmetic expression", e1); - } - - if (valueIsLong) - { - return("" + retlval); - } - else - { - return(retsval); - } - - } - - - - private static String evalCompareExpression(SvcLogicBinaryExpression expr, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException - { - - List operators = expr.getOperators(); - List operands = expr.getOperands(); - - if ((operators.size() != 1) || (operands.size() != 2)) - { - throw new SvcLogicException ("Invalid comparison expression : "+expr); - } - - OperatorType operator = operators.get(0); - String op1Value = evaluate(operands.get(0), node, ctx); - String op2Value = evaluate(operands.get(1), node, ctx); - - if ((StringUtils.isNotEmpty(op1Value) && StringUtils.isNumeric(op1Value) && StringUtils.isNotEmpty(op2Value) && StringUtils.isNumeric(op2Value))) - { - try - { - double op1dbl = Double.parseDouble(op1Value); - double op2dbl = Double.parseDouble(op2Value); - - switch(operator) - { - case equalOp: - return(Boolean.toString(op1dbl == op2dbl)); - case neOp: - return(Boolean.toString(op1dbl != op2dbl)); - case ltOp: - return(Boolean.toString(op1dbl < op2dbl)); - case leOp: - return(Boolean.toString(op1dbl <= op2dbl)); - case gtOp: - return(Boolean.toString(op1dbl > op2dbl)); - case geOp: - return(Boolean.toString(op1dbl >= op2dbl)); - default: - return(null); - } - } - catch (NumberFormatException e) - { - throw new SvcLogicException("Caught exception trying to compare numeric values", e); - } - } - else - { - - int compResult = 0; - - if (op1Value == null) { - compResult = -1; - } else if (op2Value == null ) { - compResult = 1; - } else { - compResult = op1Value.compareToIgnoreCase(op2Value); - } - - switch(operator) - { - case equalOp: - return(Boolean.toString(compResult == 0)); - case neOp: - return(Boolean.toString(compResult != 0)); - case ltOp: - return(Boolean.toString(compResult < 0)); - case leOp: - return(Boolean.toString(compResult <= 0)); - case gtOp: - return(Boolean.toString(compResult > 0)); - case geOp: - return(Boolean.toString(compResult >= 0)); - default: - return(null); - } - } - - } - - private static String evalLogicExpression(SvcLogicBinaryExpression expr, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException - { - boolean retval; - - List operands = expr.getOperands(); - List operators = expr.getOperators(); - - if (operands.size() != (operators.size()+1)) - { - throw new SvcLogicException("Invalid expression ("+expr+")"); - } - - try - { - retval = Boolean.parseBoolean(evaluate(operands.get(0), node, ctx)); - int i = 1; - for (OperatorType operator : operators) - { - if (operator == OperatorType.andOp) - { - retval = retval && Boolean.parseBoolean(evaluate(operands.get(i++), node, ctx)); - } - else - { - - retval = retval || Boolean.parseBoolean(evaluate(operands.get(i++), node, ctx)); - } - - } - } - catch (Exception e) - { - throw new SvcLogicException("Invalid expression ("+expr+")"); - } - - - return(Boolean.toString(retval)); - } - - private static String evalFunctionCall(SvcLogicFunctionCall func, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException - { - String funcName = func.getFunctionName(); - List operands = func.getOperands(); - - if ("length".equalsIgnoreCase(funcName)) - { - - if (operands.size() == 1) - { - String opValue = evaluate(operands.get(0), node, ctx); - return(""+opValue.length()); - } - else - { - throw new SvcLogicException("Invalid call to length() function"); - } - } - else if ("substr".equalsIgnoreCase(funcName)) - { - if (operands.size() == 3) - { - String op1Value = evaluate(operands.get(0), node, ctx); - String op2Value = evaluate(operands.get(1), node, ctx); - String op3Value = evaluate(operands.get(2), node, ctx); - - if (!StringUtils.isNumeric(op2Value) || !StringUtils.isNumeric(op3Value)) - { - throw new SvcLogicException("Invalid arguments to substr() function"); - } - - try - { - return(op1Value.substring(Integer.parseInt(op2Value), Integer.parseInt(op3Value))); - } - catch (Exception e) - { - throw new SvcLogicException("Caught exception trying to take substring", e); - } - } - else - { - - throw new SvcLogicException("Invalid call to substr() function"); - } - - } - else if ("toUpperCase".equalsIgnoreCase(funcName)) - { - if (operands.size() == 1) - { - String opValue = evaluate(operands.get(0), node, ctx); - if (opValue != null) { - return(opValue.toUpperCase()); - } else { - return(""); - } - } - else - { - throw new SvcLogicException("Invalid call to toUpperCase() function"); - } - } - else if ("toLowerCase".equalsIgnoreCase(funcName)) - { - if (operands.size() == 1) - { - String opValue = evaluate(operands.get(0), node, ctx); - if (opValue != null) { - return(opValue.toLowerCase()); - } else { - return(""); - } - } - else - { - throw new SvcLogicException("Invalid call to toLowerCase() function"); - } - } - else if ("convertBase".equalsIgnoreCase(funcName)) { - int fromBase = 10; - int toBase = 10; - String srcString = ""; - - if (operands.size() == 2) - { - fromBase = 10; - srcString = evaluate(operands.get(0), node, ctx); - toBase = Integer.parseInt(evaluate(operands.get(1), node, ctx)); - } else if (operands.size() == 3) { - - srcString = evaluate(operands.get(0), node, ctx); - fromBase = Integer.parseInt(evaluate(operands.get(1), node, ctx)); - toBase = Integer.parseInt(evaluate(operands.get(2), node, ctx)); - } else { - throw new SvcLogicException("Invalid call to convertBase() function"); - } - - long srcValue = Long.parseLong(srcString, fromBase); - return(Long.toString(srcValue, toBase)); - } - else - { - throw new SvcLogicException("Unrecognized function ("+funcName+")"); - } - - } - - public static String evaluateAsKey(SvcLogicExpression expr, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - if (expr == null) { - return (null); - } - - - - if (expr instanceof SvcLogicAtom) { - SvcLogicAtom atom = (SvcLogicAtom) expr; - - AtomType atomType = atom.getAtomType(); - StringBuffer varNameBuff = new StringBuffer(); - switch (atomType) { - case NUMBER: - return (atom.toString()); - case STRING: - return("'"+atom.toString()+"'"); - case CONTEXT_VAR: - case IDENTIFIER: - boolean needDot = false; - for (SvcLogicExpression term : atom.getOperands()) - { - if (needDot) - { - varNameBuff.append("."); - } - if (term instanceof SvcLogicVariableTerm) - { - SvcLogicVariableTerm vterm = (SvcLogicVariableTerm) term; - varNameBuff.append(vterm.getName()); - if (vterm.numOperands() > 0) - { - varNameBuff.append("["); - varNameBuff.append(evaluate(vterm.getSubscript(), node, ctx)); - varNameBuff.append("]"); - - } - } - else - { - varNameBuff.append(term.toString()); - } - needDot = true; - } - - String varName = varNameBuff.toString(); - LOG.debug("Evaluating context variable $"+varName); - String ctxValue = ctx.getAttribute(varName); - if (ctxValue == null) - { - return(null); - } - if (StringUtils.isNumeric(ctxValue)) - { - return(ctxValue); - } - else - { - return("'"+ctxValue+"'"); - } - - default: - return(null); - } - - } else if (expr instanceof SvcLogicBinaryExpression) { - SvcLogicBinaryExpression binExpr = (SvcLogicBinaryExpression) expr; - List operators = binExpr.getOperators(); - List operands = binExpr.getOperands(); - if (operators.isEmpty()) - { - if (operands.size() == 1) - { - LOG.debug("SvcLogicBinaryExpression as no operator and one operand - evaluating its operand"); - return(evaluateAsKey(operands.get(0), node, ctx)); - } - else - { - if (operands.isEmpty()) - { - LOG.error("SvcLogicBinaryExpression has no operators and no operands - evaluating value as null"); - } - else - { - LOG.error("SvcLogicBinaryExpression has no operators and "+operands.size()+" operands - evaluating value as null"); - } - return(null); - } - } - StringBuffer sbuff = new StringBuffer(); - sbuff.append(evaluateAsKey(operands.get(0), node, ctx)); - int i = 1; - for (OperatorType operator : operators) - { - sbuff.append(" "); - sbuff.append(operator.toString()); - sbuff.append(" "); - sbuff.append(evaluateAsKey(operands.get(i++), node,ctx)); - } - return(sbuff.toString()); - } - else if (expr instanceof SvcLogicFunctionCall) - { - StringBuffer sbuff = new StringBuffer(); - SvcLogicFunctionCall funcCall = (SvcLogicFunctionCall) expr; - sbuff.append(funcCall.getFunctionName()); - sbuff.append("("); - boolean needComma = false; - for (SvcLogicExpression operand : funcCall.getOperands()) - { - if (needComma) - { - sbuff.append(","); - } - else - { - needComma = true; - } - sbuff.append(evaluateAsKey(operand, node, ctx)); - } - sbuff.append(")"); - return(sbuff.toString()); - } - else - { - throw new SvcLogicException("Unrecognized expression type ["+expr+"]"); - } - } - - public static String resolveVariableName(SvcLogicExpression atom, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException - { - StringBuffer varNameBuff = new StringBuffer(); - - boolean needDot = false; - for (SvcLogicExpression term : atom.getOperands()) - { - if (needDot) - { - varNameBuff.append("."); - } - if (term instanceof SvcLogicVariableTerm) - { - SvcLogicVariableTerm vterm = (SvcLogicVariableTerm) term; - varNameBuff.append(vterm.getName()); - if (vterm.numOperands() > 0) - { - varNameBuff.append("["); - varNameBuff.append(evaluate(vterm.getSubscript(), node, ctx)); - varNameBuff.append("]"); - } - } - else - { - varNameBuff.append(term.toString()); - } - needDot = true; - } - return(varNameBuff.toString()); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicNodeExecutor.java deleted file mode 100644 index 0c8166ae1..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicNodeExecutor.java +++ /dev/null @@ -1,110 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicAdaptor; -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicRecorder; -import org.openecomp.sdnc.sli.SvcLogicResource; -import org.openecomp.sdnc.sli.SvcLogicStore; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceReference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class SvcLogicNodeExecutor { - - public abstract SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException; - - private static final Logger LOG = LoggerFactory.getLogger(SvcLogicNodeExecutor.class); - - protected String evaluateNodeTest(SvcLogicNode node, SvcLogicContext ctx) - throws SvcLogicException { - if (node == null) { - return null; - } - - return (SvcLogicExpressionResolver.evaluate(node.getAttribute("test"), - node, ctx)); - - } - - protected SvcLogicStore getStore() throws SvcLogicException { - return SvcLogicActivator.getStore(); - } - - protected SvcLogicAdaptor getAdaptor(String adaptorName) { - return SvcLogicAdaptorFactory.getInstance(adaptorName); - } - - protected SvcLogicResource getSvcLogicResource(String plugin) { - BundleContext bctx = FrameworkUtil.getBundle(this.getClass()) - .getBundleContext(); - - ServiceReference sref = bctx.getServiceReference(plugin); - if (sref != null) { - SvcLogicResource resourcePlugin = (SvcLogicResource) bctx - .getService(sref); - return resourcePlugin; - } - else { - LOG.warn("Could not find service reference object for plugin " + plugin); - return null; - } - } - - protected SvcLogicRecorder getSvcLogicRecorder(String plugin) { - BundleContext bctx = FrameworkUtil.getBundle(this.getClass()) - .getBundleContext(); - - ServiceReference sref = bctx.getServiceReference(plugin); - if (sref != null) { - SvcLogicRecorder resourcePlugin = (SvcLogicRecorder) bctx - .getService(sref); - return resourcePlugin; - } - else { - return null; - } - } - - protected SvcLogicJavaPlugin getSvcLogicJavaPlugin(String pluginName){ - BundleContext bctx = FrameworkUtil.getBundle(this.getClass()) - .getBundleContext(); - - ServiceReference sref = bctx.getServiceReference(pluginName); - - if (sref == null) { - LOG.warn("Could not find service reference object for plugin " + pluginName); - return null; - } else { - SvcLogicJavaPlugin plugin = (SvcLogicJavaPlugin) bctx - .getService(sref); - return plugin; - } - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicService.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicService.java deleted file mode 100644 index f30b3fc06..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicService.java +++ /dev/null @@ -1,76 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.Properties; - -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.openecomp.sdnc.sli.SvcLogicException; - -public interface SvcLogicService { - - public static final String NAME = "org.openecomp.sdnc.sli.provider.SvcLogicService"; - - // public SvcLogicContext execute(SvcLogicGraph graph, SvcLogicContext ctx) throws SvcLogicException; - /** - * Check for existence of a directed graph - * @param module - module name - * @param rpc - rpc name - * @param version - version. If null, looks for active version - * @param mode - mode (sync/async) - * @return true if directed graph found, false otherwise - * @throws SvcLogicException - */ - public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException; - - /** - * Execute a directed graph - * - * @param module - module name - * @param rpc - rpc name - * @param version - version. If null, use active version - * @param mode - mode (sync/async) - * @param parms - parameters, used to set SvcLogicContext attributes - * @return final values of attributes from SvcLogicContext, as Properties - * @throws SvcLogicException - * - * - * @deprecated use execute(String module, String rpc, String version, String mode, DOMDataBroker dataBroker) instead - */ - @Deprecated - public Properties execute(String module, String rpc, String version, String mode, Properties parms) throws SvcLogicException; - - /** - * Execute a directed graph - * - * @param module - module name - * @param rpc - rpc name - * @param version - version. If null, use active version - * @param mode - mode (sync/async) - * @param parms - parameters, used to set SvcLogicContext attributes - * @param domDataBroker - DOMDataBroker object - * @return final values of attributes from SvcLogicContext, as Properties - * @throws SvcLogicException - */ - public Properties execute(String module, String rpc, String version, String mode, Properties parms, DOMDataBroker domDataBroker) throws SvcLogicException; - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicServiceImpl.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicServiceImpl.java deleted file mode 100644 index ba929bae7..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SvcLogicServiceImpl.java +++ /dev/null @@ -1,273 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.HashMap; -import java.util.Properties; - -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.openecomp.sdnc.sli.MetricLogger; -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicGraph; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicStore; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceEvent; -import org.osgi.framework.ServiceListener; -import org.osgi.framework.ServiceReference; -import org.osgi.util.tracker.ServiceTracker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -public class SvcLogicServiceImpl implements SvcLogicService { - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicServiceImpl.class); - - private HashMap nodeExecutors = null; - - private BundleContext bctx = null; - - private void registerExecutors() { - - LOG.info("Entered register executors"); - if (bctx == null) { - bctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); - } - - if (nodeExecutors == null) { - nodeExecutors = new HashMap(); - } - - LOG.info("Opening service tracker"); - ServiceTracker tracker = new ServiceTracker(bctx, - SvcLogicNodeExecutor.class.getName(), null); - - tracker.open(); - - ServiceListener listener = new ServiceListener() { - - public void serviceChanged(ServiceEvent ev) { - ServiceReference sr = ev.getServiceReference(); - switch (ev.getType()) { - case ServiceEvent.REGISTERED: { - registerExecutor(sr); - } - break; - case ServiceEvent.UNREGISTERING: { - unregisterExecutor(sr); - } - break; - } - } - }; - - LOG.info("Adding service listener"); - String filter = "(objectclass=" + SvcLogicNodeExecutor.class.getName() - + ")"; - try { - bctx.addServiceListener(listener, filter); - ServiceReference[] srl = bctx.getServiceReferences( - SvcLogicNodeExecutor.class.getName(), null); - for (int i = 0; srl != null && i < srl.length; i++) { - listener.serviceChanged(new ServiceEvent( - ServiceEvent.REGISTERED, srl[i])); - } - } catch (InvalidSyntaxException e) { - e.printStackTrace(); - } - LOG.info("Done registerExecutors"); - } - - public void registerExecutor(ServiceReference sr) { - - String nodeName = (String) sr.getProperty("nodeType"); - if (nodeName != null) { - - SvcLogicNodeExecutor executor = null; - - try { - executor = (SvcLogicNodeExecutor) bctx.getService(sr); - } catch (Exception e) { - LOG.error("Cannot get service executor for " + nodeName); - return; - } - - registerExecutor(nodeName, executor); - - } - } - - public void registerExecutor(String nodeName, SvcLogicNodeExecutor executor) - { - if (nodeExecutors == null) { - nodeExecutors = new HashMap(); - } - LOG.info("SLI - registering executor for node type "+nodeName); - nodeExecutors.put(nodeName, executor); - } - - public void unregisterExecutor(ServiceReference sr) { - String nodeName = (String) sr.getProperty("nodeType"); - - if (nodeName != null) { - - unregisterExecutor(nodeName); - - } - - } - - public void unregisterExecutor(String nodeName) - { - - LOG.info("SLI - unregistering executor for node type "+nodeName); - nodeExecutors.remove(nodeName); - } - - - - - public SvcLogicContext execute(SvcLogicGraph graph, SvcLogicContext ctx) - throws SvcLogicException { - - if (nodeExecutors == null) { - registerExecutors(); - } - - // Set service name in MDC to reference current working directed graph - MDC.put(MetricLogger.SERVICE_NAME, graph.getModule()+":"+graph.getRpc()+"/v"+graph.getVersion()); - - SvcLogicNode curNode = graph.getRootNode(); - LOG.info("About to execute graph " + graph.toString()); - - - - while (curNode != null) { - LOG.info("About to execute node # "+curNode.getNodeId()+" ("+curNode.getNodeType()+")"); - - SvcLogicNode nextNode = executeNode(curNode, ctx); - curNode = nextNode; - } - - return (ctx); - } - - - public SvcLogicNode executeNode(SvcLogicNode node, SvcLogicContext ctx) - throws SvcLogicException { - if (node == null) { - return (null); - } - - if (LOG.isDebugEnabled()) { - LOG.debug("Executing node " + node.getNodeId()); - } - - SvcLogicNodeExecutor executor = nodeExecutors.get(node.getNodeType()); - - if (executor != null) { - LOG.debug("Executing node executor for node type "+node.getNodeType()+" - "+executor.getClass().getName()); - return (executor.execute(this, node, ctx)); - } else { - if (LOG.isDebugEnabled()) { - LOG.debug(node.getNodeType() + " node not implemented"); - } - SvcLogicNode nextNode = node.getOutcomeValue("failure"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute failure branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("no failure or Other branch found"); - } - } - return (nextNode); - } - - } - - @Override - public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException - { - SvcLogicStore store = SvcLogicActivator.getStore(); - - return (store.hasGraph(module, rpc, version, mode)); - } - - @Override - public Properties execute(String module, String rpc, String version, String mode, Properties props) - throws SvcLogicException { - return(execute(module, rpc, version, mode, props, null)); - } - - - @Override - public Properties execute(String module, String rpc, String version, String mode, - Properties props, DOMDataBroker domDataBroker) throws SvcLogicException { - - - // See if there is a service logic defined - // - SvcLogicStore store = SvcLogicActivator.getStore(); - - LOG.info("Fetching service logic from data store"); - SvcLogicGraph graph = store.fetch(module, rpc, version, mode); - - - - if (graph == null) - { - Properties retProps = new Properties(); - retProps.setProperty("error-code", "401"); - retProps.setProperty("error-message", "No service logic found for ["+module+","+rpc+","+version+","+mode+"]"); - return(retProps); - - } - - SvcLogicContext ctx = new SvcLogicContext(props); - ctx.setAttribute("currentGraph", graph.toString()); - ctx.setAttribute("X-ECOMP-RequestID", MDC.get("X-ECOMP-RequestID")); - ctx.setDomDataBroker(domDataBroker); - - execute(graph, ctx); - - return(ctx.toProperties()); - } - - - - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SwitchNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SwitchNodeExecutor.java deleted file mode 100644 index e8ae7c89d..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/SwitchNodeExecutor.java +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SwitchNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(SwitchNodeExecutor.class); - - @Override - - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - - String testResult = evaluateNodeTest(node, ctx); - - if (LOG.isDebugEnabled()) { - LOG.debug("Executing switch node"); - - - LOG.debug("test expression (" + node.getAttribute("test") - + ") evaluates to " + testResult); - } - - SvcLogicNode nextNode = node.getOutcomeValue(testResult); - - if (LOG.isDebugEnabled()) { - if (nextNode != null) { - LOG.debug("Next node to execute is node " + nextNode.getNodeId()); - } else { - LOG.debug("No next node found"); - } - } - return (nextNode); - - } -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/UpdateNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/UpdateNodeExecutor.java deleted file mode 100644 index 9eeab65a3..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/UpdateNodeExecutor.java +++ /dev/null @@ -1,136 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class UpdateNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory - .getLogger(UpdateNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - - String plugin = SvcLogicExpressionResolver.evaluate( - node.getAttribute("plugin"), node, ctx); - String resourceType = SvcLogicExpressionResolver.evaluate( - node.getAttribute("resource"), node, ctx); - String key = SvcLogicExpressionResolver.evaluateAsKey( - node.getAttribute("key"), node, ctx); - String pfx = SvcLogicExpressionResolver.evaluate( - node.getAttribute("pfx"), node, ctx); - - - Map parmMap = new HashMap(); - - Set> parmSet = node - .getParameterSet(); - boolean hasParms = false; - - for (Iterator> iter = parmSet - .iterator(); iter.hasNext();) { - hasParms = true; - Map.Entry curEnt = iter.next(); - String curName = curEnt.getKey(); - SvcLogicExpression curExpr = curEnt.getValue(); - if (curExpr != null) { - String curExprValue = SvcLogicExpressionResolver.evaluate( - curExpr, node, ctx); - - LOG.debug("Parameter " + curName + " = " - + curExpr.asParsedExpr() + " resolves to " - + curExprValue); - - parmMap.put(curName, curExprValue); - } - } - - String outValue = "failure"; - - if (LOG.isDebugEnabled()) { - LOG.debug("save node encountered - looking for resource class " - + plugin); - } - - - SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); - - - if (resourcePlugin != null) { - - try { - switch (resourcePlugin.update(resourceType, key, - parmMap, pfx, ctx)) { - case SUCCESS: - outValue = "success"; - break; - case NOT_FOUND: - outValue = "not-found"; - break; - case FAILURE: - default: - outValue = "failure"; - } - } catch (SvcLogicException e) { - LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; - } - } else { - LOG.warn("Could not find SvcLogicResource object for plugin " - + plugin); - } - - SvcLogicNode nextNode = node.getOutcomeValue(outValue); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute " + outValue + " branch"); - } - return (nextNode); - } - - nextNode = node.getOutcomeValue("Other"); - if (nextNode != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("about to execute Other branch"); - } - } else { - if (LOG.isDebugEnabled()) { - LOG.debug("no "+outValue+" or Other branch found"); - } - } - return (nextNode); - } - -} diff --git a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/WhileNodeExecutor.java b/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/WhileNodeExecutor.java deleted file mode 100644 index 5bbab323b..000000000 --- a/sli/provider/src/main/java/org/openecomp/sdnc/sli/provider/WhileNodeExecutor.java +++ /dev/null @@ -1,75 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.BreakNodeException; -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class WhileNodeExecutor extends SvcLogicNodeExecutor { - - private static final Logger LOG = LoggerFactory.getLogger(WhileNodeExecutor.class); - - @Override - public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException { - - String testResult = evaluateNodeTest(node, ctx); - SvcLogicExpression silentFailureExpr = node.getAttribute("do"); - String doWhile = SvcLogicExpressionResolver.evaluate(silentFailureExpr, node, ctx); - if ("true".equals(doWhile)) { - LOG.debug("While loop will execute once regardless of expression because do is set to true"); - } - - try { - while ("true".equals(testResult) || "true".equals(doWhile)) { - if (!"true".equals(doWhile)) { - LOG.debug("Test expression (" + node.getAttribute("test") + ") evaluates to true, executing loop."); - } - int numOutcomes = node.getNumOutcomes() + 1; - for (int i = 0; i < numOutcomes; i++) { - SvcLogicNode nextNode = node.getOutcomeValue("" + (i + 1)); - if (nextNode != null) { - while (nextNode != null) { - nextNode = svc.executeNode(nextNode, ctx); - } - } else { - if ("true".equals(doWhile)) { - LOG.debug("Do executed, will only execute again if test expression is true."); - doWhile = "false"; - } - testResult = evaluateNodeTest(node, ctx); - LOG.debug("test expression (" + node.getAttribute("test") + ") evaluates to " + testResult); - } - } - } - LOG.debug("testResult was " + testResult + " which is not equal to true, exiting while loop."); - } catch (BreakNodeException e) { - LOG.debug("WhileNodeExecutor caught break"); - } - return (null); - } - -} diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/BadPlugin.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/BadPlugin.java new file mode 100644 index 000000000..87273d0b1 --- /dev/null +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/BadPlugin.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.Map; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; + + +public class BadPlugin implements SvcLogicJavaPlugin { + public String selectLunch(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + String day = parameters.get("day"); + if (day == null || day.length() < 1) { + throw new SvcLogicException("What day is it?"); + } + switch (day) { + case ("monday"): { + return "pizza"; + } + case ("tuesday"): { + return "soup"; + } + case ("wednesday"): { + return "salad"; + } + case ("thursday"): { + return "sushi"; + } + case ("friday"): { + return "bbq"; + } + } + throw new SvcLogicException("Lunch cannot be served"); + } +} diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutorTest.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutorTest.java new file mode 100644 index 000000000..4c16222b2 --- /dev/null +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutorTest.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.Map.Entry; + +import org.onap.ccsdk.sli.core.sli.DuplicateValueException; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicGraph; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.provider.ExecuteNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.SvcLogicServiceImpl; + +import junit.framework.TestCase; + +public class ExecuteNodeExecutorTest extends TestCase { + public class MockExecuteNodeExecutor extends ExecuteNodeExecutor { + + protected SvcLogicJavaPlugin getSvcLogicJavaPlugin(String pluginName) { + return (SvcLogicJavaPlugin) new LunchSelectorPlugin(); + } + + protected String evaluate(SvcLogicExpression expr, SvcLogicNode node, + SvcLogicContext ctx) throws SvcLogicException { + return "selectLunch"; + } + } + + public void testBadPlugin() throws DuplicateValueException, SvcLogicException { + LunchSelectorPlugin p = new LunchSelectorPlugin(); + MockExecuteNodeExecutor execute = new MockExecuteNodeExecutor(); + SvcLogicNode node = new SvcLogicNode(0, "", "", new SvcLogicGraph()); + node.setAttribute("method", "selectLunch"); + execute.execute(new SvcLogicServiceImpl(), new SvcLogicNode(0, "", "", new SvcLogicGraph()), new SvcLogicContext()); + } + +} diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/LunchSelectorPlugin.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/LunchSelectorPlugin.java new file mode 100644 index 000000000..4d6b0b4dd --- /dev/null +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/LunchSelectorPlugin.java @@ -0,0 +1,77 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.Map; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; + + + +public class LunchSelectorPlugin implements SvcLogicJavaPlugin { + public class UnknownLunchDayException extends Exception{ + + public UnknownLunchDayException(String string) { + super(string); + } + + } + class Sandwhich { + String meat; + String cheese; + + public Sandwhich(String meat, String cheese) { + this.meat = meat; + this.cheese = cheese; + } + } + + public String selectLunch(Map parameters, SvcLogicContext ctx) throws Exception { + String day = parameters.get("day"); + if (day == null || day.length() < 1) { + throw new UnknownLunchDayException("What day is it?"); + } + switch (day) { + case ("monday"): { + return "pizza"; + } + case ("tuesday"): { + return "soup"; + } + case ("wednesday"): { + return "salad"; + } + case ("thursday"): { + return "sushi"; + } + case ("friday"): { + return "bbq"; + } + } + throw new SvcLogicException("Lunch cannot be served"); + } + + public Sandwhich makeLunch(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + return new Sandwhich("ham", "american"); + } +} diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelperTest.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelperTest.java new file mode 100644 index 000000000..8057dbd12 --- /dev/null +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelperTest.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import junit.framework.TestCase; + +public class MdsalHelperTest extends TestCase { + + public static final String pathToSdnPropertiesFile = "./src/test/resources/l3sdn.properties"; + + public void testSdnProperties() { + MdsalHelperTesterUtil.loadProperties(pathToSdnPropertiesFile); + assertEquals("synccomplete", MdsalHelperTesterUtil.mapEnumeratedValue("request-status", "Synccomplete")); + assertEquals("asynccomplete", MdsalHelperTesterUtil.mapEnumeratedValue("request-status", "asynccomplete")); + assertEquals("notifycomplete", MdsalHelperTesterUtil.mapEnumeratedValue("request-status", "notifycomplete")); + assertEquals("service-configuration-operation", MdsalHelperTesterUtil.mapEnumeratedValue("rpc-name", + "ServiceConfigurationOperation")); + } + + public void testNegativeSdnProperties() { + assertNotSame("synccomplete", MdsalHelperTesterUtil.mapEnumeratedValue("request-status", "Synccomplete")); + } + +} diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelperTesterUtil.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelperTesterUtil.java new file mode 100644 index 000000000..75517a1e6 --- /dev/null +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/MdsalHelperTesterUtil.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import org.onap.ccsdk.sli.core.sli.provider.MdsalHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MdsalHelperTesterUtil extends MdsalHelper { + + private static final Logger LOG = LoggerFactory.getLogger(MdsalHelperTesterUtil.class); + + //Normally static init of classes goes here for some weird classloader thing + static { + String str = "Hello World!"; + } + +} diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/PluginTest.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/PluginTest.java new file mode 100644 index 000000000..08ab5eebf --- /dev/null +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/PluginTest.java @@ -0,0 +1,107 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicGraph; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.provider.ExecuteNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.SvcLogicExpressionResolver; + +import junit.framework.TestCase; + +public class PluginTest extends TestCase { + + // The existing plugins work just like a VoidDummyPlugin + // They will return null simply because they are all void + // The attribute emitsOutcome will not be present, the expected outcome is success when no exception is thrown by the plugin + public void testOldPlugin() throws Exception { + ExecuteNodeExecutor executor = new ExecuteNodeExecutor(); + SvcLogicJavaPlugin plugin = new VoidDummyPlugin(); + + Class pluginClass = plugin.getClass(); + Method pluginMethod = pluginClass.getMethod("dummy", Map.class, SvcLogicContext.class); + Map parmMap = new HashMap(); + SvcLogicContext ctx = new SvcLogicContext(); + Object o = pluginMethod.invoke(plugin, parmMap, ctx); + + SvcLogicGraph graph = new SvcLogicGraph(); + SvcLogicNode node = new SvcLogicNode(1, "return", graph); + String emitsOutcome = SvcLogicExpressionResolver.evaluate(node.getAttribute("emitsOutcome"), node, ctx); + String outValue = executor.mapOutcome(o, emitsOutcome); + assertEquals("success",outValue); + } + + //Newer plugins can set the attribute emitsOutcome to true, if so they should return a string + //The string represents the outcome value + public void testNewPlugin() throws Exception { + ExecuteNodeExecutor executor = new ExecuteNodeExecutor(); + SvcLogicJavaPlugin plugin = new LunchSelectorPlugin(); + + Class pluginClass = plugin.getClass(); + Method pluginMethod = pluginClass.getMethod("selectLunch", Map.class, SvcLogicContext.class); + + Map parmMap = new HashMap(); + SvcLogicContext ctx = new SvcLogicContext(); + + parmMap.put("day", "monday"); + Object o = pluginMethod.invoke(plugin, parmMap, ctx); + SvcLogicGraph graph = new SvcLogicGraph(); + SvcLogicNode node = new SvcLogicNode(1, "return", graph); + node.setAttribute("emitsOutcome", "true"); + String emitsOutcome = SvcLogicExpressionResolver.evaluate(node.getAttribute("emitsOutcome"), node, ctx); + String outValue = executor.mapOutcome(o, emitsOutcome); + assertEquals("pizza", outValue); + + parmMap.put("day", "tuesday"); + outValue = (String) pluginMethod.invoke(plugin, parmMap, ctx); + o = pluginMethod.invoke(plugin, parmMap, ctx); + outValue = executor.mapOutcome(o, emitsOutcome); + assertEquals("soup",outValue); + + } + + //APPC had some legacy plugins returning objects which should not be treated as outcomes + //The attribute emitsOutcome will not be set + //The outcome should be success as it has always been + public void testObjPlugin() throws Exception{ + ExecuteNodeExecutor executor = new ExecuteNodeExecutor(); + SvcLogicJavaPlugin plugin = new LunchSelectorPlugin(); + + Class pluginClass = plugin.getClass(); + Method pluginMethod = pluginClass.getMethod("makeLunch", Map.class, SvcLogicContext.class); + + Map parmMap = new HashMap(); + SvcLogicContext ctx = new SvcLogicContext(); + Object o = pluginMethod.invoke(plugin, parmMap, ctx); + SvcLogicGraph graph = new SvcLogicGraph(); + SvcLogicNode node = new SvcLogicNode(1, "return", graph); + String emitsOutcome = SvcLogicExpressionResolver.evaluate(node.getAttribute("emitsOutcome"), node, ctx); + String outValue = executor.mapOutcome(o, emitsOutcome); + assertEquals("success",outValue); + } + +} diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicExpressionResolverTest.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicExpressionResolverTest.java new file mode 100644 index 000000000..1705e7902 --- /dev/null +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicExpressionResolverTest.java @@ -0,0 +1,122 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicExprListener; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; +import org.onap.ccsdk.sli.core.sli.SvcLogicExpressionFactory; +import org.onap.ccsdk.sli.core.sli.SvcLogicGraph; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.provider.SvcLogicExpressionResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class SvcLogicExpressionResolverTest extends TestCase { + + + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicExpressionResolver.class); + + public void testEvaluate() + { + InputStream testStr = getClass().getResourceAsStream("/expression.tests"); + BufferedReader testsReader = new BufferedReader(new InputStreamReader(testStr)); + + try + { + SvcLogicContext ctx = new SvcLogicContext(); + SvcLogicGraph graph = new SvcLogicGraph(); + SvcLogicNode node = new SvcLogicNode(1, "return", graph); + graph.setRootNode(node); + + String line = null; + int lineNo = 0; + while ((line = testsReader.readLine()) != null) { + ++lineNo; + if (line.startsWith("#")) + { + String testExpr = line.trim().substring(1).trim(); + String[] nameValue = testExpr.split("="); + String name = nameValue[0].trim(); + String value = nameValue[1].trim(); + + if (name.startsWith("$")) + { + LOG.info("Setting context attribute "+name+" = "+value); + ctx.setAttribute(name.substring(1), value); + } + else + { + + LOG.info("Setting node attribute "+name+" = "+value); + node.setAttribute(name, value); + + } + } + else + { + // if the line contains #, what comes before is the expression to evaluate, and what comes after + // is the expected value + String[] substrings = line.split("#"); + String expectedValue = substrings.length > 1 ? substrings[1].trim() : null; + String testExpr = substrings[0].trim(); + + LOG.info("Parsing expression "+testExpr); + SvcLogicExpression expr = SvcLogicExpressionFactory.parse(testExpr); + if (expr == null) + { + fail("Unable to parse expression "+testExpr); + } + else + { + LOG.info("Evaluating parsed expression "+expr.asParsedExpr()); + String exprValue = SvcLogicExpressionResolver.evaluate(expr, node, ctx); + if (exprValue == null) + { + fail("Unable to evaluate expression "+testExpr); + } + else + { + LOG.info("Expression " + testExpr + " evaluates to " + exprValue); + if (expectedValue != null) { + Assert.assertEquals("Line " + lineNo + ": " + testExpr, expectedValue, exprValue); + } + } + } + } + } + } + catch (Exception e) + { + LOG.error("Caught exception", e); + fail("Caught exception"); + } + } + +} diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicGraphExecutorTest.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicGraphExecutorTest.java new file mode 100644 index 000000000..b54f28460 --- /dev/null +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicGraphExecutorTest.java @@ -0,0 +1,211 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Properties; + +import org.onap.ccsdk.sli.core.sli.MetricLogger; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicGraph; +import org.onap.ccsdk.sli.core.sli.SvcLogicNode; +import org.onap.ccsdk.sli.core.sli.SvcLogicParser; +import org.onap.ccsdk.sli.core.sli.SvcLogicStore; +import org.onap.ccsdk.sli.core.sli.SvcLogicStoreFactory; +import org.onap.ccsdk.sli.core.sli.provider.BlockNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.CallNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.ConfigureNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.DeleteNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.ExecuteNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.ExistsNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.ForNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.GetResourceNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.IsAvailableNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.NotifyNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.RecordNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.ReleaseNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.ReserveNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.ReturnNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.SaveNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.SetNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.SvcLogicNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.SvcLogicServiceImpl; +import org.onap.ccsdk.sli.core.sli.provider.SwitchNodeExecutor; +import org.onap.ccsdk.sli.core.sli.provider.UpdateNodeExecutor; +import org.osgi.framework.ServiceRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import junit.framework.TestCase; + +public class SvcLogicGraphExecutorTest extends TestCase { + private static final Logger LOG = LoggerFactory + .getLogger(SvcLogicGraph.class); + + private static final Map BUILTIN_NODES = new HashMap() { + { + put("block", new BlockNodeExecutor()); + put("call", new CallNodeExecutor()); + put("configure", new ConfigureNodeExecutor()); + put("delete", new DeleteNodeExecutor()); + put("execute", new ExecuteNodeExecutor()); + put("exists", new ExistsNodeExecutor()); + put("for", new ForNodeExecutor()); + put("get-resource", new GetResourceNodeExecutor()); + put("is-available", new IsAvailableNodeExecutor()); + put("notify", new NotifyNodeExecutor()); + put("record", new RecordNodeExecutor()); + put("release", new ReleaseNodeExecutor()); + put("reserve", new ReserveNodeExecutor()); + put("return", new ReturnNodeExecutor()); + put("save", new SaveNodeExecutor()); + put("set", new SetNodeExecutor()); + put("switch", new SwitchNodeExecutor()); + put("update", new UpdateNodeExecutor()); + + } + }; + + public void testExecute() { + + try { + InputStream testStr = getClass().getResourceAsStream("/executor.tests"); + BufferedReader testsReader = new BufferedReader(new InputStreamReader(testStr)); + + InputStream propStr = getClass().getResourceAsStream("/svclogic.properties"); + + SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(propStr); + + assertNotNull(store); + + store.registerNodeType("switch"); + store.registerNodeType("block"); + store.registerNodeType("get-resource"); + store.registerNodeType("reserve"); + store.registerNodeType("is-available"); + store.registerNodeType("exists"); + store.registerNodeType("configure"); + store.registerNodeType("return"); + store.registerNodeType("record"); + store.registerNodeType("allocate"); + store.registerNodeType("release"); + store.registerNodeType("for"); + store.registerNodeType("set"); + SvcLogicParser parser = new SvcLogicParser(store); + + // Loop through executor tests + + SvcLogicServiceImpl svc = new SvcLogicServiceImpl(); + + for (String nodeType : BUILTIN_NODES.keySet()) { + + LOG.info("SLI - registering node executor for node type "+nodeType); + + svc.registerExecutor(nodeType, BUILTIN_NODES.get(nodeType)); + + } + String testCaseLine = null; + while ((testCaseLine = testsReader.readLine()) != null) { + + String[] testCaseFields = testCaseLine.split(":"); + String testCaseFile = testCaseFields[0]; + String testCaseMethod = testCaseFields[1]; + String testCaseParameters = null; + + if (testCaseFields.length > 2) { + testCaseParameters = testCaseFields[2]; + } + + SvcLogicContext ctx = new SvcLogicContext(); + if (testCaseParameters != null) { + String[] testCaseParameterSettings = testCaseParameters.split(","); + + for (int i = 0 ; i < testCaseParameterSettings.length ; i++) { + String[] nameValue = testCaseParameterSettings[i].split("="); + if (nameValue != null) { + String name = nameValue[0]; + String value = ""; + if (nameValue.length > 1) { + value = nameValue[1]; + } + + ctx.setAttribute(name, value); + } + } + } + + testCaseFile = testCaseFile.trim(); + + if (testCaseFile.length() > 0) { + if (!testCaseFile.startsWith("/")) { + testCaseFile = "/"+testCaseFile; + } + URL testCaseUrl = getClass().getResource(testCaseFile); + if (testCaseUrl == null) { + fail("Could not resolve test case file "+testCaseFile); + } + + LinkedList graphs = parser.parse(testCaseUrl.getPath()); + + + assertNotNull(graphs); + + for (SvcLogicGraph graph: graphs) { + if (graph.getRpc().equals(testCaseMethod)) { + Properties props = ctx.toProperties(); + LOG.info("SvcLogicContext before executing "+testCaseMethod+":"); + for (Enumeration e1 = props.propertyNames(); e1.hasMoreElements() ; ) { + String propName = (String) e1.nextElement(); + LOG.info(propName+" = "+props.getProperty(propName)); + } + + svc.execute(graph, ctx); + + props = ctx.toProperties(); + LOG.info("SvcLogicContext after executing "+testCaseMethod+":"); + for (Enumeration e2 = props.propertyNames(); e2.hasMoreElements() ; ) { + String propName = (String) e2.nextElement(); + LOG.info(propName+" = "+props.getProperty(propName)); + } + } + } + + } + + + } + + + } catch (Exception e) { + LOG.error("Caught exception executing directed graphs", e); + fail("Exception executing graphs"); + } + } + + +} diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/VoidDummyPlugin.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/VoidDummyPlugin.java new file mode 100644 index 000000000..7c6eee9ab --- /dev/null +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/VoidDummyPlugin.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.util.Map; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; + + + +public class VoidDummyPlugin implements SvcLogicJavaPlugin { + + public void dummy(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + return; + } + +} diff --git a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/BadPlugin.java b/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/BadPlugin.java deleted file mode 100644 index d1ab4cfdd..000000000 --- a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/BadPlugin.java +++ /dev/null @@ -1,56 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.Map; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; - - -public class BadPlugin implements SvcLogicJavaPlugin { - public String selectLunch(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - String day = parameters.get("day"); - if (day == null || day.length() < 1) { - throw new SvcLogicException("What day is it?"); - } - switch (day) { - case ("monday"): { - return "pizza"; - } - case ("tuesday"): { - return "soup"; - } - case ("wednesday"): { - return "salad"; - } - case ("thursday"): { - return "sushi"; - } - case ("friday"): { - return "bbq"; - } - } - throw new SvcLogicException("Lunch cannot be served"); - } -} diff --git a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/ExecuteNodeExecutorTest.java b/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/ExecuteNodeExecutorTest.java deleted file mode 100644 index 3d43ee11d..000000000 --- a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/ExecuteNodeExecutorTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.Map.Entry; - -import org.openecomp.sdnc.sli.DuplicateValueException; -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicGraph; -import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; -import org.openecomp.sdnc.sli.SvcLogicNode; - -import junit.framework.TestCase; - -public class ExecuteNodeExecutorTest extends TestCase { - public class MockExecuteNodeExecutor extends ExecuteNodeExecutor { - - protected SvcLogicJavaPlugin getSvcLogicJavaPlugin(String pluginName) { - return (SvcLogicJavaPlugin) new LunchSelectorPlugin(); - } - - protected String evaluate(SvcLogicExpression expr, SvcLogicNode node, - SvcLogicContext ctx) throws SvcLogicException { - return "selectLunch"; - } - } - - public void testBadPlugin() throws DuplicateValueException, SvcLogicException { - LunchSelectorPlugin p = new LunchSelectorPlugin(); - MockExecuteNodeExecutor execute = new MockExecuteNodeExecutor(); - SvcLogicNode node = new SvcLogicNode(0, "", "", new SvcLogicGraph()); - node.setAttribute("method", "selectLunch"); - execute.execute(new SvcLogicServiceImpl(), new SvcLogicNode(0, "", "", new SvcLogicGraph()), new SvcLogicContext()); - } - -} diff --git a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/LunchSelectorPlugin.java b/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/LunchSelectorPlugin.java deleted file mode 100644 index b9156bcdc..000000000 --- a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/LunchSelectorPlugin.java +++ /dev/null @@ -1,78 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.Map; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; - - - -public class LunchSelectorPlugin implements SvcLogicJavaPlugin { - public class UnknownLunchDayException extends Exception{ - - public UnknownLunchDayException(String string) { - super(string); - } - - } - class Sandwhich { - String meat; - String cheese; - - public Sandwhich(String meat, String cheese) { - this.meat = meat; - this.cheese = cheese; - } - } - - public String selectLunch(Map parameters, SvcLogicContext ctx) throws Exception { - String day = parameters.get("day"); - if (day == null || day.length() < 1) { - throw new UnknownLunchDayException("What day is it?"); - } - switch (day) { - case ("monday"): { - return "pizza"; - } - case ("tuesday"): { - return "soup"; - } - case ("wednesday"): { - return "salad"; - } - case ("thursday"): { - return "sushi"; - } - case ("friday"): { - return "bbq"; - } - } - throw new SvcLogicException("Lunch cannot be served"); - } - - public Sandwhich makeLunch(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - return new Sandwhich("ham", "american"); - } -} diff --git a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/MdsalHelperTest.java b/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/MdsalHelperTest.java deleted file mode 100644 index a4e41bbad..000000000 --- a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/MdsalHelperTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import junit.framework.TestCase; - -public class MdsalHelperTest extends TestCase { - - public static final String pathToSdnPropertiesFile = "./src/test/resources/l3sdn.properties"; - - public void testSdnProperties() { - MdsalHelperTesterUtil.loadProperties(pathToSdnPropertiesFile); - assertEquals("synccomplete", MdsalHelperTesterUtil.mapEnumeratedValue("request-status", "Synccomplete")); - assertEquals("asynccomplete", MdsalHelperTesterUtil.mapEnumeratedValue("request-status", "asynccomplete")); - assertEquals("notifycomplete", MdsalHelperTesterUtil.mapEnumeratedValue("request-status", "notifycomplete")); - assertEquals("service-configuration-operation", MdsalHelperTesterUtil.mapEnumeratedValue("rpc-name", - "ServiceConfigurationOperation")); - } - - public void testNegativeSdnProperties() { - assertNotSame("synccomplete", MdsalHelperTesterUtil.mapEnumeratedValue("request-status", "Synccomplete")); - } - -} diff --git a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/MdsalHelperTesterUtil.java b/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/MdsalHelperTesterUtil.java deleted file mode 100644 index 01e333f6e..000000000 --- a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/MdsalHelperTesterUtil.java +++ /dev/null @@ -1,37 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import org.openecomp.sdnc.sli.provider.MdsalHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MdsalHelperTesterUtil extends MdsalHelper { - - private static final Logger LOG = LoggerFactory.getLogger(MdsalHelperTesterUtil.class); - - //Normally static init of classes goes here for some weird classloader thing - static { - String str = "Hello World!"; - } - -} diff --git a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/PluginTest.java b/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/PluginTest.java deleted file mode 100644 index 035cd3e79..000000000 --- a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/PluginTest.java +++ /dev/null @@ -1,106 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicGraph; -import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; -import org.openecomp.sdnc.sli.SvcLogicNode; - -import junit.framework.TestCase; - -public class PluginTest extends TestCase { - - // The existing plugins work just like a VoidDummyPlugin - // They will return null simply because they are all void - // The attribute emitsOutcome will not be present, the expected outcome is success when no exception is thrown by the plugin - public void testOldPlugin() throws Exception { - ExecuteNodeExecutor executor = new ExecuteNodeExecutor(); - SvcLogicJavaPlugin plugin = new VoidDummyPlugin(); - - Class pluginClass = plugin.getClass(); - Method pluginMethod = pluginClass.getMethod("dummy", Map.class, SvcLogicContext.class); - Map parmMap = new HashMap(); - SvcLogicContext ctx = new SvcLogicContext(); - Object o = pluginMethod.invoke(plugin, parmMap, ctx); - - SvcLogicGraph graph = new SvcLogicGraph(); - SvcLogicNode node = new SvcLogicNode(1, "return", graph); - String emitsOutcome = SvcLogicExpressionResolver.evaluate(node.getAttribute("emitsOutcome"), node, ctx); - String outValue = executor.mapOutcome(o, emitsOutcome); - assertEquals("success",outValue); - } - - //Newer plugins can set the attribute emitsOutcome to true, if so they should return a string - //The string represents the outcome value - public void testNewPlugin() throws Exception { - ExecuteNodeExecutor executor = new ExecuteNodeExecutor(); - SvcLogicJavaPlugin plugin = new LunchSelectorPlugin(); - - Class pluginClass = plugin.getClass(); - Method pluginMethod = pluginClass.getMethod("selectLunch", Map.class, SvcLogicContext.class); - - Map parmMap = new HashMap(); - SvcLogicContext ctx = new SvcLogicContext(); - - parmMap.put("day", "monday"); - Object o = pluginMethod.invoke(plugin, parmMap, ctx); - SvcLogicGraph graph = new SvcLogicGraph(); - SvcLogicNode node = new SvcLogicNode(1, "return", graph); - node.setAttribute("emitsOutcome", "true"); - String emitsOutcome = SvcLogicExpressionResolver.evaluate(node.getAttribute("emitsOutcome"), node, ctx); - String outValue = executor.mapOutcome(o, emitsOutcome); - assertEquals("pizza", outValue); - - parmMap.put("day", "tuesday"); - outValue = (String) pluginMethod.invoke(plugin, parmMap, ctx); - o = pluginMethod.invoke(plugin, parmMap, ctx); - outValue = executor.mapOutcome(o, emitsOutcome); - assertEquals("soup",outValue); - - } - - //APPC had some legacy plugins returning objects which should not be treated as outcomes - //The attribute emitsOutcome will not be set - //The outcome should be success as it has always been - public void testObjPlugin() throws Exception{ - ExecuteNodeExecutor executor = new ExecuteNodeExecutor(); - SvcLogicJavaPlugin plugin = new LunchSelectorPlugin(); - - Class pluginClass = plugin.getClass(); - Method pluginMethod = pluginClass.getMethod("makeLunch", Map.class, SvcLogicContext.class); - - Map parmMap = new HashMap(); - SvcLogicContext ctx = new SvcLogicContext(); - Object o = pluginMethod.invoke(plugin, parmMap, ctx); - SvcLogicGraph graph = new SvcLogicGraph(); - SvcLogicNode node = new SvcLogicNode(1, "return", graph); - String emitsOutcome = SvcLogicExpressionResolver.evaluate(node.getAttribute("emitsOutcome"), node, ctx); - String outValue = executor.mapOutcome(o, emitsOutcome); - assertEquals("success",outValue); - } - -} diff --git a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/SvcLogicExpressionResolverTest.java b/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/SvcLogicExpressionResolverTest.java deleted file mode 100644 index 618154883..000000000 --- a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/SvcLogicExpressionResolverTest.java +++ /dev/null @@ -1,123 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicExprListener; -import org.openecomp.sdnc.sli.SvcLogicExpression; -import org.openecomp.sdnc.sli.SvcLogicExpressionFactory; -import org.openecomp.sdnc.sli.SvcLogicGraph; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.provider.SvcLogicExpressionResolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import junit.framework.Assert; -import junit.framework.TestCase; - -public class SvcLogicExpressionResolverTest extends TestCase { - - - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicExpressionResolver.class); - - public void testEvaluate() - { - InputStream testStr = getClass().getResourceAsStream("/expression.tests"); - BufferedReader testsReader = new BufferedReader(new InputStreamReader(testStr)); - - try - { - SvcLogicContext ctx = new SvcLogicContext(); - SvcLogicGraph graph = new SvcLogicGraph(); - SvcLogicNode node = new SvcLogicNode(1, "return", graph); - graph.setRootNode(node); - - String line = null; - int lineNo = 0; - while ((line = testsReader.readLine()) != null) { - ++lineNo; - if (line.startsWith("#")) - { - String testExpr = line.trim().substring(1).trim(); - String[] nameValue = testExpr.split("="); - String name = nameValue[0].trim(); - String value = nameValue[1].trim(); - - if (name.startsWith("$")) - { - LOG.info("Setting context attribute "+name+" = "+value); - ctx.setAttribute(name.substring(1), value); - } - else - { - - LOG.info("Setting node attribute "+name+" = "+value); - node.setAttribute(name, value); - - } - } - else - { - // if the line contains #, what comes before is the expression to evaluate, and what comes after - // is the expected value - String[] substrings = line.split("#"); - String expectedValue = substrings.length > 1 ? substrings[1].trim() : null; - String testExpr = substrings[0].trim(); - - LOG.info("Parsing expression "+testExpr); - SvcLogicExpression expr = SvcLogicExpressionFactory.parse(testExpr); - if (expr == null) - { - fail("Unable to parse expression "+testExpr); - } - else - { - LOG.info("Evaluating parsed expression "+expr.asParsedExpr()); - String exprValue = SvcLogicExpressionResolver.evaluate(expr, node, ctx); - if (exprValue == null) - { - fail("Unable to evaluate expression "+testExpr); - } - else - { - LOG.info("Expression " + testExpr + " evaluates to " + exprValue); - if (expectedValue != null) { - Assert.assertEquals("Line " + lineNo + ": " + testExpr, expectedValue, exprValue); - } - } - } - } - } - } - catch (Exception e) - { - LOG.error("Caught exception", e); - fail("Caught exception"); - } - } - -} diff --git a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/SvcLogicGraphExecutorTest.java b/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/SvcLogicGraphExecutorTest.java deleted file mode 100644 index 2e8b35e12..000000000 --- a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/SvcLogicGraphExecutorTest.java +++ /dev/null @@ -1,212 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.URL; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; -import java.util.Properties; - -import org.openecomp.sdnc.sli.MetricLogger; -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicGraph; -import org.openecomp.sdnc.sli.SvcLogicNode; -import org.openecomp.sdnc.sli.SvcLogicParser; -import org.openecomp.sdnc.sli.SvcLogicStore; -import org.openecomp.sdnc.sli.SvcLogicStoreFactory; -import org.openecomp.sdnc.sli.provider.BlockNodeExecutor; -import org.openecomp.sdnc.sli.provider.CallNodeExecutor; -import org.openecomp.sdnc.sli.provider.ConfigureNodeExecutor; -import org.openecomp.sdnc.sli.provider.DeleteNodeExecutor; -import org.openecomp.sdnc.sli.provider.ExecuteNodeExecutor; -import org.openecomp.sdnc.sli.provider.ExistsNodeExecutor; -import org.openecomp.sdnc.sli.provider.ForNodeExecutor; -import org.openecomp.sdnc.sli.provider.GetResourceNodeExecutor; -import org.openecomp.sdnc.sli.provider.IsAvailableNodeExecutor; -import org.openecomp.sdnc.sli.provider.NotifyNodeExecutor; -import org.openecomp.sdnc.sli.provider.RecordNodeExecutor; -import org.openecomp.sdnc.sli.provider.ReleaseNodeExecutor; -import org.openecomp.sdnc.sli.provider.ReserveNodeExecutor; -import org.openecomp.sdnc.sli.provider.ReturnNodeExecutor; -import org.openecomp.sdnc.sli.provider.SaveNodeExecutor; -import org.openecomp.sdnc.sli.provider.SetNodeExecutor; -import org.openecomp.sdnc.sli.provider.SvcLogicNodeExecutor; -import org.openecomp.sdnc.sli.provider.SvcLogicServiceImpl; -import org.openecomp.sdnc.sli.provider.SwitchNodeExecutor; -import org.openecomp.sdnc.sli.provider.UpdateNodeExecutor; -import org.osgi.framework.ServiceRegistration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import junit.framework.TestCase; - -public class SvcLogicGraphExecutorTest extends TestCase { - private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicGraph.class); - - private static final Map BUILTIN_NODES = new HashMap() { - { - put("block", new BlockNodeExecutor()); - put("call", new CallNodeExecutor()); - put("configure", new ConfigureNodeExecutor()); - put("delete", new DeleteNodeExecutor()); - put("execute", new ExecuteNodeExecutor()); - put("exists", new ExistsNodeExecutor()); - put("for", new ForNodeExecutor()); - put("get-resource", new GetResourceNodeExecutor()); - put("is-available", new IsAvailableNodeExecutor()); - put("notify", new NotifyNodeExecutor()); - put("record", new RecordNodeExecutor()); - put("release", new ReleaseNodeExecutor()); - put("reserve", new ReserveNodeExecutor()); - put("return", new ReturnNodeExecutor()); - put("save", new SaveNodeExecutor()); - put("set", new SetNodeExecutor()); - put("switch", new SwitchNodeExecutor()); - put("update", new UpdateNodeExecutor()); - - } - }; - - public void testExecute() { - - try { - InputStream testStr = getClass().getResourceAsStream("/executor.tests"); - BufferedReader testsReader = new BufferedReader(new InputStreamReader(testStr)); - - InputStream propStr = getClass().getResourceAsStream("/svclogic.properties"); - - SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(propStr); - - assertNotNull(store); - - store.registerNodeType("switch"); - store.registerNodeType("block"); - store.registerNodeType("get-resource"); - store.registerNodeType("reserve"); - store.registerNodeType("is-available"); - store.registerNodeType("exists"); - store.registerNodeType("configure"); - store.registerNodeType("return"); - store.registerNodeType("record"); - store.registerNodeType("allocate"); - store.registerNodeType("release"); - store.registerNodeType("for"); - store.registerNodeType("set"); - SvcLogicParser parser = new SvcLogicParser(store); - - // Loop through executor tests - - SvcLogicServiceImpl svc = new SvcLogicServiceImpl(); - - for (String nodeType : BUILTIN_NODES.keySet()) { - - LOG.info("SLI - registering node executor for node type "+nodeType); - - svc.registerExecutor(nodeType, BUILTIN_NODES.get(nodeType)); - - } - String testCaseLine = null; - while ((testCaseLine = testsReader.readLine()) != null) { - - String[] testCaseFields = testCaseLine.split(":"); - String testCaseFile = testCaseFields[0]; - String testCaseMethod = testCaseFields[1]; - String testCaseParameters = null; - - if (testCaseFields.length > 2) { - testCaseParameters = testCaseFields[2]; - } - - SvcLogicContext ctx = new SvcLogicContext(); - if (testCaseParameters != null) { - String[] testCaseParameterSettings = testCaseParameters.split(","); - - for (int i = 0 ; i < testCaseParameterSettings.length ; i++) { - String[] nameValue = testCaseParameterSettings[i].split("="); - if (nameValue != null) { - String name = nameValue[0]; - String value = ""; - if (nameValue.length > 1) { - value = nameValue[1]; - } - - ctx.setAttribute(name, value); - } - } - } - - testCaseFile = testCaseFile.trim(); - - if (testCaseFile.length() > 0) { - if (!testCaseFile.startsWith("/")) { - testCaseFile = "/"+testCaseFile; - } - URL testCaseUrl = getClass().getResource(testCaseFile); - if (testCaseUrl == null) { - fail("Could not resolve test case file "+testCaseFile); - } - - LinkedList graphs = parser.parse(testCaseUrl.getPath()); - - - assertNotNull(graphs); - - for (SvcLogicGraph graph: graphs) { - if (graph.getRpc().equals(testCaseMethod)) { - Properties props = ctx.toProperties(); - LOG.info("SvcLogicContext before executing "+testCaseMethod+":"); - for (Enumeration e1 = props.propertyNames(); e1.hasMoreElements() ; ) { - String propName = (String) e1.nextElement(); - LOG.info(propName+" = "+props.getProperty(propName)); - } - - svc.execute(graph, ctx); - - props = ctx.toProperties(); - LOG.info("SvcLogicContext after executing "+testCaseMethod+":"); - for (Enumeration e2 = props.propertyNames(); e2.hasMoreElements() ; ) { - String propName = (String) e2.nextElement(); - LOG.info(propName+" = "+props.getProperty(propName)); - } - } - } - - } - - - } - - - } catch (Exception e) { - LOG.error("Caught exception executing directed graphs", e); - fail("Exception executing graphs"); - } - } - - -} diff --git a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/VoidDummyPlugin.java b/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/VoidDummyPlugin.java deleted file mode 100644 index 6c8214ab7..000000000 --- a/sli/provider/src/test/java/org/openecomp/sdnc/sli/provider/VoidDummyPlugin.java +++ /dev/null @@ -1,38 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * openECOMP : SDN-C - * ================================================================================ - * Copyright (C) 2017 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.openecomp.sdnc.sli.provider; - -import java.util.Map; - -import org.openecomp.sdnc.sli.SvcLogicContext; -import org.openecomp.sdnc.sli.SvcLogicException; -import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; - - - -public class VoidDummyPlugin implements SvcLogicJavaPlugin { - - public void dummy(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - return; - } - -} diff --git a/sli/provider/src/test/resources/l3sdn_logic_v10.xml b/sli/provider/src/test/resources/l3sdn_logic_v10.xml index d81b8b789..56e1a81ef 100644 --- a/sli/provider/src/test/resources/l3sdn_logic_v10.xml +++ b/sli/provider/src/test/resources/l3sdn_logic_v10.xml @@ -1,10 +1,9 @@ - - org.opendaylight.odlparent - opendaylight-karaf-empty - ${odl.karaf.empty.distro.version} - zip - - - - - org.opendaylight.odlparent - features-test - ${odl.commons.opendaylight.version} - test - - - org.opendaylight.yangtools - features-yangtools - ${odl.yangtools.version} - features - xml - runtime - - + org.onap.ccsdk.sli.core + dblib-feature-aggregator + 0.2.1-SNAPSHOT + pom - - - - true - src/main/resources - - - - - org.apache.maven.plugins - maven-resources-plugin - - - filter - - resources - - generate-resources - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-artifacts - - attach-artifact - - package - - - - ${project.build.directory}/classes/${features.file} - xml - features - - - - - - - - + + features-dblib + ccsdk-dblib + diff --git a/dblib/features/src/main/resources/features.xml b/dblib/features/src/main/resources/features.xml deleted file mode 100755 index aa31db751..000000000 --- a/dblib/features/src/main/resources/features.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features - - - - - odl-mdsal-broker - wrap:mvn:org.apache.tomcat/tomcat-jdbc/${tomcat-jdbc.version}/$DynamicImport-Package=org.mariadb.*&overwrite=merge - mvn:org.onap.ccsdk.sli.core/dblib-provider/${project.version} - mvn:org.mariadb.jdbc/mariadb-java-client/${mariadb.connector.version} - - - diff --git a/dblib/installer/pom.xml b/dblib/installer/pom.xml index bff158011..8d6147b72 100755 --- a/dblib/installer/pom.xml +++ b/dblib/installer/pom.xml @@ -1,143 +1,149 @@ - - 4.0.0 - - dblib - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT - - dblib-installer - DBLIB Adaptor - Karaf Installer - pom + + 4.0.0 - - sdnc-dblib - sdnc-dblib - mvn:org.onap.ccsdk.sli.core/dblib-features/${project.version}/xml/features - false - + + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + - + org.onap.ccsdk.sli.core + dblib-installer + 0.2.1-SNAPSHOT + pom - - org.onap.ccsdk.sli.core - dblib-features - ${project.version} - features - xml - - - * - * - - - + ccsdk-sli-core :: dblib :: ${project.artifactId} - - org.onap.ccsdk.sli.core - dblib-provider - ${project.version} - + + ccsdk-dblib + ${application.name} + mvn:org.onap.ccsdk.sli.core/${features.boot}/${project.version}/xml/features + false + + - - org.apache.tomcat - tomcat-jdbc - ${tomcat-jdbc.version} - - + + org.onap.ccsdk.sli.core + ${application.name} + ${project.version} + xml + features + + + * + * + + + - - - - maven-assembly-plugin - - - maven-repo-zip - - single - - package - - false - stage/${application.name}-${project.version} - - src/assembly/assemble_mvnrepo_zip.xml - - false - - - - installer-zip - - single - - package - - true - ${application.name}-${project.version}-installer - - src/assembly/assemble_installer_zip.xml - - false - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - - copy-dependencies - - prepare-package - - false - ${project.build.directory}/assembly/system - false - true - true - true - false - false - org.onap.ccsdk.sli,org.apache.tomcat - sli-common,sli-provider - provided - - - - - - maven-resources-plugin - 2.6 - - - copy-version - - copy-resources - - validate - - ${basedir}/target/stage - - - src/main/resources/scripts - - install-feature.sh - - true - - - - + + org.onap.ccsdk.sli.core + dblib-provider + ${project.version} + - - - - + + org.apache.tomcat + tomcat-jdbc + ${tomcat-jdbc.version} + + + + + + maven-assembly-plugin + + + maven-repo-zip + + single + + package + + false + stage/${application.name}-${project.version} + + src/assembly/assemble_mvnrepo_zip.xml + + false + + + + installer-zip + + single + + package + + true + ${application.name}-${project.version}-installer + + src/assembly/assemble_installer_zip.xml + + false + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + + copy-dependencies + + prepare-package + + false + ${project.build.directory}/assembly/system + false + true + true + true + false + false + org.onap.ccsdk.sli,org.apache.tomcat + sli-common,sli-provider + provided + + + + + + maven-resources-plugin + 2.6 + + + copy-version + + copy-resources + + validate + + ${basedir}/target/stage + + + src/main/resources/scripts + + install-feature.sh + + true + + + + + + + + + + diff --git a/dblib/pom.xml b/dblib/pom.xml index e7743d81c..58f40ff69 100755 --- a/dblib/pom.xml +++ b/dblib/pom.xml @@ -1,77 +1,26 @@ - - - org.onap.ccsdk.sli.core - ccsdk-sli-core - 0.2.0-SNAPSHOT + + 4.0.0 + + + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + org.onap.ccsdk.sli.core + dblib + 0.2.1-SNAPSHOT + pom - 4.0.0 - pom - org.onap.ccsdk.sli.core - dblib - - - DBLIB Adaptor - The DBLIB adaptor allows service logic to access persistent data in a local sql database - - 0.2.0-SNAPSHOT - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven.compile.plugin.version} - - ${java.version.source} - ${java.version.target} - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10 - - - - aggregate - - aggregate - - site - - - - - - maven-source-plugin - 2.1.1 - - - bundle-sources - package - - - jar-no-fork - - - test-jar-no-fork - - - - - - - - - - AT&T + ccsdk-sli-core :: dblib + The DBLIB adaptor allows service logic to access persistent data in a local sql database + + ONAP - + + provider features installer diff --git a/dblib/provider/pom.xml b/dblib/provider/pom.xml index 3bdd7e67b..e6fd1bcb1 100755 --- a/dblib/provider/pom.xml +++ b/dblib/provider/pom.xml @@ -1,19 +1,27 @@ - + 4.0.0 + - org.onap.ccsdk.sli.core - dblib - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + binding-parent + 1.0.1-SNAPSHOT + + + org.onap.ccsdk.sli.core dblib-provider - 0.2.0-SNAPSHOT + 0.2.1-SNAPSHOT bundle - DBLIB Adaptor - Provider + + ccsdk-sli-core :: dblib :: ${project.artifactId} http://maven.apache.org + UTF-8 + junit @@ -21,12 +29,12 @@ ${junit.version} test - - ch.vorburger.mariaDB4j - mariaDB4j - 2.2.3 - test - + + ch.vorburger.mariaDB4j + mariaDB4j + 2.2.3 + test + equinoxSDK381 org.eclipse.osgi @@ -48,53 +56,31 @@ ${slf4j.version} test - - org.mariadb.jdbc - mariadb-java-client - ${mariadb.connector.version} - - org.apache.tomcat - tomcat-jdbc - ${tomcat-jdbc.version} + org.mariadb.jdbc + mariadb-java-client + ${mariadb.connector.version} + + + org.apache.tomcat + tomcat-jdbc + ${tomcat-jdbc.version} + + + com.google.guava + guava - - com.google.guava - guava - org.onap.ccsdk.sli.core utils-provider ${project.version} - - - org.mockito - mockito-core - test - + + + org.mockito + mockito-core + test + - - - - - org.apache.felix - maven-bundle-plugin - ${bundle.plugin.version} - true - - - org.onap.ccsdk.sli.core.dblib - org.onap.ccsdk.sli.core.dblib;version=${project.version} - *,org.mariadb.jdbc - true - - - - - - - - diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java index d2331786e..8dac33611 100755 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java +++ b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java @@ -56,500 +56,516 @@ import org.slf4j.LoggerFactory; public abstract class CachedDataSource implements DataSource, SQLExecutionMonitorObserver { - private static final Logger LOGGER = LoggerFactory.getLogger(CachedDataSource.class); - - private static final String SQL_FAILURE = "SQL FAILURE. time(ms): "; - private static final String FAILED_TO_EXECUTE = "> Failed to execute: "; - private static final String WITH_ARGUMENTS = " with arguments: "; - private static final String WITH_NO_ARGUMENTS = " with no arguments. "; - private static final String SQL_DATA_SOURCE = "SQL DataSource <"; - - - protected long connReqTimeout = 30L; - protected long dataReqTimeout = 100L; - - private final SQLExecutionMonitor monitor; - protected DataSource ds = null; - protected String connectionName = null; - protected boolean initialized = false; - - private long interval = 1000; - private long initialDelay = 5000; - private long expectedCompletionTime = 50L; - private boolean canTakeOffLine = true; - private long unprocessedFailoverThreshold = 3L; - - private long nextErrorReportTime = 0L; - - private String globalHostName = null; - - - public CachedDataSource(BaseDBConfiguration jdbcElem) throws DBConfigException { - configure(jdbcElem); - monitor = new SQLExecutionMonitor(this); - } - - protected abstract void configure(BaseDBConfiguration jdbcElem) throws DBConfigException; - - /* (non-Javadoc) - * @see javax.sql.DataSource#getConnection() - */ - @Override - public Connection getConnection() throws SQLException { - return ds.getConnection(); - } - - public CachedRowSet getData(String statement, List arguments) - throws SQLException { - TestObject testObject = monitor.registerRequest(); - - try (Connection connection = this.getConnection()) { - if (connection == null) { - throw new SQLException("Connection invalid"); - } - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Obtained connection <{}>: {}", connectionName, connection); - } - return executePreparedStatement(connection, statement, arguments, true); - } finally { - monitor.deregisterRequest(testObject); - } - } - - public boolean writeData(String statement, List arguments) - throws SQLException { - TestObject testObject = monitor.registerRequest(); - - try (Connection connection = this.getConnection()) { - if (connection == null) { - throw new SQLException("Connection invalid"); - } - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Obtained connection <{}>: {}", connectionName, connection); - } - return executeUpdatePreparedStatement(connection, statement, arguments, true); - } finally { - monitor.deregisterRequest(testObject); - } - } - - CachedRowSet executePreparedStatement(Connection conn, String statement, - List arguments, boolean close) throws SQLException { - long time = System.currentTimeMillis(); - - CachedRowSet data = null; - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("SQL Statement: {}", statement); - if (arguments != null && !arguments.isEmpty()) { - LOGGER.debug("Argunments: {}", arguments); - } - } - - ResultSet rs = null; - try (PreparedStatement ps = conn.prepareStatement(statement)) { - data = RowSetProvider.newFactory().createCachedRowSet(); - if (arguments != null) { - for (int i = 0, max = arguments.size(); i < max; i++) { - ps.setObject(i + 1, arguments.get(i)); - } - } - rs = ps.executeQuery(); - data.populate(rs); - // Point the rowset Cursor to the start - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("SQL SUCCESS. rows returned: {}, time(ms): {}", data.size(), (System.currentTimeMillis() - - time)); - } - } catch (SQLException exc) { - handleSqlExceptionForExecuteStatement(conn, statement, arguments, exc, time); - } finally { - handleFinallyBlockForExecutePreparedStatement(rs, conn, close); - } - - return data; - } - - private void handleSqlExceptionForExecuteStatement(Connection conn, String statement, - List arguments, SQLException exc, long time) throws SQLException { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug(SQL_FAILURE + (System.currentTimeMillis() - time)); - } - try { - conn.rollback(); - } catch (Exception thr) { - LOGGER.error(thr.getLocalizedMessage(), thr); - } - if (arguments != null && !arguments.isEmpty()) { - LOGGER.error(String.format("<%s%s%s%s%s", connectionName, FAILED_TO_EXECUTE, statement, WITH_ARGUMENTS, - arguments), exc); - } else { - LOGGER.error(String.format("<%s%s%s%s", connectionName, FAILED_TO_EXECUTE, statement, WITH_NO_ARGUMENTS), - exc); - } - throw exc; - } - - private void handleFinallyBlockForExecutePreparedStatement(ResultSet rs, Connection conn, boolean close) { - try { - if (rs != null) { - rs.close(); - } - } catch (Exception exc) { - LOGGER.error(exc.getLocalizedMessage(), exc); - } - try { - if (conn != null && close) { - conn.close(); - } - } catch (Exception exc) { - LOGGER.error(exc.getLocalizedMessage(), exc); - } - } - - boolean executeUpdatePreparedStatement(Connection conn, String statement, List arguments, - boolean close) throws SQLException { - long time = System.currentTimeMillis(); - - CachedRowSet data; - - try (PreparedStatement ps = conn.prepareStatement(statement)) { - data = RowSetProvider.newFactory().createCachedRowSet(); - if (arguments != null) { - prepareStatementForExecuteUpdate(arguments, ps); - } - ps.executeUpdate(); - // Point the rowset Cursor to the start - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("SQL SUCCESS. rows returned: {}, time(ms): {}", data.size(), (System.currentTimeMillis() - - time)); - } - ps.close(); - } catch (SQLException exc) { - handleSqlExceptionForExecuteStatement(conn, statement, arguments, exc, time); - } finally { - try { - if (close) { - conn.close(); - } - } catch (Exception exc) { - LOGGER.error(exc.getLocalizedMessage(), exc); - } - } - - return true; - } - - private void prepareStatementForExecuteUpdate(List arguments, PreparedStatement ps) - throws SQLException { - for (int i = 0, max = arguments.size(); i < max; i++) { - Object value = arguments.get(i); - if (value instanceof Blob) { - ps.setBlob(i + 1, (Blob) value); - } else if (value instanceof Timestamp) { - ps.setTimestamp(i + 1, (Timestamp) value); - } else if (value instanceof Integer) { - ps.setInt(i + 1, (Integer) value); - } else if (value instanceof Long) { - ps.setLong(i + 1, (Long) value); - } else if (value instanceof Date) { - ps.setDate(i + 1, (Date) value); - } else { - ps.setObject(i + 1, value); - } - } - } - - /* (non-Javadoc) - * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String) - */ - @Override - public Connection getConnection(String username, String password) - throws SQLException { - return ds.getConnection(username, password); - } - - /* (non-Javadoc) - * @see javax.sql.DataSource#getLogWriter() - */ - @Override - public PrintWriter getLogWriter() throws SQLException { - return ds.getLogWriter(); - } - - /* (non-Javadoc) - * @see javax.sql.DataSource#getLoginTimeout() - */ - @Override - public int getLoginTimeout() throws SQLException { - return ds.getLoginTimeout(); - } - - /* (non-Javadoc) - * @see javax.sql.DataSource#setLogWriter(java.io.PrintWriter) - */ - @Override - public void setLogWriter(PrintWriter out) throws SQLException { - ds.setLogWriter(out); - } - - /* (non-Javadoc) - * @see javax.sql.DataSource#setLoginTimeout(int) - */ - @Override - public void setLoginTimeout(int seconds) throws SQLException { - ds.setLoginTimeout(seconds); - } - - - @Override - public final String getDbConnectionName() { - return connectionName; - } - - protected final void setDbConnectionName(String name) { - this.connectionName = name; - } - - public void cleanUp() { - if (ds != null && ds instanceof Closeable) { - try { - ((Closeable) ds).close(); - } catch (IOException e) { - LOGGER.warn(e.getMessage()); - } - } - ds = null; - monitor.deleteObservers(); - monitor.cleanup(); - } - - public boolean isInitialized() { - return initialized; - } - - protected boolean testConnection() { - return testConnection(false); - } - - protected boolean testConnection(boolean errorLevel) { - ResultSet rs = null; - try (Connection conn = this.getConnection(); Statement stmt = conn.createStatement()) { - Boolean readOnly; - String hostname; - rs = stmt.executeQuery( - "SELECT @@global.read_only, @@global.hostname"); //("SELECT 1 FROM DUAL"); //"select BANNER from SYS.V_$VERSION" - while (rs.next()) { - readOnly = rs.getBoolean(1); - hostname = rs.getString(2); - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug( - SQL_DATA_SOURCE + getDbConnectionName() + "> connected to " + hostname + ", read-only is " - + readOnly + ", tested successfully "); - } - } - } catch (Exception exc) { - if (errorLevel) { - LOGGER.error( - SQL_DATA_SOURCE + this.getDbConnectionName() + "> test failed. Cause : " + exc.getMessage()); - } else { - LOGGER.info( - SQL_DATA_SOURCE + this.getDbConnectionName() + "> test failed. Cause : " + exc.getMessage()); - } - return false; - } finally { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - LOGGER.error(e.getLocalizedMessage(), e); - } - } - } - return true; - } - - @Override - public boolean isWrapperFor(Class iface) throws SQLException { - return false; - } - - @Override - public T unwrap(Class iface) throws SQLException { - return null; - } - - @SuppressWarnings("deprecation") - public void setConnectionCachingEnabled(boolean state) { -// if(ds != null && ds instanceof OracleDataSource) -// try { -// ((OracleDataSource)ds).setConnectionCachingEnabled(true); -// } catch (SQLException exc) { -// LOGGER.warn("", exc); -// } - } - - public void addObserver(Observer observer) { - monitor.addObserver(observer); - } - - public void deleteObserver(Observer observer) { - monitor.deleteObserver(observer); - } - - @Override - public long getInterval() { - return interval; - } - - @Override - public long getInitialDelay() { - return initialDelay; - } - - @Override - public void setInterval(long value) { - interval = value; - } - - @Override - public void setInitialDelay(long value) { - initialDelay = value; - } - - @Override - public long getExpectedCompletionTime() { - return expectedCompletionTime; - } - - @Override - public void setExpectedCompletionTime(long value) { - expectedCompletionTime = value; - } - - @Override - public long getUnprocessedFailoverThreshold() { - return unprocessedFailoverThreshold; - } - - @Override - public void setUnprocessedFailoverThreshold(long value) { - this.unprocessedFailoverThreshold = value; - } - - public boolean canTakeOffLine() { - return canTakeOffLine; - } - - public void blockImmediateOffLine() { - canTakeOffLine = false; - final Thread offLineTimer = new Thread(() -> { - try { - Thread.sleep(30000L); - } catch (Exception exc) { - LOGGER.error(exc.getLocalizedMessage(), exc); - } finally { - canTakeOffLine = true; - } - }); - offLineTimer.setDaemon(true); - offLineTimer.start(); - } - - /** - * @return the monitor - */ - final SQLExecutionMonitor getMonitor() { - return monitor; - } - - protected boolean isSlave() throws PoolExhaustedException { - CachedRowSet rs; - boolean isSlave; - String hostname = "UNDETERMINED"; - try { - boolean localSlave = true; - rs = this.getData("SELECT @@global.read_only, @@global.hostname", new ArrayList<>()); - while (rs.next()) { - localSlave = rs.getBoolean(1); - hostname = rs.getString(2); - } - isSlave = localSlave; - } catch (PoolExhaustedException peexc) { - throw peexc; - } catch (Exception e) { - LOGGER.error("", e); - isSlave = true; - } - if (isSlave) { - LOGGER.debug("SQL SLAVE : {} on server {}", connectionName, hostname); - } else { - LOGGER.debug("SQL MASTER : {} on server {}", connectionName, hostname); - } - return isSlave; - } - - public boolean isFabric() { - return false; - } - - protected boolean lockTable(Connection conn, String tableName) { - boolean retValue = false; - String query = "LOCK TABLES " + tableName + " WRITE"; - try (Statement preStmt = conn.createStatement(); Statement lock = conn.prepareStatement(query); - ResultSet rs = preStmt.executeQuery("GETDATE()")) { - if (tableName != null) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Executing 'LOCK TABLES " + tableName + " WRITE' on connection " + conn.toString()); - if ("SVC_LOGIC".equals(tableName)) { - Exception e = new Exception(); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - LOGGER.debug(sw.toString()); - } - } - lock.execute(query); - retValue = true; - } - } catch (Exception exc) { - LOGGER.error("", exc); - retValue = false; - } - return retValue; - } - - protected boolean unlockTable(Connection conn) { - boolean retValue; - try (Statement lock = conn.createStatement()) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Executing 'UNLOCK TABLES' on connection {}", conn); - } - retValue = lock.execute("UNLOCK TABLES"); - } catch (Exception exc) { - LOGGER.error("", exc); - retValue = false; - } - return retValue; - } - - public void getPoolInfo(boolean allocation) { - - } - - public long getNextErrorReportTime() { - return nextErrorReportTime; - } - - public void setNextErrorReportTime(long nextTime) { - this.nextErrorReportTime = nextTime; - } - - public void setGlobalHostName(String hostname) { - this.globalHostName = hostname; - } - - public String getGlobalHostName() { - return globalHostName; - } + private static final Logger LOGGER = LoggerFactory.getLogger(CachedDataSource.class); + + private static final String SQL_FAILURE = "SQL FAILURE. time(ms): "; + private static final String FAILED_TO_EXECUTE = "> Failed to execute: "; + private static final String WITH_ARGUMENTS = " with arguments: "; + private static final String WITH_NO_ARGUMENTS = " with no arguments. "; + private static final String SQL_DATA_SOURCE = "SQL DataSource <"; + + protected long connReqTimeout = 30L; + protected long dataReqTimeout = 100L; + + private final SQLExecutionMonitor monitor; + protected DataSource ds = null; + protected String connectionName = null; + protected boolean initialized = false; + + private long interval = 1000; + private long initialDelay = 5000; + private long expectedCompletionTime = 50L; + private boolean canTakeOffLine = true; + private long unprocessedFailoverThreshold = 3L; + + private long nextErrorReportTime = 0L; + + private String globalHostName = null; + + private boolean isDerby = false; + + public CachedDataSource(BaseDBConfiguration jdbcElem) throws DBConfigException { + configure(jdbcElem); + + if ("org.apache.derby.jdbc.EmbeddedDriver".equals(jdbcElem.getDriverName())) { + isDerby = true; + } + monitor = new SQLExecutionMonitor(this); + } + + protected abstract void configure(BaseDBConfiguration jdbcElem) throws DBConfigException; + + /* + * (non-Javadoc) + * + * @see javax.sql.DataSource#getConnection() + */ + @Override + public Connection getConnection() throws SQLException { + return ds.getConnection(); + } + + public CachedRowSet getData(String statement, List arguments) throws SQLException { + TestObject testObject = monitor.registerRequest(); + + try (Connection connection = this.getConnection()) { + if (connection == null) { + throw new SQLException("Connection invalid"); + } + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Obtained connection <{}>: {}", connectionName, connection); + } + return executePreparedStatement(connection, statement, arguments, true); + } finally { + monitor.deregisterRequest(testObject); + } + } + + public boolean writeData(String statement, List arguments) throws SQLException { + TestObject testObject = monitor.registerRequest(); + + try (Connection connection = this.getConnection()) { + if (connection == null) { + throw new SQLException("Connection invalid"); + } + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Obtained connection <{}>: {}", connectionName, connection); + } + return executeUpdatePreparedStatement(connection, statement, arguments, true); + } finally { + monitor.deregisterRequest(testObject); + } + } + + CachedRowSet executePreparedStatement(Connection conn, String statement, List arguments, boolean close) + throws SQLException { + long time = System.currentTimeMillis(); + + CachedRowSet data = null; + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("SQL Statement: {}", statement); + if (arguments != null && !arguments.isEmpty()) { + LOGGER.debug("Argunments: {}", arguments); + } + } + + ResultSet rs = null; + try (PreparedStatement ps = conn.prepareStatement(statement)) { + data = RowSetProvider.newFactory().createCachedRowSet(); + if (arguments != null) { + for (int i = 0, max = arguments.size(); i < max; i++) { + ps.setObject(i + 1, arguments.get(i)); + } + } + rs = ps.executeQuery(); + data.populate(rs); + // Point the rowset Cursor to the start + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("SQL SUCCESS. rows returned: {}, time(ms): {}", data.size(), + (System.currentTimeMillis() - time)); + } + } catch (SQLException exc) { + handleSqlExceptionForExecuteStatement(conn, statement, arguments, exc, time); + } finally { + handleFinallyBlockForExecutePreparedStatement(rs, conn, close); + } + + return data; + } + + private void handleSqlExceptionForExecuteStatement(Connection conn, String statement, List arguments, + SQLException exc, long time) throws SQLException { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(SQL_FAILURE + (System.currentTimeMillis() - time)); + } + try { + conn.rollback(); + } catch (Exception thr) { + LOGGER.error(thr.getLocalizedMessage(), thr); + } + if (arguments != null && !arguments.isEmpty()) { + LOGGER.error(String.format("<%s%s%s%s%s", connectionName, FAILED_TO_EXECUTE, statement, WITH_ARGUMENTS, + arguments), exc); + } else { + LOGGER.error(String.format("<%s%s%s%s", connectionName, FAILED_TO_EXECUTE, statement, WITH_NO_ARGUMENTS), + exc); + } + throw exc; + } + + private void handleFinallyBlockForExecutePreparedStatement(ResultSet rs, Connection conn, boolean close) { + try { + if (rs != null) { + rs.close(); + } + } catch (Exception exc) { + LOGGER.error(exc.getLocalizedMessage(), exc); + } + try { + if (conn != null && close) { + conn.close(); + } + } catch (Exception exc) { + LOGGER.error(exc.getLocalizedMessage(), exc); + } + } + + boolean executeUpdatePreparedStatement(Connection conn, String statement, List arguments, boolean close) + throws SQLException { + long time = System.currentTimeMillis(); + + CachedRowSet data; + + try (PreparedStatement ps = conn.prepareStatement(statement)) { + data = RowSetProvider.newFactory().createCachedRowSet(); + if (arguments != null) { + prepareStatementForExecuteUpdate(arguments, ps); + } + ps.executeUpdate(); + // Point the rowset Cursor to the start + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("SQL SUCCESS. rows returned: {}, time(ms): {}", data.size(), + (System.currentTimeMillis() - time)); + } + ps.close(); + } catch (SQLException exc) { + handleSqlExceptionForExecuteStatement(conn, statement, arguments, exc, time); + } finally { + try { + if (close) { + conn.close(); + } + } catch (Exception exc) { + LOGGER.error(exc.getLocalizedMessage(), exc); + } + } + + return true; + } + + private void prepareStatementForExecuteUpdate(List arguments, PreparedStatement ps) throws SQLException { + for (int i = 0, max = arguments.size(); i < max; i++) { + Object value = arguments.get(i); + if (value instanceof Blob) { + ps.setBlob(i + 1, (Blob) value); + } else if (value instanceof Timestamp) { + ps.setTimestamp(i + 1, (Timestamp) value); + } else if (value instanceof Integer) { + ps.setInt(i + 1, (Integer) value); + } else if (value instanceof Long) { + ps.setLong(i + 1, (Long) value); + } else if (value instanceof Date) { + ps.setDate(i + 1, (Date) value); + } else { + ps.setObject(i + 1, value); + } + } + } + + /* + * (non-Javadoc) + * + * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String) + */ + @Override + public Connection getConnection(String username, String password) throws SQLException { + return ds.getConnection(username, password); + } + + /* + * (non-Javadoc) + * + * @see javax.sql.DataSource#getLogWriter() + */ + @Override + public PrintWriter getLogWriter() throws SQLException { + return ds.getLogWriter(); + } + + /* + * (non-Javadoc) + * + * @see javax.sql.DataSource#getLoginTimeout() + */ + @Override + public int getLoginTimeout() throws SQLException { + return ds.getLoginTimeout(); + } + + /* + * (non-Javadoc) + * + * @see javax.sql.DataSource#setLogWriter(java.io.PrintWriter) + */ + @Override + public void setLogWriter(PrintWriter out) throws SQLException { + ds.setLogWriter(out); + } + + /* + * (non-Javadoc) + * + * @see javax.sql.DataSource#setLoginTimeout(int) + */ + @Override + public void setLoginTimeout(int seconds) throws SQLException { + ds.setLoginTimeout(seconds); + } + + @Override + public final String getDbConnectionName() { + return connectionName; + } + + protected final void setDbConnectionName(String name) { + this.connectionName = name; + } + + public void cleanUp() { + if (ds != null && ds instanceof Closeable) { + try { + ((Closeable) ds).close(); + } catch (IOException e) { + LOGGER.warn(e.getMessage()); + } + } + ds = null; + monitor.deleteObservers(); + monitor.cleanup(); + } + + public boolean isInitialized() { + return initialized; + } + + protected boolean testConnection() { + return testConnection(false); + } + + protected boolean testConnection(boolean errorLevel) { + ResultSet rs = null; + try (Connection conn = this.getConnection(); Statement stmt = conn.createStatement()) { + Boolean readOnly; + String hostname; + rs = stmt.executeQuery("SELECT @@global.read_only, @@global.hostname"); // ("SELECT 1 FROM DUAL"); //"select + // BANNER from SYS.V_$VERSION" + while (rs.next()) { + readOnly = rs.getBoolean(1); + hostname = rs.getString(2); + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(SQL_DATA_SOURCE + getDbConnectionName() + "> connected to " + hostname + + ", read-only is " + readOnly + ", tested successfully "); + } + } + } catch (Exception exc) { + if (errorLevel) { + LOGGER.error( + SQL_DATA_SOURCE + this.getDbConnectionName() + "> test failed. Cause : " + exc.getMessage()); + } else { + LOGGER.info( + SQL_DATA_SOURCE + this.getDbConnectionName() + "> test failed. Cause : " + exc.getMessage()); + } + return false; + } finally { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + LOGGER.error(e.getLocalizedMessage(), e); + } + } + } + return true; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + + @SuppressWarnings("deprecation") + public void setConnectionCachingEnabled(boolean state) { + // if(ds != null && ds instanceof OracleDataSource) + // try { + // ((OracleDataSource)ds).setConnectionCachingEnabled(true); + // } catch (SQLException exc) { + // LOGGER.warn("", exc); + // } + } + + public void addObserver(Observer observer) { + monitor.addObserver(observer); + } + + public void deleteObserver(Observer observer) { + monitor.deleteObserver(observer); + } + + @Override + public long getInterval() { + return interval; + } + + @Override + public long getInitialDelay() { + return initialDelay; + } + + @Override + public void setInterval(long value) { + interval = value; + } + + @Override + public void setInitialDelay(long value) { + initialDelay = value; + } + + @Override + public long getExpectedCompletionTime() { + return expectedCompletionTime; + } + + @Override + public void setExpectedCompletionTime(long value) { + expectedCompletionTime = value; + } + + @Override + public long getUnprocessedFailoverThreshold() { + return unprocessedFailoverThreshold; + } + + @Override + public void setUnprocessedFailoverThreshold(long value) { + this.unprocessedFailoverThreshold = value; + } + + public boolean canTakeOffLine() { + return canTakeOffLine; + } + + public void blockImmediateOffLine() { + canTakeOffLine = false; + final Thread offLineTimer = new Thread(() -> { + try { + Thread.sleep(30000L); + } catch (Exception exc) { + LOGGER.error(exc.getLocalizedMessage(), exc); + } finally { + canTakeOffLine = true; + } + }); + offLineTimer.setDaemon(true); + offLineTimer.start(); + } + + /** + * @return the monitor + */ + final SQLExecutionMonitor getMonitor() { + return monitor; + } + + protected boolean isSlave() throws PoolExhaustedException { + + // If using Apache derby, just return false + if (isDerby) { + return false; + } + CachedRowSet rs; + boolean isSlave; + String hostname = "UNDETERMINED"; + try { + boolean localSlave = true; + rs = this.getData("SELECT @@global.read_only, @@global.hostname", new ArrayList<>()); + while (rs.next()) { + localSlave = rs.getBoolean(1); + hostname = rs.getString(2); + } + isSlave = localSlave; + } catch (PoolExhaustedException peexc) { + throw peexc; + } catch (Exception e) { + LOGGER.error("", e); + isSlave = true; + } + if (isSlave) { + LOGGER.debug("SQL SLAVE : {} on server {}", connectionName, hostname); + } else { + LOGGER.debug("SQL MASTER : {} on server {}", connectionName, hostname); + } + return isSlave; + } + + public boolean isFabric() { + return false; + } + + protected boolean lockTable(Connection conn, String tableName) { + boolean retValue = false; + String query = "LOCK TABLES " + tableName + " WRITE"; + try (Statement preStmt = conn.createStatement(); + Statement lock = conn.prepareStatement(query); + ResultSet rs = preStmt.executeQuery("GETDATE()")) { + if (tableName != null) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Executing 'LOCK TABLES " + tableName + " WRITE' on connection " + conn.toString()); + if ("SVC_LOGIC".equals(tableName)) { + Exception e = new Exception(); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + LOGGER.debug(sw.toString()); + } + } + lock.execute(query); + retValue = true; + } + } catch (Exception exc) { + LOGGER.error("", exc); + retValue = false; + } + return retValue; + } + + protected boolean unlockTable(Connection conn) { + boolean retValue; + try (Statement lock = conn.createStatement()) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Executing 'UNLOCK TABLES' on connection {}", conn); + } + retValue = lock.execute("UNLOCK TABLES"); + } catch (Exception exc) { + LOGGER.error("", exc); + retValue = false; + } + return retValue; + } + + public void getPoolInfo(boolean allocation) { + + } + + public long getNextErrorReportTime() { + return nextErrorReportTime; + } + + public void setNextErrorReportTime(long nextTime) { + this.nextErrorReportTime = nextTime; + } + + public void setGlobalHostName(String hostname) { + this.globalHostName = hostname; + } + + public String getGlobalHostName() { + return globalHostName; + } } diff --git a/dblib/provider/src/main/resources/dblib.properties b/dblib/provider/src/main/resources/dblib.properties index 3e62308fc..e0399cc31 100755 --- a/dblib/provider/src/main/resources/dblib.properties +++ b/dblib/provider/src/main/resources/dblib.properties @@ -1,9 +1,10 @@ org.onap.ccsdk.sli.dbtype=jdbc org.onap.ccsdk.sli.jdbc.hosts=sdnctldb01,sdnctldb02 -org.onap.ccsdk.sli.jdbc.url=jdbc:mysql://DBHOST:3306/sdnctl +org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:sdnctl;create=true +org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver org.onap.ccsdk.sli.jdbc.database=sdnctl -org.onap.ccsdk.sli.jdbc.user={user for sdnctl} -org.onap.ccsdk.sli.jdbc.password={password for sdnctl} +org.onap.ccsdk.sli.jdbc.user=test +org.onap.ccsdk.sli.jdbc.password=test org.onap.ccsdk.sli.jdbc.connection.name=sdnctldb01 org.onap.ccsdk.sli.jdbc.connection.timeout=50 diff --git a/filters/features/ccsdk-filters/pom.xml b/filters/features/ccsdk-filters/pom.xml new file mode 100644 index 000000000..9b5c73bab --- /dev/null +++ b/filters/features/ccsdk-filters/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + single-feature-parent + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + ccsdk-filters + 0.2.1-SNAPSHOT + feature + + ccsdk-sli-core :: filters :: ${project.artifactId} + + + + + org.opendaylight.mdsal.model + mdsal-model-artifacts + 0.11.1 + pom + import + + + org.opendaylight.controller + mdsal-artifacts + 1.6.1 + pom + import + + + + + + org.opendaylight.controller + odl-mdsal-broker + xml + features + + + + ${project.groupId} + ccsdk-sli + ${project.version} + xml + features + + + + ${project.groupId} + filters-provider + ${project.version} + + + + diff --git a/filters/features/features-filters/pom.xml b/filters/features/features-filters/pom.xml new file mode 100644 index 000000000..5072971aa --- /dev/null +++ b/filters/features/features-filters/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + feature-repo-parent + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + features-filters + 0.2.1-SNAPSHOT + feature + + ccsdk-sli-core :: filters :: ${project.artifactId} + + + + ${project.groupId} + ccsdk-filters + ${project.version} + xml + features + + + + diff --git a/filters/features/pom.xml b/filters/features/pom.xml index 3662f3368..bf9868404 100755 --- a/filters/features/pom.xml +++ b/filters/features/pom.xml @@ -1,101 +1,22 @@ 4.0.0 + - filters - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + - filters-features - Filters - Features - - jar - - - - - - org.onap.ccsdk.sli.core - filters-provider - ${project.version} - - - + org.onap.ccsdk.sli.core + filters-features-aggregator + pom - - - - true - src/main/resources - - - - - org.apache.maven.plugins - maven-resources-plugin - - - filter - - resources - - generate-resources - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-artifacts - - attach-artifact - - package - - - - ${project.build.directory}/classes/${features.file} - xml - features - - - - - - - - + + features-filters + ccsdk-filters + diff --git a/filters/features/src/main/resources/features.xml b/filters/features/src/main/resources/features.xml deleted file mode 100644 index 7ede2083a..000000000 --- a/filters/features/src/main/resources/features.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - mvn:org.onap.ccsdk.sli.core/filters-provider/${project.version} - - - diff --git a/filters/installer/pom.xml b/filters/installer/pom.xml index a22e9ab72..a16b6a60c 100755 --- a/filters/installer/pom.xml +++ b/filters/installer/pom.xml @@ -1,18 +1,24 @@ 4.0.0 + - org.onap.ccsdk.sli.core - filters - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + + org.onap.ccsdk.sli.core filters-installer - Filters - Karaf Installer + 0.2.1-SNAPSHOT pom + ccsdk-sli-core :: filters :: ${project.artifactId} + - sdnc-filters - sdnc-filters + ccsdk-filters + ${application.name} mvn:org.onap.ccsdk.sli.core/filters-features/${project.version}/xml/features false @@ -21,10 +27,10 @@ org.onap.ccsdk.sli.core - filters-features + ${application.name} ${project.version} - features xml + features * @@ -134,5 +140,4 @@ - diff --git a/filters/pom.xml b/filters/pom.xml index 7780dcecb..b40d0d318 100644 --- a/filters/pom.xml +++ b/filters/pom.xml @@ -1,79 +1,26 @@ - - - - org.onap.ccsdk.sli.core - ccsdk-sli-core - 0.2.0-SNAPSHOT + + 4.0.0 + + + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + - 4.0.0 - pom - org.onap.ccsdk.sli.core - filters - - - Filters - Servlet filter to implement ECOMP logging spec - - 0.2.0-SNAPSHOT - - + org.onap.ccsdk.sli.core + filters + 0.2.1-SNAPSHOT + pom - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven.compile.plugin.version} - - ${java.version.source} - ${java.version.target} - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10 - - - - aggregate - - aggregate - - site - - - - - - - maven-source-plugin - 2.1.1 - - - bundle-sources - package - - - jar-no-fork - - - test-jar-no-fork - - - - - - - - - + ccsdk-sli-core :: filters + Servlet filter to implement ONAP logging spec + ONAP - + + provider features installer diff --git a/filters/provider/pom.xml b/filters/provider/pom.xml index 51d0c63aa..4fdd83280 100755 --- a/filters/provider/pom.xml +++ b/filters/provider/pom.xml @@ -1,82 +1,66 @@ - 4.0.0 - - org.onap.ccsdk.sli.core - filters - 0.2.0-SNAPSHOT - - filters-provider - bundle - Filters - Provider - http://maven.apache.org - - UTF-8 - - - - junit - junit - ${junit.version} - test - - - javax.servlet - javax.servlet-api - 3.0.1 - provided - + 4.0.0 + + org.onap.ccsdk.parent + binding-parent + 1.0.1-SNAPSHOT + + - - equinoxSDK381 - org.eclipse.osgi - ${equinox.osgi.version} - + org.onap.ccsdk.sli.core + filters-provider + 0.2.1-SNAPSHOT + bundle - - org.slf4j - slf4j-api - ${slf4j.version} - - - org.slf4j - jcl-over-slf4j - ${slf4j.version} - - - commons-codec - commons-codec - ${commons.codec.version} - - - org.onap.ccsdk.sli.core - sli-common - ${project.version} - + ccsdk-sli-core :: filters :: ${project.artifactId} + http://maven.apache.org - + + UTF-8 + - - - - org.apache.felix - maven-bundle-plugin - ${bundle.plugin.version} - true - - - org.onap.ccsdk.sli.core.filters - org.onap.ccsdk.sli.core.filters - org.onap.ccsdk.sli.core.filters - javax.servlet.*,java.io.*,org.osgi.framework.*,org.slf4j.*,org.apache.commons.codec.binary.* - true - - + + + junit + junit + ${junit.version} + test + + + javax.servlet + javax.servlet-api + - + + equinoxSDK381 + org.eclipse.osgi + ${equinox.osgi.version} + provided + - - + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + commons-codec + commons-codec + ${commons.codec.version} + + + org.onap.ccsdk.sli.core + sli-common + ${project.version} + + + diff --git a/pom.xml b/pom.xml index c7885a9b6..7ab4d4630 100755 --- a/pom.xml +++ b/pom.xml @@ -1,20 +1,34 @@ - - + 4.0.0 - pom + + + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + + org.onap.ccsdk.sli.core ccsdk-sli-core + 0.2.1-SNAPSHOT + pom ccsdk-sli-core - https://wiki.onap.org CCSDK core components contains the SLI, dblib + https://wiki.onap.org + + ONAP + - - org.onap.ccsdk.parent - odlparent-carbon-sr1 - 0.2.0-SNAPSHOT - + + utils + dblib + sli + filters + sliPluginUtils + sliapi + scm:git:ssh://git@${onap.git.host}/sdnc-code.git @@ -24,25 +38,6 @@ - - blackduck @@ -81,45 +76,4 @@ - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.17 - - false - - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 - true - - https://${onap.nexus.host} - ${onap.nexus.staging.profile-id} - ${onap.nexus.staging.server-id} - - - - - - - - utils - dblib - sli - filters - sliPluginUtils - sliapi - - - ONAP - - 0.2.0-SNAPSHOT - - diff --git a/sli/common/pom.xml b/sli/common/pom.xml index 4c7daa395..167a776e4 100755 --- a/sli/common/pom.xml +++ b/sli/common/pom.xml @@ -1,163 +1,136 @@ - - 4.0.0 - - sli - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT - - sli-common - bundle + + + 4.0.0 - SLI - Common Classes - The SLI Common package includes common classes used by the various SLI subcomponents, as well as classes used by clients to interface with the service logic interpreter + + org.onap.ccsdk.parent + binding-parent + 1.0.1-SNAPSHOT + + - - - junit - junit - ${junit.version} - test - - - ch.vorburger.mariaDB4j - mariaDB4j - 2.2.3 - test - - - org.antlr - antlr4 - ${antlr.version} - jar - compile - - - org.slf4j - slf4j-api - ${slf4j.version} - - - org.slf4j - slf4j-simple - 1.7.5 - compile - - - org.apache.commons - commons-lang3 - ${commons.lang3.version} - - - org.opendaylight.mdsal - yang-binding - ${odl.mdsal.yang.binding.version} - - - org.opendaylight.yangtools - yang-common - ${odl.yangtools.version} - - - org.opendaylight.mdsal.model - ietf-inet-types - ${odl.ietf-inet-types.version} - - - org.opendaylight.mdsal.model - ietf-yang-types - ${odl.ietf-yang-types.version} - - - org.opendaylight.controller - sal-core-api - ${odl.mdsal.version} - - - org.opendaylight.yangtools - yang-data-impl - ${odl.yangtools.version} - - - equinoxSDK381 - org.eclipse.osgi - ${equinox.osgi.version} - - - org.mariadb.jdbc - mariadb-java-client - ${mariadb.connector.version} - jar - compile - - - org.onap.ccsdk.sli.core - dblib-provider - ${sdnctl.dblib.version} - - - org.onap.ccsdk.sli.core - sliapi-model - ${project.version} - test - - + org.onap.ccsdk.sli.core + sli-common + 0.2.1-SNAPSHOT + bundle - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.7 - 1.7 - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - **/*.xsd - - - org.onap.ccsdk.sli.core.sli.SvcLogicParser - org.onap.ccsdk.sli.core.sli - true - - - - - - org.apache.felix - maven-bundle-plugin - true - - - org.onap.ccsdk.sli.core.sli;version=${project.version} - * - *;scope=compile;artifactId=commons-lang|commons-lang3 - true - - - - - org.antlr - antlr4-maven-plugin - ${antlr.version} - - - - ${project.basedir}/src/main/java/ - - antlr - - antlr4 - - - - - - + ccsdk-sli-core :: sli :: ${project.artifactId} + The SLI Common package includes common classes used by the various SLI subcomponents, as well as classes used by clients to interface with the service logic interpreter + + + + org.opendaylight.controller + mdsal-artifacts + 1.6.1 + pom + import + + + + + + ch.vorburger.mariaDB4j + mariaDB4j + 2.2.3 + test + + + org.antlr + antlr4 + ${antlr.version} + jar + compile + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-simple + 1.7.5 + compile + + + org.apache.commons + commons-lang3 + ${commons.lang3.version} + + + equinoxSDK381 + org.eclipse.osgi + ${equinox.osgi.version} + + + org.mariadb.jdbc + mariadb-java-client + ${mariadb.connector.version} + jar + compile + + + org.onap.ccsdk.sli.core + dblib-provider + ${sdnctl.dblib.version} + + + org.onap.ccsdk.sli.core + sli-model + ${project.version} + test + + + org.opendaylight.mdsal.model + ietf-inet-types + + + org.opendaylight.mdsal.model + ietf-yang-types + + + org.opendaylight.controller + sal-core-api + + + + org.opendaylight.controller + sal-binding-api + + + + + junit + junit + test + + + + org.mockito + mockito-core + test + + + + + + + org.antlr + antlr4-maven-plugin + ${antlr.version} + + + + ${project.basedir}/src/main/java/ + + antlr + + antlr4 + + + + + + diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicDblibStore.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicDblibStore.java index 74fa1dd66..ee3bcca5c 100644 --- a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicDblibStore.java +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicDblibStore.java @@ -54,10 +54,22 @@ public class SvcLogicDblibStore implements SvcLogicStore { private static final String DBLIB_SERVICE = "org.onap.ccsdk.sli.core.dblib.DbLibService"; + private DbLibService dbSvc; + + public SvcLogicDblibStore() + { + // Does nothing, but needed so that argumentless constructor + // still works. + } + + public SvcLogicDblibStore(DbLibService dbsvc) { + this.dbSvc = dbsvc; + } + @Override public void init(Properties props) throws ConfigurationException { - DbLibService dbSvc = getDbLibService(); + dbSvc = getDbLibService(); if(dbSvc == null) { LOG.error("SvcLogic cannot acquire DBLIB_SERVICE"); return; @@ -74,7 +86,7 @@ public class SvcLogicDblibStore implements SvcLogicStore { public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException { - DbLibService dbSvc = getDbLibService(); + boolean retval = false; CachedRowSet results = null; @@ -124,7 +136,6 @@ public class SvcLogicDblibStore implements SvcLogicStore { public SvcLogicGraph fetch(String module, String rpc, String version, String mode) throws SvcLogicException { - DbLibService dbSvc = getDbLibService(); PreparedStatement fetchGraphStmt = null; Connection dbConn = null; SvcLogicGraph retval = null; @@ -210,7 +221,7 @@ public class SvcLogicDblibStore implements SvcLogicStore { public void store(SvcLogicGraph graph) throws SvcLogicException { - DbLibService dbSvc = getDbLibService(); + String storeGraphSql = "INSERT INTO SVC_LOGIC (module, rpc, version, mode, active, graph)" + " VALUES(?, ?, ?, ?, ?, ?)"; @@ -283,7 +294,7 @@ public class SvcLogicDblibStore implements SvcLogicStore { public void delete(String module, String rpc, String version, String mode) throws SvcLogicException { - DbLibService dbSvc = getDbLibService(); + String deleteGraphSql = "DELETE FROM SVC_LOGIC WHERE module = ? AND rpc = ? AND version = ? AND mode = ?"; @@ -302,7 +313,7 @@ public class SvcLogicDblibStore implements SvcLogicStore { } public void activate(SvcLogicGraph graph) throws SvcLogicException { - DbLibService dbSvc = getDbLibService(); + String deactivateSql = "UPDATE SVC_LOGIC SET active = 'N' WHERE module = ? AND rpc = ? AND mode = ?"; @@ -328,8 +339,11 @@ public class SvcLogicDblibStore implements SvcLogicStore { private DbLibService getDbLibService() { + if (dbSvc != null) { + return dbSvc; + } + // Get DbLibService interface object. - DbLibService dblibSvc = null; ServiceReference sref = null; BundleContext bctx = null; @@ -345,8 +359,8 @@ public class SvcLogicDblibStore implements SvcLogicStore { if (sref == null) { LOG.warn("Could not find service reference for DBLIB service ({})", DBLIB_SERVICE); } else { - dblibSvc = (DbLibService) bctx.getService(sref); - if (dblibSvc == null) { + dbSvc = (DbLibService) bctx.getService(sref); + if (dbSvc == null) { LOG.warn("Could not find service reference for DBLIB service ({})", DBLIB_SERVICE); } @@ -385,16 +399,16 @@ public class SvcLogicDblibStore implements SvcLogicStore { } try { - dblibSvc = new DBResourceManager(dblibProps); - JavaSingleton.setInstance(dblibSvc); + dbSvc = new DBResourceManager(dblibProps); + JavaSingleton.setInstance(dbSvc); } catch (Exception e) { LOG.warn("Caught exception trying to create DBResourceManager", e); } } else { - dblibSvc = JavaSingleton.getInstance(); + dbSvc = JavaSingleton.getInstance(); } } - return dblibSvc; + return dbSvc; } @@ -419,7 +433,7 @@ public class SvcLogicDblibStore implements SvcLogicStore { @Override public void activate(String module, String rpc, String version, String mode) throws SvcLogicException { - DbLibService dbSvc = getDbLibService(); + String deactivateSql = "UPDATE SVC_LOGIC SET active = 'N' WHERE module = ? AND rpc = ? AND mode = ?"; diff --git a/sli/features/features-sli/pom.xml b/sli/features/features-sli/pom.xml new file mode 100644 index 000000000..de617baad --- /dev/null +++ b/sli/features/features-sli/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + feature-repo-parent + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + features-sli + 0.2.1-SNAPSHOT + feature + + ccsdk-sli-core :: sli :: ${project.artifactId} + + + + ${project.groupId} + ccsdk-sli + ${project.version} + xml + features + + + + diff --git a/sli/features/odl-sli/pom.xml b/sli/features/odl-sli/pom.xml new file mode 100644 index 000000000..907cef6a2 --- /dev/null +++ b/sli/features/odl-sli/pom.xml @@ -0,0 +1,86 @@ + + + + 4.0.0 + + + org.onap.ccsdk.parent + single-feature-parent + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + ccsdk-sli + 0.2.1-SNAPSHOT + feature + + ccsdk-sli-core :: sli :: ${project.artifactId} + + + + + org.opendaylight.mdsal.model + mdsal-model-artifacts + 0.11.1 + pom + import + + + org.opendaylight.controller + mdsal-artifacts + 1.6.1 + pom + import + + + + + + org.onap.ccsdk.sli.core + sli-common + ${project.version} + + + + org.onap.ccsdk.sli.core + sli-provider + ${project.version} + + + + org.onap.ccsdk.sli.core + sli-recording + ${project.version} + + + + org.mariadb.jdbc + mariadb-java-client + ${mariadb.connector.version} + + + + org.onap.ccsdk.sli.core + ccsdk-dblib + ${project.version} + xml + features + + + org.opendaylight.controller + odl-mdsal-broker + xml + features + + + equinoxSDK381 + org.eclipse.osgi + ${equinox.osgi.version} + provided + + + diff --git a/sli/features/pom.xml b/sli/features/pom.xml old mode 100755 new mode 100644 index 4630b7833..fbb864efa --- a/sli/features/pom.xml +++ b/sli/features/pom.xml @@ -1,137 +1,30 @@ - - 4.0.0 - - sli - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT - - sli-features - SLI - Features - - jar - - - - org.onap.ccsdk.sli.core - sli-common - ${project.version} - - - - - org.onap.ccsdk.sli.core - sli-recording - ${project.version} - - - commons-lang - commons-lang - ${commons.lang.version} - compile - - - - org.opendaylight.mdsal - features-mdsal - ${odl.mdsal.features.version} - features - xml - - runtime - - + - - - - - org.opendaylight.odlparent - features-test - ${odl.commons.opendaylight.version} - test - - - - org.opendaylight.yangtools - features-yangtools - ${odl.yangtools.version} - features - xml - runtime - - - - - - - true - src/main/resources - - - - - org.apache.maven.plugins - maven-resources-plugin - - - filter - - resources - - generate-resources - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-artifacts - - attach-artifact - - package - - - - ${project.build.directory}/classes/${features.file} - xml - features - - - - - - - - +This program and the accompanying materials are made available under the +terms of the Eclipse Public License v1.0 which accompanies this distribution, +and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL +--> + + 4.0.0 + + + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + sli-feature-aggregator + 0.1.0 + pom + + ccsdk-sli-core :: sli :: ${project.artifactId} + + + features-sli + odl-sli + diff --git a/sli/features/src/main/resources/features.xml b/sli/features/src/main/resources/features.xml deleted file mode 100644 index 1f17c1a95..000000000 --- a/sli/features/src/main/resources/features.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features - - - - - odl-mdsal-broker - mvn:org.onap.ccsdk.sli.core/sli-common/${project.version} - mvn:org.onap.ccsdk.sli.core/sli-provider/${project.version} - mvn:org.onap.ccsdk.sli.core/sli-recording/${project.version} - sdnc-dblib - mvn:org.mariadb.jdbc/mariadb-java-client/${mariadb.connector.version} - - - diff --git a/sli/installer/pom.xml b/sli/installer/pom.xml index 23b747130..ec2b43cff 100755 --- a/sli/installer/pom.xml +++ b/sli/installer/pom.xml @@ -1,19 +1,25 @@ 4.0.0 + - sli - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + + org.onap.ccsdk.sli.core sli-installer - SLI - Karaf Installer + 0.2.1-SNAPSHOT pom + ccsdk-sli-core :: sli :: ${project.artifactId} + - sdnc-sli - sdnc-sli - mvn:org.onap.ccsdk.sli.core/sli-features/${project.version}/xml/features + ccsdk-sli + ${application.name} + mvn:org.onap.ccsdk.sli.core/${features.boot}/${project.version}/xml/features false @@ -21,10 +27,10 @@ org.onap.ccsdk.sli.core - sli-features + ${application.name} ${project.version} - features xml + features * @@ -145,5 +151,4 @@ - diff --git a/sli/model/pom.xml b/sli/model/pom.xml index 59658a3e1..3a78c4788 100755 --- a/sli/model/pom.xml +++ b/sli/model/pom.xml @@ -1,82 +1,29 @@ 4.0.0 + - sli - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + binding-parent + 1.0.1-SNAPSHOT + + + org.onap.ccsdk.sli.core sli-model + 0.2.1-SNAPSHOT bundle - SLI - Model - - - - org.apache.felix - maven-bundle-plugin - true - - - * - - - - - org.opendaylight.yangtools - yang-maven-plugin - ${odl.yangtools.yang.maven.plugin.version} - - - org.opendaylight.mdsal - maven-sal-api-gen-plugin - ${odl.sal.api.gen.plugin.version} - jar - - - - - - generate-sources - - - ${yang.file.directory} - - - - org.opendaylight.mdsal.binding.maven.api.gen.plugin.CodeGeneratorImpl - ${salGeneratorPath} - - - true - - - - - - + ccsdk-sli-core :: sli :: ${project.artifactId} + - - org.opendaylight.mdsal - yang-binding - ${odl.mdsal.yang.binding.version} - - - org.opendaylight.yangtools - yang-common - ${odl.yangtools.version} - - - org.opendaylight.mdsal.model - ietf-inet-types - ${odl.ietf-inet-types.version} - - - org.opendaylight.mdsal.model - ietf-yang-types - ${odl.ietf-yang-types.version} - + + org.opendaylight.mdsal.model + ietf-inet-types + + + org.opendaylight.mdsal.model + ietf-yang-types + diff --git a/sli/pom.xml b/sli/pom.xml index 95417c3c8..985fa1d3e 100755 --- a/sli/pom.xml +++ b/sli/pom.xml @@ -1,53 +1,24 @@ - - + + 4.0.0 - org.onap.ccsdk.sli.core - ccsdk-sli-core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + - 4.0.0 - pom + org.onap.ccsdk.sli.core sli + 0.2.1-SNAPSHOT + pom - - - - - org.onap.ccsdk.sli.core - sli-features - features - xml - ${project.version} - - - - org.onap.ccsdk.sli.core - sli-common - ${project.version} - - - - org.onap.ccsdk.sli.core - sli-provider - ${project.version} - - - - org.onap.ccsdk.sli.core - sli-recording - ${project.version} - - - - - - - - Service Logic Interpreter + ccsdk-sli-core :: sli The Service Logic Interpreter (SLI) allows service planners to design the flow of logic within the SDN controller in an XML format, without a need for custom Java code. + + ONAP + model @@ -57,10 +28,4 @@ features installer - - ONAP - - 0.2.0-SNAPSHOT - - diff --git a/sli/provider/pom.xml b/sli/provider/pom.xml index 4f410ab01..4a90ae005 100755 --- a/sli/provider/pom.xml +++ b/sli/provider/pom.xml @@ -1,25 +1,38 @@ - - 4.0.0 - - org.onap.ccsdk.sli.core - sli - 0.2.0-SNAPSHOT + + 4.0.0 + + + org.onap.ccsdk.parent + binding-parent + 1.0.1-SNAPSHOT + - sli-provider - bundle - SLI - Provider - + + org.onap.ccsdk.sli.core + sli-provider + 0.2.1-SNAPSHOT + bundle + + ccsdk-sli-core :: sli :: ${project.artifactId} + SLI Provider is the OSGi bundle that exposes the service logic interpreter as a service. + + UTF-8 - - - junit - junit - ${junit.version} - test - + + + + + org.opendaylight.controller + mdsal-artifacts + 1.6.1 + pom + import + + + + ch.vorburger.mariaDB4j mariaDB4j @@ -60,129 +73,24 @@ compile - - - - - - - - org.apache.felix - maven-bundle-plugin - ${bundle.plugin.version} - true - - - org.onap.ccsdk.sli.core.sli.provider.SvcLogicActivator - org.onap.ccsdk.sli.core.sli.provider;version=${project.version} - - * + + org.opendaylight.controller + sal-binding-api + - org.onap.ccsdk.sli.core.sli;version="${project.version}",* + + + junit + junit + test + - *;scope=compile;artifactId=commons-lang|commons-lang3 + + org.mockito + mockito-core + test + - true - - - - - - org.opendaylight.yangtools - yang-maven-plugin - ${odl.yangtools.yang.maven.plugin.version} - - - config - - generate-sources - - - src/test/resources - - - - org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator - - ${jmxGeneratorPath} - - - urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang - - - - - - org.opendaylight.mdsal.binding.maven.api.gen.plugin.CodeGeneratorImpl - - ${salGeneratorPath} - - - true - - - - - - org.opendaylight.mdsal - maven-sal-api-gen-plugin - ${odl.sal.api.gen.plugin.version} - jar - - - org.opendaylight.controller - yang-jmx-generator-plugin - ${odl.yang.jmx.generator.version} - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - 1.8 - - - prepare-package - - run - - - - - - - - - - - - - - - - - - SLI Provider is the OSGi bundle that exposes the service logic interpreter as a service. + diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/CallNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/CallNodeExecutor.java index d11a2828d..24774af24 100644 --- a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/CallNodeExecutor.java +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/CallNodeExecutor.java @@ -8,9 +8,9 @@ * 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. @@ -34,15 +34,15 @@ public class CallNodeExecutor extends SvcLogicNodeExecutor { private static final Logger LOG = LoggerFactory .getLogger(CallNodeExecutor.class); - + @Override public SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException { String outValue = "not-found"; - + SvcLogicGraph myGraph = node.getGraph(); - + if (myGraph == null) { LOG.debug("execute: getGraph returned null"); @@ -51,17 +51,17 @@ public class CallNodeExecutor extends SvcLogicNodeExecutor { { LOG.debug("execute: got SvcLogicGraph"); } - + SvcLogicExpression moduleExpr = null; - + String module = null; - + moduleExpr = node.getAttribute("module"); if (moduleExpr != null) { module = SvcLogicExpressionResolver.evaluate(moduleExpr, node, ctx); } - + if ((module == null) || (module.length() == 0)) { if (myGraph != null) @@ -70,7 +70,7 @@ public class CallNodeExecutor extends SvcLogicNodeExecutor { LOG.debug("myGraph.getModule() returned "+module); } } - + SvcLogicExpression rpcExpr = null; String rpc = null; rpcExpr = node.getAttribute("rpc"); @@ -78,7 +78,7 @@ public class CallNodeExecutor extends SvcLogicNodeExecutor { { rpc = SvcLogicExpressionResolver.evaluate(rpcExpr, node, ctx); } - + if ((rpc == null) || (rpc.length() == 0)) { if (myGraph != null) @@ -87,9 +87,9 @@ public class CallNodeExecutor extends SvcLogicNodeExecutor { LOG.debug("myGraph.getRpc() returned "+rpc); } } - + String mode = null; - + moduleExpr = node.getAttribute("mode"); if (moduleExpr != null) { @@ -105,9 +105,9 @@ public class CallNodeExecutor extends SvcLogicNodeExecutor { LOG.debug("myGraph.getMode() returned "+mode); } } - + String version = null; - + moduleExpr = node.getAttribute("version"); if (moduleExpr != null) { @@ -116,9 +116,9 @@ public class CallNodeExecutor extends SvcLogicNodeExecutor { String parentGraph = ctx.getAttribute("currentGraph"); ctx.setAttribute("parentGraph", parentGraph); - - SvcLogicStore store = getStore(); - + + SvcLogicStore store = svc.getStore(); + if (store != null) { SvcLogicGraph calledGraph = store.fetch(module, rpc, version, mode); if (calledGraph != null) { @@ -132,7 +132,7 @@ public class CallNodeExecutor extends SvcLogicNodeExecutor { } else { LOG.debug("Could not get SvcLogicStore reference"); } - + SvcLogicNode nextNode = node.getOutcomeValue(outValue); if (nextNode != null) { if (LOG.isDebugEnabled()) { diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicActivator.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicActivator.java deleted file mode 100644 index 95dfb2b88..000000000 --- a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicActivator.java +++ /dev/null @@ -1,181 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 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.ccsdk.sli.core.sli.provider; - -import java.io.File; -import java.io.FileInputStream; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.LinkedList; -import java.util.Map; -import java.util.Properties; -import org.onap.ccsdk.sli.core.sli.ConfigurationException; -import org.onap.ccsdk.sli.core.sli.SvcLogicAdaptor; -import org.onap.ccsdk.sli.core.sli.SvcLogicException; -import org.onap.ccsdk.sli.core.sli.SvcLogicStore; -import org.onap.ccsdk.sli.core.sli.SvcLogicStoreFactory; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.framework.ServiceRegistration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class SvcLogicActivator implements BundleActivator { - - private static final String SVCLOGIC_PROP_VAR = "SDNC_SLI_PROPERTIES"; - private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; - - private static final Map BUILTIN_NODES = new HashMap() { - { - put("block", new BlockNodeExecutor()); - put("call", new CallNodeExecutor()); - put("configure", new ConfigureNodeExecutor()); - put("delete", new DeleteNodeExecutor()); - put("execute", new ExecuteNodeExecutor()); - put("exists", new ExistsNodeExecutor()); - put("for", new ForNodeExecutor()); - put("get-resource", new GetResourceNodeExecutor()); - put("is-available", new IsAvailableNodeExecutor()); - put("notify", new NotifyNodeExecutor()); - put("record", new RecordNodeExecutor()); - put("release", new ReleaseNodeExecutor()); - put("reserve", new ReserveNodeExecutor()); - put("return", new ReturnNodeExecutor()); - put("save", new SaveNodeExecutor()); - put("set", new SetNodeExecutor()); - put("switch", new SwitchNodeExecutor()); - put("update", new UpdateNodeExecutor()); - put("break", new BreakNodeExecutor()); - put("while", new WhileNodeExecutor()); - } - }; - - private static final Logger LOG = LoggerFactory.getLogger(SvcLogicActivator.class); - - private static LinkedList registrations = new LinkedList<>(); - - private static HashMap adaptorMap; - - private static Properties props; - - private static BundleContext bundleCtx; - - private static SvcLogicService svcLogicServiceImpl; - - @Override - public void start(BundleContext ctx) throws Exception { - - LOG.info("Activating SLI"); - - synchronized (SvcLogicActivator.class) { - bundleCtx = ctx; - props = new Properties(); - } - - // Read properties - String propPath = System.getenv(SVCLOGIC_PROP_VAR); - - if (propPath == null) { - String propDir = System.getenv(SDNC_CONFIG_DIR); - if (propDir == null) { - - propDir = "/opt/sdnc/data/properties"; - } - propPath = propDir + "/svclogic.properties"; - LOG.warn("Environment variable {} unset - defaulting to {}", SVCLOGIC_PROP_VAR, propPath); - } - - File propFile = new File(propPath); - - if (!propFile.exists()) { - throw new ConfigurationException("Missing configuration properties file : " + propFile); - } - - try { - props.load(new FileInputStream(propFile)); - } catch (Exception e) { - throw new ConfigurationException("Could not load properties file " + propPath, e); - - } - - synchronized (SvcLogicActivator.class) { - if (registrations == null) { - registrations = new LinkedList<>(); - } - // Advertise SvcLogicService - svcLogicServiceImpl = new SvcLogicServiceImpl(); - } - - LOG.info("SLI: Registering service {} in bundle {}", SvcLogicService.NAME, ctx.getBundle().getSymbolicName()); - ServiceRegistration reg = ctx.registerService(SvcLogicService.NAME, svcLogicServiceImpl, null); - registrations.add(reg); - - // Initialize SvcLogicStore - try { - SvcLogicStore store = getStore(); - } catch (ConfigurationException e) { - LOG.warn("Could not initialize SvcLogicScore", e); - } - - LOG.info("SLI - done registering services"); - } - - @Override - public void stop(BundleContext ctx) throws Exception { - - if (registrations != null) { - for (ServiceRegistration reg : registrations) { - ServiceReference regRef = reg.getReference(); - reg.unregister(); - } - synchronized (SvcLogicActivator.class) { - registrations = null; - } - } - } - - public static SvcLogicStore getStore() throws SvcLogicException { - // Create and initialize SvcLogicStore object - used to access - // saved service logic. - - SvcLogicStore store; - - try { - store = SvcLogicStoreFactory.getSvcLogicStore(props); - } catch (Exception e) { - throw new ConfigurationException("Could not get service logic store", e); - - } - - try { - store.init(props); - } catch (Exception e) { - throw new ConfigurationException("Could not get service logic store", e); - } - - return(store); - } - - -} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicNodeExecutor.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicNodeExecutor.java index 43296c6cd..951536b50 100644 --- a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicNodeExecutor.java +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicNodeExecutor.java @@ -8,9 +8,9 @@ * 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. @@ -36,7 +36,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class SvcLogicNodeExecutor { - + public abstract SvcLogicNode execute(SvcLogicServiceImpl svc, SvcLogicNode node, SvcLogicContext ctx) throws SvcLogicException; private static final Logger LOG = LoggerFactory.getLogger(SvcLogicNodeExecutor.class); @@ -51,15 +51,12 @@ public abstract class SvcLogicNodeExecutor { node, ctx)); } - - protected SvcLogicStore getStore() throws SvcLogicException { - return SvcLogicActivator.getStore(); - } - + + protected SvcLogicAdaptor getAdaptor(String adaptorName) { return SvcLogicAdaptorFactory.getInstance(adaptorName); } - + protected SvcLogicResource getSvcLogicResource(String plugin) { BundleContext bctx = FrameworkUtil.getBundle(this.getClass()) .getBundleContext(); @@ -75,7 +72,7 @@ public abstract class SvcLogicNodeExecutor { return null; } } - + protected SvcLogicRecorder getSvcLogicRecorder(String plugin) { BundleContext bctx = FrameworkUtil.getBundle(this.getClass()) .getBundleContext(); @@ -90,7 +87,7 @@ public abstract class SvcLogicNodeExecutor { return null; } } - + protected SvcLogicJavaPlugin getSvcLogicJavaPlugin(String pluginName){ BundleContext bctx = FrameworkUtil.getBundle(this.getClass()) .getBundleContext(); @@ -106,5 +103,5 @@ public abstract class SvcLogicNodeExecutor { return plugin; } } - + } diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicPropertiesProvider.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicPropertiesProvider.java new file mode 100644 index 000000000..6e8597210 --- /dev/null +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicPropertiesProvider.java @@ -0,0 +1,188 @@ +/*- + * ============LICENSE_START======================================================= + * onap + * ================================================================================ + * Copyright (C) 2016 - 2017 ONAP + * ================================================================================ + * 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.ccsdk.sli.core.sli.provider; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Optional; +import java.util.Properties; +import java.util.Vector; + +import org.onap.ccsdk.sli.core.dblib.DblibConfigurationException; +import org.onap.ccsdk.sli.core.sli.ConfigurationException; +import org.onap.ccsdk.sli.core.utils.JREFileResolver; +import org.onap.ccsdk.sli.core.utils.KarafRootFileResolver; +import org.onap.ccsdk.sli.core.utils.PropertiesFileResolver; +import org.onap.ccsdk.sli.core.utils.common.CoreDefaultFileResolver; +import org.onap.ccsdk.sli.core.utils.common.SdncConfigEnvVarFileResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Responsible for determining the properties file to use and instantiating the + * DBResourceManager Service. The priority for properties file + * resolution is as follows: + * + *
    + *
  1. A directory identified by the system environment variable + * SDNC_CONFIG_DIR
  2. + *
  3. The default directory DEFAULT_DBLIB_PROP_DIR
  4. + *
  5. A directory identified by the JRE argument + * dblib.properties
  6. + *
  7. A dblib.properties file located in the karaf root + * directory
  8. + *
+ */ +public class SvcLogicPropertiesProvider { + + private static final Logger LOG = LoggerFactory.getLogger(SvcLogicPropertiesProvider.class); + + /** + * The name of the properties file for database configuration + */ + private static final String SVCLOGIC_PROP_FILE_NAME = "svclogic.properties"; + + /** + * A prioritized list of strategies for resolving dblib properties files. + */ + private Vector sliPropertiesFileResolvers = new Vector<>(); + + /** + * The configuration properties for the db connection. + */ + private Properties properties; + + /** + * Set up the prioritized list of strategies for resolving dblib properties + * files. + */ + public SvcLogicPropertiesProvider() { + sliPropertiesFileResolvers + .add(new SdncConfigEnvVarFileResolver("Using property file (1) from environment variable")); + sliPropertiesFileResolvers.add(new CoreDefaultFileResolver("Using property file (2) from default directory")); + + sliPropertiesFileResolvers.add( + new JREFileResolver("Using property file (3) from JRE argument", SvcLogicPropertiesProvider.class)); + sliPropertiesFileResolvers.add(new KarafRootFileResolver("Using property file (4) from karaf root", this)); + + // determines properties file as according to the priority described in the + // class header comment + final File propertiesFile = determinePropertiesFile(this); + if (propertiesFile != null) { + try (FileInputStream fileInputStream = new FileInputStream(propertiesFile)) { + properties = new Properties(); + properties.load(fileInputStream); + } catch (final IOException e) { + LOG.error("Failed to load properties for file: {}", propertiesFile.toString(), + new ConfigurationException("Failed to load properties for file: " + propertiesFile.toString(), + e)); + } + } else { + // Try to read properties as resource + + InputStream propStr = getClass().getResourceAsStream("/" + SVCLOGIC_PROP_FILE_NAME); + if (propStr != null) { + properties = new Properties(); + try { + properties.load(propStr); + propStr.close(); + } catch (IOException e) { + properties = null; + } + } + + } + + if (properties == null) { + reportFailure("Missing configuration properties resource(3)", new ConfigurationException( + "Missing configuration properties resource(3): " + SVCLOGIC_PROP_FILE_NAME)); + } + } + + /** + * Extract svclogic config properties. + * + * @return the svclogic config properties + */ + public Properties getProperties() { + return properties; + } + + /** + * Reports the method chosen for properties resolution to the + * Logger. + * + * @param message + * Some user friendly message + * @param fileOptional + * The file location of the chosen properties file + * @return the file location of the chosen properties file + */ + private static File reportSuccess(final String message, final Optional fileOptional) { + if (fileOptional.isPresent()) { + final File file = fileOptional.get(); + LOG.info("{} {}", message, file.getPath()); + return file; + } + return null; + } + + /** + * Reports fatal errors. This is the case in which no properties file could be + * found. + * + * @param message + * An appropriate fatal error message + * @param configurationException + * An exception describing what went wrong during resolution + */ + private static void reportFailure(final String message, final ConfigurationException configurationException) { + + LOG.error("{}", message, configurationException); + } + + /** + * Determines the dblib properties file to use based on the following priority: + *
    + *
  1. A directory identified by the system environment variable + * SDNC_CONFIG_DIR
  2. + *
  3. The default directory DEFAULT_DBLIB_PROP_DIR
  4. + *
  5. A directory identified by the JRE argument + * dblib.properties
  6. + *
  7. A dblib.properties file located in the karaf root + * directory
  8. + *
+ */ + File determinePropertiesFile(final SvcLogicPropertiesProvider resourceProvider) { + + for (final PropertiesFileResolver sliPropertiesFileResolver : sliPropertiesFileResolvers) { + final Optional fileOptional = sliPropertiesFileResolver.resolveFile(SVCLOGIC_PROP_FILE_NAME); + if (fileOptional.isPresent()) { + return reportSuccess(sliPropertiesFileResolver.getSuccessfulResolutionMessage(), fileOptional); + } + } + + return null; + } +} diff --git a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicServiceImpl.java b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicServiceImpl.java index 5f4d3653e..53875b35a 100644 --- a/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicServiceImpl.java +++ b/sli/provider/src/main/java/org/onap/ccsdk/sli/core/sli/provider/SvcLogicServiceImpl.java @@ -8,9 +8,9 @@ * 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. @@ -24,12 +24,16 @@ package org.onap.ccsdk.sli.core.sli.provider; import java.util.HashMap; import java.util.Properties; +import org.onap.ccsdk.sli.core.dblib.DbLibService; +import org.onap.ccsdk.sli.core.sli.ConfigurationException; import org.onap.ccsdk.sli.core.sli.MetricLogger; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicDblibStore; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicGraph; import org.onap.ccsdk.sli.core.sli.SvcLogicNode; import org.onap.ccsdk.sli.core.sli.SvcLogicStore; +import org.onap.ccsdk.sli.core.sli.SvcLogicStoreFactory; import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; @@ -51,6 +55,25 @@ public class SvcLogicServiceImpl implements SvcLogicService { private BundleContext bctx = null; + private Properties properties; + + private SvcLogicStore store; + + public SvcLogicServiceImpl(SvcLogicPropertiesProvider resourceProvider) throws SvcLogicException{ + + properties = resourceProvider.getProperties(); + + getStore(); + } + + public SvcLogicServiceImpl(SvcLogicPropertiesProvider resourceProvider, DbLibService dbSvc) throws SvcLogicException{ + + properties = resourceProvider.getProperties(); + store = new SvcLogicDblibStore(dbSvc); +} + + + private void registerExecutors() { LOG.info("Entered register executors"); @@ -210,8 +233,6 @@ public class SvcLogicServiceImpl implements SvcLogicService { @Override public boolean hasGraph(String module, String rpc, String version, String mode) throws SvcLogicException { - SvcLogicStore store = SvcLogicActivator.getStore(); - return (store.hasGraph(module, rpc, version, mode)); } @@ -226,8 +247,6 @@ public class SvcLogicServiceImpl implements SvcLogicService { public Properties execute(String module, String rpc, String version, String mode, Properties props, DOMDataBroker domDataBroker) throws SvcLogicException { - // See if there is a service logic defined - SvcLogicStore store = SvcLogicActivator.getStore(); LOG.info("Fetching service logic from data store"); SvcLogicGraph graph = store.fetch(module, rpc, version, mode); @@ -249,4 +268,28 @@ public class SvcLogicServiceImpl implements SvcLogicService { return(ctx.toProperties()); } + + public SvcLogicStore getStore() throws SvcLogicException { + // Create and initialize SvcLogicStore object - used to access + // saved service logic. + + if (store != null) { + return store; + } + + try { + store = SvcLogicStoreFactory.getSvcLogicStore(properties); + } catch (Exception e) { + throw new ConfigurationException("Could not get service logic store", e); + + } + + try { + store.init(properties); + } catch (SvcLogicException e) { + throw new ConfigurationException("Could not get service logic store", e); + } + + return store; + } } diff --git a/sli/provider/src/main/resources/org/opendaylight/blueprint/sli-blueprint.xml b/sli/provider/src/main/resources/org/opendaylight/blueprint/sli-blueprint.xml new file mode 100755 index 000000000..829057426 --- /dev/null +++ b/sli/provider/src/main/resources/org/opendaylight/blueprint/sli-blueprint.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + org.onap.ccsdk.sli.core.sli.provider.SvcLogicService + + + + \ No newline at end of file diff --git a/sli/provider/src/main/resources/svclogic.properties b/sli/provider/src/main/resources/svclogic.properties new file mode 100644 index 000000000..49d39ab40 --- /dev/null +++ b/sli/provider/src/main/resources/svclogic.properties @@ -0,0 +1,25 @@ +### +# ============LICENSE_START======================================================= +# ONAP : CCSDK +# ================================================================================ +# Copyright (C) 2017 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========================================================= +### + +org.onap.ccsdk.sli.dbtype = dblib +org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:sdnctl;create=true +org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver +org.onap.ccsdk.sli.jdbc.database = sdnctl diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutorTest.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutorTest.java index 48e49f812..eccbfc9e8 100644 --- a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutorTest.java +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ExecuteNodeExecutorTest.java @@ -8,9 +8,9 @@ * 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. @@ -53,7 +53,8 @@ public class ExecuteNodeExecutorTest extends TestCase { MockExecuteNodeExecutor execute = new MockExecuteNodeExecutor(); SvcLogicNode node = new SvcLogicNode(0, "", "", new SvcLogicGraph()); node.setAttribute("method", "selectLunch"); - execute.execute(new SvcLogicServiceImpl(), new SvcLogicNode(0, "", "", new SvcLogicGraph()), new SvcLogicContext()); + SvcLogicPropertiesProvider resourceProvider = new SvcLogicPropertiesProvider(); + execute.execute(new SvcLogicServiceImpl(resourceProvider), new SvcLogicNode(0, "", "", new SvcLogicGraph()), new SvcLogicContext()); } } diff --git a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ITCaseSvcLogicGraphExecutor.java b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ITCaseSvcLogicGraphExecutor.java index 724e946d5..18f044b30 100644 --- a/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ITCaseSvcLogicGraphExecutor.java +++ b/sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ITCaseSvcLogicGraphExecutor.java @@ -102,8 +102,8 @@ public class ITCaseSvcLogicGraphExecutor { SvcLogicParser parser = new SvcLogicParser(); // Loop through executor tests - - SvcLogicServiceImpl svc = new SvcLogicServiceImpl(); + SvcLogicPropertiesProvider resourceProvider = new SvcLogicPropertiesProvider(); + SvcLogicServiceImpl svc = new SvcLogicServiceImpl(resourceProvider); for (String nodeType : BUILTIN_NODES.keySet()) { LOG.info("SLI - registering node executor for node type " + nodeType); @@ -156,8 +156,9 @@ public class ITCaseSvcLogicGraphExecutor { SvcLogicParser parser = new SvcLogicParser(); // Loop through executor tests + SvcLogicPropertiesProvider resourceProvider = new SvcLogicPropertiesProvider(); - SvcLogicServiceImpl svc = new SvcLogicServiceImpl(); + SvcLogicServiceImpl svc = new SvcLogicServiceImpl(resourceProvider); for (String nodeType : BUILTIN_NODES.keySet()) { diff --git a/sli/provider/src/test/resources/svclogic.properties b/sli/provider/src/test/resources/svclogic.properties index 25eb3bd47..49d39ab40 100644 --- a/sli/provider/src/test/resources/svclogic.properties +++ b/sli/provider/src/test/resources/svclogic.properties @@ -8,9 +8,9 @@ # 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. @@ -19,8 +19,7 @@ # ============LICENSE_END========================================================= ### -org.onap.ccsdk.sli.dbtype = jdbc -org.onap.ccsdk.sli.jdbc.url = jdbc:mysql://localhost:3306/sdnctl +org.onap.ccsdk.sli.dbtype = dblib +org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:sdnctl;create=true +org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver org.onap.ccsdk.sli.jdbc.database = sdnctl -org.onap.ccsdk.sli.jdbc.user = sdnctl -org.onap.ccsdk.sli.jdbc.password = gamma diff --git a/sli/recording/pom.xml b/sli/recording/pom.xml index b571cfbb9..e8b136fdd 100755 --- a/sli/recording/pom.xml +++ b/sli/recording/pom.xml @@ -1,24 +1,38 @@ 4.0.0 + - org.onap.ccsdk.sli.core - sli - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + binding-parent + 1.0.1-SNAPSHOT + + + org.onap.ccsdk.sli.core sli-recording + 0.2.1-SNAPSHOT bundle - SLI - Recording + + ccsdk-sli-core :: sli :: ${project.artifactId} + SLI Recording is an OSGi bundle that implements recording service for the service logic record node. + UTF-8 + + + + + org.opendaylight.controller + mdsal-artifacts + 1.6.1 + pom + import + + + - - junit - junit - ${junit.version} - test - org.onap.ccsdk.sli.core sli-common @@ -48,28 +62,23 @@ compile - - - - - - org.apache.felix - maven-bundle-plugin - ${bundle.plugin.version} - true - - - org.onap.ccsdk.sli.core.sli.recording;version=${project.version} - true - - - - + + org.opendaylight.controller + sal-binding-api + - + + + junit + junit + test + + + org.mockito + mockito-core + test + - - - SLI Recording is an OSGi bundle that implements recording service for the service logic record node. + diff --git a/sliPluginUtils/features/ccsdk-sliPluginUtils/pom.xml b/sliPluginUtils/features/ccsdk-sliPluginUtils/pom.xml new file mode 100644 index 000000000..8ea5ca86e --- /dev/null +++ b/sliPluginUtils/features/ccsdk-sliPluginUtils/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + single-feature-parent + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + ccsdk-sliPluginUtils + 0.2.1-SNAPSHOT + feature + + ccsdk-sli-core :: sliPluginUtils :: ${project.artifactId} + + + + + org.opendaylight.mdsal.model + mdsal-model-artifacts + 0.11.1 + pom + import + + + org.opendaylight.controller + mdsal-artifacts + 1.6.1 + pom + import + + + + + + org.opendaylight.controller + odl-mdsal-broker + xml + features + + + + ${project.groupId} + ccsdk-sli + ${project.version} + xml + features + + + + ${project.groupId} + sliPluginUtils-provider + ${project.version} + + + equinoxSDK381 + org.eclipse.osgi + ${equinox.osgi.version} + provided + + + diff --git a/sliPluginUtils/features/features-sliPluginUtils/pom.xml b/sliPluginUtils/features/features-sliPluginUtils/pom.xml new file mode 100644 index 000000000..004277dd3 --- /dev/null +++ b/sliPluginUtils/features/features-sliPluginUtils/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + feature-repo-parent + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + features-sliPluginUtils + 0.2.1-SNAPSHOT + feature + + ccsdk-sli-core :: sliPluginUtils :: ${project.artifactId} + + + + ${project.groupId} + ccsdk-sliPluginUtils + ${project.version} + xml + features + + + + diff --git a/sliPluginUtils/features/pom.xml b/sliPluginUtils/features/pom.xml index 19d32f7a2..4a1f89947 100755 --- a/sliPluginUtils/features/pom.xml +++ b/sliPluginUtils/features/pom.xml @@ -1,127 +1,23 @@ - - sliPluginUtils-features - jar 4.0.0 - sliPluginUtils - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + - SliPluginUtils Plugin - Features - - - - org.onap.ccsdk.sli.core - sliPluginUtils-provider - ${project.version} - - - commons-lang - commons-lang - ${commons.lang.version} - compile - - - org.opendaylight.mdsal - features-mdsal - ${odl.mdsal.features.version} - features - xml - runtime - - - - org.opendaylight.odlparent - opendaylight-karaf-empty - ${odl.karaf.empty.distro.version} - zip - - - - org.opendaylight.odlparent - features-test - ${odl.commons.opendaylight.version} - test - - - org.opendaylight.yangtools - features-yangtools - ${odl.yangtools.version} - features - xml - runtime - - - - - - - true - src/main/resources - - - - - org.apache.maven.plugins - maven-resources-plugin - - - filter - - resources - - generate-resources - - - + org.onap.ccsdk.sli.core + sliPluginUtils-features + 0.2.1-SNAPSHOT + pom - + ccsdk-sli-core :: sliPluginUtils :: ${project.artifactId} - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-artifacts - - attach-artifact - - package - - - - ${project.build.directory}/classes/${features.file} - xml - features - - - - - - - - + + features-sliPluginUtils + ccsdk-sliPluginUtils + diff --git a/sliPluginUtils/features/src/main/resources/features.xml b/sliPluginUtils/features/src/main/resources/features.xml deleted file mode 100644 index f59cea423..000000000 --- a/sliPluginUtils/features/src/main/resources/features.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features - - - - - odl-mdsal-broker - sdnc-sli - mvn:org.onap.ccsdk.sli.core/sliPluginUtils-provider/${project.version} - - - diff --git a/sliPluginUtils/installer/pom.xml b/sliPluginUtils/installer/pom.xml index 736d22202..1c0704af6 100755 --- a/sliPluginUtils/installer/pom.xml +++ b/sliPluginUtils/installer/pom.xml @@ -1,18 +1,24 @@ 4.0.0 + - sliPluginUtils - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + + org.onap.ccsdl.sli.core sliPluginUtils-installer - SLI Plugin Utilities - Karaf Installer + 0.2.1-SNAPSHOT pom + ccsdk-sli-core :: sliPluginUtils :: ${project.artifactId} + - sdnc-sliPluginUtils - sdnc-sliPluginUtils + ccsdk-sliPluginUtils + ${application.name} mvn:org.onap.ccsdk.sli.core/sliPluginUtils-features/${project.version}/xml/features false @@ -21,10 +27,10 @@ org.onap.ccsdk.sli.core - sliPluginUtils-features + ${application.name} ${project.version} - features xml + features * @@ -134,5 +140,4 @@ - diff --git a/sliPluginUtils/pom.xml b/sliPluginUtils/pom.xml index 21efb170b..45be684f7 100755 --- a/sliPluginUtils/pom.xml +++ b/sliPluginUtils/pom.xml @@ -1,38 +1,22 @@ - + + 4.0.0 + + + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + org.onap.ccsdk.sli.core sliPluginUtils - 0.2.0-SNAPSHOT + 0.2.1-SNAPSHOT pom - 4.0.0 - - - org.onap.ccsdk.sli.core - ccsdk-sli-core - 0.2.0-SNAPSHOT - - Service Logic Interface Plugin Utilities + ccsdk-sli-core :: sliPluginUtils A package of static utility functions to be used when developing SLI plugins - - - - org.onap.ccsdk.sli.core - SliPluginUtils-features - features - xml - ${project.version} - - - org.onap.ccsdk.sli.core - SliPluginUtils-provider - ${project.version} - - - - provider features diff --git a/sliPluginUtils/provider/pom.xml b/sliPluginUtils/provider/pom.xml index 61b5e958f..0a274edd0 100755 --- a/sliPluginUtils/provider/pom.xml +++ b/sliPluginUtils/provider/pom.xml @@ -1,17 +1,20 @@ - - sliPluginUtils-provider - bundle 4.0.0 - org.onap.ccsdk.sli.core - sliPluginUtils - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + binding-parent + 1.0.1-SNAPSHOT + - SliPluginUtils Plugin - Provider + org.onap.ccsdk.sli.core + sliPluginUtils-provider + 0.2.1-SNAPSHOT + bundle + + ccsdk-sli-core :: sliPluginUtils :: ${project.artifactId} http://maven.apache.org @@ -22,11 +25,10 @@ junit junit - ${junit.version} test - org.onap.ccsdk.sli.core + ${project.groupId} sli-common ${project.version} compile @@ -34,22 +36,18 @@ equinoxSDK381 org.eclipse.osgi - ${equinox.osgi.version} org.slf4j slf4j-api - ${slf4j.version} org.slf4j jcl-over-slf4j - ${slf4j.version} org.apache.commons commons-lang3 - 3.1 org.hamcrest @@ -68,27 +66,4 @@ 1.1 - - - - - - org.apache.felix - maven-bundle-plugin - ${bundle.plugin.version} - true - - - org.onap.ccsdk.sli.core.slipluginutils - org.onap.ccsdk.sli.core.slipluginutils - org.onap.ccsdk.sli.core.*,org.osgi.framework.*,org.slf4j.*,java.net.* - *;scope=compile|runtime;artifactId=!sli-common|org.eclipse.osgi|mariadb-java-client|slf4j-api|jcl-over-slf4j - true - - - - - - - diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2PropertiesProvider.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2PropertiesProvider.java index 07c84c66f..6802c9a8b 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2PropertiesProvider.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2PropertiesProvider.java @@ -8,9 +8,9 @@ * 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. @@ -31,193 +31,248 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; import java.util.Properties; +import java.util.Vector; +import org.onap.ccsdk.sli.core.utils.JREFileResolver; +import org.onap.ccsdk.sli.core.utils.KarafRootFileResolver; +import org.onap.ccsdk.sli.core.utils.PropertiesFileResolver; +import org.onap.ccsdk.sli.core.utils.common.CoreDefaultFileResolver; +import org.onap.ccsdk.sli.core.utils.common.SdncConfigEnvVarFileResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Immutable properties container for dme2 properties. Since the initial design decision was made to - * utilize Properties instead of an OSGi ManagedService, it was decided - * to make these properties immutable. + * Immutable properties container for dme2 properties. Since the initial design + * decision was made to utilize Properties instead of an OSGi + * ManagedService, it was decided to make these properties + * immutable. */ public final class Dme2PropertiesProvider { - private static final Logger LOG = LoggerFactory.getLogger(Dme2PropertiesProvider.class); - - /** - * The name of the environment variable to specify the configuration directory. - */ - private static final String SDNC_ROOT_DIR_ENV_VAR_KEY = "SDNC_CONFIG_DIR"; - - /** - * the dme2 properties file name. - */ - private static final String DME2_PROPERTIES_FILE_NAME = "dme2.properties"; - - /** - * the key for proxyUrl, which represents a CSV list of urls - */ - static final String PROXY_URL_KEY = "proxyUrl"; - - /** - * indicates that proxy urls are separated by commas - */ - private static final String PROXY_URLS_VALUE_SEPARATOR = ","; - - /** - * the key for aafUserName - */ - static final String AAF_USERNAME_KEY = "aafUserName"; - - /** - * the key for aafPassword - */ - static final String AAF_PASSWORD_KEY = "aafPassword"; - - /** - * the key for envContext - */ - static final String ENV_CONTEXT_KEY = "envContext"; - - /** - * the key for routeOffer - */ - static final String ROUTE_OFFER_KEY = "routeOffer"; - - /** - * the key for commonServiceVersion - */ - static final String COMMON_SERVICE_VERSION_KEY = "commonServiceVersion"; - - /** - * the key for partner - */ - static final String PARTNER_KEY = "partner"; - - private Optional proxyUrls = Optional.empty(); - - private Optional aafUsername = Optional.empty(); - - private Optional aafPassword = Optional.empty(); - - private Optional envContext = Optional.empty(); - - private Optional routeOffer = Optional.empty(); - - private Optional commonServiceVersion = Optional.empty(); - - private Optional partner = Optional.empty(); - - - /** - * Instantiates the properties provider, which involves loading the appropriate properties for dme2. - */ - public Dme2PropertiesProvider() { - this(getDme2Path(SDNC_ROOT_DIR_ENV_VAR_KEY, DME2_PROPERTIES_FILE_NAME).toString()); - } - - /** - * Instantiates the properties provider, which involves loading the appropriate properties for dme2. - * - * @param dme2Path location of the dme2.properties file - */ - @VisibleForTesting - Dme2PropertiesProvider(final String dme2Path) { - final Properties properties; - try { - properties = getProperties(dme2Path); - this.proxyUrls = getProxyUrls(properties); - this.aafUsername = getAafUsername(properties); - this.aafPassword = getAafPassword(properties); - this.envContext = getEnvContext(properties); - this.routeOffer = getRouteOffer(properties); - this.commonServiceVersion = getCommonServiceVersion(properties); - this.partner = getPartner(properties); - } catch (final FileNotFoundException e) { - LOG.error("dme2.properties file could not be found at path: {}", dme2Path, e); - } catch (final IOException e) { - LOG.error("fatal error reading dme2.properties at path: {}", dme2Path, e); - } - } - - private static Path getDme2Path(final String sdncRootDirectory, final String dme2Filename) { - return Paths.get(sdncRootDirectory, dme2Filename); - } - - private static Properties getProperties(final String dme2Path) throws IOException { - final File dme2File = new File(dme2Path); - final Properties properties = new Properties(); - properties.load(new FileReader(dme2File)); - return properties; - } - - private String getProxyUrl(final Properties properties) { - return properties.getProperty(PROXY_URL_KEY); - } - - private Optional getProxyUrls(final Properties properties) { - final String proxyUrlsValue = getProxyUrl(properties); - if (!Strings.isNullOrEmpty(proxyUrlsValue)) { - return Optional.ofNullable(proxyUrlsValue.split(PROXY_URLS_VALUE_SEPARATOR)); - } - return Optional.empty(); - } - - public Optional getProxyUrls() { - return this.proxyUrls; - } - - private Optional getAafUsername(final Properties properties) { - final String aafUsernameValue = properties.getProperty(AAF_USERNAME_KEY); - return Optional.ofNullable(aafUsernameValue); - } - - Optional getAafUsername() { - return this.aafUsername; - } - - private Optional getAafPassword(final Properties properties) { - final String aafPassword = properties.getProperty(AAF_PASSWORD_KEY); - return Optional.ofNullable(aafPassword); - } - - Optional getAafPassword() { - return this.aafPassword; - } - - private Optional getEnvContext(final Properties properties) { - final String envContext = properties.getProperty(ENV_CONTEXT_KEY); - return Optional.ofNullable(envContext); - } - - Optional getEnvContext() { - return this.envContext; - } - - private Optional getRouteOffer(final Properties properties) { - final String routeOffer = properties.getProperty(ROUTE_OFFER_KEY); - return Optional.ofNullable(routeOffer); - } - - Optional getRouteOffer() { - return this.routeOffer; - } - - private Optional getCommonServiceVersion(final Properties properties) { - final String commonServiceVersion = properties.getProperty(COMMON_SERVICE_VERSION_KEY); - return Optional.ofNullable(commonServiceVersion); - } - - Optional getCommonServiceVersion() { - return this.commonServiceVersion; - } - - private Optional getPartner(final Properties properties) { - final String partner = properties.getProperty(PARTNER_KEY); - return Optional.ofNullable(partner); - } - - Optional getPartner() { - return this.partner; - } + private static final Logger LOG = LoggerFactory.getLogger(Dme2PropertiesProvider.class); + + /** + * The name of the environment variable to specify the configuration directory. + */ + private static final String SDNC_ROOT_DIR_ENV_VAR_KEY = "SDNC_CONFIG_DIR"; + + /** + * the dme2 properties file name. + */ + private static final String DME2_PROPERTIES_FILE_NAME = "dme2.properties"; + + /** + * the key for proxyUrl, which represents a CSV list of urls + */ + static final String PROXY_URL_KEY = "proxyUrl"; + + /** + * indicates that proxy urls are separated by commas + */ + private static final String PROXY_URLS_VALUE_SEPARATOR = ","; + + /** + * the key for aafUserName + */ + static final String AAF_USERNAME_KEY = "aafUserName"; + + /** + * the key for aafPassword + */ + static final String AAF_PASSWORD_KEY = "aafPassword"; + + /** + * the key for envContext + */ + static final String ENV_CONTEXT_KEY = "envContext"; + + /** + * the key for routeOffer + */ + static final String ROUTE_OFFER_KEY = "routeOffer"; + + /** + * the key for commonServiceVersion + */ + static final String COMMON_SERVICE_VERSION_KEY = "commonServiceVersion"; + + /** + * the key for partner + */ + static final String PARTNER_KEY = "partner"; + + private Optional proxyUrls = Optional.empty(); + + private Optional aafUsername = Optional.empty(); + + private Optional aafPassword = Optional.empty(); + + private Optional envContext = Optional.empty(); + + private Optional routeOffer = Optional.empty(); + + private Optional commonServiceVersion = Optional.empty(); + + private Optional partner = Optional.empty(); + + /** + * A prioritized list of strategies for resolving dme2 properties files. + */ + private Vector dme2PropertiesFileResolvers = new Vector<>(); + + /** + * Instantiates the properties provider, which involves loading the appropriate + * properties for dme2. + */ + public Dme2PropertiesProvider() { + this(DME2_PROPERTIES_FILE_NAME); + } + + /** + * Instantiates the properties provider, which involves loading the appropriate + * properties for dme2. + * + * @param dme2Path + * location of the dme2.properties file + */ + @VisibleForTesting + Dme2PropertiesProvider(final String dme2FileName) { + dme2PropertiesFileResolvers + .add(new SdncConfigEnvVarFileResolver("Using property file (1) from environment variable")); + dme2PropertiesFileResolvers.add(new CoreDefaultFileResolver("Using property file (2) from default directory")); + + dme2PropertiesFileResolvers + .add(new JREFileResolver("Using property file (3) from JRE argument", Dme2PropertiesProvider.class)); + dme2PropertiesFileResolvers.add(new KarafRootFileResolver("Using property file (4) from karaf root", this)); + + File dme2File = getDme2File(dme2FileName); + + init(dme2File); + } + + private void init(final File dme2Path) { + final Properties properties; + try { + properties = getProperties(dme2Path); + this.proxyUrls = getProxyUrls(properties); + this.aafUsername = getAafUsername(properties); + this.aafPassword = getAafPassword(properties); + this.envContext = getEnvContext(properties); + this.routeOffer = getRouteOffer(properties); + this.commonServiceVersion = getCommonServiceVersion(properties); + this.partner = getPartner(properties); + } catch (final FileNotFoundException e) { + + LOG.error("dme2.properties file could not be found at path: {}", dme2Path, e); + } catch (final IOException e) { + LOG.error("fatal error reading dme2.properties at path: {}", dme2Path, e); + } + } + + /** + * Reports the method chosen for properties resolution to the + * Logger. + * + * @param message + * Some user friendly message + * @param fileOptional + * The file location of the chosen properties file + * @return the file location of the chosen properties file + */ + private static File reportSuccess(final String message, final Optional fileOptional) { + if (fileOptional.isPresent()) { + final File file = fileOptional.get(); + LOG.info("{} {}", message, file.getPath()); + return file; + } + return null; + } + + private File getDme2File(final String dme2Filename) { + + for (final PropertiesFileResolver dblibPropertiesFileResolver : dme2PropertiesFileResolvers) { + final Optional fileOptional = dblibPropertiesFileResolver.resolveFile(dme2Filename); + if (fileOptional.isPresent()) { + return reportSuccess(dblibPropertiesFileResolver.getSuccessfulResolutionMessage(), fileOptional); + } + } + return (new File(dme2Filename)); + } + + private static Properties getProperties(final File dme2File) throws IOException { + + final Properties properties = new Properties(); + properties.load(new FileReader(dme2File)); + return properties; + } + + private String getProxyUrl(final Properties properties) { + return properties.getProperty(PROXY_URL_KEY); + } + + private Optional getProxyUrls(final Properties properties) { + final String proxyUrlsValue = getProxyUrl(properties); + if (!Strings.isNullOrEmpty(proxyUrlsValue)) { + return Optional.ofNullable(proxyUrlsValue.split(PROXY_URLS_VALUE_SEPARATOR)); + } + return Optional.empty(); + } + + public Optional getProxyUrls() { + return this.proxyUrls; + } + + private Optional getAafUsername(final Properties properties) { + final String aafUsernameValue = properties.getProperty(AAF_USERNAME_KEY); + return Optional.ofNullable(aafUsernameValue); + } + + Optional getAafUsername() { + return this.aafUsername; + } + + private Optional getAafPassword(final Properties properties) { + final String aafPassword = properties.getProperty(AAF_PASSWORD_KEY); + return Optional.ofNullable(aafPassword); + } + + Optional getAafPassword() { + return this.aafPassword; + } + + private Optional getEnvContext(final Properties properties) { + final String envContext = properties.getProperty(ENV_CONTEXT_KEY); + return Optional.ofNullable(envContext); + } + + Optional getEnvContext() { + return this.envContext; + } + + private Optional getRouteOffer(final Properties properties) { + final String routeOffer = properties.getProperty(ROUTE_OFFER_KEY); + return Optional.ofNullable(routeOffer); + } + + Optional getRouteOffer() { + return this.routeOffer; + } + + private Optional getCommonServiceVersion(final Properties properties) { + final String commonServiceVersion = properties.getProperty(COMMON_SERVICE_VERSION_KEY); + return Optional.ofNullable(commonServiceVersion); + } + + Optional getCommonServiceVersion() { + return this.commonServiceVersion; + } + + private Optional getPartner(final Properties properties) { + final String partner = properties.getProperty(PARTNER_KEY); + return Optional.ofNullable(partner); + } + + Optional getPartner() { + return this.partner; + } } diff --git a/sliPluginUtils/provider/src/main/resources/dme2.properties b/sliPluginUtils/provider/src/main/resources/dme2.properties new file mode 100644 index 000000000..373448447 --- /dev/null +++ b/sliPluginUtils/provider/src/main/resources/dme2.properties @@ -0,0 +1,7 @@ +aafUserName=user@sample.com +aafPassword=fake +envContext=UAT +routeOffer=UAT +proxyUrl=http://sample.com:25055,http://sample.com:25055 +commonServiceVersion=1702.0 +partner= \ No newline at end of file diff --git a/sliapi/features/ccsdk-sliapi/pom.xml b/sliapi/features/ccsdk-sliapi/pom.xml new file mode 100644 index 000000000..be4025b4a --- /dev/null +++ b/sliapi/features/ccsdk-sliapi/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + single-feature-parent + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + ccsdk-sliapi + 0.2.1-SNAPSHOT + feature + + ccsdk-sli-core :: sliapi :: ${project.artifactId} + + + + + org.opendaylight.mdsal.model + mdsal-model-artifacts + 0.11.1 + pom + import + + + org.opendaylight.controller + mdsal-artifacts + 1.6.1 + pom + import + + + + + + org.opendaylight.controller + odl-mdsal-broker + xml + features + + + + ${project.groupId} + ccsdk-sli + ${project.version} + xml + features + + + + ${project.groupId} + sliapi-provider + ${project.version} + + + + diff --git a/sliapi/features/features-sliapi/pom.xml b/sliapi/features/features-sliapi/pom.xml new file mode 100644 index 000000000..f3481cba8 --- /dev/null +++ b/sliapi/features/features-sliapi/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + feature-repo-parent + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + features-sliapi + 0.2.1-SNAPSHOT + feature + + ccsdk-sli-core :: sliapi :: ${project.artifactId} + + + + ${project.groupId} + ccsdk-sliapi + ${project.version} + xml + features + + + + diff --git a/sliapi/features/pom.xml b/sliapi/features/pom.xml index 78bfb89a4..17fa8fb41 100755 --- a/sliapi/features/pom.xml +++ b/sliapi/features/pom.xml @@ -1,134 +1,23 @@ 4.0.0 + - sliapi - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + - sliapi-features - - jar - - - - org.onap.ccsdk.sli.core - sliapi-model - - - org.onap.ccsdk.sli.core - sliapi-provider - config - xml - - - org.onap.ccsdk.sli.core - sliapi-provider - - - - org.opendaylight.mdsal - features-mdsal - ${odl.mdsal.features.version} - features - xml - - runtime - - - - - - - org.opendaylight.odlparent - opendaylight-karaf-empty - ${odl.karaf.empty.distro.version} - zip - - - - - - org.opendaylight.odlparent - features-test - test - ${odl.commons.opendaylight.version} - - - org.opendaylight.yangtools - features-yangtools - ${odl.yangtools.version} - features - xml - runtime - - + org.onap.ccsdk.sli.core + sliapi-feature-aggregator + 0.2.1-SNAPSHOT + pom - - - - true - src/main/resources - - - - - org.apache.maven.plugins - maven-resources-plugin - - - filter - - resources - - generate-resources - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-artifacts - - attach-artifact - - package - - - - ${project.build.directory}/classes/${features.file} - xml - features - - - - - - - - + + features-sliapi + ccsdk-sliapi + diff --git a/sliapi/features/src/main/resources/features.xml b/sliapi/features/src/main/resources/features.xml deleted file mode 100644 index c5df348fa..000000000 --- a/sliapi/features/src/main/resources/features.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features - - - - odl-mdsal-broker - sdnc-sli - mvn:org.onap.ccsdk.sli.core/sliapi-model/${project.version} - mvn:org.onap.ccsdk.sli.core/sliapi-provider/${project.version} - mvn:org.onap.ccsdk.sli.core/sliapi-provider/${project.version}/xml/config - - - diff --git a/sliapi/installer/pom.xml b/sliapi/installer/pom.xml index cddcf6dd7..290524e32 100755 --- a/sliapi/installer/pom.xml +++ b/sliapi/installer/pom.xml @@ -1,18 +1,25 @@ 4.0.0 + - sliapi - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + + org.onap.ccsdk.sli.core sliapi-installer + 0.2.1-SNAPSHOT pom + ccsdk-sli-core :: sliapi :: ${project.artifactId} + - sdnc-sliapi - sdnc-sliapi - mvn:org.onap.ccsdk.sli.core/sliapi-features/${project.version}/xml/features + ccsdk-sliapi + ${application.name} + mvn:org.onap.ccsdk.sli.core/${features.boot}/${project.version}/xml/features false @@ -20,10 +27,10 @@ org.onap.ccsdk.sli.core - sliapi-features + ${application.name} ${project.version} - features xml + features * @@ -133,5 +140,4 @@ - diff --git a/sliapi/installer/src/assembly/assemble_mvnrepo_zip.xml b/sliapi/installer/src/assembly/assemble_mvnrepo_zip.xml index e22c6f567..5f3e3af31 100644 --- a/sliapi/installer/src/assembly/assemble_mvnrepo_zip.xml +++ b/sliapi/installer/src/assembly/assemble_mvnrepo_zip.xml @@ -8,9 +8,9 @@ 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. @@ -44,12 +44,6 @@ - - - ../provider/src/main/resources/initial/${feature-name}-provider.xml - ./etc/opendaylight/karaf/200-${feature-name}provider.xml - - diff --git a/sliapi/model/pom.xml b/sliapi/model/pom.xml index 4ea88516a..bbdcea051 100755 --- a/sliapi/model/pom.xml +++ b/sliapi/model/pom.xml @@ -1,89 +1,29 @@ 4.0.0 + - sliapi - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + binding-parent + 1.0.1-SNAPSHOT + + + org.onap.ccsdk.sli.core sliapi-model + 0.2.1-SNAPSHOT bundle - + ccsdk-sli-core :: sliapi :: ${project.artifactId} - - - org.apache.felix - maven-bundle-plugin - true - - - * - - - - - org.opendaylight.yangtools - yang-maven-plugin - ${odl.yangtools.yang.maven.plugin.version} - - - org.opendaylight.mdsal - maven-sal-api-gen-plugin - ${odl.sal.api.gen.plugin.version} - jar - - - org.opendaylight.netconf - sal-rest-docgen-maven - ${odl.restconf.version} - jar - - - - - - generate-sources - - - ${yang.file.directory} - - - org.opendaylight.mdsal.binding.maven.api.gen.plugin.CodeGeneratorImpl - ${salGeneratorPath} - - - org.opendaylight.netconf.sal.rest.doc.maven.StaticDocGenerator - target/swagger - - - true - - - - - - - - org.opendaylight.mdsal - yang-binding - ${odl.mdsal.yang.binding.version} - - - org.opendaylight.yangtools - yang-common - ${odl.yangtools.version} - org.opendaylight.mdsal.model ietf-inet-types - ${odl.ietf-inet-types.version} org.opendaylight.mdsal.model ietf-yang-types - ${odl.ietf-yang-types.version} diff --git a/sliapi/pom.xml b/sliapi/pom.xml index a08d8fcb8..46057da0f 100755 --- a/sliapi/pom.xml +++ b/sliapi/pom.xml @@ -1,56 +1,20 @@ - + 4.0.0 - - org.onap.ccsdk.sli.core - ccsdk-sli-core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + - pom org.onap.ccsdk.sli.core sliapi - 0.2.0-SNAPSHOT - - - sliapi - - - - - - - - org.onap.ccsdk.sli.core - sliapi-features - features - xml - ${project.version} - - - - org.onap.ccsdk.sli.core - sliapi-model - ${project.version} - - - org.onap.ccsdk.sli.core - sliapi-provider - ${project.version} - config - xml - - - org.onap.ccsdk.sli.core - sliapi-provider - ${project.version} - - - + 0.2.1-SNAPSHOT + pom - + ccsdk-sli-core :: sliapi model @@ -58,4 +22,8 @@ provider installer + + + sliapi + diff --git a/sliapi/provider/pom.xml b/sliapi/provider/pom.xml index 5db9671d6..cb4dfc898 100755 --- a/sliapi/provider/pom.xml +++ b/sliapi/provider/pom.xml @@ -1,125 +1,53 @@ 4.0.0 + - sliapi - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + binding-parent + 1.0.1-SNAPSHOT + + + org.onap.ccsdk.sli.core sliapi-provider + 0.2.1-SNAPSHOT bundle - - - - org.apache.felix - maven-bundle-plugin - true - - - org.opendaylight.controller.config.yang.config.sliapi.impl - * - - - - - org.opendaylight.yangtools - yang-maven-plugin - ${odl.yangtools.yang.maven.plugin.version} - - - config - - generate-sources - - - - - org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator - ${jmxGeneratorPath} - - urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang - - - - - org.opendaylight.mdsal.binding.maven.api.gen.plugin.CodeGeneratorImpl - ${salGeneratorPath} - - - true - - - - - - org.opendaylight.mdsal - maven-sal-api-gen-plugin - ${odl.sal.api.gen.plugin.version} - jar - - - org.opendaylight.controller - yang-jmx-generator-plugin - ${odl.yang.jmx.generator.version} - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-artifacts - - attach-artifact - - package - - - - ${project.build.directory}/classes/initial/sliapi-provider.xml - xml - config - - - - - - - - + ccsdk-sli-core :: sliapi :: ${project.artifactId} + + + + org.opendaylight.controller + mdsal-artifacts + 1.6.1 + pom + import + + + org.onap.ccsdk.sli.core sliapi-model - - - org.opendaylight.controller - config-api - ${odl.controller.config.api.version} + ${project.version} org.opendaylight.controller sal-binding-config - ${odl.mdsal.version} org.opendaylight.controller sal-binding-api - ${odl.mdsal.version} org.opendaylight.controller sal-common-util - ${odl.mdsal.version} @@ -136,12 +64,10 @@ org.opendaylight.controller sal-core-api - ${odl.mdsal.version} org.opendaylight.yangtools yang-data-impl - ${odl.yangtools.version} diff --git a/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java b/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java index 82e660083..c3ad4ed60 100644 --- a/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java +++ b/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java @@ -31,6 +31,7 @@ import java.util.Properties; import java.util.concurrent.Future; import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService; import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.binding.impl.AbstractForwardedDataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; @@ -118,7 +119,7 @@ public class sliapiProvider implements AutoCloseable, SLIAPIService{ protected DataBroker dataBroker; protected DOMDataBroker domDataBroker; - protected NotificationProviderService notificationService; + protected NotificationPublishService notificationService; protected RpcProviderRegistry rpcRegistry; protected BindingAwareBroker.RpcRegistration rpcRegistration; @@ -142,16 +143,24 @@ public class sliapiProvider implements AutoCloseable, SLIAPIService{ } - public sliapiProvider() { + public sliapiProvider( + DataBroker dataBroker, + NotificationPublishService notificationPublishService, + RpcProviderRegistry rpcProviderRegistry) { this.LOG.info( "Creating provider for " + appName ); + this.dataBroker = dataBroker; + this.notificationService = notificationPublishService; + this.rpcRegistry = rpcProviderRegistry; + initialize(); } + + public void initialize(){ LOG.info( "Initializing provider for " + appName ); //initialization code goes here. sdncStatusFile = System.getenv(SDNC_STATUS_FILE); LOG.info( "SDNC STATUS FILE = " + sdncStatusFile ); - rpcRegistration = rpcRegistry.addRpcImplementation(SLIAPIService.class, this); LOG.info( "Initialization complete for " + appName ); } @@ -179,7 +188,7 @@ public class sliapiProvider implements AutoCloseable, SLIAPIService{ } public void setNotificationService( - NotificationProviderService notificationService) { + NotificationPublishService notificationService) { this.notificationService = notificationService; if( LOG.isDebugEnabled() ){ LOG.debug( "Notification Service set to " + (notificationService==null?"null":"non-null") + "." ); diff --git a/sliapi/provider/src/main/java/org/opendaylight/yang/gen/v1/org/onap/ccsdk/sli/core/sliapi/provider/impl/rev140523/SliapiProviderModule.java b/sliapi/provider/src/main/java/org/opendaylight/yang/gen/v1/org/onap/ccsdk/sli/core/sliapi/provider/impl/rev140523/SliapiProviderModule.java deleted file mode 100644 index e7444e318..000000000 --- a/sliapi/provider/src/main/java/org/opendaylight/yang/gen/v1/org/onap/ccsdk/sli/core/sliapi/provider/impl/rev140523/SliapiProviderModule.java +++ /dev/null @@ -1,64 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 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.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.provider.impl.rev140523; - -import org.onap.ccsdk.sli.core.sliapi.sliapiProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SliapiProviderModule extends org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.provider.impl.rev140523.AbstractSliapiProviderModule { - private final Logger LOG = LoggerFactory.getLogger( SliapiProviderModule.class ); - - public SliapiProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } - - public SliapiProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.provider.impl.rev140523.SliapiProviderModule oldModule, java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } - - @Override - public void customValidation() { - // add custom validation form module attributes here. - } - - @Override - public java.lang.AutoCloseable createInstance() { - - LOG.info("Calling SliapiProviderModule.createInstance"); - final sliapiProvider provider = new sliapiProvider(); - provider.setDataBroker( getDataBrokerDependency() ); - provider.setNotificationService( getNotificationServiceDependency() ); - provider.setRpcRegistry( getRpcRegistryDependency() ); - provider.initialize(); - return new AutoCloseable() { - - @Override - public void close() throws Exception { - //TODO: CLOSE ANY REGISTRATION OBJECTS CREATED USING ABOVE BROKER/NOTIFICATION - //SERVIE/RPC REGISTRY - provider.close(); - } - }; - } - -} diff --git a/sliapi/provider/src/main/java/org/opendaylight/yang/gen/v1/org/onap/ccsdk/sli/core/sliapi/provider/impl/rev140523/SliapiProviderModuleFactory.java b/sliapi/provider/src/main/java/org/opendaylight/yang/gen/v1/org/onap/ccsdk/sli/core/sliapi/provider/impl/rev140523/SliapiProviderModuleFactory.java deleted file mode 100644 index 6454d17c4..000000000 --- a/sliapi/provider/src/main/java/org/opendaylight/yang/gen/v1/org/onap/ccsdk/sli/core/sliapi/provider/impl/rev140523/SliapiProviderModuleFactory.java +++ /dev/null @@ -1,34 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 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========================================================= - */ - -/* -* Generated file -* -* Generated from: yang module name: sliapi-provider-impl yang module local name: sliapi-provider-impl -* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator -* Generated at: Thu Aug 03 16:10:18 EDT 2017 -* -* Do not modify this file unless it is present under src/main directory -*/ -package org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.provider.impl.rev140523; -public class SliapiProviderModuleFactory extends org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.provider.impl.rev140523.AbstractSliapiProviderModuleFactory { - -} diff --git a/sliapi/provider/src/main/resources/initial/sliapi-provider.xml b/sliapi/provider/src/main/resources/initial/sliapi-provider.xml deleted file mode 100644 index 47d31d0ab..000000000 --- a/sliapi/provider/src/main/resources/initial/sliapi-provider.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - prefix:sliapi-provider-impl - - sliapi-provider-impl - - - - binding:binding-rpc-registry - binding-rpc-broker - - - - binding:binding-async-data-broker - binding-data-broker - - - - - binding:binding-notification-service - - binding-notification-broker - - - - - - - - - - - org:onap:ccsdk:sli:core:sliapi:provider:impl?module=sliapi-provider-impl&revision=2014-05-23 - - - diff --git a/sliapi/provider/src/main/resources/org/opendaylight/blueprint/sliapi-blueprint.xml b/sliapi/provider/src/main/resources/org/opendaylight/blueprint/sliapi-blueprint.xml new file mode 100644 index 000000000..761b014a0 --- /dev/null +++ b/sliapi/provider/src/main/resources/org/opendaylight/blueprint/sliapi-blueprint.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/utils/features/features-util/pom.xml b/utils/features/features-util/pom.xml new file mode 100644 index 000000000..9a4cd43c5 --- /dev/null +++ b/utils/features/features-util/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + feature-repo-parent + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + features-util + 0.2.1-SNAPSHOT + feature + + ccsdk-sli-core :: utils :: ${project.artifactId} + + + + ${project.groupId} + ccsdk-slicore-utils + ${project.version} + xml + features + + + + diff --git a/utils/features/features3-util/pom.xml b/utils/features/features3-util/pom.xml new file mode 100755 index 000000000..5cc0d8995 --- /dev/null +++ b/utils/features/features3-util/pom.xml @@ -0,0 +1,141 @@ + + + 4.0.0 + + utils + org.onap.ccsdk.sli.core + 0.2.0-SNAPSHOT + + + org.onap.ccsdk.sli.core + utils-features + ccsdk-sli-core :: utils :: ${project.artifactId} + DBLIB Adaptor - Features + + jar + + + + + + org.onap.ccsdk.sli.core + utils-provider + ${project.version} + + + + commons-lang + commons-lang + ${commons.lang.version} + compile + + + + org.opendaylight.mdsal + features-mdsal + ${odl.mdsal.features.version} + features + xml + + runtime + + + + org.apache.tomcat + tomcat-jdbc + ${tomcat-jdbc.version} + + + + + org.opendaylight.odlparent + opendaylight-karaf-empty + ${odl.karaf.empty.distro.version} + zip + + + + + org.opendaylight.odlparent + features-test + ${odl.commons.opendaylight.version} + test + + + + org.opendaylight.yangtools + features-yangtools + ${odl.yangtools.version} + features + xml + runtime + + + + + + + true + src/main/resources + + + + + org.apache.maven.plugins + maven-resources-plugin + + + filter + + resources + + generate-resources + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + attach-artifacts + + attach-artifact + + package + + + + ${project.build.directory}/classes/${features.file} + xml + features + + + + + + + + + diff --git a/utils/features/features3-util/src/main/resources/features.xml b/utils/features/features3-util/src/main/resources/features.xml new file mode 100755 index 000000000..547832ba6 --- /dev/null +++ b/utils/features/features3-util/src/main/resources/features.xml @@ -0,0 +1,16 @@ + + + + + mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features + + + + + odl-mdsal-broker + mvn:org.onap.ccsdk.sli.core/utils-provider/${project.version} + + + diff --git a/utils/features/pom.xml b/utils/features/pom.xml index be6227d7e..8bc1cd8a8 100755 --- a/utils/features/pom.xml +++ b/utils/features/pom.xml @@ -1,138 +1,22 @@ - 4.0.0 - - utils - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT - - utils-features - DBLIB Adaptor - Features + 4.0.0 - jar + + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + - + org.onap.ccsdk.sli.core + utils-features-aggregator + pom + ccsdk-sli-core :: utils :: ${project.artifactId} - - org.onap.ccsdk.sli.core - utils-provider - ${project.version} - - - - commons-lang - commons-lang - ${commons.lang.version} - compile - - - - org.opendaylight.mdsal - features-mdsal - ${odl.mdsal.features.version} - features - xml - - runtime - - - - org.apache.tomcat - tomcat-jdbc - ${tomcat-jdbc.version} - - - - - org.opendaylight.odlparent - opendaylight-karaf-empty - ${odl.karaf.empty.distro.version} - zip - - - - - org.opendaylight.odlparent - features-test - ${odl.commons.opendaylight.version} - test - - - - org.opendaylight.yangtools - features-yangtools - ${odl.yangtools.version} - features - xml - runtime - - - - - - - true - src/main/resources - - - - - org.apache.maven.plugins - maven-resources-plugin - - - filter - - resources - - generate-resources - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - attach-artifacts - - attach-artifact - - package - - - - ${project.build.directory}/classes/${features.file} - xml - features - - - - - - - - + + features-util + sdnc-slicore-utils + diff --git a/utils/features/sdnc-slicore-utils/pom.xml b/utils/features/sdnc-slicore-utils/pom.xml new file mode 100644 index 000000000..85c81ff67 --- /dev/null +++ b/utils/features/sdnc-slicore-utils/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + single-feature-parent + 1.0.1-SNAPSHOT + + + + org.onap.ccsdk.sli.core + ccsdk-slicore-utils + 0.2.1-SNAPSHOT + feature + + ccsdk-sli-core :: utils :: ${project.artifactId} + + + + + org.opendaylight.mdsal.model + mdsal-model-artifacts + 0.11.1 + pom + import + + + org.opendaylight.controller + mdsal-artifacts + 1.6.1 + pom + import + + + + + + org.opendaylight.controller + odl-mdsal-broker + xml + features + + + + ${project.groupId} + utils-provider + ${project.version} + + + + diff --git a/utils/features/src/main/resources/features.xml b/utils/features/src/main/resources/features.xml deleted file mode 100755 index 547832ba6..000000000 --- a/utils/features/src/main/resources/features.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features - - - - - odl-mdsal-broker - mvn:org.onap.ccsdk.sli.core/utils-provider/${project.version} - - - diff --git a/utils/installer/pom.xml b/utils/installer/pom.xml index df7fc0de8..c19ac8c67 100755 --- a/utils/installer/pom.xml +++ b/utils/installer/pom.xml @@ -1,19 +1,25 @@ 4.0.0 + - utils - org.onap.ccsdk.sli.core - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + + org.onap.ccsdk.sli.core utils-installer - SLI core utils - Karaf Installer + 0.2.1-SNAPSHOT pom + ccsdk-sli-core :: utils :: ${project.artifactId} + - sdnc-slicore-utils - sdnc-slicore-utils - mvn:org.onap.ccsdk.sli.core/utils-features/${project.version}/xml/features + ccsdk-slicore-utils + ${application.name} + mvn:org.onap.ccsdk.sli.core/${features.boot}/${project.version}/xml/features false @@ -21,10 +27,10 @@ org.onap.ccsdk.sli.core - utils-features + ${application.name} ${project.version} - features xml + features * @@ -134,5 +140,4 @@ - diff --git a/utils/pom.xml b/utils/pom.xml index 17a0f6b6e..cd342f774 100755 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -1,77 +1,26 @@ - - - org.onap.ccsdk.sli.core - ccsdk-sli-core - 0.2.0-SNAPSHOT + + 4.0.0 + + + org.onap.ccsdk.parent + odlparent-lite + 1.0.1-SNAPSHOT + + org.onap.ccsdk.sli.core + utils + 0.2.1-SNAPSHOT + pom - 4.0.0 - pom - org.onap.ccsdk.sli.core - utils - - - SLI Utils - Utilities used across sli-core - - 0.2.0-SNAPSHOT - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven.compile.plugin.version} - - ${java.version.source} - ${java.version.target} - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10 - - - - aggregate - - aggregate - - site - - - - - - maven-source-plugin - 2.1.1 - - - bundle-sources - package - - - jar-no-fork - - - test-jar-no-fork - - - - - - - - - - AT&T + ccsdk-sli-core :: utils + Utilities used across sli-core + + ONAP - + + provider features installer diff --git a/utils/provider/pom.xml b/utils/provider/pom.xml index b0adc7d46..7a4e8c9ed 100644 --- a/utils/provider/pom.xml +++ b/utils/provider/pom.xml @@ -1,21 +1,26 @@ - + + 4.0.0 - org.onap.ccsdk.sli.core - utils - 0.2.0-SNAPSHOT + org.onap.ccsdk.parent + binding-parent + 1.0.1-SNAPSHOT + - 4.0.0 - bundle + org.onap.ccsdk.sli.core utils-provider - SLI Core Utilities Package + 0.2.1-SNAPSHOT + bundle + ccsdk-sli-core :: utils :: ${project.artifactId} The SLI Core Utilities Package provides common functionality for setting up SLI connectivity. + + ONAP + @@ -26,6 +31,7 @@ equinoxSDK381 org.eclipse.osgi ${equinox.osgi.version} + provided @@ -41,17 +47,4 @@ test - - - - - org.apache.felix - maven-bundle-plugin - ${bundle.plugin.version} - - - - - Inocybe Technologies and Others - diff --git a/utils/provider/src/main/java/org/onap/ccsdk/sli/core/utils/JREFileResolver.java b/utils/provider/src/main/java/org/onap/ccsdk/sli/core/utils/JREFileResolver.java index 8da9b7ef0..cc164d042 100755 --- a/utils/provider/src/main/java/org/onap/ccsdk/sli/core/utils/JREFileResolver.java +++ b/utils/provider/src/main/java/org/onap/ccsdk/sli/core/utils/JREFileResolver.java @@ -7,9 +7,9 @@ * 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. @@ -54,9 +54,11 @@ public class JREFileResolver implements PropertiesFileResolver { */ @Override public Optional resolveFile(final String filename) { + final Bundle bundle = FrameworkUtil.getBundle(this.clazz); final File dataFile; + try { if (bundle == null) { return Optional.empty(); @@ -67,6 +69,7 @@ public class JREFileResolver implements PropertiesFileResolver { return Optional.empty(); } + dataFile = bundle.getDataFile(filename); if(dataFile.exists()) { dataFile.delete(); -- cgit 1.2.3-korg From 898ccabd60d1eea9c638386793b2a40215418b5f Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Wed, 25 Apr 2018 21:13:56 +0000 Subject: add replaceAll to slistringutils add replaceAll to slistringutils because it supports regular expressions and replace does not Change-Id: Ibff7acd339103a6bb897d14ca3d31736a5b568ef Issue-ID: CCSDK-253 Signed-off-by: Smokowski, Kevin (ks6305) --- .../sli/core/slipluginutils/SliStringUtils.java | 22 ++++++++++++++++++++++ .../core/slipluginutils/SliStringUtilsTest.java | 15 +++++++++++++++ 2 files changed, 37 insertions(+) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java index 6402abd68..63c750cb8 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java @@ -304,6 +304,28 @@ public class SliStringUtils implements SvcLogicJavaPlugin { ctx.setAttribute(parameters.get("outputPath"), (parameters.get("source").replace(parameters.get("target"), parameters.get("replacement")))); } + /** + * exposes replaceAll to directed graph + * writes the length of source to outputPath + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
sourceMandatorysource string
targetMandatoryThis should be a valid regular expression
replacementMandatoryThe replacement sequence of char values
outputPathMandatorythe location in context memory the result is written to
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static void replaceAll(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath","target","replacement"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").replaceAll(parameters.get("target"), parameters.get("replacement"))); + } + /** * Provides substring functionality to Directed Graphs. *

diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java index 4fc8d1866..4c665121c 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java @@ -234,6 +234,21 @@ public class SliStringUtilsTest { SliStringUtils.replace(param, ctx); assertEquals(sourceString.replace(old, neww), ctx.getAttribute(outputPath)); } + + @Test + public void replaceAll() throws SvcLogicException { + String source = "cat Hello World cat"; + String target = "\\s"; + String replacement = ""; + String outputPath = "out"; + + param.put("source", source); + param.put("target", target); + param.put("replacement", replacement); + param.put("outputPath", outputPath); + SliStringUtils.replaceAll(param, ctx); + assertEquals(source.replaceAll(target, replacement), ctx.getAttribute(outputPath)); + } @Test public void concat() throws SvcLogicException { -- cgit 1.2.3-korg From 88115d6cf23b4d836cb5637905d46412fb82c7e4 Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Fri, 11 May 2018 14:27:15 +0000 Subject: dme2 plugin improvements DME2 plugin itself will be coded to generic properties object not any custom object. The code is flexible so new query parameters can easily be added without code changes. Default properties which could previously not be overridden can now be overridden if desired. Change-Id: I56b4dfd4dee350198a23ac57c775bd1adacb1a9a Issue-ID: CCSDK-274 Signed-off-by: Smokowski, Kevin (ks6305) --- .../onap/ccsdk/sli/core/slipluginutils/DME2.java | 296 +++++++++++---------- .../ccsdk/sli/core/slipluginutils/Dme2Factory.java | 109 ++++++++ .../slipluginutils/Dme2PropertiesProvider.java | 278 ------------------- .../blueprint/slipluginutils-blueprint.xml | 37 +-- .../ccsdk/sli/core/slipluginutils/Dme2Test.java | 293 ++++++++++++-------- 5 files changed, 462 insertions(+), 551 deletions(-) create mode 100644 sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Factory.java delete mode 100644 sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2PropertiesProvider.java (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java index 6bdd87e24..5121e8a56 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java @@ -1,146 +1,150 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; - -import java.util.Map; - -import java.util.Optional; -import org.onap.ccsdk.sli.core.sli.SvcLogicContext; -import org.onap.ccsdk.sli.core.sli.SvcLogicException; -import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - - -/** - * A SvcLogicJavaPlugin that generates DME2 proxy urls using parameters from context memory. - */ -public class DME2 implements SvcLogicJavaPlugin { - - private static final Logger LOG = LoggerFactory.getLogger(DME2.class); - - final String aafUserName; - final String aafPassword; - final String envContext; - final String routeOffer; - final String[] proxyUrls; - final String commonServiceVersion; - - Integer index; - String partner; - - - public void setPartner(String partner) { - if (partner != null && partner.length() > 0) { - this.partner = partner; - } - } - - public DME2(String aafUserName, String aafPassword, String envContext, String routeOffer, String[] proxyUrls, String commonServiceVersion) { - this.aafUserName = aafUserName; - this.aafPassword = aafPassword; - this.envContext = envContext; - this.routeOffer = routeOffer; - this.proxyUrls = proxyUrls; - this.index = 0; - this.commonServiceVersion = commonServiceVersion; - } - - public DME2(final Dme2PropertiesProvider provider) { - this.aafUserName = useProperty(provider.getAafUsername(), Dme2PropertiesProvider.AAF_USERNAME_KEY); - this.aafPassword = useProperty(provider.getAafPassword(), Dme2PropertiesProvider.AAF_PASSWORD_KEY); - this.envContext = useProperty(provider.getEnvContext(), Dme2PropertiesProvider.ENV_CONTEXT_KEY); - this.routeOffer = useProperty(provider.getRouteOffer(), Dme2PropertiesProvider.ROUTE_OFFER_KEY); - this.index = 0; - this.commonServiceVersion = useProperty(provider.getCommonServiceVersion(), - Dme2PropertiesProvider.COMMON_SERVICE_VERSION_KEY); - - final Optional maybeProxyUrls = provider.getProxyUrls(); - if (maybeProxyUrls.isPresent()) { - this.proxyUrls = maybeProxyUrls.get(); - } else { - warnOfMissingProperty(Dme2PropertiesProvider.PROXY_URL_KEY); - this.proxyUrls = null; - } - this.setPartner(useProperty(provider.getPartner(), Dme2PropertiesProvider.PARTNER_KEY)); - } - - private String useProperty(final Optional propertyOptional, final String propertyKey) { - if (propertyOptional.isPresent()) { - return propertyOptional.get(); - } - warnOfMissingProperty(propertyKey); - return null; - } - - private void warnOfMissingProperty(final String propertyName) { - LOG.warn("Utilizing null for {} since it was left unassigned in the properties file"); - } - - // constructs a URL to contact the proxy which contacts a DME2 service - public String constructUrl(String service, String version, String subContext) { - StringBuilder sb = new StringBuilder(); - - // The hostname is assigned in a round robin fashion - sb.append(acquireHostName()); - sb.append("/service=" + service); - - //If the directedGraph passes an explicit version use that, if not use the commonServiceVersion found in the properties file - if (version == null) { - version = this.commonServiceVersion; - } - sb.append("/version=" + version); - - sb.append("/envContext=" + this.envContext); - if (this.routeOffer != null && this.routeOffer.length() > 0) { - sb.append("/routeOffer=" + this.routeOffer); - } - if (subContext != null && subContext.length() > 0) { - sb.append("/subContext=" + subContext); - } - sb.append("?dme2.password=" + this.aafPassword); - sb.append("&dme2.username=" + this.aafUserName); - if (this.partner != null) { - sb.append("&dme2.partner=" + this.partner); - } - sb.append("&dme2.allowhttpcode=true"); - return sb.toString(); - } - - public synchronized String acquireHostName() { - String retVal = proxyUrls[index]; - index++; - if (index == this.proxyUrls.length) { - index = 0; - } - return retVal; - } - - // Node entry point - public void constructUrl(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[] { "service", "outputPath" }, LOG); - String completeProxyUrl = constructUrl(parameters.get("service"), parameters.get("version"), parameters.get("subContext")); - ctx.setAttribute(parameters.get("outputPath"), completeProxyUrl); - } - -} +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; + +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A SvcLogicJavaPlugin that generates DME2 proxy urls (for calling the DME2 ingress proxy) using + * parameters from context memory. + */ +public class DME2 implements SvcLogicJavaPlugin { + + private static final Logger LOG = LoggerFactory.getLogger(DME2.class); + // the key for proxyUrl, which represents a CSV list of urls + static final String PROXY_URL_KEY = "proxyUrl"; + static final String PROXY_URLS_VALUE_SEPARATOR = ","; + static final String AAF_USERNAME_KEY = "aafUserName"; + static final String AAF_PASSWORD_KEY = "aafPassword"; + static final String ENV_CONTEXT_KEY = "envContext"; + static final String ROUTE_OFFER_KEY = "routeOffer"; + static final String COMMON_SERVICE_VERSION_KEY = "commonServiceVersion"; + static final String PARTNER_KEY = "partner"; + static final String VERSION_KEY = "version"; + static final String SERVICE_KEY = "service"; + static final String SUBCONTEXT_KEY = "subContext"; + static final String ENDPOINT_READ_TIMEOUT_KEY = "endpointReadTimeout"; + static final String OUTPUT_PATH_KEY = "outputPath"; + + final String aafUserName; + final String aafPassword; + final String envContext; + final String routeOffer; + final String[] proxyUrls; + final String commonServiceVersion; + final String partner; + final String endpointReadTimeout; + Integer index; + + public DME2(Properties properties) { + Iterator> it = properties.entrySet().iterator(); + while (it.hasNext()) { + Entry entry = it.next(); + if (entry.getValue() == null || entry.getValue().toString().length() < 1) { + it.remove(); + } + } + this.aafUserName = properties.getProperty(AAF_USERNAME_KEY, null); + this.aafPassword = properties.getProperty(AAF_PASSWORD_KEY, null); + this.envContext = properties.getProperty(ENV_CONTEXT_KEY, null); + this.routeOffer = properties.getProperty(ROUTE_OFFER_KEY, null); + this.commonServiceVersion = properties.getProperty(COMMON_SERVICE_VERSION_KEY, null); + this.partner = properties.getProperty(PARTNER_KEY, null); + this.endpointReadTimeout = properties.getProperty(ENDPOINT_READ_TIMEOUT_KEY, null); + String proxyUrlString = properties.getProperty(PROXY_URL_KEY, null); + if (proxyUrlString != null && proxyUrlString.length() > 0) { + this.proxyUrls = proxyUrlString.split(PROXY_URLS_VALUE_SEPARATOR); + } else { + String[] local = {"http://localhost:5000"}; + this.proxyUrls = local; + } + this.index = 0; + } + + // constructs a URL to contact the proxy which contacts a DME2 service + public String constructUrl(Map parameters) { + StringBuilder sb = new StringBuilder(); + + // The hostname is assigned in a round robin fashion + sb.append(acquireHostName()); + sb.append("/service=" + parameters.get(SERVICE_KEY)); + + // If the directedGraph passes an explicit version use that, if not use the commonServiceVersion + // found in the properties file + String version = parameters.getOrDefault(VERSION_KEY, this.commonServiceVersion); + sb.append("/version=" + version); + String envContext = parameters.getOrDefault(ENV_CONTEXT_KEY, this.envContext); + sb.append("/envContext=" + envContext); + String routeOffer = parameters.getOrDefault(ROUTE_OFFER_KEY, this.routeOffer); + sb.append("/routeOffer=" + routeOffer); + + String subContext = parameters.get(SUBCONTEXT_KEY); + if (subContext != null && subContext.length() > 0) { + sb.append("/subContext=" + subContext); + } + sb.append("?dme2.password=" + this.aafPassword); + sb.append("&dme2.username=" + this.aafUserName); + if (this.partner != null) { + sb.append("&dme2.partner=" + this.partner); + } + sb.append("&dme2.allowhttpcode=true"); + String endpointReadTimeout = parameters.getOrDefault(ENDPOINT_READ_TIMEOUT_KEY, this.endpointReadTimeout); + if (endpointReadTimeout != null) { + sb.append("&dme2.endpointReadTimeout=" + endpointReadTimeout); + } + String incompleteUrl = sb.toString(); + + // Support optional parameters in a flexible way + for (Entry param : parameters.entrySet()) { + if (!incompleteUrl.contains(param.getKey() + "=") && param.getValue() != null + && param.getValue().length() > 0 && !OUTPUT_PATH_KEY.equals(param.getKey())) { + sb.append("&" + param.getKey() + "=" + param.getValue()); + } + } + return sb.toString(); + } + + public synchronized String acquireHostName() { + String retVal = proxyUrls[index]; + index++; + if (index == this.proxyUrls.length) { + index = 0; + } + return retVal; + } + + // Node entry point + public void constructUrl(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[] {SERVICE_KEY, OUTPUT_PATH_KEY}, LOG); + String completeProxyUrl = constructUrl(parameters); + ctx.setAttribute(parameters.get(OUTPUT_PATH_KEY), completeProxyUrl); + } + +} diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Factory.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Factory.java new file mode 100644 index 000000000..7013a9c5d --- /dev/null +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Factory.java @@ -0,0 +1,109 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Optional; +import java.util.Properties; +import java.util.Vector; +import org.onap.ccsdk.sli.core.utils.JREFileResolver; +import org.onap.ccsdk.sli.core.utils.KarafRootFileResolver; +import org.onap.ccsdk.sli.core.utils.PropertiesFileResolver; +import org.onap.ccsdk.sli.core.utils.common.CoreDefaultFileResolver; +import org.onap.ccsdk.sli.core.utils.common.SdncConfigEnvVarFileResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Immutable properties container for dme2 properties. Since the initial design decision was made to + * utilize Properties instead of an OSGi ManagedService, it was decided to + * make these properties immutable. + */ +public final class Dme2Factory { + + private static final Logger LOG = LoggerFactory.getLogger(Dme2Factory.class); + private static final String DME2_PROPERTIES_FILE_NAME = "dme2.properties"; + + static Properties properties; + private Vector dme2PropertiesFileResolvers = new Vector<>(); + + public Dme2Factory() { + dme2PropertiesFileResolvers + .add(new SdncConfigEnvVarFileResolver("Using property file (1) from environment variable")); + dme2PropertiesFileResolvers.add(new CoreDefaultFileResolver("Using property file (2) from default directory")); + dme2PropertiesFileResolvers + .add(new JREFileResolver("Using property file (3) from JRE argument", Dme2Factory.class)); + dme2PropertiesFileResolvers.add(new KarafRootFileResolver("Using property file (4) from karaf root", this)); + File dme2File = getDme2File(DME2_PROPERTIES_FILE_NAME); + init(dme2File); + } + + private void init(final File dme2propertiesFile) { + try { + properties = getProperties(dme2propertiesFile); + } catch (final FileNotFoundException e) { + LOG.error("dme2.properties file could not be found at path: {}", dme2propertiesFile, e); + } catch (final IOException e) { + LOG.error("fatal error reading dme2.properties at path: {}", dme2propertiesFile, e); + } + } + + /** + * Reports the method chosen for properties resolution to the Logger. + * + * @param message Some user friendly message + * @param fileOptional The file location of the chosen properties file + * @return the file location of the chosen properties file + */ + private static File reportSuccess(final String message, final Optional fileOptional) { + if (fileOptional.isPresent()) { + final File file = fileOptional.get(); + LOG.info("{} {}", message, file.getPath()); + return file; + } + return null; + } + + private File getDme2File(final String dme2Filename) { + for (final PropertiesFileResolver dblibPropertiesFileResolver : dme2PropertiesFileResolvers) { + final Optional fileOptional = dblibPropertiesFileResolver.resolveFile(dme2Filename); + if (fileOptional.isPresent()) { + return reportSuccess(dblibPropertiesFileResolver.getSuccessfulResolutionMessage(), fileOptional); + } + } + return (new File(dme2Filename)); + } + + private static Properties getProperties(final File dme2File) throws IOException { + final Properties properties = new Properties(); + properties.load(new FileReader(dme2File)); + return properties; + } + + public DME2 createDme2() { + return new DME2(properties); + } + +} diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2PropertiesProvider.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2PropertiesProvider.java deleted file mode 100644 index 6802c9a8b..000000000 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2PropertiesProvider.java +++ /dev/null @@ -1,278 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Strings; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Optional; -import java.util.Properties; -import java.util.Vector; - -import org.onap.ccsdk.sli.core.utils.JREFileResolver; -import org.onap.ccsdk.sli.core.utils.KarafRootFileResolver; -import org.onap.ccsdk.sli.core.utils.PropertiesFileResolver; -import org.onap.ccsdk.sli.core.utils.common.CoreDefaultFileResolver; -import org.onap.ccsdk.sli.core.utils.common.SdncConfigEnvVarFileResolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Immutable properties container for dme2 properties. Since the initial design - * decision was made to utilize Properties instead of an OSGi - * ManagedService, it was decided to make these properties - * immutable. - */ -public final class Dme2PropertiesProvider { - - private static final Logger LOG = LoggerFactory.getLogger(Dme2PropertiesProvider.class); - - /** - * The name of the environment variable to specify the configuration directory. - */ - private static final String SDNC_ROOT_DIR_ENV_VAR_KEY = "SDNC_CONFIG_DIR"; - - /** - * the dme2 properties file name. - */ - private static final String DME2_PROPERTIES_FILE_NAME = "dme2.properties"; - - /** - * the key for proxyUrl, which represents a CSV list of urls - */ - static final String PROXY_URL_KEY = "proxyUrl"; - - /** - * indicates that proxy urls are separated by commas - */ - private static final String PROXY_URLS_VALUE_SEPARATOR = ","; - - /** - * the key for aafUserName - */ - static final String AAF_USERNAME_KEY = "aafUserName"; - - /** - * the key for aafPassword - */ - static final String AAF_PASSWORD_KEY = "aafPassword"; - - /** - * the key for envContext - */ - static final String ENV_CONTEXT_KEY = "envContext"; - - /** - * the key for routeOffer - */ - static final String ROUTE_OFFER_KEY = "routeOffer"; - - /** - * the key for commonServiceVersion - */ - static final String COMMON_SERVICE_VERSION_KEY = "commonServiceVersion"; - - /** - * the key for partner - */ - static final String PARTNER_KEY = "partner"; - - private Optional proxyUrls = Optional.empty(); - - private Optional aafUsername = Optional.empty(); - - private Optional aafPassword = Optional.empty(); - - private Optional envContext = Optional.empty(); - - private Optional routeOffer = Optional.empty(); - - private Optional commonServiceVersion = Optional.empty(); - - private Optional partner = Optional.empty(); - - /** - * A prioritized list of strategies for resolving dme2 properties files. - */ - private Vector dme2PropertiesFileResolvers = new Vector<>(); - - /** - * Instantiates the properties provider, which involves loading the appropriate - * properties for dme2. - */ - public Dme2PropertiesProvider() { - this(DME2_PROPERTIES_FILE_NAME); - } - - /** - * Instantiates the properties provider, which involves loading the appropriate - * properties for dme2. - * - * @param dme2Path - * location of the dme2.properties file - */ - @VisibleForTesting - Dme2PropertiesProvider(final String dme2FileName) { - dme2PropertiesFileResolvers - .add(new SdncConfigEnvVarFileResolver("Using property file (1) from environment variable")); - dme2PropertiesFileResolvers.add(new CoreDefaultFileResolver("Using property file (2) from default directory")); - - dme2PropertiesFileResolvers - .add(new JREFileResolver("Using property file (3) from JRE argument", Dme2PropertiesProvider.class)); - dme2PropertiesFileResolvers.add(new KarafRootFileResolver("Using property file (4) from karaf root", this)); - - File dme2File = getDme2File(dme2FileName); - - init(dme2File); - } - - private void init(final File dme2Path) { - final Properties properties; - try { - properties = getProperties(dme2Path); - this.proxyUrls = getProxyUrls(properties); - this.aafUsername = getAafUsername(properties); - this.aafPassword = getAafPassword(properties); - this.envContext = getEnvContext(properties); - this.routeOffer = getRouteOffer(properties); - this.commonServiceVersion = getCommonServiceVersion(properties); - this.partner = getPartner(properties); - } catch (final FileNotFoundException e) { - - LOG.error("dme2.properties file could not be found at path: {}", dme2Path, e); - } catch (final IOException e) { - LOG.error("fatal error reading dme2.properties at path: {}", dme2Path, e); - } - } - - /** - * Reports the method chosen for properties resolution to the - * Logger. - * - * @param message - * Some user friendly message - * @param fileOptional - * The file location of the chosen properties file - * @return the file location of the chosen properties file - */ - private static File reportSuccess(final String message, final Optional fileOptional) { - if (fileOptional.isPresent()) { - final File file = fileOptional.get(); - LOG.info("{} {}", message, file.getPath()); - return file; - } - return null; - } - - private File getDme2File(final String dme2Filename) { - - for (final PropertiesFileResolver dblibPropertiesFileResolver : dme2PropertiesFileResolvers) { - final Optional fileOptional = dblibPropertiesFileResolver.resolveFile(dme2Filename); - if (fileOptional.isPresent()) { - return reportSuccess(dblibPropertiesFileResolver.getSuccessfulResolutionMessage(), fileOptional); - } - } - return (new File(dme2Filename)); - } - - private static Properties getProperties(final File dme2File) throws IOException { - - final Properties properties = new Properties(); - properties.load(new FileReader(dme2File)); - return properties; - } - - private String getProxyUrl(final Properties properties) { - return properties.getProperty(PROXY_URL_KEY); - } - - private Optional getProxyUrls(final Properties properties) { - final String proxyUrlsValue = getProxyUrl(properties); - if (!Strings.isNullOrEmpty(proxyUrlsValue)) { - return Optional.ofNullable(proxyUrlsValue.split(PROXY_URLS_VALUE_SEPARATOR)); - } - return Optional.empty(); - } - - public Optional getProxyUrls() { - return this.proxyUrls; - } - - private Optional getAafUsername(final Properties properties) { - final String aafUsernameValue = properties.getProperty(AAF_USERNAME_KEY); - return Optional.ofNullable(aafUsernameValue); - } - - Optional getAafUsername() { - return this.aafUsername; - } - - private Optional getAafPassword(final Properties properties) { - final String aafPassword = properties.getProperty(AAF_PASSWORD_KEY); - return Optional.ofNullable(aafPassword); - } - - Optional getAafPassword() { - return this.aafPassword; - } - - private Optional getEnvContext(final Properties properties) { - final String envContext = properties.getProperty(ENV_CONTEXT_KEY); - return Optional.ofNullable(envContext); - } - - Optional getEnvContext() { - return this.envContext; - } - - private Optional getRouteOffer(final Properties properties) { - final String routeOffer = properties.getProperty(ROUTE_OFFER_KEY); - return Optional.ofNullable(routeOffer); - } - - Optional getRouteOffer() { - return this.routeOffer; - } - - private Optional getCommonServiceVersion(final Properties properties) { - final String commonServiceVersion = properties.getProperty(COMMON_SERVICE_VERSION_KEY); - return Optional.ofNullable(commonServiceVersion); - } - - Optional getCommonServiceVersion() { - return this.commonServiceVersion; - } - - private Optional getPartner(final Properties properties) { - final String partner = properties.getProperty(PARTNER_KEY); - return Optional.ofNullable(partner); - } - - Optional getPartner() { - return this.partner; - } -} diff --git a/sliPluginUtils/provider/src/main/resources/org/opendaylight/blueprint/slipluginutils-blueprint.xml b/sliPluginUtils/provider/src/main/resources/org/opendaylight/blueprint/slipluginutils-blueprint.xml index c0952d2a2..283dbbaa9 100644 --- a/sliPluginUtils/provider/src/main/resources/org/opendaylight/blueprint/slipluginutils-blueprint.xml +++ b/sliPluginUtils/provider/src/main/resources/org/opendaylight/blueprint/slipluginutils-blueprint.xml @@ -1,19 +1,20 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java index d19fbec43..662df75da 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java @@ -1,109 +1,184 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - -public class Dme2Test { - - @Test - public void createInstarUrl() { - String instarUrl = "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - DME2 dme = new DME2("user@sample.com", "fake", "TEST", "DEFAULT", new String[] { "http://localhost:25055" }, "common"); - String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(instarUrl, constructedUrl); - } - - @Test - public void createInstarUrlNoSubContext() { - String instarUrl = "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - DME2 dme = new DME2("user@sample.com", "fake", "TEST", "DEFAULT", new String[] { "http://localhost:25055" }, "common"); - Map parameters = new HashMap(); - String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", parameters.get(null)); - assertEquals(instarUrl, constructedUrl); - } - - @Test - public void testRoundRobin() { - String[] proxyHostNames = new String[] { "http://one:25055", "http://two:25055", "http://three:25055" }; - String urlSuffix = "/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - DME2 dme = new DME2("user@sample.com", "fake", "TEST", "DEFAULT", proxyHostNames, "common"); - String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - } - - @Test - public void createDme2EndtoEnd() { - Dme2PropertiesProvider provider = - new Dme2PropertiesProvider("src/test/resources/dme2.e2e.properties"); - DME2 dme2 = new DME2(provider); - assertEquals("user@sample.com", dme2.aafUserName); - assertEquals("fake", dme2.aafPassword); - assertEquals("UAT", dme2.envContext); - assertEquals("UAT", dme2.routeOffer); - Assert.assertArrayEquals("http://sample.com:25055,http://sample.com:25055".split(","), dme2.proxyUrls); - assertEquals("1702.0", dme2.commonServiceVersion); - assertEquals(null, dme2.partner); - - String constructedUrl = dme2.constructUrl("sample.com/restservices/instar/v1/assetSearch", null, "/mySubContext"); - assertNotNull(constructedUrl); - System.out.println(constructedUrl); - } - - @Test - public void createDme2Prod() { - Dme2PropertiesProvider provider = - new Dme2PropertiesProvider("src/test/resources/dme2.prod.properties"); - DME2 dme2 = new DME2(provider); - assertEquals("user@sample.com", dme2.aafUserName); - assertEquals("fake", dme2.aafPassword); - assertEquals("PROD", dme2.envContext); - assertEquals("", dme2.routeOffer); - Assert.assertArrayEquals("http://sample.com:25055,http://sample.com:25055".split(","), dme2.proxyUrls); - assertEquals("1.0", dme2.commonServiceVersion); - assertEquals("LPP_PROD", dme2.partner); - - String constructedUrl = dme2.constructUrl("sample.com/restservices/instar/v1/assetSearch", null, "/mySubContext"); - assertNotNull(constructedUrl); - System.out.println(constructedUrl); - } - -} +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import org.junit.Assert; +import org.junit.Test; + +public class Dme2Test { + public Properties makesProperties(String aafUserName, String aafPassword, String envContext, String routeOffer, + String proxyUrls, String commonServiceVersion) { + Properties props = new Properties(); + props.put(DME2.AAF_USERNAME_KEY, aafUserName); + props.put(DME2.AAF_PASSWORD_KEY, aafPassword); + props.put(DME2.ENV_CONTEXT_KEY, envContext); + props.put(DME2.ROUTE_OFFER_KEY, routeOffer); + props.put(DME2.PROXY_URL_KEY, proxyUrls); + props.put(DME2.COMMON_SERVICE_VERSION_KEY, commonServiceVersion); + return props; + } + + @Test + public void createUrl() { + String instarUrl = + "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + Properties props = + makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); + DME2 dme = new DME2(props); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); + parameters.put(DME2.VERSION_KEY, "1702.0"); + parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + parameters.put(DME2.OUTPUT_PATH_KEY, "tmp.test"); + + String constructedUrl = dme.constructUrl(parameters); + assertEquals(instarUrl, constructedUrl); + } + + @Test + public void createUrlNoSubContext() { + String instarUrl = + "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + Properties props = + makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); + DME2 dme = new DME2(props); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); + parameters.put(DME2.VERSION_KEY, "1702.0"); + parameters.put(DME2.SUBCONTEXT_KEY, null); + String constructedUrl = dme.constructUrl(parameters); + assertEquals(instarUrl, constructedUrl); + } + + @Test + public void testRoundRobin() { + String[] proxyHostNames = new String[] {"http://one:25055", "http://two:25055", "http://three:25055"}; + String proxyHostNameString = proxyHostNames[0] + "," + proxyHostNames[1] + "," + proxyHostNames[2]; + + String urlSuffix = + "/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + Properties props = makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", proxyHostNameString, "common"); + DME2 dme = new DME2(props); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); + parameters.put(DME2.VERSION_KEY, "1702.0"); + parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + String constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); + } + + @Test + public void createDme2EndtoEnd() throws FileNotFoundException, IOException { + Properties props = new Properties(); + props.load(new FileInputStream("src/test/resources/dme2.e2e.properties")); + DME2 dme2 = new DME2(props); + assertEquals("user@sample.com", dme2.aafUserName); + assertEquals("fake", dme2.aafPassword); + assertEquals("UAT", dme2.envContext); + assertEquals("UAT", dme2.routeOffer); + Assert.assertArrayEquals( + "http://sample.com:25055,http://sample.com:25055".split(DME2.PROXY_URLS_VALUE_SEPARATOR), + dme2.proxyUrls); + assertEquals("1702.0", dme2.commonServiceVersion); + assertEquals(null, dme2.partner); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "sample.com/restservices/instar/v1/assetSearch"); + parameters.put(DME2.VERSION_KEY, null); + parameters.put(DME2.SUBCONTEXT_KEY, "/mySubContext"); + String constructedUrl = dme2.constructUrl(parameters); + assertNotNull(constructedUrl); + } + + @Test + public void createDme2Prod() throws FileNotFoundException, IOException { + Properties props = new Properties(); + props.load(new FileInputStream("src/test/resources/dme2.prod.properties")); + DME2 dme2 = new DME2(props); + assertEquals("user@sample.com", dme2.aafUserName); + assertEquals("fake", dme2.aafPassword); + assertEquals("PROD", dme2.envContext); + assertEquals(null, dme2.routeOffer); + Assert.assertArrayEquals( + "http://sample.com:25055,http://sample.com:25055".split(DME2.PROXY_URLS_VALUE_SEPARATOR), + dme2.proxyUrls); + assertEquals("1.0", dme2.commonServiceVersion); + assertEquals("LPP_PROD", dme2.partner); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); + parameters.put(DME2.VERSION_KEY, "1702.0"); + parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + String constructedUrl = dme2.constructUrl(parameters); + assertNotNull(constructedUrl); + } + + @Test + public void blankProperties() throws Exception { + Properties props = new Properties(); + DME2 dme2 = new DME2(props); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "easyService"); + parameters.put(DME2.VERSION_KEY, "3"); + parameters.put(DME2.SUBCONTEXT_KEY, "/sub"); + assertEquals( + "http://localhost:5000/service=easyService/version=3/envContext=null/routeOffer=null/subContext=/sub?dme2.password=null&dme2.username=null&dme2.allowhttpcode=true", + dme2.constructUrl(parameters)); + } + + @Test + public void optionalParameters() { + String instarUrl = + "http://localhost:25055/service=serv/version=4/envContext=TEST/routeOffer=DEFAULT/subContext=/sub?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true&test=123"; + Properties props = + makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); + DME2 dme = new DME2(props); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "serv"); + parameters.put(DME2.VERSION_KEY, "4"); + parameters.put(DME2.SUBCONTEXT_KEY, "/sub"); + parameters.put("test", "123"); + + String constructedUrl = dme.constructUrl(parameters); + assertEquals(instarUrl, constructedUrl); + } + +} -- cgit 1.2.3-korg From 127401e9fbca889c1a64836ae06ac03309e26e7c Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Tue, 12 Jun 2018 14:12:26 +0000 Subject: dme2 partner fix update dme2 query parameter for partner it should be just partner not dme2.partner Change-Id: I2c4304cb2cce4d1def7f4b33bd17bfeca0f68fd3 Issue-ID: CCSDK-301 Signed-off-by: Smokowski, Kevin (ks6305) --- .../src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java index 5121e8a56..422470b8f 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java @@ -112,7 +112,7 @@ public class DME2 implements SvcLogicJavaPlugin { sb.append("?dme2.password=" + this.aafPassword); sb.append("&dme2.username=" + this.aafUserName); if (this.partner != null) { - sb.append("&dme2.partner=" + this.partner); + sb.append("&partner=" + this.partner); } sb.append("&dme2.allowhttpcode=true"); String endpointReadTimeout = parameters.getOrDefault(ENDPOINT_READ_TIMEOUT_KEY, this.endpointReadTimeout); -- cgit 1.2.3-korg From ed8a53f82d780d3c8409e286bff238dc93e43e2b Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Thu, 21 Jun 2018 14:40:27 +0000 Subject: additional dme2 improvements add back convenience method to support legacy callers that don't want to switch to new function signature and additional small changes Change-Id: Idebc992c4ddf70feb11fc7faebb0f050c353a4a7 Issue-ID: CCSDK-308 Signed-off-by: Smokowski, Kevin (ks6305) --- .../onap/ccsdk/sli/core/slipluginutils/DME2.java | 319 +++++++------- .../ccsdk/sli/core/slipluginutils/Dme2Test.java | 466 +++++++++++++-------- 2 files changed, 451 insertions(+), 334 deletions(-) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java index 422470b8f..7bc1a4118 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java @@ -1,150 +1,169 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; - -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import org.onap.ccsdk.sli.core.sli.SvcLogicContext; -import org.onap.ccsdk.sli.core.sli.SvcLogicException; -import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A SvcLogicJavaPlugin that generates DME2 proxy urls (for calling the DME2 ingress proxy) using - * parameters from context memory. - */ -public class DME2 implements SvcLogicJavaPlugin { - - private static final Logger LOG = LoggerFactory.getLogger(DME2.class); - // the key for proxyUrl, which represents a CSV list of urls - static final String PROXY_URL_KEY = "proxyUrl"; - static final String PROXY_URLS_VALUE_SEPARATOR = ","; - static final String AAF_USERNAME_KEY = "aafUserName"; - static final String AAF_PASSWORD_KEY = "aafPassword"; - static final String ENV_CONTEXT_KEY = "envContext"; - static final String ROUTE_OFFER_KEY = "routeOffer"; - static final String COMMON_SERVICE_VERSION_KEY = "commonServiceVersion"; - static final String PARTNER_KEY = "partner"; - static final String VERSION_KEY = "version"; - static final String SERVICE_KEY = "service"; - static final String SUBCONTEXT_KEY = "subContext"; - static final String ENDPOINT_READ_TIMEOUT_KEY = "endpointReadTimeout"; - static final String OUTPUT_PATH_KEY = "outputPath"; - - final String aafUserName; - final String aafPassword; - final String envContext; - final String routeOffer; - final String[] proxyUrls; - final String commonServiceVersion; - final String partner; - final String endpointReadTimeout; - Integer index; - - public DME2(Properties properties) { - Iterator> it = properties.entrySet().iterator(); - while (it.hasNext()) { - Entry entry = it.next(); - if (entry.getValue() == null || entry.getValue().toString().length() < 1) { - it.remove(); - } - } - this.aafUserName = properties.getProperty(AAF_USERNAME_KEY, null); - this.aafPassword = properties.getProperty(AAF_PASSWORD_KEY, null); - this.envContext = properties.getProperty(ENV_CONTEXT_KEY, null); - this.routeOffer = properties.getProperty(ROUTE_OFFER_KEY, null); - this.commonServiceVersion = properties.getProperty(COMMON_SERVICE_VERSION_KEY, null); - this.partner = properties.getProperty(PARTNER_KEY, null); - this.endpointReadTimeout = properties.getProperty(ENDPOINT_READ_TIMEOUT_KEY, null); - String proxyUrlString = properties.getProperty(PROXY_URL_KEY, null); - if (proxyUrlString != null && proxyUrlString.length() > 0) { - this.proxyUrls = proxyUrlString.split(PROXY_URLS_VALUE_SEPARATOR); - } else { - String[] local = {"http://localhost:5000"}; - this.proxyUrls = local; - } - this.index = 0; - } - - // constructs a URL to contact the proxy which contacts a DME2 service - public String constructUrl(Map parameters) { - StringBuilder sb = new StringBuilder(); - - // The hostname is assigned in a round robin fashion - sb.append(acquireHostName()); - sb.append("/service=" + parameters.get(SERVICE_KEY)); - - // If the directedGraph passes an explicit version use that, if not use the commonServiceVersion - // found in the properties file - String version = parameters.getOrDefault(VERSION_KEY, this.commonServiceVersion); - sb.append("/version=" + version); - String envContext = parameters.getOrDefault(ENV_CONTEXT_KEY, this.envContext); - sb.append("/envContext=" + envContext); - String routeOffer = parameters.getOrDefault(ROUTE_OFFER_KEY, this.routeOffer); - sb.append("/routeOffer=" + routeOffer); - - String subContext = parameters.get(SUBCONTEXT_KEY); - if (subContext != null && subContext.length() > 0) { - sb.append("/subContext=" + subContext); - } - sb.append("?dme2.password=" + this.aafPassword); - sb.append("&dme2.username=" + this.aafUserName); - if (this.partner != null) { - sb.append("&partner=" + this.partner); - } - sb.append("&dme2.allowhttpcode=true"); - String endpointReadTimeout = parameters.getOrDefault(ENDPOINT_READ_TIMEOUT_KEY, this.endpointReadTimeout); - if (endpointReadTimeout != null) { - sb.append("&dme2.endpointReadTimeout=" + endpointReadTimeout); - } - String incompleteUrl = sb.toString(); - - // Support optional parameters in a flexible way - for (Entry param : parameters.entrySet()) { - if (!incompleteUrl.contains(param.getKey() + "=") && param.getValue() != null - && param.getValue().length() > 0 && !OUTPUT_PATH_KEY.equals(param.getKey())) { - sb.append("&" + param.getKey() + "=" + param.getValue()); - } - } - return sb.toString(); - } - - public synchronized String acquireHostName() { - String retVal = proxyUrls[index]; - index++; - if (index == this.proxyUrls.length) { - index = 0; - } - return retVal; - } - - // Node entry point - public void constructUrl(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[] {SERVICE_KEY, OUTPUT_PATH_KEY}, LOG); - String completeProxyUrl = constructUrl(parameters); - ctx.setAttribute(parameters.get(OUTPUT_PATH_KEY), completeProxyUrl); - } - -} +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A SvcLogicJavaPlugin that generates DME2 proxy urls (for calling the DME2 ingress proxy) using + * parameters from context memory. + */ +public class DME2 implements SvcLogicJavaPlugin { + + private static final Logger LOG = LoggerFactory.getLogger(DME2.class); + // the key for proxyUrl, which represents a CSV list of urls + static final String PROXY_URL_KEY = "proxyUrl"; + static final String PROXY_URLS_VALUE_SEPARATOR = ","; + static final String AAF_USERNAME_KEY = "aafUserName"; + static final String AAF_PASSWORD_KEY = "aafPassword"; + static final String ENV_CONTEXT_KEY = "envContext"; + static final String ROUTE_OFFER_KEY = "routeOffer"; + static final String COMMON_SERVICE_VERSION_KEY = "commonServiceVersion"; + static final String PARTNER_KEY = "partner"; + static final String VERSION_KEY = "version"; + static final String SERVICE_KEY = "service"; + static final String SUBCONTEXT_KEY = "subContext"; + static final String ENDPOINT_READ_TIMEOUT_KEY = "endpointReadTimeout"; + static final String OUTPUT_PATH_KEY = "outputPath"; + + final String aafUserName; + final String aafPassword; + final String envContext; + final String routeOffer; + final String[] proxyUrls; + final String commonServiceVersion; + final String partner; + final String endpointReadTimeout; + Integer index; + + public DME2(Properties properties) { + Iterator> it = properties.entrySet().iterator(); + while (it.hasNext()) { + Entry entry = it.next(); + if (entry.getValue() == null || entry.getValue().toString().length() < 1) { + it.remove(); + } + } + this.aafUserName = properties.getProperty(AAF_USERNAME_KEY, null); + this.aafPassword = properties.getProperty(AAF_PASSWORD_KEY, null); + this.envContext = properties.getProperty(ENV_CONTEXT_KEY, null); + this.routeOffer = properties.getProperty(ROUTE_OFFER_KEY, null); + this.commonServiceVersion = properties.getProperty(COMMON_SERVICE_VERSION_KEY, null); + this.partner = properties.getProperty(PARTNER_KEY, null); + this.endpointReadTimeout = properties.getProperty(ENDPOINT_READ_TIMEOUT_KEY, null); + String proxyUrlString = properties.getProperty(PROXY_URL_KEY, null); + if (proxyUrlString != null && proxyUrlString.length() > 0) { + this.proxyUrls = proxyUrlString.split(PROXY_URLS_VALUE_SEPARATOR); + } else { + String[] local = {"http://localhost:5000"}; + this.proxyUrls = local; + } + this.index = 0; + } + + // constructs a URL to contact the proxy which contacts a DME2 service + public String constructUrl(Map parameters) { + StringBuilder sb = new StringBuilder(); + + // The hostname is assigned in a round robin fashion + sb.append(acquireHostName()); + sb.append("/service=" + parameters.get(SERVICE_KEY)); + + // If the directedGraph passes an explicit version use that, if not use the commonServiceVersion + // found in the properties file + String version = parameters.get(VERSION_KEY); + if (version != null && version.length() > 0) { + sb.append("/version=" + version); + }else { + sb.append("/version=" + this.commonServiceVersion); + } + String envContext = parameters.getOrDefault(ENV_CONTEXT_KEY, this.envContext); + sb.append("/envContext=" + envContext); + + String routeOffer = parameters.getOrDefault(ROUTE_OFFER_KEY, this.routeOffer); + if (routeOffer != null && routeOffer.length() > 0) { + sb.append("/routeOffer=" + routeOffer); + } + + String subContext = parameters.get(SUBCONTEXT_KEY); + if (subContext != null && subContext.length() > 0) { + sb.append("/subContext=" + subContext); + } + sb.append("?dme2.password=" + this.aafPassword); + sb.append("&dme2.username=" + this.aafUserName); + if (this.partner != null) { + sb.append("&partner=" + this.partner); + } + sb.append("&dme2.allowhttpcode=true"); + String endpointReadTimeout = parameters.getOrDefault(ENDPOINT_READ_TIMEOUT_KEY, this.endpointReadTimeout); + if (endpointReadTimeout != null) { + sb.append("&dme2.endpointReadTimeout=" + endpointReadTimeout); + } + String incompleteUrl = sb.toString(); + + // Support optional parameters in a flexible way + for (Entry param : parameters.entrySet()) { + if (!incompleteUrl.contains(param.getKey() + "=") && param.getValue() != null + && param.getValue().length() > 0 && !OUTPUT_PATH_KEY.equals(param.getKey())) { + sb.append("&" + param.getKey() + "=" + param.getValue()); + } + } + return sb.toString(); + } + + public synchronized String acquireHostName() { + String retVal = proxyUrls[index]; + index++; + if (index == this.proxyUrls.length) { + index = 0; + } + return retVal; + } + + // Node entry point + public void constructUrl(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[] {SERVICE_KEY, OUTPUT_PATH_KEY}, LOG); + String completeProxyUrl = constructUrl(parameters); + ctx.setAttribute(parameters.get(OUTPUT_PATH_KEY), completeProxyUrl); + } + + // Support legacy direct java call + public String constructUrl(String service, String version, String subContext) { + Map parameters = new HashMap(); + parameters.put(SERVICE_KEY, service); + if (version != null) { + parameters.put(VERSION_KEY, version); + } + parameters.put(SUBCONTEXT_KEY, subContext); + return constructUrl(parameters); + } + +} diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java index 662df75da..6cb6c8ba1 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java @@ -1,184 +1,282 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import org.junit.Assert; -import org.junit.Test; - -public class Dme2Test { - public Properties makesProperties(String aafUserName, String aafPassword, String envContext, String routeOffer, - String proxyUrls, String commonServiceVersion) { - Properties props = new Properties(); - props.put(DME2.AAF_USERNAME_KEY, aafUserName); - props.put(DME2.AAF_PASSWORD_KEY, aafPassword); - props.put(DME2.ENV_CONTEXT_KEY, envContext); - props.put(DME2.ROUTE_OFFER_KEY, routeOffer); - props.put(DME2.PROXY_URL_KEY, proxyUrls); - props.put(DME2.COMMON_SERVICE_VERSION_KEY, commonServiceVersion); - return props; - } - - @Test - public void createUrl() { - String instarUrl = - "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - Properties props = - makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); - DME2 dme = new DME2(props); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); - parameters.put(DME2.VERSION_KEY, "1702.0"); - parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - parameters.put(DME2.OUTPUT_PATH_KEY, "tmp.test"); - - String constructedUrl = dme.constructUrl(parameters); - assertEquals(instarUrl, constructedUrl); - } - - @Test - public void createUrlNoSubContext() { - String instarUrl = - "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - Properties props = - makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); - DME2 dme = new DME2(props); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); - parameters.put(DME2.VERSION_KEY, "1702.0"); - parameters.put(DME2.SUBCONTEXT_KEY, null); - String constructedUrl = dme.constructUrl(parameters); - assertEquals(instarUrl, constructedUrl); - } - - @Test - public void testRoundRobin() { - String[] proxyHostNames = new String[] {"http://one:25055", "http://two:25055", "http://three:25055"}; - String proxyHostNameString = proxyHostNames[0] + "," + proxyHostNames[1] + "," + proxyHostNames[2]; - - String urlSuffix = - "/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - Properties props = makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", proxyHostNameString, "common"); - DME2 dme = new DME2(props); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); - parameters.put(DME2.VERSION_KEY, "1702.0"); - parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - String constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - } - - @Test - public void createDme2EndtoEnd() throws FileNotFoundException, IOException { - Properties props = new Properties(); - props.load(new FileInputStream("src/test/resources/dme2.e2e.properties")); - DME2 dme2 = new DME2(props); - assertEquals("user@sample.com", dme2.aafUserName); - assertEquals("fake", dme2.aafPassword); - assertEquals("UAT", dme2.envContext); - assertEquals("UAT", dme2.routeOffer); - Assert.assertArrayEquals( - "http://sample.com:25055,http://sample.com:25055".split(DME2.PROXY_URLS_VALUE_SEPARATOR), - dme2.proxyUrls); - assertEquals("1702.0", dme2.commonServiceVersion); - assertEquals(null, dme2.partner); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "sample.com/restservices/instar/v1/assetSearch"); - parameters.put(DME2.VERSION_KEY, null); - parameters.put(DME2.SUBCONTEXT_KEY, "/mySubContext"); - String constructedUrl = dme2.constructUrl(parameters); - assertNotNull(constructedUrl); - } - - @Test - public void createDme2Prod() throws FileNotFoundException, IOException { - Properties props = new Properties(); - props.load(new FileInputStream("src/test/resources/dme2.prod.properties")); - DME2 dme2 = new DME2(props); - assertEquals("user@sample.com", dme2.aafUserName); - assertEquals("fake", dme2.aafPassword); - assertEquals("PROD", dme2.envContext); - assertEquals(null, dme2.routeOffer); - Assert.assertArrayEquals( - "http://sample.com:25055,http://sample.com:25055".split(DME2.PROXY_URLS_VALUE_SEPARATOR), - dme2.proxyUrls); - assertEquals("1.0", dme2.commonServiceVersion); - assertEquals("LPP_PROD", dme2.partner); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); - parameters.put(DME2.VERSION_KEY, "1702.0"); - parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - String constructedUrl = dme2.constructUrl(parameters); - assertNotNull(constructedUrl); - } - - @Test - public void blankProperties() throws Exception { - Properties props = new Properties(); - DME2 dme2 = new DME2(props); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "easyService"); - parameters.put(DME2.VERSION_KEY, "3"); - parameters.put(DME2.SUBCONTEXT_KEY, "/sub"); - assertEquals( - "http://localhost:5000/service=easyService/version=3/envContext=null/routeOffer=null/subContext=/sub?dme2.password=null&dme2.username=null&dme2.allowhttpcode=true", - dme2.constructUrl(parameters)); - } - - @Test - public void optionalParameters() { - String instarUrl = - "http://localhost:25055/service=serv/version=4/envContext=TEST/routeOffer=DEFAULT/subContext=/sub?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true&test=123"; - Properties props = - makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); - DME2 dme = new DME2(props); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "serv"); - parameters.put(DME2.VERSION_KEY, "4"); - parameters.put(DME2.SUBCONTEXT_KEY, "/sub"); - parameters.put("test", "123"); - - String constructedUrl = dme.constructUrl(parameters); - assertEquals(instarUrl, constructedUrl); - } - -} +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import org.junit.Assert; +import org.junit.Test; + +public class Dme2Test { + public Properties makesProperties(String aafUserName, String aafPassword, String envContext, String routeOffer, + String proxyUrls, String commonServiceVersion) { + Properties props = new Properties(); + props.put(DME2.AAF_USERNAME_KEY, aafUserName); + props.put(DME2.AAF_PASSWORD_KEY, aafPassword); + props.put(DME2.ENV_CONTEXT_KEY, envContext); + props.put(DME2.ROUTE_OFFER_KEY, routeOffer); + props.put(DME2.PROXY_URL_KEY, proxyUrls); + props.put(DME2.COMMON_SERVICE_VERSION_KEY, commonServiceVersion); + return props; + } + + @Test + public void createUrl() { + String localUrl = + "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + Properties props = + makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); + DME2 dme = new DME2(props); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); + parameters.put(DME2.VERSION_KEY, "1702.0"); + parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + parameters.put(DME2.OUTPUT_PATH_KEY, "tmp.test"); + + String constructedUrl = dme.constructUrl(parameters); + assertEquals(localUrl, constructedUrl); + } + + @Test + public void createUrlNoSubContext() { + String localUrl = + "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + Properties props = + makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); + DME2 dme = new DME2(props); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); + parameters.put(DME2.VERSION_KEY, "1702.0"); + parameters.put(DME2.SUBCONTEXT_KEY, null); + String constructedUrl = dme.constructUrl(parameters); + assertEquals(localUrl, constructedUrl); + } + + @Test + public void testRoundRobin() { + String[] proxyHostNames = new String[] {"http://one:25055", "http://two:25055", "http://three:25055"}; + String proxyHostNameString = proxyHostNames[0] + "," + proxyHostNames[1] + "," + proxyHostNames[2]; + + String urlSuffix = + "/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + Properties props = makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", proxyHostNameString, "common"); + DME2 dme = new DME2(props); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); + parameters.put(DME2.VERSION_KEY, "1702.0"); + parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + String constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl(parameters); + assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); + } + + @Test + public void createDme2EndtoEnd() throws FileNotFoundException, IOException { + Properties props = new Properties(); + props.load(new FileInputStream("src/test/resources/dme2.e2e.properties")); + DME2 dme2 = new DME2(props); + assertEquals("user@sample.com", dme2.aafUserName); + assertEquals("fake", dme2.aafPassword); + assertEquals("UAT", dme2.envContext); + assertEquals("UAT", dme2.routeOffer); + Assert.assertArrayEquals( + "http://sample.com:25055,http://sample.com:25055".split(DME2.PROXY_URLS_VALUE_SEPARATOR), + dme2.proxyUrls); + assertEquals("1702.0", dme2.commonServiceVersion); + assertEquals(null, dme2.partner); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "sample.com/restservices/sys/v1/assetSearch"); + parameters.put(DME2.VERSION_KEY, null); + parameters.put(DME2.SUBCONTEXT_KEY, "/mySubContext"); + String constructedUrl = dme2.constructUrl(parameters); + assertNotNull(constructedUrl); + String expected = + "http://sample.com:25055/service=sample.com/restservices/sys/v1/assetSearch/version=1702.0/envContext=UAT/routeOffer=UAT/subContext=/mySubContext?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + assertEquals(expected, constructedUrl); + } + + @Test + public void createDme2Prod() throws FileNotFoundException, IOException { + Properties props = new Properties(); + props.load(new FileInputStream("src/test/resources/dme2.prod.properties")); + DME2 dme2 = new DME2(props); + assertEquals("user@sample.com", dme2.aafUserName); + assertEquals("fake", dme2.aafPassword); + assertEquals("PROD", dme2.envContext); + assertEquals(null, dme2.routeOffer); + Assert.assertArrayEquals( + "http://sample.com:25055,http://sample.com:25055".split(DME2.PROXY_URLS_VALUE_SEPARATOR), + dme2.proxyUrls); + assertEquals("1.0", dme2.commonServiceVersion); + assertEquals("LPP_PROD", dme2.partner); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); + parameters.put(DME2.VERSION_KEY, "1702.0"); + parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + String constructedUrl = dme2.constructUrl(parameters); + assertNotNull(constructedUrl); + String expected = + "http://sample.com:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=PROD/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&partner=LPP_PROD&dme2.allowhttpcode=true"; + assertEquals(expected, constructedUrl); + } + + @Test + public void blankProperties() throws Exception { + Properties props = new Properties(); + DME2 dme2 = new DME2(props); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "easyService"); + parameters.put(DME2.VERSION_KEY, "3"); + parameters.put(DME2.SUBCONTEXT_KEY, "/sub"); + assertEquals( + "http://localhost:5000/service=easyService/version=3/envContext=null/subContext=/sub?dme2.password=null&dme2.username=null&dme2.allowhttpcode=true", + dme2.constructUrl(parameters)); + } + + @Test + public void optionalParameters() { + String localUrl = + "http://localhost:25055/service=serv/version=4/envContext=TEST/routeOffer=DEFAULT/subContext=/sub?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true&test=123"; + Properties props = + makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); + DME2 dme = new DME2(props); + Map parameters = new HashMap(); + parameters.put(DME2.SERVICE_KEY, "serv"); + parameters.put(DME2.VERSION_KEY, "4"); + parameters.put(DME2.SUBCONTEXT_KEY, "/sub"); + parameters.put("test", "123"); + + String constructedUrl = dme.constructUrl(parameters); + assertEquals(localUrl, constructedUrl); + } + + @Test + public void createLocalUrlLegacy() { + String localUrl = + "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + Properties props = + makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); + DME2 dme = new DME2(props); + String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", + "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + assertEquals(localUrl, constructedUrl); + } + + @Test + public void createLocalUrlNoSubContextLegacy() { + String localUrl = + "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + Properties props = + makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); + DME2 dme = new DME2(props); + Map parameters = new HashMap(); + String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", parameters.get(null)); + assertEquals(localUrl, constructedUrl); + } + + @Test + public void testRoundRobinLegacy() { + String[] proxyHostNames = new String[] {"http://one:25055", "http://two:25055", "http://three:25055"}; + String urlSuffix = + "/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + Properties props = makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", + "http://one:25055,http://two:25055,http://three:25055", "common"); + DME2 dme = new DME2(props); + String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", + "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", + "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", + "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", + "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", + "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", + "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); + constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", + "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); + assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); + } + + @Test + public void createDme2EndtoEndLegacy() throws Exception { + Properties props = new Properties(); + props.load(new FileInputStream("src/test/resources/dme2.e2e.properties")); + DME2 dme2 = new DME2(props); + assertEquals("user@sample.com", dme2.aafUserName); + assertEquals("fake", dme2.aafPassword); + assertEquals("UAT", dme2.envContext); + assertEquals("UAT", dme2.routeOffer); + Assert.assertArrayEquals("http://sample.com:25055,http://sample.com:25055".split(","), dme2.proxyUrls); + assertEquals("1702.0", dme2.commonServiceVersion); + assertEquals(null, dme2.partner); + String constructedUrl = dme2.constructUrl("sample.com/restservices/sys/v1/assetSearch", null, "/mySubContext"); + assertNotNull(constructedUrl); + String expected = + "http://sample.com:25055/service=sample.com/restservices/sys/v1/assetSearch/version=1702.0/envContext=UAT/routeOffer=UAT/subContext=/mySubContext?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; + assertEquals(expected, constructedUrl); + } + + @Test + public void createDme2ProdLegacy() throws Exception { + Properties props = new Properties(); + props.load(new FileInputStream("src/test/resources/dme2.prod.properties")); + DME2 dme2 = new DME2(props); + assertEquals("user@sample.com", dme2.aafUserName); + assertEquals("fake", dme2.aafPassword); + assertEquals("PROD", dme2.envContext); + assertEquals(null, dme2.routeOffer); + Assert.assertArrayEquals("http://sample.com:25055,http://sample.com:25055".split(","), dme2.proxyUrls); + assertEquals("1.0", dme2.commonServiceVersion); + assertEquals("LPP_PROD", dme2.partner); + String constructedUrl = dme2.constructUrl("sample.com/restservices/sys/v1/assetSearch", null, "/mySubContext"); + assertNotNull(constructedUrl); + String expected = + "http://sample.com:25055/service=sample.com/restservices/sys/v1/assetSearch/version=1.0/envContext=PROD/subContext=/mySubContext?dme2.password=fake&dme2.username=user@sample.com&partner=LPP_PROD&dme2.allowhttpcode=true"; + assertEquals(expected, constructedUrl); + } + +} -- cgit 1.2.3-korg From dcf9e631063544fb44ac11491c717907165b9620 Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Wed, 27 Jun 2018 20:15:40 +0000 Subject: filter partner out filter partner out Change-Id: Ia23d5f484c52aed94500bb0bf50ae2654d8aa14b Issue-ID: CCSDK-323 Signed-off-by: Smokowski, Kevin (ks6305) --- .../onap/ccsdk/sli/core/slipluginutils/DME2.java | 28 +++++++++++----------- .../ccsdk/sli/core/slipluginutils/Dme2Test.java | 1 + 2 files changed, 15 insertions(+), 14 deletions(-) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java index 7bc1a4118..5b3c2a623 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java @@ -40,19 +40,19 @@ public class DME2 implements SvcLogicJavaPlugin { private static final Logger LOG = LoggerFactory.getLogger(DME2.class); // the key for proxyUrl, which represents a CSV list of urls - static final String PROXY_URL_KEY = "proxyUrl"; - static final String PROXY_URLS_VALUE_SEPARATOR = ","; - static final String AAF_USERNAME_KEY = "aafUserName"; - static final String AAF_PASSWORD_KEY = "aafPassword"; - static final String ENV_CONTEXT_KEY = "envContext"; - static final String ROUTE_OFFER_KEY = "routeOffer"; - static final String COMMON_SERVICE_VERSION_KEY = "commonServiceVersion"; - static final String PARTNER_KEY = "partner"; - static final String VERSION_KEY = "version"; - static final String SERVICE_KEY = "service"; - static final String SUBCONTEXT_KEY = "subContext"; - static final String ENDPOINT_READ_TIMEOUT_KEY = "endpointReadTimeout"; - static final String OUTPUT_PATH_KEY = "outputPath"; + public static final String PROXY_URL_KEY = "proxyUrl"; + public static final String PROXY_URLS_VALUE_SEPARATOR = ","; + public static final String AAF_USERNAME_KEY = "aafUserName"; + public static final String AAF_PASSWORD_KEY = "aafPassword"; + public static final String ENV_CONTEXT_KEY = "envContext"; + public static final String ROUTE_OFFER_KEY = "routeOffer"; + public static final String COMMON_SERVICE_VERSION_KEY = "commonServiceVersion"; + public static final String PARTNER_KEY = "partner"; + public static final String VERSION_KEY = "version"; + public static final String SERVICE_KEY = "service"; + public static final String SUBCONTEXT_KEY = "subContext"; + public static final String ENDPOINT_READ_TIMEOUT_KEY = "endpointReadTimeout"; + public static final String OUTPUT_PATH_KEY = "outputPath"; final String aafUserName; final String aafPassword; @@ -132,7 +132,7 @@ public class DME2 implements SvcLogicJavaPlugin { // Support optional parameters in a flexible way for (Entry param : parameters.entrySet()) { if (!incompleteUrl.contains(param.getKey() + "=") && param.getValue() != null - && param.getValue().length() > 0 && !OUTPUT_PATH_KEY.equals(param.getKey())) { + && param.getValue().length() > 0 && !OUTPUT_PATH_KEY.equals(param.getKey()) && !"partner".equals(param.getKey())) { sb.append("&" + param.getKey() + "=" + param.getValue()); } } diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java index 6cb6c8ba1..9bff94835 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java @@ -121,6 +121,7 @@ public class Dme2Test { assertEquals("1702.0", dme2.commonServiceVersion); assertEquals(null, dme2.partner); Map parameters = new HashMap(); + parameters.put(DME2.PARTNER_KEY, "I SHOULD BE FILTERED NOW!"); parameters.put(DME2.SERVICE_KEY, "sample.com/restservices/sys/v1/assetSearch"); parameters.put(DME2.VERSION_KEY, null); parameters.put(DME2.SUBCONTEXT_KEY, "/mySubContext"); -- cgit 1.2.3-korg From c293b7bb06ee40199514efb3ba5ba7533afcaf54 Mon Sep 17 00:00:00 2001 From: Sandeep J Date: Wed, 19 Dec 2018 12:59:00 +0530 Subject: fixed sonar issues in DME2.java fixed sonar issues Issue-ID: CCSDK-525 Change-Id: Ib6858f2ed802ca979f9098bf87c5536ba223ff5a Signed-off-by: Sandeep J --- .../src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java index 5b3c2a623..65b597e11 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java @@ -5,6 +5,8 @@ * Copyright (C) 2017 AT&T Intellectual Property. All rights * reserved. * ================================================================================ + * Modifications Copyright (C) 2018 IBM. + * ================================================================================ * 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 @@ -132,7 +134,7 @@ public class DME2 implements SvcLogicJavaPlugin { // Support optional parameters in a flexible way for (Entry param : parameters.entrySet()) { if (!incompleteUrl.contains(param.getKey() + "=") && param.getValue() != null - && param.getValue().length() > 0 && !OUTPUT_PATH_KEY.equals(param.getKey()) && !"partner".equals(param.getKey())) { + && param.getValue().length() > 0 && !OUTPUT_PATH_KEY.equals(param.getKey()) && !PARTNER_KEY.equals(param.getKey())) { sb.append("&" + param.getKey() + "=" + param.getValue()); } } @@ -157,7 +159,7 @@ public class DME2 implements SvcLogicJavaPlugin { // Support legacy direct java call public String constructUrl(String service, String version, String subContext) { - Map parameters = new HashMap(); + Map parameters = new HashMap<>(); parameters.put(SERVICE_KEY, service); if (version != null) { parameters.put(VERSION_KEY, version); -- cgit 1.2.3-korg From 69e82097f57e8994be98e5262b5ca9fb8d9c6c53 Mon Sep 17 00:00:00 2001 From: Sandeep J Date: Wed, 19 Dec 2018 13:04:02 +0530 Subject: fixed sonar issues in SliPluginUtils.java fixed sonar issues Issue-ID: CCSDK-525 Change-Id: I672eb667887af1d5d25de4da7429299b414ef79f Signed-off-by: Sandeep J --- .../ccsdk/sli/core/slipluginutils/SliPluginUtils.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java index 0eb53199c..ebfe81718 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java @@ -5,6 +5,8 @@ * Copyright (C) 2017 AT&T Intellectual Property. All rights * reserved. * ================================================================================ + * Modifications Copyright (C) 2018 IBM. + * ================================================================================ * 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 @@ -61,6 +63,8 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { } private static final Logger LOG = LoggerFactory.getLogger(SliPluginUtils.class); + private static final String LOG_MSG="extracting list from context memory"; + private static final String LOG_MSG1="removing elements from list"; // ========== CONSTRUCTORS ========== @@ -116,9 +120,9 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { } // Extract list from context memory & remove object @ index - LOG.trace("extracting list from context memory"); + LOG.trace(LOG_MSG); list = SvcLogicContextList.extract(ctx, list_pfx); - LOG.trace("removing elements from list"); + LOG.trace(LOG_MSG1); list.remove(index); } else if( param_value != null ) { @@ -127,9 +131,9 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { // Extract list from context memory & remove objects with // key-value pair LOG.trace("executing remove by key-value pair logic"); - LOG.trace("extracting list from context memory"); + LOG.trace(LOG_MSG); list = SvcLogicContextList.extract(ctx, list_pfx); - LOG.trace("removing elements from list"); + LOG.trace(LOG_MSG1); list.remove( param_key, param_value ); } else if( param_keys_length != null ) { @@ -152,9 +156,9 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { // Extract list from context memory & remove objects with all // key-value pairs matching - LOG.trace("extracting list from context memory"); + LOG.trace(LOG_MSG); list = SvcLogicContextList.extract(ctx, list_pfx); - LOG.trace("removing elements from list"); + LOG.trace(LOG_MSG1); list.remove(keys_values); } else { -- cgit 1.2.3-korg From 76782813b60a90ffa20d225f501208f6ae100e44 Mon Sep 17 00:00:00 2001 From: Sandeep J Date: Wed, 19 Dec 2018 13:09:06 +0530 Subject: fixed sonar issues in SliStringUtils.java fixed sonar issues Issue-ID: CCSDK-525 Change-Id: Id1326402bca7207518ba35cf3f5139cef249c5e5 Signed-off-by: Sandeep J --- .../sli/core/slipluginutils/SliStringUtils.java | 54 +++++++++++----------- 1 file changed, 28 insertions(+), 26 deletions(-) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java index 63c750cb8..574178e39 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java @@ -5,6 +5,8 @@ * Copyright (C) 2017 AT&T Intellectual Property. All rights * reserved. * ================================================================================ + * Modifications Copyright (C) 2018 IBM. + * ================================================================================ * 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 @@ -38,8 +40,8 @@ import org.slf4j.LoggerFactory; public class SliStringUtils implements SvcLogicJavaPlugin { private static final Logger LOG = LoggerFactory.getLogger(SliStringUtils.class); - public static String INPUT_PARAM_SOURCE = "source"; - public static String INPUT_PARAM_TARGET = "target"; + public static final String INPUT_PARAM_SOURCE = "source"; + public static final String INPUT_PARAM_TARGET = "target"; public SliStringUtils() {} @@ -123,8 +125,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static String equalsIgnoreCase(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG); - if(parameters.get("source").equalsIgnoreCase(parameters.get("target"))){ + SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"target"}, LOG); + if(parameters.get(INPUT_PARAM_SOURCE).equalsIgnoreCase(parameters.get("target"))){ return "true"; } return "false"; @@ -146,8 +148,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static void toUpper(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG); - ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").toUpperCase()); + SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"outputPath"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), parameters.get(INPUT_PARAM_SOURCE).toUpperCase()); } /** @@ -166,8 +168,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static void toLower(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG); - ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").toLowerCase()); + SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"outputPath"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), parameters.get(INPUT_PARAM_SOURCE).toLowerCase()); } /** @@ -187,8 +189,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static String contains(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG); - if(parameters.get("source").contains(parameters.get("target"))){ + SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"target"}, LOG); + if(parameters.get(INPUT_PARAM_SOURCE).contains(parameters.get("target"))){ return "true"; } return "false"; @@ -211,8 +213,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static String endsWith(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG); - if(parameters.get("source").endsWith(parameters.get("target"))){ + SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"target"}, LOG); + if(parameters.get(INPUT_PARAM_SOURCE).endsWith(parameters.get("target"))){ return "true"; } return "false"; @@ -235,8 +237,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static String startsWith(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG); - if(parameters.get("source").startsWith(parameters.get("target"))){ + SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"target"}, LOG); + if(parameters.get(INPUT_PARAM_SOURCE).startsWith(parameters.get("target"))){ return "true"; } return "false"; @@ -258,8 +260,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static void trim(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG); - ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").trim()); + SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"outputPath"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), parameters.get(INPUT_PARAM_SOURCE).trim()); } /** @@ -278,8 +280,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static void getLength(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG); - ctx.setAttribute(parameters.get("outputPath"), String.valueOf(parameters.get("source").length())); + SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"outputPath"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), String.valueOf(parameters.get(INPUT_PARAM_SOURCE).length())); } /** @@ -300,8 +302,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static void replace(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath","target","replacement"}, LOG); - ctx.setAttribute(parameters.get("outputPath"), (parameters.get("source").replace(parameters.get("target"), parameters.get("replacement")))); + SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"outputPath","target","replacement"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), (parameters.get(INPUT_PARAM_SOURCE).replace(parameters.get("target"), parameters.get("replacement")))); } /** @@ -322,8 +324,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static void replaceAll(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath","target","replacement"}, LOG); - ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").replaceAll(parameters.get("target"), parameters.get("replacement"))); + SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"outputPath","target","replacement"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), parameters.get(INPUT_PARAM_SOURCE).replaceAll(parameters.get("target"), parameters.get("replacement"))); } /** @@ -383,8 +385,8 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static void concat( Map parameters, SvcLogicContext ctx ) throws SvcLogicException { - SliPluginUtils.checkParameters( parameters, new String[]{"source","target","outputPath"}, LOG ); - String result = parameters.get("source").concat(parameters.get("target")); + SliPluginUtils.checkParameters( parameters, new String[]{INPUT_PARAM_SOURCE,"target","outputPath"}, LOG ); + String result = parameters.get(INPUT_PARAM_SOURCE).concat(parameters.get("target")); ctx.setAttribute(parameters.get("outputPath"), result); } @@ -405,13 +407,13 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @throws SvcLogicException */ public static void urlEncode(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[] { "source", "outputPath" }, LOG); + SliPluginUtils.checkParameters(parameters, new String[] { INPUT_PARAM_SOURCE, "outputPath" }, LOG); String encoding = parameters.get("encoding"); if (encoding == null) { encoding = "UTF-8"; } try { - String result = URLEncoder.encode(parameters.get("source"), encoding); + String result = URLEncoder.encode(parameters.get(INPUT_PARAM_SOURCE), encoding); ctx.setAttribute(parameters.get("outputPath"), result); } catch (UnsupportedEncodingException e) { throw new SvcLogicException("Url encode failed.", e); -- cgit 1.2.3-korg From 8a72139cd40e1fd6353b6c535c2ba3bd1e7290f1 Mon Sep 17 00:00:00 2001 From: Sandeep J Date: Fri, 21 Dec 2018 17:46:01 +0530 Subject: fixed sonar issues in SliPluginUtils.java fixed sonar issues Issue-ID: CCSDK-525 Change-Id: I6d48ed028e98c2fc9ce0cf6ae215dfd3fcc6c871 Signed-off-by: Sandeep J --- .../onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java index ebfe81718..fd3364ca4 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java @@ -65,6 +65,7 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { private static final Logger LOG = LoggerFactory.getLogger(SliPluginUtils.class); private static final String LOG_MSG="extracting list from context memory"; private static final String LOG_MSG1="removing elements from list"; + private static final String LENGTH="_length"; // ========== CONSTRUCTORS ========== @@ -216,7 +217,7 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { i++; } // Reset list length (removed by ctxBulkErase above) - ctx.setAttribute(ctx_list_str+"_length", Integer.toString(listSz)); + ctx.setAttribute(ctx_list_str+LENGTH, Integer.toString(listSz)); } /** @@ -492,7 +493,7 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { * @since 1.0 */ public static final int getArrayLength( SvcLogicContext ctx, String key, Logger log, LogLevel logLevel, String log_message ) { - String ctxKey = key.endsWith("_length") ? key : key + "_length"; + String ctxKey = key.endsWith(LENGTH) ? key : key + LENGTH; try { return Integer.parseInt(ctx.getAttribute(ctxKey)); } @@ -829,7 +830,7 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { writeJsonObject(entry.getValue().getAsJsonObject(), ctx, root + entry.getKey() + "."); } else if (entry.getValue().isJsonArray()) { JsonArray array = entry.getValue().getAsJsonArray(); - ctx.setAttribute(root + entry.getKey() + "_length", String.valueOf(array.size())); + ctx.setAttribute(root + entry.getKey() + LENGTH, String.valueOf(array.size())); Integer arrayIdx = 0; for (JsonElement element : array) { if (element.isJsonObject()) { @@ -873,7 +874,7 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { try { String ctxList = parameters.get("list"); - ctxList = (ctxList.endsWith("_length")) ? ctxList : ctxList + "_length"; + ctxList = (ctxList.endsWith(LENGTH)) ? ctxList : ctxList + LENGTH; int listLength = getArrayLength(ctx, ctxList); if (listLength == 0) { @@ -1063,9 +1064,9 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { setParametersToCtxList(parameters, ctx, prefixKeyWithIndex, valuePrefixKey); // set length of list - String ListLengthKeyName = prefixKey + "_length"; + String ListLengthKeyName = prefixKey + LENGTH; - ctxSetAttribute(ctx, prefixKey + "_length", listLength + 1); + ctxSetAttribute(ctx, prefixKey + LENGTH, listLength + 1); LOG.debug("Updated _length: " + prefixKey + "_length is now " + ctx.getAttribute(ListLengthKeyName)); } -- cgit 1.2.3-korg From f175ecd3ba0a785ac1737ab3a4196d5141c05045 Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Fri, 10 May 2019 18:41:59 +0000 Subject: Remove DME2 plugin dme2 plugin was used to create dme2ingress proxy urls. This class is not generic enough to be useful to a wide audience. Change-Id: Iadc68d8f22393c3a9a5d21754137cae22b23fafe Issue-ID: CCSDK-1323 Signed-off-by: Smokowski, Kevin (ks6305) --- .../onap/ccsdk/sli/core/slipluginutils/DME2.java | 171 ------------ .../ccsdk/sli/core/slipluginutils/Dme2Factory.java | 109 -------- .../provider/src/main/resources/dme2.properties | 7 - .../blueprint/slipluginutils-blueprint.xml | 9 +- .../ccsdk/sli/core/slipluginutils/Dme2Test.java | 302 --------------------- .../src/test/resources/dme2.e2e.properties | 7 - .../src/test/resources/dme2.prod.properties | 7 - 7 files changed, 1 insertion(+), 611 deletions(-) delete mode 100644 sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java delete mode 100644 sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Factory.java delete mode 100644 sliPluginUtils/provider/src/main/resources/dme2.properties delete mode 100644 sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java delete mode 100644 sliPluginUtils/provider/src/test/resources/dme2.e2e.properties delete mode 100644 sliPluginUtils/provider/src/test/resources/dme2.prod.properties (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java deleted file mode 100644 index 65b597e11..000000000 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/DME2.java +++ /dev/null @@ -1,171 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (C) 2018 IBM. - * ================================================================================ - * 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.ccsdk.sli.core.slipluginutils; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import org.onap.ccsdk.sli.core.sli.SvcLogicContext; -import org.onap.ccsdk.sli.core.sli.SvcLogicException; -import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A SvcLogicJavaPlugin that generates DME2 proxy urls (for calling the DME2 ingress proxy) using - * parameters from context memory. - */ -public class DME2 implements SvcLogicJavaPlugin { - - private static final Logger LOG = LoggerFactory.getLogger(DME2.class); - // the key for proxyUrl, which represents a CSV list of urls - public static final String PROXY_URL_KEY = "proxyUrl"; - public static final String PROXY_URLS_VALUE_SEPARATOR = ","; - public static final String AAF_USERNAME_KEY = "aafUserName"; - public static final String AAF_PASSWORD_KEY = "aafPassword"; - public static final String ENV_CONTEXT_KEY = "envContext"; - public static final String ROUTE_OFFER_KEY = "routeOffer"; - public static final String COMMON_SERVICE_VERSION_KEY = "commonServiceVersion"; - public static final String PARTNER_KEY = "partner"; - public static final String VERSION_KEY = "version"; - public static final String SERVICE_KEY = "service"; - public static final String SUBCONTEXT_KEY = "subContext"; - public static final String ENDPOINT_READ_TIMEOUT_KEY = "endpointReadTimeout"; - public static final String OUTPUT_PATH_KEY = "outputPath"; - - final String aafUserName; - final String aafPassword; - final String envContext; - final String routeOffer; - final String[] proxyUrls; - final String commonServiceVersion; - final String partner; - final String endpointReadTimeout; - Integer index; - - public DME2(Properties properties) { - Iterator> it = properties.entrySet().iterator(); - while (it.hasNext()) { - Entry entry = it.next(); - if (entry.getValue() == null || entry.getValue().toString().length() < 1) { - it.remove(); - } - } - this.aafUserName = properties.getProperty(AAF_USERNAME_KEY, null); - this.aafPassword = properties.getProperty(AAF_PASSWORD_KEY, null); - this.envContext = properties.getProperty(ENV_CONTEXT_KEY, null); - this.routeOffer = properties.getProperty(ROUTE_OFFER_KEY, null); - this.commonServiceVersion = properties.getProperty(COMMON_SERVICE_VERSION_KEY, null); - this.partner = properties.getProperty(PARTNER_KEY, null); - this.endpointReadTimeout = properties.getProperty(ENDPOINT_READ_TIMEOUT_KEY, null); - String proxyUrlString = properties.getProperty(PROXY_URL_KEY, null); - if (proxyUrlString != null && proxyUrlString.length() > 0) { - this.proxyUrls = proxyUrlString.split(PROXY_URLS_VALUE_SEPARATOR); - } else { - String[] local = {"http://localhost:5000"}; - this.proxyUrls = local; - } - this.index = 0; - } - - // constructs a URL to contact the proxy which contacts a DME2 service - public String constructUrl(Map parameters) { - StringBuilder sb = new StringBuilder(); - - // The hostname is assigned in a round robin fashion - sb.append(acquireHostName()); - sb.append("/service=" + parameters.get(SERVICE_KEY)); - - // If the directedGraph passes an explicit version use that, if not use the commonServiceVersion - // found in the properties file - String version = parameters.get(VERSION_KEY); - if (version != null && version.length() > 0) { - sb.append("/version=" + version); - }else { - sb.append("/version=" + this.commonServiceVersion); - } - String envContext = parameters.getOrDefault(ENV_CONTEXT_KEY, this.envContext); - sb.append("/envContext=" + envContext); - - String routeOffer = parameters.getOrDefault(ROUTE_OFFER_KEY, this.routeOffer); - if (routeOffer != null && routeOffer.length() > 0) { - sb.append("/routeOffer=" + routeOffer); - } - - String subContext = parameters.get(SUBCONTEXT_KEY); - if (subContext != null && subContext.length() > 0) { - sb.append("/subContext=" + subContext); - } - sb.append("?dme2.password=" + this.aafPassword); - sb.append("&dme2.username=" + this.aafUserName); - if (this.partner != null) { - sb.append("&partner=" + this.partner); - } - sb.append("&dme2.allowhttpcode=true"); - String endpointReadTimeout = parameters.getOrDefault(ENDPOINT_READ_TIMEOUT_KEY, this.endpointReadTimeout); - if (endpointReadTimeout != null) { - sb.append("&dme2.endpointReadTimeout=" + endpointReadTimeout); - } - String incompleteUrl = sb.toString(); - - // Support optional parameters in a flexible way - for (Entry param : parameters.entrySet()) { - if (!incompleteUrl.contains(param.getKey() + "=") && param.getValue() != null - && param.getValue().length() > 0 && !OUTPUT_PATH_KEY.equals(param.getKey()) && !PARTNER_KEY.equals(param.getKey())) { - sb.append("&" + param.getKey() + "=" + param.getValue()); - } - } - return sb.toString(); - } - - public synchronized String acquireHostName() { - String retVal = proxyUrls[index]; - index++; - if (index == this.proxyUrls.length) { - index = 0; - } - return retVal; - } - - // Node entry point - public void constructUrl(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[] {SERVICE_KEY, OUTPUT_PATH_KEY}, LOG); - String completeProxyUrl = constructUrl(parameters); - ctx.setAttribute(parameters.get(OUTPUT_PATH_KEY), completeProxyUrl); - } - - // Support legacy direct java call - public String constructUrl(String service, String version, String subContext) { - Map parameters = new HashMap<>(); - parameters.put(SERVICE_KEY, service); - if (version != null) { - parameters.put(VERSION_KEY, version); - } - parameters.put(SUBCONTEXT_KEY, subContext); - return constructUrl(parameters); - } - -} diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Factory.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Factory.java deleted file mode 100644 index 7013a9c5d..000000000 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Factory.java +++ /dev/null @@ -1,109 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 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.ccsdk.sli.core.slipluginutils; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Optional; -import java.util.Properties; -import java.util.Vector; -import org.onap.ccsdk.sli.core.utils.JREFileResolver; -import org.onap.ccsdk.sli.core.utils.KarafRootFileResolver; -import org.onap.ccsdk.sli.core.utils.PropertiesFileResolver; -import org.onap.ccsdk.sli.core.utils.common.CoreDefaultFileResolver; -import org.onap.ccsdk.sli.core.utils.common.SdncConfigEnvVarFileResolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Immutable properties container for dme2 properties. Since the initial design decision was made to - * utilize Properties instead of an OSGi ManagedService, it was decided to - * make these properties immutable. - */ -public final class Dme2Factory { - - private static final Logger LOG = LoggerFactory.getLogger(Dme2Factory.class); - private static final String DME2_PROPERTIES_FILE_NAME = "dme2.properties"; - - static Properties properties; - private Vector dme2PropertiesFileResolvers = new Vector<>(); - - public Dme2Factory() { - dme2PropertiesFileResolvers - .add(new SdncConfigEnvVarFileResolver("Using property file (1) from environment variable")); - dme2PropertiesFileResolvers.add(new CoreDefaultFileResolver("Using property file (2) from default directory")); - dme2PropertiesFileResolvers - .add(new JREFileResolver("Using property file (3) from JRE argument", Dme2Factory.class)); - dme2PropertiesFileResolvers.add(new KarafRootFileResolver("Using property file (4) from karaf root", this)); - File dme2File = getDme2File(DME2_PROPERTIES_FILE_NAME); - init(dme2File); - } - - private void init(final File dme2propertiesFile) { - try { - properties = getProperties(dme2propertiesFile); - } catch (final FileNotFoundException e) { - LOG.error("dme2.properties file could not be found at path: {}", dme2propertiesFile, e); - } catch (final IOException e) { - LOG.error("fatal error reading dme2.properties at path: {}", dme2propertiesFile, e); - } - } - - /** - * Reports the method chosen for properties resolution to the Logger. - * - * @param message Some user friendly message - * @param fileOptional The file location of the chosen properties file - * @return the file location of the chosen properties file - */ - private static File reportSuccess(final String message, final Optional fileOptional) { - if (fileOptional.isPresent()) { - final File file = fileOptional.get(); - LOG.info("{} {}", message, file.getPath()); - return file; - } - return null; - } - - private File getDme2File(final String dme2Filename) { - for (final PropertiesFileResolver dblibPropertiesFileResolver : dme2PropertiesFileResolvers) { - final Optional fileOptional = dblibPropertiesFileResolver.resolveFile(dme2Filename); - if (fileOptional.isPresent()) { - return reportSuccess(dblibPropertiesFileResolver.getSuccessfulResolutionMessage(), fileOptional); - } - } - return (new File(dme2Filename)); - } - - private static Properties getProperties(final File dme2File) throws IOException { - final Properties properties = new Properties(); - properties.load(new FileReader(dme2File)); - return properties; - } - - public DME2 createDme2() { - return new DME2(properties); - } - -} diff --git a/sliPluginUtils/provider/src/main/resources/dme2.properties b/sliPluginUtils/provider/src/main/resources/dme2.properties deleted file mode 100644 index 373448447..000000000 --- a/sliPluginUtils/provider/src/main/resources/dme2.properties +++ /dev/null @@ -1,7 +0,0 @@ -aafUserName=user@sample.com -aafPassword=fake -envContext=UAT -routeOffer=UAT -proxyUrl=http://sample.com:25055,http://sample.com:25055 -commonServiceVersion=1702.0 -partner= \ No newline at end of file diff --git a/sliPluginUtils/provider/src/main/resources/org/opendaylight/blueprint/slipluginutils-blueprint.xml b/sliPluginUtils/provider/src/main/resources/org/opendaylight/blueprint/slipluginutils-blueprint.xml index 283dbbaa9..534b92c93 100644 --- a/sliPluginUtils/provider/src/main/resources/org/opendaylight/blueprint/slipluginutils-blueprint.xml +++ b/sliPluginUtils/provider/src/main/resources/org/opendaylight/blueprint/slipluginutils-blueprint.xml @@ -10,11 +10,4 @@ - - - - - - - \ No newline at end of file + diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java deleted file mode 100644 index a06def652..000000000 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/Dme2Test.java +++ /dev/null @@ -1,302 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (C) 2018 IBM. - * ================================================================================ - * 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.ccsdk.sli.core.slipluginutils; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import org.junit.Assert; -import org.junit.Test; -import org.onap.ccsdk.sli.core.sli.SvcLogicContext; -import org.onap.ccsdk.sli.core.sli.SvcLogicException; - -public class Dme2Test { - public Properties makesProperties(String aafUserName, String aafPassword, String envContext, String routeOffer, - String proxyUrls, String commonServiceVersion) { - Properties props = new Properties(); - props.put(DME2.AAF_USERNAME_KEY, aafUserName); - props.put(DME2.AAF_PASSWORD_KEY, aafPassword); - props.put(DME2.ENV_CONTEXT_KEY, envContext); - props.put(DME2.ROUTE_OFFER_KEY, routeOffer); - props.put(DME2.PROXY_URL_KEY, proxyUrls); - props.put(DME2.COMMON_SERVICE_VERSION_KEY, commonServiceVersion); - return props; - } - - @Test - public void createUrl() { - String localUrl = - "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - Properties props = - makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); - DME2 dme = new DME2(props); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); - parameters.put(DME2.VERSION_KEY, "1702.0"); - parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - parameters.put(DME2.OUTPUT_PATH_KEY, "tmp.test"); - - String constructedUrl = dme.constructUrl(parameters); - assertEquals(localUrl, constructedUrl); - } - - @Test - public void createUrlNoSubContext() { - String localUrl = - "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - Properties props = - makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); - DME2 dme = new DME2(props); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); - parameters.put(DME2.VERSION_KEY, "1702.0"); - parameters.put(DME2.SUBCONTEXT_KEY, null); - String constructedUrl = dme.constructUrl(parameters); - assertEquals(localUrl, constructedUrl); - } - - @Test - public void testRoundRobin() { - String[] proxyHostNames = new String[] {"http://one:25055", "http://two:25055", "http://three:25055"}; - String proxyHostNameString = proxyHostNames[0] + "," + proxyHostNames[1] + "," + proxyHostNames[2]; - - String urlSuffix = - "/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - Properties props = makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", proxyHostNameString, "common"); - DME2 dme = new DME2(props); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); - parameters.put(DME2.VERSION_KEY, "1702.0"); - parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - String constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl(parameters); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - } - - @Test - public void createDme2EndtoEnd() throws FileNotFoundException, IOException { - Properties props = new Properties(); - props.load(new FileInputStream("src/test/resources/dme2.e2e.properties")); - DME2 dme2 = new DME2(props); - assertEquals("user@sample.com", dme2.aafUserName); - assertEquals("fake", dme2.aafPassword); - assertEquals("UAT", dme2.envContext); - assertEquals("UAT", dme2.routeOffer); - Assert.assertArrayEquals( - "http://sample.com:25055,http://sample.com:25055".split(DME2.PROXY_URLS_VALUE_SEPARATOR), - dme2.proxyUrls); - assertEquals("1702.0", dme2.commonServiceVersion); - assertEquals(null, dme2.partner); - Map parameters = new HashMap(); - parameters.put(DME2.PARTNER_KEY, "I SHOULD BE FILTERED NOW!"); - parameters.put(DME2.SERVICE_KEY, "sample.com/restservices/sys/v1/assetSearch"); - parameters.put(DME2.VERSION_KEY, null); - parameters.put(DME2.SUBCONTEXT_KEY, "/mySubContext"); - String constructedUrl = dme2.constructUrl(parameters); - assertNotNull(constructedUrl); - String expected = - "http://sample.com:25055/service=sample.com/restservices/sys/v1/assetSearch/version=1702.0/envContext=UAT/routeOffer=UAT/subContext=/mySubContext?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - assertEquals(expected, constructedUrl); - } - - @Test - public void createDme2Prod() throws FileNotFoundException, IOException { - Properties props = new Properties(); - props.load(new FileInputStream("src/test/resources/dme2.prod.properties")); - DME2 dme2 = new DME2(props); - assertEquals("user@sample.com", dme2.aafUserName); - assertEquals("fake", dme2.aafPassword); - assertEquals("PROD", dme2.envContext); - assertEquals(null, dme2.routeOffer); - Assert.assertArrayEquals( - "http://sample.com:25055,http://sample.com:25055".split(DME2.PROXY_URLS_VALUE_SEPARATOR), - dme2.proxyUrls); - assertEquals("1.0", dme2.commonServiceVersion); - assertEquals("LPP_PROD", dme2.partner); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); - parameters.put(DME2.VERSION_KEY, "1702.0"); - parameters.put(DME2.SUBCONTEXT_KEY, "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - String constructedUrl = dme2.constructUrl(parameters); - assertNotNull(constructedUrl); - String expected = - "http://sample.com:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=PROD/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&partner=LPP_PROD&dme2.allowhttpcode=true"; - assertEquals(expected, constructedUrl); - } - - @Test - public void blankProperties() throws Exception { - Properties props = new Properties(); - DME2 dme2 = new DME2(props); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "easyService"); - parameters.put(DME2.VERSION_KEY, "3"); - parameters.put(DME2.SUBCONTEXT_KEY, "/sub"); - assertEquals( - "http://localhost:5000/service=easyService/version=3/envContext=null/subContext=/sub?dme2.password=null&dme2.username=null&dme2.allowhttpcode=true", - dme2.constructUrl(parameters)); - } - - @Test - public void optionalParameters() { - String localUrl = - "http://localhost:25055/service=serv/version=4/envContext=TEST/routeOffer=DEFAULT/subContext=/sub?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true&test=123"; - Properties props = - makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); - DME2 dme = new DME2(props); - Map parameters = new HashMap(); - parameters.put(DME2.SERVICE_KEY, "serv"); - parameters.put(DME2.VERSION_KEY, "4"); - parameters.put(DME2.SUBCONTEXT_KEY, "/sub"); - parameters.put("test", "123"); - - String constructedUrl = dme.constructUrl(parameters); - assertEquals(localUrl, constructedUrl); - } - - @Test - public void createLocalUrlLegacy() { - String localUrl = - "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - Properties props = - makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); - DME2 dme = new DME2(props); - String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", - "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(localUrl, constructedUrl); - } - - @Test - public void createLocalUrlNoSubContextLegacy() { - String localUrl = - "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - Properties props = - makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", "http://localhost:25055", "common"); - DME2 dme = new DME2(props); - Map parameters = new HashMap(); - String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", parameters.get(null)); - assertEquals(localUrl, constructedUrl); - } - - @Test - public void testRoundRobinLegacy() { - String[] proxyHostNames = new String[] {"http://one:25055", "http://two:25055", "http://three:25055"}; - String urlSuffix = - "/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - Properties props = makesProperties("user@sample.com", "fake", "TEST", "DEFAULT", - "http://one:25055,http://two:25055,http://three:25055", "common"); - DME2 dme = new DME2(props); - String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", - "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", - "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", - "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", - "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", - "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", - "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl); - constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", - "/enterpriseConnection/getEnterpriseConnectionDetails/v1"); - assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl); - } - - @Test - public void createDme2EndtoEndLegacy() throws Exception { - Properties props = new Properties(); - props.load(new FileInputStream("src/test/resources/dme2.e2e.properties")); - DME2 dme2 = new DME2(props); - assertEquals("user@sample.com", dme2.aafUserName); - assertEquals("fake", dme2.aafPassword); - assertEquals("UAT", dme2.envContext); - assertEquals("UAT", dme2.routeOffer); - Assert.assertArrayEquals("http://sample.com:25055,http://sample.com:25055".split(","), dme2.proxyUrls); - assertEquals("1702.0", dme2.commonServiceVersion); - assertEquals(null, dme2.partner); - String constructedUrl = dme2.constructUrl("sample.com/restservices/sys/v1/assetSearch", null, "/mySubContext"); - assertNotNull(constructedUrl); - String expected = - "http://sample.com:25055/service=sample.com/restservices/sys/v1/assetSearch/version=1702.0/envContext=UAT/routeOffer=UAT/subContext=/mySubContext?dme2.password=fake&dme2.username=user@sample.com&dme2.allowhttpcode=true"; - assertEquals(expected, constructedUrl); - } - - @Test - public void createDme2ProdLegacy() throws Exception { - Properties props = new Properties(); - props.load(new FileInputStream("src/test/resources/dme2.prod.properties")); - DME2 dme2 = new DME2(props); - assertEquals("user@sample.com", dme2.aafUserName); - assertEquals("fake", dme2.aafPassword); - assertEquals("PROD", dme2.envContext); - assertEquals(null, dme2.routeOffer); - Assert.assertArrayEquals("http://sample.com:25055,http://sample.com:25055".split(","), dme2.proxyUrls); - assertEquals("1.0", dme2.commonServiceVersion); - assertEquals("LPP_PROD", dme2.partner); - String constructedUrl = dme2.constructUrl("sample.com/restservices/sys/v1/assetSearch", null, "/mySubContext"); - assertNotNull(constructedUrl); - String expected = - "http://sample.com:25055/service=sample.com/restservices/sys/v1/assetSearch/version=1.0/envContext=PROD/subContext=/mySubContext?dme2.password=fake&dme2.username=user@sample.com&partner=LPP_PROD&dme2.allowhttpcode=true"; - assertEquals(expected, constructedUrl); - } - - @Test - public void testConstructUrl() throws FileNotFoundException, IOException, SvcLogicException - { - Properties props = new Properties(); - props.load(new FileInputStream("src/test/resources/dme2.prod.properties")); - DME2 dme2 = new DME2(props); - Map parameters= new HashMap<>(); - SvcLogicContext ctx= new SvcLogicContext(); - parameters.put(DME2.SERVICE_KEY, "sample.com/services/eim/v1/rest"); - parameters.put(DME2.OUTPUT_PATH_KEY, "tmp.test"); - dme2.constructUrl(parameters,ctx); - String expected= "http://sample.com:25055/service=sample.com/services/eim/v1/rest/version=1.0/envContext=PROD?dme2.password=fake&dme2.username=user@sample.com&partner=LPP_PROD&dme2.allowhttpcode=true"; - assertEquals(expected,ctx.getAttribute(parameters.get(DME2.OUTPUT_PATH_KEY))); - } - -} diff --git a/sliPluginUtils/provider/src/test/resources/dme2.e2e.properties b/sliPluginUtils/provider/src/test/resources/dme2.e2e.properties deleted file mode 100644 index 373448447..000000000 --- a/sliPluginUtils/provider/src/test/resources/dme2.e2e.properties +++ /dev/null @@ -1,7 +0,0 @@ -aafUserName=user@sample.com -aafPassword=fake -envContext=UAT -routeOffer=UAT -proxyUrl=http://sample.com:25055,http://sample.com:25055 -commonServiceVersion=1702.0 -partner= \ No newline at end of file diff --git a/sliPluginUtils/provider/src/test/resources/dme2.prod.properties b/sliPluginUtils/provider/src/test/resources/dme2.prod.properties deleted file mode 100644 index 4326b0048..000000000 --- a/sliPluginUtils/provider/src/test/resources/dme2.prod.properties +++ /dev/null @@ -1,7 +0,0 @@ -aafUserName=user@sample.com -aafPassword=fake -envContext=PROD -routeOffer= -proxyUrl=http://sample.com:25055,http://sample.com:25055 -commonServiceVersion=1.0 -partner=LPP_PROD \ No newline at end of file -- cgit 1.2.3-korg From a3d782bc5e0bc07fcc5efd9a118e109011ee2889 Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Wed, 22 May 2019 15:31:08 +0000 Subject: add escape and unescape json to SliStringUtils Add escape and unescape json to SliStringUtils. Can be useful when creating payloads from escaped json or sending payloads that involved escaped json. Change-Id: I736024ef91b5e6fff75374802b0fee2370f12b2f Issue-ID: CCSDK-1353 Signed-off-by: Smokowski, Kevin (ks6305) --- .../sli/core/slipluginutils/SliStringUtils.java | 38 ++++++++++++++++++++++ .../core/slipluginutils/SliStringUtilsTest.java | 20 ++++++++++++ 2 files changed, 58 insertions(+) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java index 574178e39..888ef8834 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java @@ -437,4 +437,42 @@ public class SliStringUtils implements SvcLogicJavaPlugin { source = StringEscapeUtils.escapeXml(source); ctx.setAttribute(target, source); } + + /** + * unescapeJsonString takes an escaped json string stored as a single property in context memory and unescapes it storing it as a single property + * @param parameters - requires source and outputPath to not be null. + * @param ctx Reference to context memory + * @throws SvcLogicException if a required parameter is missing an exception is thrown + */ + public static void unescapeJsonString(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[] { INPUT_PARAM_SOURCE, INPUT_PARAM_TARGET }, LOG); + try { + String source = parameters.get(INPUT_PARAM_SOURCE); + String target = parameters.get(INPUT_PARAM_TARGET); + String unescapedJson = StringEscapeUtils.unescapeJson(source); + ctx.setAttribute(target, unescapedJson); + } catch (Exception ex) { + ex.printStackTrace(); + throw new SvcLogicException("problem with unescapeJsonString", ex); + } + } + + /** + * escapeJsonString takes json stored as a single string in context memory and escapes it storing it as a single property + * @param parameters - requires source and outputPath to not be null. + * @param ctx Reference to context memory + * @throws SvcLogicException if a required parameter is missing an exception is thrown + */ + public static void escapeJsonString(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[] { INPUT_PARAM_SOURCE, INPUT_PARAM_TARGET }, LOG); + try { + String source = parameters.get(INPUT_PARAM_SOURCE); + String target = parameters.get(INPUT_PARAM_TARGET); + String unescapedJson = StringEscapeUtils.escapeJson(source); + ctx.setAttribute(target, unescapedJson); + } catch (Exception ex) { + ex.printStackTrace(); + throw new SvcLogicException("problem with escapeJsonString", ex); + } + } } diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java index 085d46ef7..b88e8d2c9 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java @@ -297,4 +297,24 @@ public class SliStringUtilsTest { utils.substring(param, ctx); } + @Test + public void testUnescapeJsonString() throws Exception { + String source = "{\\\"image_name\\\":\\\"Ubuntu 14.04\\\",\\\"service-instance-id\\\":\\\"1\\\",\\\"vnf-model-customization-uuid\\\":\\\"2f\\\",\\\"vnf-id\\\":\\\"3b\\\"}"; + param.put(SliStringUtils.INPUT_PARAM_SOURCE, source); + String outputPath = "unescaped"; + param.put(SliStringUtils.INPUT_PARAM_TARGET, outputPath); + SliStringUtils.unescapeJsonString(param, ctx); + assertEquals("{\"image_name\":\"Ubuntu 14.04\",\"service-instance-id\":\"1\",\"vnf-model-customization-uuid\":\"2f\",\"vnf-id\":\"3b\"}", ctx.getAttribute(outputPath)); + } + + @Test + public void testEscapeJsonString() throws Exception { + String source = "{\"image_name\":\"Ubuntu 14.04\",\"service-instance-id\":\"1\",\"vnf-model-customization-uuid\":\"2f\",\"vnf-id\":\"3b\"}"; + param.put(SliStringUtils.INPUT_PARAM_SOURCE, source); + String outputPath = "unescaped"; + param.put(SliStringUtils.INPUT_PARAM_TARGET, outputPath); + SliStringUtils.escapeJsonString(param, ctx); + assertEquals("{\\\"image_name\\\":\\\"Ubuntu 14.04\\\",\\\"service-instance-id\\\":\\\"1\\\",\\\"vnf-model-customization-uuid\\\":\\\"2f\\\",\\\"vnf-id\\\":\\\"3b\\\"}", ctx.getAttribute(outputPath)); + } + } -- cgit 1.2.3-korg From 06877cb9a30c4ea3e7e95c230f214a78fb4db9e1 Mon Sep 17 00:00:00 2001 From: "Timoney, Dan (dt5972)" Date: Wed, 3 Jul 2019 13:53:18 -0400 Subject: Code changes for OpenDaylight Neon Updated code for OpenDaylight Neon (using ccsdk/parent/tools/fluorine2neon.sh) Change-Id: Ic54b636f691cb2c9dd627dfc3b22b523c0f4f8da Issue-ID: CCSDK-1389 Signed-off-by: Timoney, Dan (dt5972) --- artifacts/pom.xml | 4 +- dblib/features/ccsdk-dblib/pom.xml | 4 +- dblib/features/features-dblib/pom.xml | 4 +- dblib/features/pom.xml | 4 +- dblib/installer/pom.xml | 4 +- dblib/pom.xml | 4 +- dblib/provider/pom.xml | 4 +- .../OSGI-INF/blueprint/dblib-blueprint.xml | 24 + features/ccsdk-sli-core-all/pom.xml | 4 +- features/features-sli-core/pom.xml | 4 +- features/installer/pom.xml | 4 +- features/pom.xml | 4 +- filters/features/ccsdk-filters/pom.xml | 4 +- filters/features/features-filters/pom.xml | 4 +- filters/features/pom.xml | 3 +- filters/installer/pom.xml | 4 +- filters/pom.xml | 4 +- filters/provider/pom.xml | 4 +- .../OSGI-INF/blueprint/filters-blueprint.xml | 9 + pom.xml | 4 +- sli/common/pom.xml | 14 +- sli/features/features-sli/pom.xml | 4 +- sli/features/odl-sli/pom.xml | 4 +- sli/features/pom.xml | 4 +- sli/installer/pom.xml | 4 +- sli/model/pom.xml | 16 +- sli/pom.xml | 4 +- sli/provider-base/pom.xml | 4 +- sli/provider/pom.xml | 4 +- .../resources/OSGI-INF/blueprint/sli-blueprint.xml | 21 + sli/recording/pom.xml | 4 +- .../OSGI-INF/blueprint/recording-blueprint.xml | 20 + .../features/ccsdk-sliPluginUtils/pom.xml | 4 +- .../features/features-sliPluginUtils/pom.xml | 4 +- sliPluginUtils/features/pom.xml | 4 +- sliPluginUtils/installer/pom.xml | 4 +- sliPluginUtils/pom.xml | 4 +- sliPluginUtils/provider/pom.xml | 4 +- .../blueprint/slipluginutils-blueprint.xml | 13 + sliapi/features/ccsdk-sliapi/pom.xml | 4 +- sliapi/features/features-sliapi/pom.xml | 4 +- sliapi/features/pom.xml | 4 +- sliapi/installer/pom.xml | 4 +- sliapi/model/pom.xml | 16 +- sliapi/pom.xml | 4 +- sliapi/provider/pom.xml | 4 +- .../onap/ccsdk/sli/core/sliapi/SliapiProvider.java | 676 ++++++++++++++++++++ .../onap/ccsdk/sli/core/sliapi/sliapiProvider.java | 677 --------------------- .../OSGI-INF/blueprint/sliapi-blueprint.xml | 28 + .../opendaylight/blueprint/sliapi-blueprint.xml | 2 +- .../ccsdk/sli/core/sliapi/TestSliapiProvider.java | 10 +- .../src/test/resources/simplelogger.properties | 2 +- utils/features/ccsdk-slicore-utils/pom.xml | 4 +- utils/features/features-util/pom.xml | 4 +- utils/features/pom.xml | 3 +- utils/installer/pom.xml | 4 +- utils/pom.xml | 4 +- utils/provider/pom.xml | 4 +- version.properties | 4 +- 59 files changed, 906 insertions(+), 800 deletions(-) create mode 100755 dblib/provider/src/main/resources/OSGI-INF/blueprint/dblib-blueprint.xml create mode 100644 filters/provider/src/main/resources/OSGI-INF/blueprint/filters-blueprint.xml create mode 100644 sli/provider/src/main/resources/OSGI-INF/blueprint/sli-blueprint.xml create mode 100644 sli/recording/src/main/resources/OSGI-INF/blueprint/recording-blueprint.xml create mode 100644 sliPluginUtils/provider/src/main/resources/OSGI-INF/blueprint/slipluginutils-blueprint.xml create mode 100644 sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/SliapiProvider.java delete mode 100644 sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java create mode 100644 sliapi/provider/src/main/resources/OSGI-INF/blueprint/sliapi-blueprint.xml (limited to 'sliPluginUtils/provider/src/main') diff --git a/artifacts/pom.xml b/artifacts/pom.xml index 405a572b7..245077465 100755 --- a/artifacts/pom.xml +++ b/artifacts/pom.xml @@ -4,7 +4,7 @@ org.onap.ccsdk.sli.core sli-core-artifacts - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: sli-core-artifacts @@ -17,7 +17,7 @@ org.onap.ccsdk.parent parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT diff --git a/dblib/features/ccsdk-dblib/pom.xml b/dblib/features/ccsdk-dblib/pom.xml index ef0c3ee07..d541bab9c 100644 --- a/dblib/features/ccsdk-dblib/pom.xml +++ b/dblib/features/ccsdk-dblib/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent single-feature-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core ccsdk-dblib - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: dblib :: ${project.artifactId} diff --git a/dblib/features/features-dblib/pom.xml b/dblib/features/features-dblib/pom.xml index 87c7ed78b..462ca365b 100644 --- a/dblib/features/features-dblib/pom.xml +++ b/dblib/features/features-dblib/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent feature-repo-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core features-dblib - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: dblib :: ${project.artifactId} diff --git a/dblib/features/pom.xml b/dblib/features/pom.xml index 89c0c8b19..bac999f62 100755 --- a/dblib/features/pom.xml +++ b/dblib/features/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core dblib-feature-aggregator - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: dblib :: ${project.artifactId} diff --git a/dblib/installer/pom.xml b/dblib/installer/pom.xml index a283157eb..c02f6ee62 100755 --- a/dblib/installer/pom.xml +++ b/dblib/installer/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core dblib-installer - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: dblib :: ${project.artifactId} diff --git a/dblib/pom.xml b/dblib/pom.xml index 0d5d565a8..258a4307a 100755 --- a/dblib/pom.xml +++ b/dblib/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core dblib - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: dblib diff --git a/dblib/provider/pom.xml b/dblib/provider/pom.xml index d0b97afe0..52a39b8f9 100755 --- a/dblib/provider/pom.xml +++ b/dblib/provider/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core dblib-provider - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT bundle ccsdk-sli-core :: dblib :: ${project.artifactId} diff --git a/dblib/provider/src/main/resources/OSGI-INF/blueprint/dblib-blueprint.xml b/dblib/provider/src/main/resources/OSGI-INF/blueprint/dblib-blueprint.xml new file mode 100755 index 000000000..d9bb99c07 --- /dev/null +++ b/dblib/provider/src/main/resources/OSGI-INF/blueprint/dblib-blueprint.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + javax.sql.DataSource + org.onap.ccsdk.sli.core.dblib.DbLibService + + + + + + + + + + \ No newline at end of file diff --git a/features/ccsdk-sli-core-all/pom.xml b/features/ccsdk-sli-core-all/pom.xml index 3f9a272a2..a040c3687 100644 --- a/features/ccsdk-sli-core-all/pom.xml +++ b/features/ccsdk-sli-core-all/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent single-feature-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core ccsdk-sli-core-all - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: features :: ${project.artifactId} diff --git a/features/features-sli-core/pom.xml b/features/features-sli-core/pom.xml index 8109a7a29..b90f020e8 100644 --- a/features/features-sli-core/pom.xml +++ b/features/features-sli-core/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent feature-repo-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core features-sli-core - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: features :: ${project.artifactId} diff --git a/features/installer/pom.xml b/features/installer/pom.xml index b15835444..76bd191b2 100755 --- a/features/installer/pom.xml +++ b/features/installer/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core slicore-features-installer - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: features :: ${project.artifactId} diff --git a/features/pom.xml b/features/pom.xml index 52f8a427e..f374be96b 100755 --- a/features/pom.xml +++ b/features/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core slicore-feature-aggregator - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: features diff --git a/filters/features/ccsdk-filters/pom.xml b/filters/features/ccsdk-filters/pom.xml index 952e8da11..390f1b34e 100644 --- a/filters/features/ccsdk-filters/pom.xml +++ b/filters/features/ccsdk-filters/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent single-feature-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core ccsdk-filters - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: filters :: ${project.artifactId} diff --git a/filters/features/features-filters/pom.xml b/filters/features/features-filters/pom.xml index c130afe9c..d72f95a5f 100644 --- a/filters/features/features-filters/pom.xml +++ b/filters/features/features-filters/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent feature-repo-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core features-filters - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: filters :: ${project.artifactId} diff --git a/filters/features/pom.xml b/filters/features/pom.xml index 4daca915f..494f7f169 100755 --- a/filters/features/pom.xml +++ b/filters/features/pom.xml @@ -5,13 +5,12 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core filters-features-aggregator - 0.5.2-SNAPSHOT pom ccsdk-sli-core :: filters :: ${project.artifactId} diff --git a/filters/installer/pom.xml b/filters/installer/pom.xml index b980d5a58..42c39e9c3 100755 --- a/filters/installer/pom.xml +++ b/filters/installer/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core filters-installer - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: filters :: ${project.artifactId} diff --git a/filters/pom.xml b/filters/pom.xml index 2fee26b06..12f44bfeb 100644 --- a/filters/pom.xml +++ b/filters/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core filters - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: filters diff --git a/filters/provider/pom.xml b/filters/provider/pom.xml index bf28ad975..e7555aaf6 100755 --- a/filters/provider/pom.xml +++ b/filters/provider/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core filters-provider - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT bundle ccsdk-sli-core :: filters :: ${project.artifactId} diff --git a/filters/provider/src/main/resources/OSGI-INF/blueprint/filters-blueprint.xml b/filters/provider/src/main/resources/OSGI-INF/blueprint/filters-blueprint.xml new file mode 100644 index 000000000..3bf8423e9 --- /dev/null +++ b/filters/provider/src/main/resources/OSGI-INF/blueprint/filters-blueprint.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/pom.xml b/pom.xml index c52876b93..711f3faea 100755 --- a/pom.xml +++ b/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core ccsdk-sli-core - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core diff --git a/sli/common/pom.xml b/sli/common/pom.xml index c35397f37..24e29b2ec 100755 --- a/sli/common/pom.xml +++ b/sli/common/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sli-common - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT bundle ccsdk-sli-core :: sli :: ${project.artifactId} @@ -70,13 +70,11 @@ test - org.opendaylight.mdsal.model - ietf-inet-types-2013-07-15 - - - org.opendaylight.mdsal.model - ietf-yang-types-20130715 + org.opendaylight.mdsal.binding.model.ietf + rfc6991 + + org.opendaylight.controller sal-core-api diff --git a/sli/features/features-sli/pom.xml b/sli/features/features-sli/pom.xml index ee93bab69..8597432e1 100644 --- a/sli/features/features-sli/pom.xml +++ b/sli/features/features-sli/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent feature-repo-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core features-sli - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: sli :: ${project.artifactId} diff --git a/sli/features/odl-sli/pom.xml b/sli/features/odl-sli/pom.xml index d53cb4498..8c46e8193 100644 --- a/sli/features/odl-sli/pom.xml +++ b/sli/features/odl-sli/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent single-feature-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core ccsdk-sli - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: sli :: ${project.artifactId} diff --git a/sli/features/pom.xml b/sli/features/pom.xml index 5beb26338..871d41c37 100644 --- a/sli/features/pom.xml +++ b/sli/features/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sli-feature-aggregator - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: sli :: ${project.artifactId} diff --git a/sli/installer/pom.xml b/sli/installer/pom.xml index 54e24d004..ad8a9200e 100755 --- a/sli/installer/pom.xml +++ b/sli/installer/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sli-installer - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: sli :: ${project.artifactId} diff --git a/sli/model/pom.xml b/sli/model/pom.xml index 75befd35f..243223e17 100755 --- a/sli/model/pom.xml +++ b/sli/model/pom.xml @@ -5,25 +5,23 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sli-model - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT bundle ccsdk-sli-core :: sli :: ${project.artifactId} - org.opendaylight.mdsal.model - ietf-inet-types-2013-07-15 - - - org.opendaylight.mdsal.model - ietf-yang-types-20130715 - + org.opendaylight.mdsal.binding.model.ietf + rfc6991 + + + diff --git a/sli/pom.xml b/sli/pom.xml index bfb63846d..b9b60e9e3 100755 --- a/sli/pom.xml +++ b/sli/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sli - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: sli diff --git a/sli/provider-base/pom.xml b/sli/provider-base/pom.xml index e31119377..d1dd62930 100644 --- a/sli/provider-base/pom.xml +++ b/sli/provider-base/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sli-provider-base - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT diff --git a/sli/provider/pom.xml b/sli/provider/pom.xml index aff9ca270..1326ef7aa 100755 --- a/sli/provider/pom.xml +++ b/sli/provider/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sli-provider - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT bundle ccsdk-sli-core :: sli :: ${project.artifactId} diff --git a/sli/provider/src/main/resources/OSGI-INF/blueprint/sli-blueprint.xml b/sli/provider/src/main/resources/OSGI-INF/blueprint/sli-blueprint.xml new file mode 100644 index 000000000..bb14477e4 --- /dev/null +++ b/sli/provider/src/main/resources/OSGI-INF/blueprint/sli-blueprint.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + org.onap.ccsdk.sli.core.sli.provider.SvcLogicService + + + + \ No newline at end of file diff --git a/sli/recording/pom.xml b/sli/recording/pom.xml index a4ec1b255..de8a56440 100755 --- a/sli/recording/pom.xml +++ b/sli/recording/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sli-recording - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT bundle ccsdk-sli-core :: sli :: ${project.artifactId} diff --git a/sli/recording/src/main/resources/OSGI-INF/blueprint/recording-blueprint.xml b/sli/recording/src/main/resources/OSGI-INF/blueprint/recording-blueprint.xml new file mode 100644 index 000000000..6786b955b --- /dev/null +++ b/sli/recording/src/main/resources/OSGI-INF/blueprint/recording-blueprint.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sliPluginUtils/features/ccsdk-sliPluginUtils/pom.xml b/sliPluginUtils/features/ccsdk-sliPluginUtils/pom.xml index a0450630b..f55d3d47e 100644 --- a/sliPluginUtils/features/ccsdk-sliPluginUtils/pom.xml +++ b/sliPluginUtils/features/ccsdk-sliPluginUtils/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent single-feature-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core ccsdk-sliPluginUtils - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: sliPluginUtils :: ${project.artifactId} diff --git a/sliPluginUtils/features/features-sliPluginUtils/pom.xml b/sliPluginUtils/features/features-sliPluginUtils/pom.xml index e639b1c64..3950c94ec 100644 --- a/sliPluginUtils/features/features-sliPluginUtils/pom.xml +++ b/sliPluginUtils/features/features-sliPluginUtils/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent feature-repo-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core features-sliPluginUtils - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: sliPluginUtils :: ${project.artifactId} diff --git a/sliPluginUtils/features/pom.xml b/sliPluginUtils/features/pom.xml index 5c56b0174..d95b5fdf1 100755 --- a/sliPluginUtils/features/pom.xml +++ b/sliPluginUtils/features/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sliPluginUtils-features - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: sliPluginUtils :: ${project.artifactId} diff --git a/sliPluginUtils/installer/pom.xml b/sliPluginUtils/installer/pom.xml index fde893095..fdb245d62 100755 --- a/sliPluginUtils/installer/pom.xml +++ b/sliPluginUtils/installer/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sliPluginUtils-installer - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: sliPluginUtils :: ${project.artifactId} diff --git a/sliPluginUtils/pom.xml b/sliPluginUtils/pom.xml index 1ce7757c2..f9cdcec2e 100755 --- a/sliPluginUtils/pom.xml +++ b/sliPluginUtils/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sliPluginUtils - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: sliPluginUtils diff --git a/sliPluginUtils/provider/pom.xml b/sliPluginUtils/provider/pom.xml index 49a1210fd..1814a0085 100755 --- a/sliPluginUtils/provider/pom.xml +++ b/sliPluginUtils/provider/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sliPluginUtils-provider - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT bundle ccsdk-sli-core :: sliPluginUtils :: ${project.artifactId} diff --git a/sliPluginUtils/provider/src/main/resources/OSGI-INF/blueprint/slipluginutils-blueprint.xml b/sliPluginUtils/provider/src/main/resources/OSGI-INF/blueprint/slipluginutils-blueprint.xml new file mode 100644 index 000000000..534b92c93 --- /dev/null +++ b/sliPluginUtils/provider/src/main/resources/OSGI-INF/blueprint/slipluginutils-blueprint.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/sliapi/features/ccsdk-sliapi/pom.xml b/sliapi/features/ccsdk-sliapi/pom.xml index 329d6ff7a..004ec95f4 100644 --- a/sliapi/features/ccsdk-sliapi/pom.xml +++ b/sliapi/features/ccsdk-sliapi/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent single-feature-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core ccsdk-sliapi - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: sliapi :: ${project.artifactId} diff --git a/sliapi/features/features-sliapi/pom.xml b/sliapi/features/features-sliapi/pom.xml index c95311cc3..8765fb97f 100644 --- a/sliapi/features/features-sliapi/pom.xml +++ b/sliapi/features/features-sliapi/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent feature-repo-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core features-sliapi - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: sliapi :: ${project.artifactId} diff --git a/sliapi/features/pom.xml b/sliapi/features/pom.xml index 6e366e6e4..719aa1962 100755 --- a/sliapi/features/pom.xml +++ b/sliapi/features/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sliapi-feature-aggregator - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: sliapi :: ${project.artifactId} diff --git a/sliapi/installer/pom.xml b/sliapi/installer/pom.xml index eb69925b5..95fea32cd 100755 --- a/sliapi/installer/pom.xml +++ b/sliapi/installer/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sliapi-installer - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: sliapi :: ${project.artifactId} diff --git a/sliapi/model/pom.xml b/sliapi/model/pom.xml index a4faeae36..2b0f58717 100755 --- a/sliapi/model/pom.xml +++ b/sliapi/model/pom.xml @@ -5,25 +5,23 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sliapi-model - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT bundle ccsdk-sli-core :: sliapi :: ${project.artifactId} - org.opendaylight.mdsal.model - ietf-inet-types-2013-07-15 - - - org.opendaylight.mdsal.model - ietf-yang-types-20130715 - + org.opendaylight.mdsal.binding.model.ietf + rfc6991 + + + diff --git a/sliapi/pom.xml b/sliapi/pom.xml index c5ed07a00..c9541ac22 100755 --- a/sliapi/pom.xml +++ b/sliapi/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sliapi - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: sliapi diff --git a/sliapi/provider/pom.xml b/sliapi/provider/pom.xml index 8dd79432c..533b18e0c 100755 --- a/sliapi/provider/pom.xml +++ b/sliapi/provider/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core sliapi-provider - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT bundle ccsdk-sli-core :: sliapi :: ${project.artifactId} diff --git a/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/SliapiProvider.java b/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/SliapiProvider.java new file mode 100644 index 000000000..449fc3822 --- /dev/null +++ b/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/SliapiProvider.java @@ -0,0 +1,676 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 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.ccsdk.sli.core.sliapi; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Enumeration; +import java.util.LinkedList; +import java.util.Properties; + +import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.binding.impl.AbstractForwardedDataBroker; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; +import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInput; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInput.Mode; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphOutput; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.HealthcheckInput; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.HealthcheckOutput; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.HealthcheckOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.SLIAPIService; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.TestResults; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.VlbcheckInput; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.VlbcheckOutput; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.VlbcheckOutputBuilder; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.execute.graph.input.SliParameter; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.test.results.TestResult; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.test.results.TestResultBuilder; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue; +import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; +import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; + +/** + * Defines a base implementation for your provider. This class extends from a + * helper class which provides storage for the most commonly used components of + * the MD-SAL. Additionally the base class provides some basic logging and + * initialization / clean up methods. + * + * To use this, copy and paste (overwrite) the following method into the + * TestApplicationProviderModule class which is auto generated under + * src/main/java in this project (created only once during first compilation): + * + *

+ * 
+ * @Override
+ * public java.lang.AutoCloseable createInstance() {
+ * 
+ * 	final SliapiProvider provider = new SliapiProvider();
+ * 	provider.setDataBroker(getDataBrokerDependency());
+ * 	provider.setNotificationService(getNotificationServiceDependency());
+ * 	provider.setRpcRegistry(getRpcRegistryDependency());
+ * 	provider.initialize();
+ * 	return new AutoCloseable() {
+ * 
+ * 		@Override
+ * 		public void close() throws Exception {
+ * 			// TODO: CLOSE ANY REGISTRATION OBJECTS CREATED USING ABOVE
+ * 			// BROKER/NOTIFICATION
+ * 			// SERVIE/RPC REGISTRY
+ * 			provider.close();
+ * 		}
+ * 	};
+ * }
+ * 
+ * 
+ */ +public class SliapiProvider implements AutoCloseable, SLIAPIService { + + private static final Logger LOG = LoggerFactory.getLogger(SliapiProvider.class); + private static final String appName = "slitester"; + + protected DataBroker dataBroker; + protected DOMDataBroker domDataBroker; + protected NotificationPublishService notificationService; + protected RpcProviderRegistry rpcRegistry; + + private SvcLogicService svcLogic; + + protected BindingAwareBroker.RpcRegistration rpcRegistration; + + private static String SLIAPI_NAMESPACE = "org:onap:ccsdk:sli:core:sliapi"; + private static String SLIAPI_REVISION = "2016-11-10"; + private static String SDNC_STATUS_FILE = "SDNC_STATUS_FILE"; + private static String sdncStatusFile = null; + + private static QName TEST_RESULTS_QNAME = null; + private static QName TEST_RESULT_QNAME = null; + private static QName TEST_ID_QNAME = null; + private static QName RESULTS_QNAME = null; + private static final String NON_NULL = "non-null"; + + static { + + TEST_RESULTS_QNAME = QName.create(SLIAPI_NAMESPACE, SLIAPI_REVISION, "test-results"); + TEST_RESULT_QNAME = QName.create(TEST_RESULTS_QNAME, "test-result"); + TEST_ID_QNAME = QName.create(TEST_RESULT_QNAME, "test-identifier"); + RESULTS_QNAME = QName.create(TEST_RESULT_QNAME, "results"); + } + + public SliapiProvider(DataBroker dataBroker, NotificationPublishService notificationPublishService, + RpcProviderRegistry rpcProviderRegistry) { + this(dataBroker, notificationPublishService, rpcProviderRegistry, findSvcLogicService()); + } + + public SliapiProvider(DataBroker dataBroker, NotificationPublishService notificationPublishService, + RpcProviderRegistry rpcProviderRegistry, SvcLogicService svcLogic) { + this.LOG.info("Creating provider for " + appName); + this.dataBroker = dataBroker; + this.notificationService = notificationPublishService; + this.rpcRegistry = rpcProviderRegistry; + this.svcLogic = svcLogic; + initialize(); + } + + public void initialize() { + LOG.info("Initializing provider for " + appName); + // initialization code goes here. + rpcRegistration = rpcRegistry.addRpcImplementation(SLIAPIService.class, this); + + sdncStatusFile = System.getenv(SDNC_STATUS_FILE); + LOG.info("SDNC STATUS FILE = " + sdncStatusFile); + LOG.info("Initialization complete for " + appName); + } + + protected void initializeChild() { + // Override if you have custom initialization intelligence + } + + @Override + public void close() throws Exception { + LOG.info("Closing provider for " + appName); + // closing code goes here + + rpcRegistration.close(); + LOG.info("Successfully closed provider for " + appName); + } + + public void setDataBroker(DataBroker dataBroker) { + this.dataBroker = dataBroker; + if (dataBroker instanceof AbstractForwardedDataBroker) { + domDataBroker = ((AbstractForwardedDataBroker) dataBroker).getDelegate(); + } + if (LOG.isDebugEnabled()) { + LOG.debug("DataBroker set to " + (dataBroker == null ? "null" : NON_NULL) + "."); + } + } + + public void setNotificationService(NotificationPublishService notificationService) { + this.notificationService = notificationService; + if (LOG.isDebugEnabled()) { + LOG.debug("Notification Service set to " + (notificationService == null ? "null" : NON_NULL) + "."); + } + } + + public void setRpcRegistry(RpcProviderRegistry rpcRegistry) { + this.rpcRegistry = rpcRegistry; + if (LOG.isDebugEnabled()) { + LOG.debug("RpcRegistry set to " + (rpcRegistry == null ? "null" : NON_NULL) + "."); + } + } + + @Override + public ListenableFuture> executeGraph(ExecuteGraphInput input) { + RpcResult rpcResult = null; + + SvcLogicService svcLogic = getSvcLogicService(); + ExecuteGraphOutputBuilder respBuilder = new ExecuteGraphOutputBuilder(); + + String calledModule = input.getModuleName(); + String calledRpc = input.getRpcName(); + Mode calledMode = input.getMode(); + String modeStr = "sync"; + + if (calledMode == Mode.Async) { + modeStr = "async"; + } + + if (svcLogic == null) { + respBuilder.setResponseCode("500"); + respBuilder.setResponseMessage("Could not locate OSGi SvcLogicService service"); + respBuilder.setAckFinalIndicator("Y"); + + rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); + return (Futures.immediateFuture(rpcResult)); + } + + try { + if (!svcLogic.hasGraph(calledModule, calledRpc, null, modeStr)) { + respBuilder.setResponseCode("404"); + respBuilder.setResponseMessage( + "Directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr + " not found"); + respBuilder.setAckFinalIndicator("Y"); + + rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); + return (Futures.immediateFuture(rpcResult)); + } + } catch (Exception e) { + LOG.error( + "Caught exception looking for directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr, + e); + + respBuilder.setResponseCode("500"); + respBuilder.setResponseMessage("Internal error : could not determine if target graph exists"); + respBuilder.setAckFinalIndicator("Y"); + + rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); + return (Futures.immediateFuture(rpcResult)); + } + + // Load properties + Properties parms = new Properties(); + + // Pass properties using names from sli-parameters + for (SliParameter sliParm : input.getSliParameter()) { + + String propValue = ""; + + Boolean boolval = sliParm.isBooleanValue(); + + if (boolval != null) { + propValue = boolval.toString(); + } else { + Integer intval = sliParm.getIntValue(); + if (intval != null) { + propValue = intval.toString(); + } else { + propValue = sliParm.getStringValue(); + if (propValue == null) { + propValue = ""; + } + } + } + parms.setProperty(sliParm.getParameterName(), propValue); + } + + // Also, pass "meta" properties (i.e. pass SliParameter objects themselves) + ExecuteGraphInputBuilder inputBuilder = new ExecuteGraphInputBuilder(input); + + SliapiHelper.toProperties(parms, "input", inputBuilder); + + try { + LOG.info("Calling directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr); + + if (LOG.isTraceEnabled()) { + StringBuffer argList = new StringBuffer(); + argList.append("Parameters : {"); + Enumeration e = parms.propertyNames(); + while (e.hasMoreElements()) { + String propName = (String) e.nextElement(); + argList.append(" (" + propName + "," + parms.getProperty(propName) + ") "); + } + argList.append("}"); + LOG.trace(argList.toString()); + argList = null; + } + + Properties respProps = svcLogic.execute(calledModule, calledRpc, null, modeStr, parms, domDataBroker); + + StringBuilder sb = new StringBuilder("{"); + + for (Object key : respProps.keySet()) { + String keyValue = (String) key; + if (keyValue != null && !"".equals(keyValue) && !keyValue.contains("input.sli-parameter")) { + sb.append("\"").append(keyValue).append("\": \"").append(respProps.getProperty(keyValue)) + .append("\","); + } + } + + sb.setLength(sb.length() - 1); + sb.append("}"); + + respBuilder.setResponseCode(respProps.getProperty("error-code", "0")); + respBuilder.setResponseMessage(respProps.getProperty("error-message", ""));// TODO change response-text to + // response-message to match + // other BVC APIs + respBuilder.setAckFinalIndicator(respProps.getProperty("ack-final", "Y")); + respBuilder.setContextMemoryJson(sb.toString()); + + TestResultBuilder testResultBuilder = new TestResultBuilder(); + + SliapiHelper.toBuilder(respProps, testResultBuilder); + + String testIdentifier = testResultBuilder.getTestIdentifier(); + + if ((testIdentifier != null) && (testIdentifier.length() > 0)) { + + // Add test results to config tree + LOG.debug("Saving test results for test id " + testIdentifier); + + DomSaveTestResult(testResultBuilder.build(), true, LogicalDatastoreType.CONFIGURATION); + + } + + } catch (Exception e) { + LOG.error("Caught exception executing directed graph for" + calledModule + ":" + calledRpc + "," + modeStr + + ">", e); + + respBuilder.setResponseCode("500"); + respBuilder.setResponseMessage("Internal error : caught exception executing directed graph " + calledModule + + "/" + calledRpc + "/" + modeStr); + respBuilder.setAckFinalIndicator("Y"); + + } + + rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); + return (Futures.immediateFuture(rpcResult)); + } + + private SvcLogicService getSvcLogicService() { + if (svcLogic == null) { + svcLogic = findSvcLogicService(); + } + + return (svcLogic); + } + + private static SvcLogicService findSvcLogicService() { + BundleContext bctx = FrameworkUtil.getBundle(SvcLogicService.class).getBundleContext(); + + SvcLogicService svcLogic = null; + + // Get SvcLogicService reference + ServiceReference sref = bctx.getServiceReference(SvcLogicService.NAME); + if (sref != null) { + svcLogic = (SvcLogicService) bctx.getService(sref); + + } else { + LOG.warn("Cannot find service reference for " + SvcLogicService.NAME); + + } + + return (svcLogic); + } + + @Override + public ListenableFuture> healthcheck(HealthcheckInput healthcheckInput) { + + RpcResult rpcResult = null; + SvcLogicService svcLogic = getSvcLogicService(); + + HealthcheckOutputBuilder respBuilder = new HealthcheckOutputBuilder(); + + String calledModule = "sli"; + String calledRpc = "healthcheck"; + String modeStr = "sync"; + + if (svcLogic == null) { + respBuilder.setResponseCode("500"); + respBuilder.setResponseMessage("Could not locate OSGi SvcLogicService service"); + respBuilder.setAckFinalIndicator("Y"); + + rpcResult = RpcResultBuilder.failed().withResult(respBuilder.build()).build(); + return (Futures.immediateFuture(rpcResult)); + } + + try { + if (!svcLogic.hasGraph(calledModule, calledRpc, null, modeStr)) { + respBuilder.setResponseCode("404"); + respBuilder.setResponseMessage( + "Directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr + " not found"); + + respBuilder.setAckFinalIndicator("Y"); + + rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); + return (Futures.immediateFuture(rpcResult)); + } + } catch (Exception e) { + LOG.error( + "Caught exception looking for directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr, + e); + + respBuilder.setResponseCode("500"); + respBuilder.setResponseMessage("Internal error : could not determine if target graph exists"); + respBuilder.setAckFinalIndicator("Y"); + + rpcResult = RpcResultBuilder.failed().withResult(respBuilder.build()).build(); + return (Futures.immediateFuture(rpcResult)); + } + + try { + LOG.info("Calling directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr); + + Properties parms = new Properties(); + + Properties respProps = svcLogic.execute(calledModule, calledRpc, null, modeStr, parms); + + respBuilder.setResponseCode(respProps.getProperty("error-code", "0")); + respBuilder.setResponseMessage(respProps.getProperty("error-message", "")); + respBuilder.setAckFinalIndicator(respProps.getProperty("ack-final", "Y")); + + } catch (Exception e) { + LOG.error("Caught exception executing directed graph for" + calledModule + ":" + calledRpc + "," + modeStr + + ">", e); + + respBuilder.setResponseCode("500"); + respBuilder.setResponseMessage("Internal error : caught exception executing directed graph " + calledModule + + "/" + calledRpc + "/" + modeStr); + respBuilder.setAckFinalIndicator("Y"); + + } + + rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); + return (Futures.immediateFuture(rpcResult)); + } + + public ListenableFuture> vlbcheck(VlbcheckInput vlbInput) { + + RpcResult rpcResult = null; + SvcLogicService svcLogic = getSvcLogicService(); + + VlbcheckOutputBuilder respBuilder = new VlbcheckOutputBuilder(); + + String calledModule = "sli"; + String calledRpc = "vlbcheck"; + String modeStr = "sync"; + + if (svcLogic == null) { + respBuilder.setResponseCode("500"); + respBuilder.setResponseMessage("Could not locate OSGi SvcLogicService service"); + respBuilder.setAckFinalIndicator("Y"); + + rpcResult = RpcResultBuilder.failed().withResult(respBuilder.build()).build(); + return (Futures.immediateFuture(rpcResult)); + } + + boolean dgExists = true; + try { + if (!svcLogic.hasGraph(calledModule, calledRpc, null, modeStr)) { + dgExists = false; + } + } catch (Exception e) { + LOG.warn( + "Caught exception looking for directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr, + e); + + dgExists = false; + } + + if (dgExists) { + try { + LOG.info("Calling directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr); + + Properties parms = new Properties(); + + Properties respProps = svcLogic.execute(calledModule, calledRpc, null, modeStr, parms); + + respBuilder.setResponseCode(respProps.getProperty("error-code", "0")); + respBuilder.setResponseMessage(respProps.getProperty("error-message", "")); + respBuilder.setAckFinalIndicator(respProps.getProperty("ack-final", "Y")); + + } catch (Exception e) { + LOG.error("Caught exception executing directed graph for" + calledModule + ":" + calledRpc + "," + + modeStr + ">", e); + + respBuilder.setResponseCode("500"); + respBuilder.setResponseMessage("Internal error : caught exception executing directed graph " + + calledModule + "/" + calledRpc + "/" + modeStr); + respBuilder.setAckFinalIndicator("Y"); + + } + + rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); + return (Futures.immediateFuture(rpcResult)); + } else { + // check the state based on the config file + + boolean suspended = false; + BufferedReader br = null; + String line = ""; + + if (sdncStatusFile != null) { + try { + br = new BufferedReader(new FileReader(sdncStatusFile)); + while ((line = br.readLine()) != null) { + if ("ODL_STATE=SUSPENDED".equals(line)) { + suspended = true; + LOG.debug("vlbcheck: server is suspended"); + } + } + br.close(); + } catch (FileNotFoundException e) { + LOG.trace("Caught File not found exception " + sdncStatusFile + "\n", e); + } catch (Exception e) { + LOG.trace("Failed to read status file " + sdncStatusFile + "\n", e); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException e) { + LOG.warn("Failed to close status file " + sdncStatusFile + "\n", e); + } + } + } + } + + if (suspended) { + rpcResult = RpcResultBuilder.failed() + .withError(ErrorType.APPLICATION, "resource-denied", "Server Suspended").build(); + } else { + respBuilder.setResponseMessage("server is normal"); + rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); + } + return (Futures.immediateFuture(rpcResult)); + } + } + + private void DomSaveTestResult(final TestResult entry, boolean merge, LogicalDatastoreType storeType) { + + if (domDataBroker == null) { + LOG.error("domDataBroker unset - cannot save test result using DOMDataBroker"); + return; + } + + MapEntryNode resultNode = null; + + try { + resultNode = toMapEntryNode(entry); + } catch (Exception e) { + LOG.error("Caught exception trying to create map entry node", e); + } + + if (resultNode == null) { + LOG.error("Could not convert entry to MapEntryNode"); + return; + } + + YangInstanceIdentifier testResultsPid = YangInstanceIdentifier.builder().node(TEST_RESULTS_QNAME) + .node(QName.create(TEST_RESULTS_QNAME, "test-result")).build(); + YangInstanceIdentifier testResultPid = testResultsPid + .node(new NodeIdentifierWithPredicates(TEST_RESULT_QNAME, resultNode.getIdentifier().getKeyValues())); + + int tries = 2; + while (true) { + try { + DOMDataWriteTransaction wtx = domDataBroker.newWriteOnlyTransaction(); + if (merge) { + LOG.info("Merging test identifier " + entry.getTestIdentifier()); + wtx.merge(storeType, testResultPid, resultNode); + } else { + LOG.info("Putting test identifier " + entry.getTestIdentifier()); + wtx.put(storeType, testResultPid, resultNode); + } + wtx.submit().checkedGet(); + LOG.trace("Update DataStore succeeded"); + break; + } catch (final TransactionCommitFailedException e) { + if (e instanceof OptimisticLockFailedException) { + if (--tries <= 0) { + LOG.trace("Got OptimisticLockFailedException on last try - failing "); + throw new IllegalStateException(e); + } + LOG.trace("Got OptimisticLockFailedException - trying again "); + } else { + LOG.trace("Update DataStore failed"); + throw new IllegalStateException(e); + } + } + } + + } + + private void SaveTestResult(final TestResult entry, boolean merge, LogicalDatastoreType storeType) + throws IllegalStateException { + // Each entry will be identifiable by a unique key, we have to create that + // identifier + + InstanceIdentifier.InstanceIdentifierBuilder testResultIdBuilder = InstanceIdentifier + .builder(TestResults.class).child(TestResult.class, entry.key()); + InstanceIdentifier path = testResultIdBuilder.build(); + int tries = 2; + while (true) { + try { + WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); + if (merge) { + tx.merge(storeType, path, entry); + } else { + tx.put(storeType, path, entry); + } + tx.submit().checkedGet(); + LOG.trace("Update DataStore succeeded"); + break; + } catch (final TransactionCommitFailedException e) { + if (e instanceof OptimisticLockFailedException) { + if (--tries <= 0) { + LOG.trace("Got OptimisticLockFailedException on last try - failing "); + throw new IllegalStateException(e); + } + LOG.trace("Got OptimisticLockFailedException - trying again "); + } else { + LOG.trace("Update DataStore failed"); + throw new IllegalStateException(e); + } + } + } + } + + private MapEntryNode toMapEntryNode(TestResult testResult) { + + YangInstanceIdentifier testResultId = YangInstanceIdentifier.builder().node(TEST_RESULTS_QNAME) + .node(TEST_RESULT_QNAME).build(); + + // Construct results list + LinkedList> entryList = new LinkedList<>(); + for (String result : testResult.getResults()) { + LeafSetEntryNode leafSetEntryNode = ImmutableLeafSetEntryNodeBuilder.create() + .withNodeIdentifier(new NodeWithValue(RESULTS_QNAME, result)).withValue(result).build(); + entryList.add(leafSetEntryNode); + } + // Construct results LeafSetNode + LeafSetNode resultsNode = ImmutableLeafSetNodeBuilder.create() + .withNodeIdentifier(new NodeIdentifier(RESULTS_QNAME)).withValue(entryList).build(); + + // Construct test result ContainerNode with 2 children - test-identifier leaf + // and results leaf-set + MapEntryNode testResultNode = ImmutableNodes.mapEntryBuilder() + .withNodeIdentifier(new NodeIdentifierWithPredicates(TEST_RESULT_QNAME, TEST_ID_QNAME, + testResult.getTestIdentifier())) + .withChild(ImmutableNodes.leafNode(TEST_ID_QNAME, testResult.getTestIdentifier())) + .withChild(resultsNode).build(); + + return (testResultNode); + + } + +} diff --git a/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java b/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java deleted file mode 100644 index 20cbc2e0f..000000000 --- a/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java +++ /dev/null @@ -1,677 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 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.ccsdk.sli.core.sliapi; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Enumeration; -import java.util.LinkedList; -import java.util.Properties; -import java.util.concurrent.Future; - -import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -import org.opendaylight.controller.md.sal.binding.impl.AbstractForwardedDataBroker; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; -import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInput; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInput.Mode; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInputBuilder; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphOutput; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphOutputBuilder; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.HealthcheckInput; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.HealthcheckOutput; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.HealthcheckOutputBuilder; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.SLIAPIService; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.TestResults; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.VlbcheckInput; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.VlbcheckOutput; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.VlbcheckOutputBuilder; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.execute.graph.input.SliParameter; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.test.results.TestResult; -import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.test.results.TestResultBuilder; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; -import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceReference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; - -/** - * Defines a base implementation for your provider. This class extends from a - * helper class which provides storage for the most commonly used components of - * the MD-SAL. Additionally the base class provides some basic logging and - * initialization / clean up methods. - * - * To use this, copy and paste (overwrite) the following method into the - * TestApplicationProviderModule class which is auto generated under - * src/main/java in this project (created only once during first compilation): - * - *
- * 
- * @Override
- * public java.lang.AutoCloseable createInstance() {
- * 
- * 	final sliapiProvider provider = new sliapiProvider();
- * 	provider.setDataBroker(getDataBrokerDependency());
- * 	provider.setNotificationService(getNotificationServiceDependency());
- * 	provider.setRpcRegistry(getRpcRegistryDependency());
- * 	provider.initialize();
- * 	return new AutoCloseable() {
- * 
- * 		@Override
- * 		public void close() throws Exception {
- * 			// TODO: CLOSE ANY REGISTRATION OBJECTS CREATED USING ABOVE
- * 			// BROKER/NOTIFICATION
- * 			// SERVIE/RPC REGISTRY
- * 			provider.close();
- * 		}
- * 	};
- * }
- * 
- * 
- */ -public class sliapiProvider implements AutoCloseable, SLIAPIService { - - private static final Logger LOG = LoggerFactory.getLogger(sliapiProvider.class); - private static final String appName = "slitester"; - - protected DataBroker dataBroker; - protected DOMDataBroker domDataBroker; - protected NotificationPublishService notificationService; - protected RpcProviderRegistry rpcRegistry; - - private SvcLogicService svcLogic; - - protected BindingAwareBroker.RpcRegistration rpcRegistration; - - private static String SLIAPI_NAMESPACE = "org:onap:ccsdk:sli:core:sliapi"; - private static String SLIAPI_REVISION = "2016-11-10"; - private static String SDNC_STATUS_FILE = "SDNC_STATUS_FILE"; - private static String sdncStatusFile = null; - - private static QName TEST_RESULTS_QNAME = null; - private static QName TEST_RESULT_QNAME = null; - private static QName TEST_ID_QNAME = null; - private static QName RESULTS_QNAME = null; - private static final String NON_NULL = "non-null"; - - static { - - TEST_RESULTS_QNAME = QName.create(SLIAPI_NAMESPACE, SLIAPI_REVISION, "test-results"); - TEST_RESULT_QNAME = QName.create(TEST_RESULTS_QNAME, "test-result"); - TEST_ID_QNAME = QName.create(TEST_RESULT_QNAME, "test-identifier"); - RESULTS_QNAME = QName.create(TEST_RESULT_QNAME, "results"); - } - - public sliapiProvider(DataBroker dataBroker, NotificationPublishService notificationPublishService, - RpcProviderRegistry rpcProviderRegistry) { - this(dataBroker, notificationPublishService, rpcProviderRegistry, findSvcLogicService()); - } - - public sliapiProvider(DataBroker dataBroker, NotificationPublishService notificationPublishService, - RpcProviderRegistry rpcProviderRegistry, SvcLogicService svcLogic) { - this.LOG.info("Creating provider for " + appName); - this.dataBroker = dataBroker; - this.notificationService = notificationPublishService; - this.rpcRegistry = rpcProviderRegistry; - this.svcLogic = svcLogic; - initialize(); - } - - public void initialize() { - LOG.info("Initializing provider for " + appName); - // initialization code goes here. - rpcRegistration = rpcRegistry.addRpcImplementation(SLIAPIService.class, this); - - sdncStatusFile = System.getenv(SDNC_STATUS_FILE); - LOG.info("SDNC STATUS FILE = " + sdncStatusFile); - LOG.info("Initialization complete for " + appName); - } - - protected void initializeChild() { - // Override if you have custom initialization intelligence - } - - @Override - public void close() throws Exception { - LOG.info("Closing provider for " + appName); - // closing code goes here - - rpcRegistration.close(); - LOG.info("Successfully closed provider for " + appName); - } - - public void setDataBroker(DataBroker dataBroker) { - this.dataBroker = dataBroker; - if (dataBroker instanceof AbstractForwardedDataBroker) { - domDataBroker = ((AbstractForwardedDataBroker) dataBroker).getDelegate(); - } - if (LOG.isDebugEnabled()) { - LOG.debug("DataBroker set to " + (dataBroker == null ? "null" : NON_NULL) + "."); - } - } - - public void setNotificationService(NotificationPublishService notificationService) { - this.notificationService = notificationService; - if (LOG.isDebugEnabled()) { - LOG.debug("Notification Service set to " + (notificationService == null ? "null" : NON_NULL) + "."); - } - } - - public void setRpcRegistry(RpcProviderRegistry rpcRegistry) { - this.rpcRegistry = rpcRegistry; - if (LOG.isDebugEnabled()) { - LOG.debug("RpcRegistry set to " + (rpcRegistry == null ? "null" : NON_NULL) + "."); - } - } - - @Override - public ListenableFuture> executeGraph(ExecuteGraphInput input) { - RpcResult rpcResult = null; - - SvcLogicService svcLogic = getSvcLogicService(); - ExecuteGraphOutputBuilder respBuilder = new ExecuteGraphOutputBuilder(); - - String calledModule = input.getModuleName(); - String calledRpc = input.getRpcName(); - Mode calledMode = input.getMode(); - String modeStr = "sync"; - - if (calledMode == Mode.Async) { - modeStr = "async"; - } - - if (svcLogic == null) { - respBuilder.setResponseCode("500"); - respBuilder.setResponseMessage("Could not locate OSGi SvcLogicService service"); - respBuilder.setAckFinalIndicator("Y"); - - rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); - return (Futures.immediateFuture(rpcResult)); - } - - try { - if (!svcLogic.hasGraph(calledModule, calledRpc, null, modeStr)) { - respBuilder.setResponseCode("404"); - respBuilder.setResponseMessage( - "Directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr + " not found"); - respBuilder.setAckFinalIndicator("Y"); - - rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); - return (Futures.immediateFuture(rpcResult)); - } - } catch (Exception e) { - LOG.error( - "Caught exception looking for directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr, - e); - - respBuilder.setResponseCode("500"); - respBuilder.setResponseMessage("Internal error : could not determine if target graph exists"); - respBuilder.setAckFinalIndicator("Y"); - - rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); - return (Futures.immediateFuture(rpcResult)); - } - - // Load properties - Properties parms = new Properties(); - - // Pass properties using names from sli-parameters - for (SliParameter sliParm : input.getSliParameter()) { - - String propValue = ""; - - Boolean boolval = sliParm.isBooleanValue(); - - if (boolval != null) { - propValue = boolval.toString(); - } else { - Integer intval = sliParm.getIntValue(); - if (intval != null) { - propValue = intval.toString(); - } else { - propValue = sliParm.getStringValue(); - if (propValue == null) { - propValue = ""; - } - } - } - parms.setProperty(sliParm.getParameterName(), propValue); - } - - // Also, pass "meta" properties (i.e. pass SliParameter objects themselves) - ExecuteGraphInputBuilder inputBuilder = new ExecuteGraphInputBuilder(input); - - SliapiHelper.toProperties(parms, "input", inputBuilder); - - try { - LOG.info("Calling directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr); - - if (LOG.isTraceEnabled()) { - StringBuffer argList = new StringBuffer(); - argList.append("Parameters : {"); - Enumeration e = parms.propertyNames(); - while (e.hasMoreElements()) { - String propName = (String) e.nextElement(); - argList.append(" (" + propName + "," + parms.getProperty(propName) + ") "); - } - argList.append("}"); - LOG.trace(argList.toString()); - argList = null; - } - - Properties respProps = svcLogic.execute(calledModule, calledRpc, null, modeStr, parms, domDataBroker); - - StringBuilder sb = new StringBuilder("{"); - - for (Object key : respProps.keySet()) { - String keyValue = (String) key; - if (keyValue != null && !"".equals(keyValue) && !keyValue.contains("input.sli-parameter")) { - sb.append("\"").append(keyValue).append("\": \"").append(respProps.getProperty(keyValue)) - .append("\","); - } - } - - sb.setLength(sb.length() - 1); - sb.append("}"); - - respBuilder.setResponseCode(respProps.getProperty("error-code", "0")); - respBuilder.setResponseMessage(respProps.getProperty("error-message", ""));// TODO change response-text to - // response-message to match - // other BVC APIs - respBuilder.setAckFinalIndicator(respProps.getProperty("ack-final", "Y")); - respBuilder.setContextMemoryJson(sb.toString()); - - TestResultBuilder testResultBuilder = new TestResultBuilder(); - - SliapiHelper.toBuilder(respProps, testResultBuilder); - - String testIdentifier = testResultBuilder.getTestIdentifier(); - - if ((testIdentifier != null) && (testIdentifier.length() > 0)) { - - // Add test results to config tree - LOG.debug("Saving test results for test id " + testIdentifier); - - DomSaveTestResult(testResultBuilder.build(), true, LogicalDatastoreType.CONFIGURATION); - - } - - } catch (Exception e) { - LOG.error("Caught exception executing directed graph for" + calledModule + ":" + calledRpc + "," + modeStr - + ">", e); - - respBuilder.setResponseCode("500"); - respBuilder.setResponseMessage("Internal error : caught exception executing directed graph " + calledModule - + "/" + calledRpc + "/" + modeStr); - respBuilder.setAckFinalIndicator("Y"); - - } - - rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); - return (Futures.immediateFuture(rpcResult)); - } - - private SvcLogicService getSvcLogicService() { - if (svcLogic == null) { - svcLogic = findSvcLogicService(); - } - - return (svcLogic); - } - - private static SvcLogicService findSvcLogicService() { - BundleContext bctx = FrameworkUtil.getBundle(SvcLogicService.class).getBundleContext(); - - SvcLogicService svcLogic = null; - - // Get SvcLogicService reference - ServiceReference sref = bctx.getServiceReference(SvcLogicService.NAME); - if (sref != null) { - svcLogic = (SvcLogicService) bctx.getService(sref); - - } else { - LOG.warn("Cannot find service reference for " + SvcLogicService.NAME); - - } - - return (svcLogic); - } - - @Override - public ListenableFuture> healthcheck(HealthcheckInput healthcheckInput) { - - RpcResult rpcResult = null; - SvcLogicService svcLogic = getSvcLogicService(); - - HealthcheckOutputBuilder respBuilder = new HealthcheckOutputBuilder(); - - String calledModule = "sli"; - String calledRpc = "healthcheck"; - String modeStr = "sync"; - - if (svcLogic == null) { - respBuilder.setResponseCode("500"); - respBuilder.setResponseMessage("Could not locate OSGi SvcLogicService service"); - respBuilder.setAckFinalIndicator("Y"); - - rpcResult = RpcResultBuilder.failed().withResult(respBuilder.build()).build(); - return (Futures.immediateFuture(rpcResult)); - } - - try { - if (!svcLogic.hasGraph(calledModule, calledRpc, null, modeStr)) { - respBuilder.setResponseCode("404"); - respBuilder.setResponseMessage( - "Directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr + " not found"); - - respBuilder.setAckFinalIndicator("Y"); - - rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); - return (Futures.immediateFuture(rpcResult)); - } - } catch (Exception e) { - LOG.error( - "Caught exception looking for directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr, - e); - - respBuilder.setResponseCode("500"); - respBuilder.setResponseMessage("Internal error : could not determine if target graph exists"); - respBuilder.setAckFinalIndicator("Y"); - - rpcResult = RpcResultBuilder.failed().withResult(respBuilder.build()).build(); - return (Futures.immediateFuture(rpcResult)); - } - - try { - LOG.info("Calling directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr); - - Properties parms = new Properties(); - - Properties respProps = svcLogic.execute(calledModule, calledRpc, null, modeStr, parms); - - respBuilder.setResponseCode(respProps.getProperty("error-code", "0")); - respBuilder.setResponseMessage(respProps.getProperty("error-message", "")); - respBuilder.setAckFinalIndicator(respProps.getProperty("ack-final", "Y")); - - } catch (Exception e) { - LOG.error("Caught exception executing directed graph for" + calledModule + ":" + calledRpc + "," + modeStr - + ">", e); - - respBuilder.setResponseCode("500"); - respBuilder.setResponseMessage("Internal error : caught exception executing directed graph " + calledModule - + "/" + calledRpc + "/" + modeStr); - respBuilder.setAckFinalIndicator("Y"); - - } - - rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); - return (Futures.immediateFuture(rpcResult)); - } - - public ListenableFuture> vlbcheck(VlbcheckInput vlbInput) { - - RpcResult rpcResult = null; - SvcLogicService svcLogic = getSvcLogicService(); - - VlbcheckOutputBuilder respBuilder = new VlbcheckOutputBuilder(); - - String calledModule = "sli"; - String calledRpc = "vlbcheck"; - String modeStr = "sync"; - - if (svcLogic == null) { - respBuilder.setResponseCode("500"); - respBuilder.setResponseMessage("Could not locate OSGi SvcLogicService service"); - respBuilder.setAckFinalIndicator("Y"); - - rpcResult = RpcResultBuilder.failed().withResult(respBuilder.build()).build(); - return (Futures.immediateFuture(rpcResult)); - } - - boolean dgExists = true; - try { - if (!svcLogic.hasGraph(calledModule, calledRpc, null, modeStr)) { - dgExists = false; - } - } catch (Exception e) { - LOG.warn( - "Caught exception looking for directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr, - e); - - dgExists = false; - } - - if (dgExists) { - try { - LOG.info("Calling directed graph for " + calledModule + "/" + calledRpc + "/" + modeStr); - - Properties parms = new Properties(); - - Properties respProps = svcLogic.execute(calledModule, calledRpc, null, modeStr, parms); - - respBuilder.setResponseCode(respProps.getProperty("error-code", "0")); - respBuilder.setResponseMessage(respProps.getProperty("error-message", "")); - respBuilder.setAckFinalIndicator(respProps.getProperty("ack-final", "Y")); - - } catch (Exception e) { - LOG.error("Caught exception executing directed graph for" + calledModule + ":" + calledRpc + "," - + modeStr + ">", e); - - respBuilder.setResponseCode("500"); - respBuilder.setResponseMessage("Internal error : caught exception executing directed graph " - + calledModule + "/" + calledRpc + "/" + modeStr); - respBuilder.setAckFinalIndicator("Y"); - - } - - rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); - return (Futures.immediateFuture(rpcResult)); - } else { - // check the state based on the config file - - boolean suspended = false; - BufferedReader br = null; - String line = ""; - - if (sdncStatusFile != null) { - try { - br = new BufferedReader(new FileReader(sdncStatusFile)); - while ((line = br.readLine()) != null) { - if ("ODL_STATE=SUSPENDED".equals(line)) { - suspended = true; - LOG.debug("vlbcheck: server is suspended"); - } - } - br.close(); - } catch (FileNotFoundException e) { - LOG.trace("Caught File not found exception " + sdncStatusFile + "\n", e); - } catch (Exception e) { - LOG.trace("Failed to read status file " + sdncStatusFile + "\n", e); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - LOG.warn("Failed to close status file " + sdncStatusFile + "\n", e); - } - } - } - } - - if (suspended) { - rpcResult = RpcResultBuilder.failed() - .withError(ErrorType.APPLICATION, "resource-denied", "Server Suspended").build(); - } else { - respBuilder.setResponseMessage("server is normal"); - rpcResult = RpcResultBuilder.status(true).withResult(respBuilder.build()).build(); - } - return (Futures.immediateFuture(rpcResult)); - } - } - - private void DomSaveTestResult(final TestResult entry, boolean merge, LogicalDatastoreType storeType) { - - if (domDataBroker == null) { - LOG.error("domDataBroker unset - cannot save test result using DOMDataBroker"); - return; - } - - MapEntryNode resultNode = null; - - try { - resultNode = toMapEntryNode(entry); - } catch (Exception e) { - LOG.error("Caught exception trying to create map entry node", e); - } - - if (resultNode == null) { - LOG.error("Could not convert entry to MapEntryNode"); - return; - } - - YangInstanceIdentifier testResultsPid = YangInstanceIdentifier.builder().node(TEST_RESULTS_QNAME) - .node(QName.create(TEST_RESULTS_QNAME, "test-result")).build(); - YangInstanceIdentifier testResultPid = testResultsPid - .node(new NodeIdentifierWithPredicates(TEST_RESULT_QNAME, resultNode.getIdentifier().getKeyValues())); - - int tries = 2; - while (true) { - try { - DOMDataWriteTransaction wtx = domDataBroker.newWriteOnlyTransaction(); - if (merge) { - LOG.info("Merging test identifier " + entry.getTestIdentifier()); - wtx.merge(storeType, testResultPid, resultNode); - } else { - LOG.info("Putting test identifier " + entry.getTestIdentifier()); - wtx.put(storeType, testResultPid, resultNode); - } - wtx.submit().checkedGet(); - LOG.trace("Update DataStore succeeded"); - break; - } catch (final TransactionCommitFailedException e) { - if (e instanceof OptimisticLockFailedException) { - if (--tries <= 0) { - LOG.trace("Got OptimisticLockFailedException on last try - failing "); - throw new IllegalStateException(e); - } - LOG.trace("Got OptimisticLockFailedException - trying again "); - } else { - LOG.trace("Update DataStore failed"); - throw new IllegalStateException(e); - } - } - } - - } - - private void SaveTestResult(final TestResult entry, boolean merge, LogicalDatastoreType storeType) - throws IllegalStateException { - // Each entry will be identifiable by a unique key, we have to create that - // identifier - - InstanceIdentifier.InstanceIdentifierBuilder testResultIdBuilder = InstanceIdentifier - .builder(TestResults.class).child(TestResult.class, entry.key()); - InstanceIdentifier path = testResultIdBuilder.build(); - int tries = 2; - while (true) { - try { - WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); - if (merge) { - tx.merge(storeType, path, entry); - } else { - tx.put(storeType, path, entry); - } - tx.submit().checkedGet(); - LOG.trace("Update DataStore succeeded"); - break; - } catch (final TransactionCommitFailedException e) { - if (e instanceof OptimisticLockFailedException) { - if (--tries <= 0) { - LOG.trace("Got OptimisticLockFailedException on last try - failing "); - throw new IllegalStateException(e); - } - LOG.trace("Got OptimisticLockFailedException - trying again "); - } else { - LOG.trace("Update DataStore failed"); - throw new IllegalStateException(e); - } - } - } - } - - private MapEntryNode toMapEntryNode(TestResult testResult) { - - YangInstanceIdentifier testResultId = YangInstanceIdentifier.builder().node(TEST_RESULTS_QNAME) - .node(TEST_RESULT_QNAME).build(); - - // Construct results list - LinkedList> entryList = new LinkedList<>(); - for (String result : testResult.getResults()) { - LeafSetEntryNode leafSetEntryNode = ImmutableLeafSetEntryNodeBuilder.create() - .withNodeIdentifier(new NodeWithValue(RESULTS_QNAME, result)).withValue(result).build(); - entryList.add(leafSetEntryNode); - } - // Construct results LeafSetNode - LeafSetNode resultsNode = ImmutableLeafSetNodeBuilder.create() - .withNodeIdentifier(new NodeIdentifier(RESULTS_QNAME)).withValue(entryList).build(); - - // Construct test result ContainerNode with 2 children - test-identifier leaf - // and results leaf-set - MapEntryNode testResultNode = ImmutableNodes.mapEntryBuilder() - .withNodeIdentifier(new NodeIdentifierWithPredicates(TEST_RESULT_QNAME, TEST_ID_QNAME, - testResult.getTestIdentifier())) - .withChild(ImmutableNodes.leafNode(TEST_ID_QNAME, testResult.getTestIdentifier())) - .withChild(resultsNode).build(); - - return (testResultNode); - - } - -} diff --git a/sliapi/provider/src/main/resources/OSGI-INF/blueprint/sliapi-blueprint.xml b/sliapi/provider/src/main/resources/OSGI-INF/blueprint/sliapi-blueprint.xml new file mode 100644 index 000000000..875027e63 --- /dev/null +++ b/sliapi/provider/src/main/resources/OSGI-INF/blueprint/sliapi-blueprint.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sliapi/provider/src/main/resources/org/opendaylight/blueprint/sliapi-blueprint.xml b/sliapi/provider/src/main/resources/org/opendaylight/blueprint/sliapi-blueprint.xml index 761b014a0..875027e63 100644 --- a/sliapi/provider/src/main/resources/org/opendaylight/blueprint/sliapi-blueprint.xml +++ b/sliapi/provider/src/main/resources/org/opendaylight/blueprint/sliapi-blueprint.xml @@ -19,7 +19,7 @@ interface="org.opendaylight.controller.sal.binding.api.RpcProviderRegistry" odl:type="default" /> - + diff --git a/sliapi/provider/src/test/java/org/onap/ccsdk/sli/core/sliapi/TestSliapiProvider.java b/sliapi/provider/src/test/java/org/onap/ccsdk/sli/core/sliapi/TestSliapiProvider.java index 0326429c9..c898ffffe 100644 --- a/sliapi/provider/src/test/java/org/onap/ccsdk/sli/core/sliapi/TestSliapiProvider.java +++ b/sliapi/provider/src/test/java/org/onap/ccsdk/sli/core/sliapi/TestSliapiProvider.java @@ -65,7 +65,7 @@ import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.exe */ public class TestSliapiProvider { - private sliapiProvider provider; + private SliapiProvider provider; private static final String HEALTHCHECK_DG = "sli_healthcheck.xml"; @@ -129,8 +129,8 @@ public class TestSliapiProvider { svc.registerExecutor(nodeType, BUILTIN_NODES.get(nodeType)); } - // Finally ready to create sliapiProvider - provider = new sliapiProvider(dataBroker, notifyService, rpcRegistry, svc); + // Finally ready to create SliapiProvider + provider = new SliapiProvider(dataBroker, notifyService, rpcRegistry, svc); provider.setDataBroker(dataBroker); provider.setNotificationService(notifyService); provider.setRpcRegistry(rpcRegistry); @@ -146,7 +146,7 @@ public class TestSliapiProvider { /** * Test method for - * {@link org.onap.ccsdk.sli.core.sliapi.sliapiProvider#executeGraph(org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInput)}. + * {@link SliapiProvider#executeGraph(org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInput)}. */ @Test public void testExecuteGraph() { @@ -198,7 +198,7 @@ public class TestSliapiProvider { /** * Test method for - * {@link org.onap.ccsdk.sli.core.sliapi.sliapiProvider#healthcheck()}. + * {@link SliapiProvider#healthcheck()}. */ @Test public void testHealthcheck() { diff --git a/sliapi/provider/src/test/resources/simplelogger.properties b/sliapi/provider/src/test/resources/simplelogger.properties index 417c4d143..2f7d8ea0b 100644 --- a/sliapi/provider/src/test/resources/simplelogger.properties +++ b/sliapi/provider/src/test/resources/simplelogger.properties @@ -20,4 +20,4 @@ ### org.slf4j.simpleLogger.defaultLogLevel=info -org.slf4j.simplelogger.log.org.onap.ccsdk.sli.core.sliapi.sliapiProvider=debug +org.slf4j.simplelogger.log.org.onap.ccsdk.sli.core.sliapi.SliapiProvider=debug diff --git a/utils/features/ccsdk-slicore-utils/pom.xml b/utils/features/ccsdk-slicore-utils/pom.xml index fdeeb4412..71110f6b6 100644 --- a/utils/features/ccsdk-slicore-utils/pom.xml +++ b/utils/features/ccsdk-slicore-utils/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent single-feature-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core ccsdk-slicore-utils - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: utils :: ${project.artifactId} diff --git a/utils/features/features-util/pom.xml b/utils/features/features-util/pom.xml index c1e60c647..cc52237da 100644 --- a/utils/features/features-util/pom.xml +++ b/utils/features/features-util/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent feature-repo-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core features-util - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT feature ccsdk-sli-core :: utils :: ${project.artifactId} diff --git a/utils/features/pom.xml b/utils/features/pom.xml index 19279b3ff..e1528efb3 100755 --- a/utils/features/pom.xml +++ b/utils/features/pom.xml @@ -5,13 +5,12 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core utils-features-aggregator - 0.5.2-SNAPSHOT pom ccsdk-sli-core :: utils :: ${project.artifactId} diff --git a/utils/installer/pom.xml b/utils/installer/pom.xml index db0c505d1..02b824013 100755 --- a/utils/installer/pom.xml +++ b/utils/installer/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core utils-installer - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: utils :: ${project.artifactId} diff --git a/utils/pom.xml b/utils/pom.xml index 2b42734e0..f2bb15ca0 100755 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent odlparent-lite - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core utils - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT pom ccsdk-sli-core :: utils diff --git a/utils/provider/pom.xml b/utils/provider/pom.xml index 2b7799741..d65fa253f 100644 --- a/utils/provider/pom.xml +++ b/utils/provider/pom.xml @@ -5,13 +5,13 @@ org.onap.ccsdk.parent binding-parent - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT org.onap.ccsdk.sli.core utils-provider - 0.5.2-SNAPSHOT + 0.6.0-SNAPSHOT bundle ccsdk-sli-core :: utils :: ${project.artifactId} diff --git a/version.properties b/version.properties index 6a35b9035..50be578e4 100644 --- a/version.properties +++ b/version.properties @@ -5,8 +5,8 @@ release_name=0 -sprint_number=5 -feature_revision=2 +sprint_number=6 +feature_revision=0 base_version=${release_name}.${sprint_number}.${feature_revision} -- cgit 1.2.3-korg From 4a79f9d1e5066f9fafde81bf13004a61a4011fe7 Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Thu, 17 Oct 2019 19:03:35 +0000 Subject: SliStringUtils additional functions in SliStringUtils added Issue-ID: CCSDK-1847 Signed-off-by: Smokowski, Kevin (ks6305) Change-Id: I2e38258abe57d4fcd49cf226877cd38e9dd947d6 --- .../sli/core/slipluginutils/SliPluginUtils.java | 11 ++- .../sli/core/slipluginutils/SliStringUtils.java | 82 +++++++++++++++------- .../SliPluginUtils_StaticFunctionsTest.java | 21 +++++- .../core/slipluginutils/SliStringUtilsTest.java | 68 +++++++++++++++++- 4 files changed, 153 insertions(+), 29 deletions(-) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java index fd3364ca4..b8e88f652 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java @@ -39,8 +39,8 @@ import java.util.Objects; import java.util.Properties; import java.util.Set; import java.util.UUID; -import org.apache.commons.text.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.text.StringEscapeUtils; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; @@ -1110,4 +1110,13 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { return changeFlag; } + public static String containsKey(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + String key = parameters.get("key"); + Boolean keyFound = ctx.getAttributeKeySet().contains(key); + if (keyFound) { + return "true"; + } + return "false"; + } + } diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java index 888ef8834..269c3766c 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java @@ -39,10 +39,12 @@ import org.slf4j.LoggerFactory; */ public class SliStringUtils implements SvcLogicJavaPlugin { private static final Logger LOG = LoggerFactory.getLogger(SliStringUtils.class); - + public static final String INPUT_PARAM_KEY = "key"; public static final String INPUT_PARAM_SOURCE = "source"; public static final String INPUT_PARAM_TARGET = "target"; - + public static final String TRUE_CONSTANT = "true"; + public static final String FALSE_CONSTANT = "false"; + public SliStringUtils() {} /** @@ -125,11 +127,11 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static String equalsIgnoreCase(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"target"}, LOG); - if(parameters.get(INPUT_PARAM_SOURCE).equalsIgnoreCase(parameters.get("target"))){ - return "true"; + SliPluginUtils.checkParameters(parameters, new String[] {INPUT_PARAM_SOURCE, INPUT_PARAM_TARGET}, LOG); + if (parameters.get(INPUT_PARAM_SOURCE).equalsIgnoreCase(parameters.get(INPUT_PARAM_TARGET))) { + return TRUE_CONSTANT; } - return "false"; + return FALSE_CONSTANT; } /** @@ -189,11 +191,11 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static String contains(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"target"}, LOG); - if(parameters.get(INPUT_PARAM_SOURCE).contains(parameters.get("target"))){ - return "true"; + SliPluginUtils.checkParameters(parameters, new String[] {INPUT_PARAM_SOURCE, INPUT_PARAM_TARGET}, LOG); + if (parameters.get(INPUT_PARAM_SOURCE).contains(parameters.get(INPUT_PARAM_TARGET))) { + return TRUE_CONSTANT; } - return "false"; + return FALSE_CONSTANT; } /** @@ -213,11 +215,11 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static String endsWith(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"target"}, LOG); - if(parameters.get(INPUT_PARAM_SOURCE).endsWith(parameters.get("target"))){ - return "true"; + SliPluginUtils.checkParameters(parameters, new String[] {INPUT_PARAM_SOURCE, INPUT_PARAM_TARGET}, LOG); + if (parameters.get(INPUT_PARAM_SOURCE).endsWith(parameters.get(INPUT_PARAM_TARGET))) { + return TRUE_CONSTANT; } - return "false"; + return FALSE_CONSTANT; } /** @@ -237,11 +239,11 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static String startsWith(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"target"}, LOG); - if(parameters.get(INPUT_PARAM_SOURCE).startsWith(parameters.get("target"))){ - return "true"; + SliPluginUtils.checkParameters(parameters, new String[] {INPUT_PARAM_SOURCE, INPUT_PARAM_TARGET}, LOG); + if (parameters.get(INPUT_PARAM_SOURCE).startsWith(parameters.get(INPUT_PARAM_TARGET))) { + return TRUE_CONSTANT; } - return "false"; + return FALSE_CONSTANT; } /** @@ -302,8 +304,10 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static void replace(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"outputPath","target","replacement"}, LOG); - ctx.setAttribute(parameters.get("outputPath"), (parameters.get(INPUT_PARAM_SOURCE).replace(parameters.get("target"), parameters.get("replacement")))); + SliPluginUtils.checkParameters(parameters, + new String[] {INPUT_PARAM_SOURCE, "outputPath", INPUT_PARAM_TARGET, "replacement"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), (parameters.get(INPUT_PARAM_SOURCE) + .replace(parameters.get(INPUT_PARAM_TARGET), parameters.get("replacement")))); } /** @@ -324,8 +328,10 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static void replaceAll(Map parameters, SvcLogicContext ctx) throws SvcLogicException { - SliPluginUtils.checkParameters(parameters, new String[]{INPUT_PARAM_SOURCE,"outputPath","target","replacement"}, LOG); - ctx.setAttribute(parameters.get("outputPath"), parameters.get(INPUT_PARAM_SOURCE).replaceAll(parameters.get("target"), parameters.get("replacement"))); + SliPluginUtils.checkParameters(parameters, + new String[] {INPUT_PARAM_SOURCE, "outputPath", INPUT_PARAM_TARGET, "replacement"}, LOG); + ctx.setAttribute(parameters.get("outputPath"), parameters.get(INPUT_PARAM_SOURCE) + .replaceAll(parameters.get(INPUT_PARAM_TARGET), parameters.get("replacement"))); } /** @@ -385,8 +391,9 @@ public class SliStringUtils implements SvcLogicJavaPlugin { * @since 11.0.2 */ public static void concat( Map parameters, SvcLogicContext ctx ) throws SvcLogicException { - SliPluginUtils.checkParameters( parameters, new String[]{INPUT_PARAM_SOURCE,"target","outputPath"}, LOG ); - String result = parameters.get(INPUT_PARAM_SOURCE).concat(parameters.get("target")); + SliPluginUtils.checkParameters(parameters, new String[] {INPUT_PARAM_SOURCE, INPUT_PARAM_TARGET, "outputPath"}, + LOG); + String result = parameters.get(INPUT_PARAM_SOURCE).concat(parameters.get(INPUT_PARAM_TARGET)); ctx.setAttribute(parameters.get("outputPath"), result); } @@ -475,4 +482,31 @@ public class SliStringUtils implements SvcLogicJavaPlugin { throw new SvcLogicException("problem with escapeJsonString", ex); } } + + public static String isBlank(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + String ctxLocation = parameters.get(INPUT_PARAM_KEY); + String str = ctx.getAttribute(ctxLocation); + if (str == null || str.isEmpty() || " ".equals(str)) { + return TRUE_CONSTANT; + } + return FALSE_CONSTANT; + } + + public static String isEmpty(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + String ctxLocation = parameters.get(INPUT_PARAM_KEY); + String str = ctx.getAttribute(ctxLocation); + if (str == null || str.isEmpty()) { + return TRUE_CONSTANT; + } + return FALSE_CONSTANT; + } + + public static String isNull(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + String ctxLocation = parameters.get(INPUT_PARAM_KEY); + String str = ctx.getAttribute(ctxLocation); + if (str == null) { + return TRUE_CONSTANT; + } + return FALSE_CONSTANT; + } } diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java index 774aa1c84..08adc9731 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java @@ -24,10 +24,8 @@ package org.onap.ccsdk.sli.core.slipluginutils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; - import java.util.HashMap; import java.util.Map; - import org.junit.Before; import org.junit.Test; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; @@ -247,4 +245,23 @@ public class SliPluginUtils_StaticFunctionsTest { SliPluginUtils.setTime(parameters, ctx); assertNotNull(ctx.getAttribute(outputPath)); } + + @Test + public void containsKey() throws Exception { + ctx = new SvcLogicContext(); + parameters.put(SliStringUtils.INPUT_PARAM_KEY, "key_does_not_exist"); + String result = SliPluginUtils.containsKey(parameters, ctx); + assertEquals(SliStringUtils.FALSE_CONSTANT, result); + + ctx.setAttribute("a", null); + parameters.put(SliStringUtils.INPUT_PARAM_KEY, "a"); + result = SliPluginUtils.containsKey(parameters, ctx); + assertEquals(SliStringUtils.FALSE_CONSTANT, result); + + ctx.setAttribute("a", "hellworld"); + parameters.put(SliStringUtils.INPUT_PARAM_KEY, "a"); + result = SliPluginUtils.containsKey(parameters, ctx); + assertEquals(SliStringUtils.TRUE_CONSTANT, result); + } + } diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java index b88e8d2c9..d8d78a0b1 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java @@ -26,10 +26,8 @@ package org.onap.ccsdk.sli.core.slipluginutils; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; - import java.util.HashMap; import java.util.Map; - import org.junit.Before; import org.junit.Test; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; @@ -317,4 +315,70 @@ public class SliStringUtilsTest { assertEquals("{\\\"image_name\\\":\\\"Ubuntu 14.04\\\",\\\"service-instance-id\\\":\\\"1\\\",\\\"vnf-model-customization-uuid\\\":\\\"2f\\\",\\\"vnf-id\\\":\\\"3b\\\"}", ctx.getAttribute(outputPath)); } + @Test + public void isEmpty() throws Exception { + ctx = new SvcLogicContext(); + param = new HashMap<>(); + String result = SliStringUtils.isEmpty(param, ctx); + param.put(SliStringUtils.INPUT_PARAM_KEY, "key_does_not_exist"); + assertEquals(SliStringUtils.TRUE_CONSTANT, result); + + ctx.setAttribute("a", null); + param.put(SliStringUtils.INPUT_PARAM_KEY, "a"); + result = SliStringUtils.isEmpty(param, ctx); + assertEquals(SliStringUtils.TRUE_CONSTANT, result); + + ctx.setAttribute("a", ""); + result = SliStringUtils.isEmpty(param, ctx); + assertEquals(SliStringUtils.TRUE_CONSTANT, result); + + ctx.setAttribute("a", " "); + result = SliStringUtils.isEmpty(param, ctx); + assertEquals(SliStringUtils.FALSE_CONSTANT, result); + } + + @Test + public void isBlank() throws Exception { + ctx = new SvcLogicContext(); + param = new HashMap<>(); + String result = SliStringUtils.isBlank(param, ctx); + param.put(SliStringUtils.INPUT_PARAM_KEY, "key_does_not_exist"); + assertEquals(SliStringUtils.TRUE_CONSTANT, result); + + ctx.setAttribute("a", null); + param.put(SliStringUtils.INPUT_PARAM_KEY, "a"); + result = SliStringUtils.isBlank(param, ctx); + assertEquals(SliStringUtils.TRUE_CONSTANT, result); + + ctx.setAttribute("a", ""); + result = SliStringUtils.isBlank(param, ctx); + assertEquals(SliStringUtils.TRUE_CONSTANT, result); + + ctx.setAttribute("a", " "); + result = SliStringUtils.isBlank(param, ctx); + assertEquals(SliStringUtils.TRUE_CONSTANT, result); + } + + @Test + public void isNull() throws Exception { + ctx = new SvcLogicContext(); + param = new HashMap<>(); + String result = SliStringUtils.isNull(param, ctx); + param.put(SliStringUtils.INPUT_PARAM_KEY, "key_does_not_exist"); + assertEquals(SliStringUtils.TRUE_CONSTANT, result); + + ctx.setAttribute("a", null); + param.put(SliStringUtils.INPUT_PARAM_KEY, "a"); + result = SliStringUtils.isNull(param, ctx); + assertEquals(SliStringUtils.TRUE_CONSTANT, result); + + ctx.setAttribute("a", ""); + result = SliStringUtils.isNull(param, ctx); + assertEquals(SliStringUtils.FALSE_CONSTANT, result); + + ctx.setAttribute("a", " "); + result = SliStringUtils.isNull(param, ctx); + assertEquals(SliStringUtils.FALSE_CONSTANT, result); + } + } -- cgit 1.2.3-korg From 2fa35ec7af06c9f1d1982dc500726de703f7dede Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Tue, 17 Dec 2019 18:27:42 +0000 Subject: enhance SliPluginUtils writeJsonToCtx now supports top level json arrays, add urlDecode to SliStringUtils, rename CheckParametersTest and move unrelated methods into another test class and Add test cases to improve test coverage Issue-ID: CCSDK-2006 Signed-off-by: Smokowski, Kevin (ks6305) Change-Id: If1f654ea9c7046b00c977434f87740e54f15b7d3 --- .../sli/core/slipluginutils/SliPluginUtils.java | 40 ++- .../sli/core/slipluginutils/SliStringUtils.java | 15 + .../core/slipluginutils/CheckParametersTest.java | 216 ------------- .../SliPluginUtils_StaticFunctionsTest.java | 342 +++++++++++++++++++-- .../SliPluginUtils_checkParametersTest.java | 117 +++++++ .../core/slipluginutils/SliStringUtilsTest.java | 17 +- .../provider/src/test/resources/2dArray.json | 4 + .../provider/src/test/resources/3dArray.json | 4 + .../provider/src/test/resources/ArrayMenu.json | 41 +++ .../src/test/resources/EmbeddedEscapedJson.json | 16 + .../provider/src/test/resources/EscapedJson.json | 1 + .../provider/src/test/resources/ObjectMenu.json | 43 +++ .../provider/src/test/resources/Widget.json | 27 ++ 13 files changed, 626 insertions(+), 257 deletions(-) delete mode 100644 sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/CheckParametersTest.java create mode 100644 sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_checkParametersTest.java create mode 100644 sliPluginUtils/provider/src/test/resources/2dArray.json create mode 100644 sliPluginUtils/provider/src/test/resources/3dArray.json create mode 100644 sliPluginUtils/provider/src/test/resources/ArrayMenu.json create mode 100644 sliPluginUtils/provider/src/test/resources/EmbeddedEscapedJson.json create mode 100644 sliPluginUtils/provider/src/test/resources/EscapedJson.json create mode 100644 sliPluginUtils/provider/src/test/resources/ObjectMenu.json create mode 100644 sliPluginUtils/provider/src/test/resources/Widget.json (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java index b8e88f652..1fc052532 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java @@ -821,32 +821,46 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { protected static void writeJsonToCtx(String resp, SvcLogicContext ctx, String prefix){ JsonParser jp = new JsonParser(); JsonElement element = jp.parse(resp); - writeJsonObject(element.getAsJsonObject(), ctx, prefix + "."); + String root = prefix + "."; + if (element.isJsonObject()) { + writeJsonObject(element.getAsJsonObject(), ctx, root); + } else if (element.isJsonArray()) { + handleJsonArray("", element.getAsJsonArray(), ctx, root); + } } protected static void writeJsonObject(JsonObject obj, SvcLogicContext ctx, String root) { for (Entry entry : obj.entrySet()) { + String key = entry.getKey(); if (entry.getValue().isJsonObject()) { - writeJsonObject(entry.getValue().getAsJsonObject(), ctx, root + entry.getKey() + "."); + writeJsonObject(entry.getValue().getAsJsonObject(), ctx, root + key + "."); } else if (entry.getValue().isJsonArray()) { JsonArray array = entry.getValue().getAsJsonArray(); - ctx.setAttribute(root + entry.getKey() + LENGTH, String.valueOf(array.size())); - Integer arrayIdx = 0; - for (JsonElement element : array) { - if (element.isJsonObject()) { - writeJsonObject(element.getAsJsonObject(), ctx, root + entry.getKey() + "[" + arrayIdx + "]."); - } else if (element.isJsonPrimitive()) { - ctx.setAttribute(root + entry.getKey() + "[" + arrayIdx + "]", element.getAsString()); - } - arrayIdx++; - } + handleJsonArray(key, array, ctx, root); } else { //Handles when a JSON obj is nested within a JSON obj if(!root.endsWith(".")){ root = root + "."; } - ctx.setAttribute(root + entry.getKey(), entry.getValue().getAsString()); + ctx.setAttribute(root + key, entry.getValue().getAsString()); + } + } + } + + protected static void handleJsonArray(String key, JsonArray array, SvcLogicContext ctx, String root) { + ctx.setAttribute(root + key + LENGTH, String.valueOf(array.size())); + Integer arrayIdx = 0; + for (JsonElement element : array) { + String prefix = root + key + "[" + arrayIdx + "]"; + + if (element.isJsonArray()) { + handleJsonArray(key, element.getAsJsonArray(), ctx, prefix); + } else if (element.isJsonObject()) { + writeJsonObject(element.getAsJsonObject(), ctx, prefix + "."); + } else if (element.isJsonPrimitive()) { + ctx.setAttribute(prefix, element.getAsString()); } + arrayIdx++; } } diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java index 269c3766c..d343ce25f 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java @@ -24,6 +24,7 @@ package org.onap.ccsdk.sli.core.slipluginutils; import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Map; import org.apache.commons.lang3.StringEscapeUtils; @@ -427,6 +428,20 @@ public class SliStringUtils implements SvcLogicJavaPlugin { } } + public static void urlDecode(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + SliPluginUtils.checkParameters(parameters, new String[] {INPUT_PARAM_SOURCE, "outputPath"}, LOG); + String encoding = parameters.get("encoding"); + if (encoding == null) { + encoding = "UTF-8"; + } + try { + String result = URLDecoder.decode(parameters.get(INPUT_PARAM_SOURCE), encoding); + ctx.setAttribute(parameters.get("outputPath"), result); + } catch (UnsupportedEncodingException e) { + throw new SvcLogicException("Url decode failed.", e); + } + } + /** * xmlEscapeText() will be used to format input xml with text. * diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/CheckParametersTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/CheckParametersTest.java deleted file mode 100644 index 21aa4a356..000000000 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/CheckParametersTest.java +++ /dev/null @@ -1,216 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP : CCSDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. - * ================================================================================ - * Modifications Copyright (C) 2018 IBM. - * ================================================================================ - * 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.ccsdk.sli.core.slipluginutils; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Test; -import org.onap.ccsdk.sli.core.sli.SvcLogicContext; -import org.onap.ccsdk.sli.core.sli.SvcLogicException; -import org.onap.ccsdk.sli.core.slipluginutils.SliPluginUtils.LogLevel; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.Marker; - -import com.google.gson.JsonObject; - -public class CheckParametersTest { - - @Test - public void nullRequiredParameters() throws Exception { - Map parametersMap = new HashMap(); - String[] requiredParams = null; - Logger Log = LoggerFactory.getLogger(SliPluginUtils.class); - SliPluginUtils.checkParameters(parametersMap, requiredParams, Log); - } - - @Test(expected = SvcLogicException.class) - public void emptyParametersMap() throws Exception { - Map parametersMap = new HashMap(); - String[] requiredParams = new String[] { "param1", "param2", "param3" }; - Logger Log = LoggerFactory.getLogger(SliPluginUtils.class); - SliPluginUtils.checkParameters(parametersMap, requiredParams, Log); - } - - @Test(expected = SvcLogicException.class) - public void paramNotFound() throws Exception { - Map parametersMap = new HashMap(); - parametersMap.put("tst", "me"); - String[] requiredParams = new String[] { "param1", "parm2", "param3" }; - Logger Log = LoggerFactory.getLogger(SliPluginUtils.class); - SliPluginUtils.checkParameters(parametersMap, requiredParams, Log); - } - - @Test - public void testSunnyRequiredParameters() throws Exception { - SvcLogicContext ctx = new SvcLogicContext(); - ctx.setAttribute("param1", "hello"); - ctx.setAttribute("param2", "world"); - ctx.setAttribute("param3", "!"); - - Map parameters = new HashMap(); - parameters.put("param1", "dog"); - parameters.put("param2", "cat"); - parameters.put("param3", "fish"); - - SliPluginUtils.requiredParameters(parameters, ctx); - } - - @Test - public void testSunnyRequiredParametersWithPrefix() throws Exception { - String prefixValue = "my.unique.path."; - SvcLogicContext ctx = new SvcLogicContext(); - ctx.setAttribute(prefixValue + "param1", "hello"); - ctx.setAttribute(prefixValue + "param2", "world"); - ctx.setAttribute(prefixValue + "param3", "!"); - - Map parameters = new HashMap(); - parameters.put("prefix", prefixValue); - parameters.put("param1", "dog"); - parameters.put("param2", "cat"); - parameters.put("param3", "fish"); - - SliPluginUtils.requiredParameters(parameters, ctx); - } - - @Test(expected = SvcLogicException.class) - public void testRainyMissingRequiredParameters() throws Exception { - SvcLogicContext ctx = new SvcLogicContext(); - ctx.setAttribute("param1", "hello"); - ctx.setAttribute("param3", "!"); - - Map parameters = new HashMap(); - parameters.put("param1", null); - parameters.put("param2", null); - parameters.put("param3", null); - - SliPluginUtils.requiredParameters(parameters, ctx); - } - - @Test(expected = SvcLogicException.class) - public void testEmptyRequiredParameters() throws Exception { - SvcLogicContext ctx = new SvcLogicContext(); - ctx.setAttribute("param1", "hello"); - ctx.setAttribute("param3", "!"); - - Map parameters = new HashMap(); - - SliPluginUtils.requiredParameters(parameters, ctx); - } - - @Test(expected = SvcLogicException.class) - public void testJsonStringToCtx() throws Exception { - SvcLogicContext ctx = new SvcLogicContext(); - Map parameters = new HashMap(); - parameters.put("outputPath", "testPath"); - parameters.put("isEscaped", "true"); - parameters.put("source", "//{/name1/:value1/}//"); - SliPluginUtils.jsonStringToCtx(parameters, ctx); - } - - @Test - public void testGetAttributeValue() throws Exception { - SvcLogicContext ctx = new SvcLogicContext(); - Map parameters = new HashMap(); - parameters.put("outputPath", "testPath"); - parameters.put("source", "testSource"); - SliPluginUtils.getAttributeValue(parameters, ctx); - assertNull(ctx.getAttribute(parameters.get("outputPath"))); - } - - @Test - public void testCtxListContains() throws Exception { - SvcLogicContext ctx = new SvcLogicContext(); - Map parameters = new HashMap(); - parameters.put("list", "10_length"); - parameters.put("keyName", "testName"); - parameters.put("keyValue", "testValue"); - ctx.setAttribute("10_length", "10"); - assertEquals("false", SliPluginUtils.ctxListContains(parameters, ctx)); - - } - - @Test(expected= SvcLogicException.class) - public void testPrintContextForNullParameters() throws SvcLogicException - { - SvcLogicContext ctx = new SvcLogicContext(); - Map parameters = new HashMap(); - SliPluginUtils.printContext(parameters, ctx); - } - - @Test - public void testPrintContext() throws SvcLogicException - { - SvcLogicContext ctx = new SvcLogicContext(); - Map parameters = new HashMap(); - parameters.put("filename","testFileName"); - SliPluginUtils.printContext(parameters, ctx); - } - - @Test - public void testWriteJsonObject() throws SvcLogicException - { - JsonObject obj=new JsonObject(); - obj.addProperty("name","testName"); - obj.addProperty("age",27); - obj.addProperty("salary",600000); - SvcLogicContext ctx = new SvcLogicContext(); - SliPluginUtils.writeJsonObject(obj, ctx,"root"); - assertEquals("testName", ctx.getAttribute("root.name")); - assertEquals("27", ctx.getAttribute("root.age")); - assertEquals("600000", ctx.getAttribute("root.salary")); - } - - @Test - public void testCtxKeyEmpty() - { - SvcLogicContext ctx = new SvcLogicContext(); - ctx.setAttribute("key", ""); - assertTrue(SliPluginUtils.ctxKeyEmpty(ctx, "key")); - } - - @Test - public void testGetArrayLength() - { - SvcLogicContext ctx = new SvcLogicContext(); - ctx.setAttribute("key_length", "test"); - Logger log = LoggerFactory.getLogger(getClass()); - SliPluginUtils.getArrayLength(ctx, "key", log , LogLevel.INFO, "invalid input"); - } - - @Test - public void testSetPropertiesForRoot() - { - SvcLogicContext ctx = new SvcLogicContext(); - Map parameters= new HashMap<>(); - parameters.put("root","RootVal"); - parameters.put("valueRoot", "ValueRootVal"); - assertEquals("success",SliPluginUtils.setPropertiesForRoot(parameters,ctx)); - } -} diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java index 08adc9731..64645b363 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java @@ -24,14 +24,20 @@ package org.onap.ccsdk.sli.core.slipluginutils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.slipluginutils.SliPluginUtils.LogLevel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; public class SliPluginUtils_StaticFunctionsTest { private static final Logger LOG = LoggerFactory.getLogger(SliPluginUtils_StaticFunctionsTest.class); @@ -216,28 +222,6 @@ public class SliPluginUtils_StaticFunctionsTest { SliPluginUtils.ctxSetAttribute(ctx, "test", i, LOG, SliPluginUtils.LogLevel.TRACE); } - /*@Test - public void printContext() throws SvcLogicException, IOException { - String filePath = "/src/test/resources/printContext.txt"; - parameters.put("filename", filePath); - File f = new File(filePath); - assert (f.exists()); - assert (!f.isDirectory()); - ctx.setAttribute("hello", "world"); - ctx.setAttribute("name", "value"); - - SliPluginUtils.printContext(parameters, ctx); - BufferedReader br = new BufferedReader(new FileReader(f)); - String line = br.readLine(); - assertEquals("#######################################", line); - line = br.readLine(); - assertEquals("hello = world", line); - line = br.readLine(); - assertEquals("name = value", line); - br.close(); - Files.delete(Paths.get(filePath)); - }*/ - @Test public void setTime() throws SvcLogicException { String outputPath = "output"; @@ -264,4 +248,318 @@ public class SliPluginUtils_StaticFunctionsTest { assertEquals(SliStringUtils.TRUE_CONSTANT, result); } + @Test + public void testGetAttributeValue() throws Exception { + parameters.put("outputPath", "testPath"); + parameters.put("source", "testSource"); + SliPluginUtils.getAttributeValue(parameters, ctx); + assertNull(ctx.getAttribute(parameters.get("outputPath"))); + } + + @Test + public void testCtxListContains() throws Exception { + parameters.put("list", "10_length"); + parameters.put("keyName", "testName"); + parameters.put("keyValue", "testValue"); + ctx.setAttribute("10_length", "10"); + assertEquals("false", SliPluginUtils.ctxListContains(parameters, ctx)); + + } + + @Test(expected = SvcLogicException.class) + public void testPrintContextForEmptyParameters() throws SvcLogicException { + SliPluginUtils.printContext(parameters, ctx); + } + + @Test(expected = SvcLogicException.class) + public void testPrintContextForNullParameters() throws SvcLogicException { + SliPluginUtils.printContext(null, ctx); + } + + @Test + public void testPrintContext() throws SvcLogicException { + parameters.put("filename", "testFileName"); + SliPluginUtils.printContext(parameters, ctx); + } + + @Test + public void testWriteJsonObject() throws SvcLogicException { + JsonObject obj = new JsonObject(); + obj.addProperty("name", "testName"); + obj.addProperty("age", 27); + obj.addProperty("salary", 600000); + SvcLogicContext ctx = new SvcLogicContext(); + SliPluginUtils.writeJsonObject(obj, ctx, "root"); + assertEquals("testName", ctx.getAttribute("root.name")); + assertEquals("27", ctx.getAttribute("root.age")); + assertEquals("600000", ctx.getAttribute("root.salary")); + } + + @Test + public void testCtxKeyEmpty() { + ctx.setAttribute("key", ""); + assertTrue(SliPluginUtils.ctxKeyEmpty(ctx, "key")); + } + + @Test + public void testGetArrayLength() { + ctx.setAttribute("key_length", "test"); + Logger log = LoggerFactory.getLogger(getClass()); + SliPluginUtils.getArrayLength(ctx, "key", log, LogLevel.INFO, "invalid input"); + } + + @Test + public void testSetPropertiesForRoot() { + Map parameters = new HashMap<>(); + parameters.put("root", "RootVal"); + parameters.put("valueRoot", "ValueRootVal"); + assertEquals("success", SliPluginUtils.setPropertiesForRoot(parameters, ctx)); + } + + @Test + public void testJsonStringToCtxToplevelArray() throws Exception { + String path = "src/test/resources/ArrayMenu.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("input", content); + Map parameters = new HashMap(); + parameters.put("outputPath", "testPath"); + parameters.put("isEscaped", "false"); + parameters.put("source", "input"); + + SliPluginUtils.jsonStringToCtx(parameters, ctx); + + assertEquals("1000", ctx.getAttribute("testPath.[0].calories")); + assertEquals("1", ctx.getAttribute("testPath.[0].id")); + assertEquals("plain", ctx.getAttribute("testPath.[0].name")); + assertEquals("pizza", ctx.getAttribute("testPath.[0].type")); + assertEquals("true", ctx.getAttribute("testPath.[0].vegetarian")); + assertEquals("2000", ctx.getAttribute("testPath.[1].calories")); + assertEquals("2", ctx.getAttribute("testPath.[1].id")); + assertEquals("Tuesday Special", ctx.getAttribute("testPath.[1].name")); + assertEquals("1", ctx.getAttribute("testPath.[1].topping[0].id")); + assertEquals("onion", ctx.getAttribute("testPath.[1].topping[0].name")); + assertEquals("2", ctx.getAttribute("testPath.[1].topping[1].id")); + assertEquals("pepperoni", ctx.getAttribute("testPath.[1].topping[1].name")); + assertEquals("2", ctx.getAttribute("testPath.[1].topping_length")); + assertEquals("pizza", ctx.getAttribute("testPath.[1].type")); + assertEquals("false", ctx.getAttribute("testPath.[1].vegetarian")); + assertEquals("1500", ctx.getAttribute("testPath.[2].calories")); + assertEquals("3", ctx.getAttribute("testPath.[2].id")); + assertEquals("House Special", ctx.getAttribute("testPath.[2].name")); + assertEquals("3", ctx.getAttribute("testPath.[2].topping[0].id")); + assertEquals("basil", ctx.getAttribute("testPath.[2].topping[0].name")); + assertEquals("4", ctx.getAttribute("testPath.[2].topping[1].id")); + assertEquals("fresh mozzarella", ctx.getAttribute("testPath.[2].topping[1].name")); + assertEquals("5", ctx.getAttribute("testPath.[2].topping[2].id")); + assertEquals("tomato", ctx.getAttribute("testPath.[2].topping[2].name")); + assertEquals("3", ctx.getAttribute("testPath.[2].topping_length")); + assertEquals("pizza", ctx.getAttribute("testPath.[2].type")); + assertEquals("true", ctx.getAttribute("testPath.[2].vegetarian")); + assertEquals("3", ctx.getAttribute("testPath._length")); + } + + @Test + public void testJsonStringToCtx() throws Exception { + String path = "src/test/resources/ObjectMenu.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("input", content); + + Map parameters = new HashMap(); + parameters.put("outputPath", "testPath"); + parameters.put("isEscaped", "false"); + parameters.put("source", "input"); + + SliPluginUtils.jsonStringToCtx(parameters, ctx); + + + assertEquals("1000", ctx.getAttribute("testPath.menu[0].calories")); + assertEquals("1", ctx.getAttribute("testPath.menu[0].id")); + assertEquals("plain", ctx.getAttribute("testPath.menu[0].name")); + assertEquals("pizza", ctx.getAttribute("testPath.menu[0].type")); + assertEquals("true", ctx.getAttribute("testPath.menu[0].vegetarian")); + assertEquals("2000", ctx.getAttribute("testPath.menu[1].calories")); + assertEquals("2", ctx.getAttribute("testPath.menu[1].id")); + assertEquals("Tuesday Special", ctx.getAttribute("testPath.menu[1].name")); + assertEquals("1", ctx.getAttribute("testPath.menu[1].topping[0].id")); + assertEquals("onion", ctx.getAttribute("testPath.menu[1].topping[0].name")); + assertEquals("2", ctx.getAttribute("testPath.menu[1].topping[1].id")); + assertEquals("pepperoni", ctx.getAttribute("testPath.menu[1].topping[1].name")); + assertEquals("2", ctx.getAttribute("testPath.menu[1].topping_length")); + assertEquals("pizza", ctx.getAttribute("testPath.menu[1].type")); + assertEquals("false", ctx.getAttribute("testPath.menu[1].vegetarian")); + assertEquals("1500", ctx.getAttribute("testPath.menu[2].calories")); + assertEquals("3", ctx.getAttribute("testPath.menu[2].id")); + assertEquals("House Special", ctx.getAttribute("testPath.menu[2].name")); + assertEquals("3", ctx.getAttribute("testPath.menu[2].topping[0].id")); + assertEquals("basil", ctx.getAttribute("testPath.menu[2].topping[0].name")); + assertEquals("4", ctx.getAttribute("testPath.menu[2].topping[1].id")); + assertEquals("fresh mozzarella", ctx.getAttribute("testPath.menu[2].topping[1].name")); + assertEquals("5", ctx.getAttribute("testPath.menu[2].topping[2].id")); + assertEquals("tomato", ctx.getAttribute("testPath.menu[2].topping[2].name")); + assertEquals("3", ctx.getAttribute("testPath.menu[2].topping_length")); + assertEquals("pizza", ctx.getAttribute("testPath.menu[2].type")); + assertEquals("true", ctx.getAttribute("testPath.menu[2].vegetarian")); + assertEquals("3", ctx.getAttribute("testPath.menu_length")); + } + + @Test + public void test2dJsonStringToCtx() throws Exception { + String path = "src/test/resources/2dArray.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("input", content); + + Map parameters = new HashMap(); + parameters.put("outputPath", "testPath"); + parameters.put("isEscaped", "false"); + parameters.put("source", "input"); + + SliPluginUtils.jsonStringToCtx(parameters, ctx); + assertEquals("apple", ctx.getAttribute("testPath.[0][0]")); + assertEquals("orange", ctx.getAttribute("testPath.[0][1]")); + assertEquals("banana", ctx.getAttribute("testPath.[0][2]")); + assertEquals("3", ctx.getAttribute("testPath.[0]_length")); + assertEquals("squash", ctx.getAttribute("testPath.[1][0]")); + assertEquals("broccoli", ctx.getAttribute("testPath.[1][1]")); + assertEquals("cauliflower", ctx.getAttribute("testPath.[1][2]")); + assertEquals("3", ctx.getAttribute("testPath.[1]_length")); + assertEquals("2", ctx.getAttribute("testPath._length")); + } + + @Test + public void test3dJsonStringToCtx() throws Exception { + String path = "src/test/resources/3dArray.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("input", content); + + Map parameters = new HashMap(); + parameters.put("outputPath", "testPath"); + parameters.put("isEscaped", "false"); + parameters.put("source", "input"); + + SliPluginUtils.jsonStringToCtx(parameters, ctx); + assertEquals("a", ctx.getAttribute("testPath.[0][0][0]")); + assertEquals("b", ctx.getAttribute("testPath.[0][0][1]")); + assertEquals("c", ctx.getAttribute("testPath.[0][0][2]")); + assertEquals("3", ctx.getAttribute("testPath.[0][0]_length")); + assertEquals("d", ctx.getAttribute("testPath.[0][1][0]")); + assertEquals("e", ctx.getAttribute("testPath.[0][1][1]")); + assertEquals("f", ctx.getAttribute("testPath.[0][1][2]")); + assertEquals("3", ctx.getAttribute("testPath.[0][1]_length")); + assertEquals("2", ctx.getAttribute("testPath.[0]_length")); + assertEquals("x", ctx.getAttribute("testPath.[1][0][0]")); + assertEquals("y", ctx.getAttribute("testPath.[1][0][1]")); + assertEquals("z", ctx.getAttribute("testPath.[1][0][2]")); + assertEquals("3", ctx.getAttribute("testPath.[1][0]_length")); + assertEquals("1", ctx.getAttribute("testPath.[1]_length")); + assertEquals("2", ctx.getAttribute("testPath._length")); + } + + @Test + public void testJsonWidgetStringToCtx() throws Exception { + String path = "src/test/resources/Widget.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("input", content); + + Map parameters = new HashMap(); + parameters.put("outputPath", "testPath"); + parameters.put("isEscaped", "false"); + parameters.put("source", "input"); + + SliPluginUtils.jsonStringToCtx(parameters, ctx); + assertEquals("false", ctx.getAttribute("testPath.widget.debug")); + assertEquals("center", ctx.getAttribute("testPath.widget.image.alignment")); + assertEquals("150", ctx.getAttribute("testPath.widget.image.hOffset")); + assertEquals("moon", ctx.getAttribute("testPath.widget.image.name")); + assertEquals("images/moon.png", ctx.getAttribute("testPath.widget.image.src")); + assertEquals("150", ctx.getAttribute("testPath.widget.image.vOffset")); + assertEquals("center", ctx.getAttribute("testPath.widget.text.alignment")); + assertEquals("Click Me", ctx.getAttribute("testPath.widget.text.data")); + assertEquals("350", ctx.getAttribute("testPath.widget.text.hOffset")); + assertEquals("text1", ctx.getAttribute("testPath.widget.text.name")); + assertEquals("21", ctx.getAttribute("testPath.widget.text.size")); + assertEquals("bold", ctx.getAttribute("testPath.widget.text.style")); + assertEquals("200", ctx.getAttribute("testPath.widget.text.vOffset")); + assertEquals("300", ctx.getAttribute("testPath.widget.window.height")); + assertEquals("main_window", ctx.getAttribute("testPath.widget.window.name")); + assertEquals("ONAP Widget", ctx.getAttribute("testPath.widget.window.title")); + assertEquals("200", ctx.getAttribute("testPath.widget.window.width")); + } + + @Test + public void testEmbeddedEscapedJsonJsonStringToCtx() throws Exception { + String path = "src/test/resources/EmbeddedEscapedJson.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("input", content); + + Map parameters = new HashMap(); + parameters.put("outputPath", "testPath"); + parameters.put("isEscaped", "false"); + parameters.put("source", "input"); + + SliPluginUtils.jsonStringToCtx(parameters, ctx); + + assertEquals("escapedJsonObject", ctx.getAttribute("testPath.input.parameters[0].name")); + assertEquals("[{\"id\":\"0.2.0.0/16\"},{\"id\":\"ge04::/64\"}]", + ctx.getAttribute("testPath.input.parameters[0].value")); + assertEquals("Hello/World", ctx.getAttribute("testPath.input.parameters[1].value")); + assertEquals("resourceName", ctx.getAttribute("testPath.input.parameters[2].name")); + assertEquals("The\t\"Best\"\tName", ctx.getAttribute("testPath.input.parameters[2].value")); + assertEquals("3", ctx.getAttribute("testPath.input.parameters_length")); + + + // Break the embedded json object into properties + parameters.put("outputPath", "testPath.input.parameters[0].value"); + parameters.put("source", "testPath.input.parameters[0].value"); + SliPluginUtils.jsonStringToCtx(parameters, ctx); + + assertEquals("0.2.0.0/16", ctx.getAttribute("testPath.input.parameters[0].value.[0].id")); + assertEquals("ge04::/64", ctx.getAttribute("testPath.input.parameters[0].value.[1].id")); + assertEquals("2", ctx.getAttribute("testPath.input.parameters[0].value._length")); + } + + @Test + public void testEscapedJsonStringToCtx() throws Exception { + String path = "src/test/resources/EscapedJson.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("input", content); + + Map parameters = new HashMap(); + parameters.put("outputPath", "testPath"); + parameters.put("isEscaped", "true"); // set to true because the entire json content has been escaped + parameters.put("source", "input"); + + + SliPluginUtils.jsonStringToCtx(parameters, ctx); + assertEquals("false", ctx.getAttribute("testPath.widget.debug")); + assertEquals("center", ctx.getAttribute("testPath.widget.image.alignment")); + assertEquals("150", ctx.getAttribute("testPath.widget.image.hOffset")); + assertEquals("moon", ctx.getAttribute("testPath.widget.image.name")); + assertEquals("images/moon.png", ctx.getAttribute("testPath.widget.image.src")); + assertEquals("150", ctx.getAttribute("testPath.widget.image.vOffset")); + assertEquals("center", ctx.getAttribute("testPath.widget.text.alignment")); + assertEquals("Click Me", ctx.getAttribute("testPath.widget.text.data")); + assertEquals("350", ctx.getAttribute("testPath.widget.text.hOffset")); + assertEquals("text1", ctx.getAttribute("testPath.widget.text.name")); + assertEquals("21", ctx.getAttribute("testPath.widget.text.size")); + assertEquals("bold", ctx.getAttribute("testPath.widget.text.style")); + assertEquals("200", ctx.getAttribute("testPath.widget.text.vOffset")); + assertEquals("300", ctx.getAttribute("testPath.widget.window.height")); + assertEquals("main_window", ctx.getAttribute("testPath.widget.window.name")); + assertEquals("ONAP Widget", ctx.getAttribute("testPath.widget.window.title")); + assertEquals("200", ctx.getAttribute("testPath.widget.window.width")); + } + } diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_checkParametersTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_checkParametersTest.java new file mode 100644 index 000000000..f92271f7c --- /dev/null +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_checkParametersTest.java @@ -0,0 +1,117 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : CCSDK + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Modifications Copyright (C) 2018 IBM. + * ================================================================================ + * 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.ccsdk.sli.core.slipluginutils; + +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SliPluginUtils_checkParametersTest { + + @Test + public void nullRequiredParameters() throws Exception { + Map parametersMap = new HashMap(); + String[] requiredParams = null; + Logger Log = LoggerFactory.getLogger(SliPluginUtils.class); + SliPluginUtils.checkParameters(parametersMap, requiredParams, Log); + } + + @Test(expected = SvcLogicException.class) + public void emptyParametersMap() throws Exception { + Map parametersMap = new HashMap(); + String[] requiredParams = new String[] { "param1", "param2", "param3" }; + Logger Log = LoggerFactory.getLogger(SliPluginUtils.class); + SliPluginUtils.checkParameters(parametersMap, requiredParams, Log); + } + + @Test(expected = SvcLogicException.class) + public void paramNotFound() throws Exception { + Map parametersMap = new HashMap(); + parametersMap.put("tst", "me"); + String[] requiredParams = new String[] { "param1", "parm2", "param3" }; + Logger Log = LoggerFactory.getLogger(SliPluginUtils.class); + SliPluginUtils.checkParameters(parametersMap, requiredParams, Log); + } + + @Test + public void testSunnyRequiredParameters() throws Exception { + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("param1", "hello"); + ctx.setAttribute("param2", "world"); + ctx.setAttribute("param3", "!"); + + Map parameters = new HashMap(); + parameters.put("param1", "dog"); + parameters.put("param2", "cat"); + parameters.put("param3", "fish"); + + SliPluginUtils.requiredParameters(parameters, ctx); + } + + @Test + public void testSunnyRequiredParametersWithPrefix() throws Exception { + String prefixValue = "my.unique.path."; + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute(prefixValue + "param1", "hello"); + ctx.setAttribute(prefixValue + "param2", "world"); + ctx.setAttribute(prefixValue + "param3", "!"); + + Map parameters = new HashMap(); + parameters.put("prefix", prefixValue); + parameters.put("param1", "dog"); + parameters.put("param2", "cat"); + parameters.put("param3", "fish"); + + SliPluginUtils.requiredParameters(parameters, ctx); + } + + @Test(expected = SvcLogicException.class) + public void testRainyMissingRequiredParameters() throws Exception { + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("param1", "hello"); + ctx.setAttribute("param3", "!"); + + Map parameters = new HashMap(); + parameters.put("param1", null); + parameters.put("param2", null); + parameters.put("param3", null); + + SliPluginUtils.requiredParameters(parameters, ctx); + } + + @Test(expected = SvcLogicException.class) + public void testEmptyRequiredParameters() throws Exception { + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("param1", "hello"); + ctx.setAttribute("param3", "!"); + + Map parameters = new HashMap(); + + SliPluginUtils.requiredParameters(parameters, ctx); + } +} diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java index d8d78a0b1..3a6c31a3c 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java @@ -271,6 +271,17 @@ public class SliStringUtilsTest { assertEquals("102%2FGE100%2FSNJSCAMCJP8%2FSNJSCAMCJT4", ctx.getAttribute(outputPath)); } + @Test + public void urlDecode() throws SvcLogicException { + String sourceString = "102%2FGE100%2FSNJSCAMCJP8%2FSNJSCAMCJT4"; + String outputPath = "out"; + + param.put("source", sourceString); + param.put("outputPath", outputPath); + SliStringUtils.urlDecode(param, ctx); + assertEquals("102/GE100/SNJSCAMCJP8/SNJSCAMCJT4", ctx.getAttribute(outputPath)); + } + @Test public void testXmlEscapeText() { param.put("source", "102/GE100/SNJSCAMCJP8/SNJSCAMCJT4"); @@ -317,8 +328,6 @@ public class SliStringUtilsTest { @Test public void isEmpty() throws Exception { - ctx = new SvcLogicContext(); - param = new HashMap<>(); String result = SliStringUtils.isEmpty(param, ctx); param.put(SliStringUtils.INPUT_PARAM_KEY, "key_does_not_exist"); assertEquals(SliStringUtils.TRUE_CONSTANT, result); @@ -339,8 +348,6 @@ public class SliStringUtilsTest { @Test public void isBlank() throws Exception { - ctx = new SvcLogicContext(); - param = new HashMap<>(); String result = SliStringUtils.isBlank(param, ctx); param.put(SliStringUtils.INPUT_PARAM_KEY, "key_does_not_exist"); assertEquals(SliStringUtils.TRUE_CONSTANT, result); @@ -361,8 +368,6 @@ public class SliStringUtilsTest { @Test public void isNull() throws Exception { - ctx = new SvcLogicContext(); - param = new HashMap<>(); String result = SliStringUtils.isNull(param, ctx); param.put(SliStringUtils.INPUT_PARAM_KEY, "key_does_not_exist"); assertEquals(SliStringUtils.TRUE_CONSTANT, result); diff --git a/sliPluginUtils/provider/src/test/resources/2dArray.json b/sliPluginUtils/provider/src/test/resources/2dArray.json new file mode 100644 index 000000000..b473864d8 --- /dev/null +++ b/sliPluginUtils/provider/src/test/resources/2dArray.json @@ -0,0 +1,4 @@ +[ + ["apple", "orange", "banana"], + ["squash", "broccoli", "cauliflower"] +] \ No newline at end of file diff --git a/sliPluginUtils/provider/src/test/resources/3dArray.json b/sliPluginUtils/provider/src/test/resources/3dArray.json new file mode 100644 index 000000000..149955596 --- /dev/null +++ b/sliPluginUtils/provider/src/test/resources/3dArray.json @@ -0,0 +1,4 @@ +[ + [["a","b","c"], ["d","e","f"]], + [["x","y","z"]] +] \ No newline at end of file diff --git a/sliPluginUtils/provider/src/test/resources/ArrayMenu.json b/sliPluginUtils/provider/src/test/resources/ArrayMenu.json new file mode 100644 index 000000000..b12f16315 --- /dev/null +++ b/sliPluginUtils/provider/src/test/resources/ArrayMenu.json @@ -0,0 +1,41 @@ +[{ + "id": "1", + "type": "pizza", + "name": "plain", + "calories": 1000, + "vegetarian": true + }, { + "id": "2", + "type": "pizza", + "name": "Tuesday Special", + "calories": 2000, + "vegetarian": false, + "topping": + [{ + "id": "1", + "name": "onion" + }, { + "id": "2", + "name": "pepperoni" + } + ] + }, { + "id": "3", + "type": "pizza", + "name": "House Special", + "calories": 1500, + "vegetarian": true, + "topping": + [{ + "id": "3", + "name": "basil" + }, { + "id": "4", + "name": "fresh mozzarella" + }, { + "id": "5", + "name": "tomato" + } + ] + } +] diff --git a/sliPluginUtils/provider/src/test/resources/EmbeddedEscapedJson.json b/sliPluginUtils/provider/src/test/resources/EmbeddedEscapedJson.json new file mode 100644 index 000000000..dbb6d8d3a --- /dev/null +++ b/sliPluginUtils/provider/src/test/resources/EmbeddedEscapedJson.json @@ -0,0 +1,16 @@ +{ + "input": { + "parameters": + [{ + "name": "escapedJsonObject", + "value": "[{\"id\":\"0.2.0.0\/16\"},{\"id\":\"ge04::\/64\"}]" + }, { + "name": "password", + "value": "Hello\/World" + }, { + "name": "resourceName", + "value": "The\t\"Best\"\tName" + } + ] + } +} \ No newline at end of file diff --git a/sliPluginUtils/provider/src/test/resources/EscapedJson.json b/sliPluginUtils/provider/src/test/resources/EscapedJson.json new file mode 100644 index 000000000..a7719e819 --- /dev/null +++ b/sliPluginUtils/provider/src/test/resources/EscapedJson.json @@ -0,0 +1 @@ +{\"widget\":{\"debug\":false,\"window\":{\"title\":\"ONAP Widget\",\"name\":\"main_window\",\"width\":200,\"height\":300},\"image\":{\"src\":\"images\/moon.png\",\"name\":\"moon\",\"hOffset\":150,\"vOffset\":150,\"alignment\":\"center\"},\"text\":{\"data\":\"Click Me\",\"size\":21,\"style\":\"bold\",\"name\":\"text1\",\"hOffset\":350,\"vOffset\":200,\"alignment\":\"center\"}}} \ No newline at end of file diff --git a/sliPluginUtils/provider/src/test/resources/ObjectMenu.json b/sliPluginUtils/provider/src/test/resources/ObjectMenu.json new file mode 100644 index 000000000..56f842d48 --- /dev/null +++ b/sliPluginUtils/provider/src/test/resources/ObjectMenu.json @@ -0,0 +1,43 @@ +{ + "menu": [{ + "id": "1", + "type": "pizza", + "name": "plain", + "calories": 1000, + "vegetarian": true + }, { + "id": "2", + "type": "pizza", + "name": "Tuesday Special", + "calories": 2000, + "vegetarian": false, + "topping": + [{ + "id": "1", + "name": "onion" + }, { + "id": "2", + "name": "pepperoni" + } + ] + }, { + "id": "3", + "type": "pizza", + "name": "House Special", + "calories": 1500, + "vegetarian": true, + "topping": + [{ + "id": "3", + "name": "basil" + }, { + "id": "4", + "name": "fresh mozzarella" + }, { + "id": "5", + "name": "tomato" + } + ] + } + ] +} diff --git a/sliPluginUtils/provider/src/test/resources/Widget.json b/sliPluginUtils/provider/src/test/resources/Widget.json new file mode 100644 index 000000000..1e25282c2 --- /dev/null +++ b/sliPluginUtils/provider/src/test/resources/Widget.json @@ -0,0 +1,27 @@ +{ + "widget": { + "debug": false, + "window": { + "title": "ONAP Widget", + "name": "main_window", + "width": 200, + "height": 300 + }, + "image": { + "src": "images/moon.png", + "name": "moon", + "hOffset": 150, + "vOffset": 150, + "alignment": "center" + }, + "text": { + "data": "Click Me", + "size": 21, + "style": "bold", + "name": "text1", + "hOffset": 350, + "vOffset": 200, + "alignment": "center" + } + } +} \ No newline at end of file -- cgit 1.2.3-korg From 48c0cd8b7726436d876cbc86c91e92b80583531b Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Fri, 31 Jan 2020 17:52:01 +0000 Subject: minor sli provider base changes add more unit testing, use constants for success/failure and improve some logging calls Issue-ID: CCSDK-2064 Signed-off-by: Smokowski, Kevin (ks6305) Change-Id: I2c7039c706de1172bd506a20e96eb987cc86f211 --- .../onap/ccsdk/sli/core/sli/SvcLogicConstants.java | 7 +++ .../onap/ccsdk/sli/core/sli/SvcLogicContext.java | 15 +++++- .../ccsdk/sli/core/sli/SvcLogicContextTest.java | 27 ++++++++-- .../core/sli/provider/base/BlockNodeExecutor.java | 5 +- .../sli/provider/base/ConfigureNodeExecutor.java | 21 ++++---- .../core/sli/provider/base/DeleteNodeExecutor.java | 5 +- .../sli/provider/base/ExecuteNodeExecutor.java | 17 +++--- .../core/sli/provider/base/ExistsNodeExecutor.java | 5 +- .../core/sli/provider/base/ForNodeExecutor.java | 5 +- .../sli/provider/base/GetResourceNodeExecutor.java | 9 ++-- .../sli/provider/base/IsAvailableNodeExecutor.java | 5 +- .../core/sli/provider/base/NotifyNodeExecutor.java | 9 ++-- .../core/sli/provider/base/RecordNodeExecutor.java | 5 +- .../sli/provider/base/ReleaseNodeExecutor.java | 9 ++-- .../sli/provider/base/ReserveNodeExecutor.java | 9 ++-- .../core/sli/provider/base/SaveNodeExecutor.java | 5 +- .../core/sli/provider/base/UpdateNodeExecutor.java | 9 ++-- .../core/sli/provider/base/WhileNodeExecutor.java | 2 +- .../sli/core/sli/provider/base/GraphTests.java | 61 ++++++++++++++++++++++ .../sli/core/sli/provider/base/PluginTest.java | 6 +-- .../src/test/resources/breakGraph.xml | 26 +++++++++ .../sli/core/slipluginutils/SliPluginUtils.java | 17 +++--- .../SliPluginUtils_StaticFunctionsTest.java | 3 +- .../slipluginutils/SliPluginUtils_ctxSortList.java | 5 +- .../ccsdk/sli/core/utils/JREFileResolverTest.java | 3 +- .../sli/core/utils/KarafRootFileResolverTest.java | 3 +- .../utils/common/BundleContexFileResolverTest.java | 6 +-- .../utils/common/CoreDefaultFileResolverTest.java | 4 +- .../common/SdncConfigEnvVarFileResolverTest.java | 4 +- .../utils/dblib/DblibDefaultFileResolverTest.java | 4 +- .../utils/dblib/DblibEnvVarFileResolverTest.java | 4 +- 31 files changed, 225 insertions(+), 90 deletions(-) create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicConstants.java create mode 100644 sli/provider-base/src/test/java/org/onap/ccsdk/sli/core/sli/provider/base/GraphTests.java create mode 100644 sli/provider-base/src/test/resources/breakGraph.xml (limited to 'sliPluginUtils/provider/src/main') diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicConstants.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicConstants.java new file mode 100644 index 000000000..61bfe7c20 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicConstants.java @@ -0,0 +1,7 @@ +package org.onap.ccsdk.sli.core.sli; + +public class SvcLogicConstants { + public final static String SUCCESS = "success"; + public final static String FAILURE = "failure"; + +} diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java index b592c15f6..549e6364f 100644 --- a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java @@ -40,7 +40,7 @@ public class SvcLogicContext { private HashMap attributes; - private String status = "success"; + private String status = SvcLogicConstants.SUCCESS; public SvcLogicContext() { @@ -91,15 +91,28 @@ public class SvcLogicContext { { return attributes.keySet(); } + public Boolean isSuccess() { + return status.equals(SvcLogicConstants.SUCCESS); + } + @Deprecated public String getStatus() { return status; } + @Deprecated public void setStatus(String status) { this.status = status; } + public void markFailed() { + this.status = SvcLogicConstants.FAILURE; + } + + public void markSuccess() { + this.status = SvcLogicConstants.SUCCESS; + } + public Properties toProperties() { Properties props = new Properties(); diff --git a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java index 3b9fff75e..bad1209b0 100644 --- a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java +++ b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java @@ -24,20 +24,17 @@ package org.onap.ccsdk.sli.core.sli; import java.io.InputStream; import java.util.Enumeration; import java.util.Properties; - import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; - import junit.framework.TestCase; public class SvcLogicContextTest extends TestCase { private static final Logger LOG = LoggerFactory .getLogger(SvcLogicContext.class); - + public void testMerge() { try { @@ -62,4 +59,26 @@ public class SvcLogicContextTest extends TestCase { } + public void testIsSuccess() { + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setStatus(SvcLogicConstants.SUCCESS); + assertTrue(ctx.isSuccess()); + ctx.setStatus(SvcLogicConstants.FAILURE); + assertFalse(ctx.isSuccess()); + } + + public void testMarkSuccess() { + SvcLogicContext ctx = new SvcLogicContext(); + ctx.markSuccess(); + assertTrue(ctx.isSuccess()); + assertEquals(SvcLogicConstants.SUCCESS, ctx.getStatus()); + } + + public void testMarkFailed() { + SvcLogicContext ctx = new SvcLogicContext(); + ctx.markFailed(); + assertFalse(ctx.isSuccess()); + assertEquals(SvcLogicConstants.FAILURE, ctx.getStatus()); + } + } diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/BlockNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/BlockNodeExecutor.java index fb1527901..7079e263b 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/BlockNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/BlockNodeExecutor.java @@ -21,6 +21,7 @@ package org.onap.ccsdk.sli.core.sli.provider.base; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; @@ -42,12 +43,12 @@ public class BlockNodeExecutor extends AbstractSvcLogicNodeExecutor { boolean isAtomic = "true".equalsIgnoreCase(atomicStr); // Initialize status to success so that at least one outcome will execute - ctx.setStatus("success"); + ctx.markSuccess(); int numOutcomes = node.getNumOutcomes(); for (int i = 0; i < numOutcomes; i++) { - if ("failure".equals(ctx.getStatus()) && isAtomic) { + if (SvcLogicConstants.FAILURE.equals(ctx.getStatus()) && isAtomic) { LOG.info("Block - stopped executing nodes due to failure status"); return(null); } diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ConfigureNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ConfigureNodeExecutor.java index 55afa8594..a0e3af189 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ConfigureNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ConfigureNodeExecutor.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.Set; import org.onap.ccsdk.sli.core.sli.SvcLogicAdaptor; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; @@ -48,7 +49,7 @@ public class ConfigureNodeExecutor extends AbstractSvcLogicNodeExecutor { String adaptorName = SvcLogicExpressionResolver.evaluate( node.getAttribute("adaptor"), node, ctx); - String outValue = "failure"; + String outValue = SvcLogicConstants.FAILURE; if (LOG.isDebugEnabled()) { LOG.debug("configure node encountered - looking for adaptor " @@ -82,7 +83,7 @@ public class ConfigureNodeExecutor extends AbstractSvcLogicNodeExecutor { switch (confStatus) { case SUCCESS: - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; if ((activate != null) && (activate.length() > 0)) { if ("true".equalsIgnoreCase(activate)) { SvcLogicAdaptor.ConfigStatus activateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; @@ -108,7 +109,7 @@ public class ConfigureNodeExecutor extends AbstractSvcLogicNodeExecutor { break; case FAILURE: default: - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else if ("false".equalsIgnoreCase(activate)) { SvcLogicAdaptor.ConfigStatus deactivateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; @@ -134,7 +135,7 @@ public class ConfigureNodeExecutor extends AbstractSvcLogicNodeExecutor { break; case FAILURE: default: - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } } @@ -150,7 +151,7 @@ public class ConfigureNodeExecutor extends AbstractSvcLogicNodeExecutor { break; case FAILURE: default: - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else { if ((activate != null) && (activate.length() > 0)) { @@ -164,7 +165,7 @@ public class ConfigureNodeExecutor extends AbstractSvcLogicNodeExecutor { } switch (activateStatus) { case SUCCESS: - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; break; case ALREADY_ACTIVE: outValue = ALREADY_ACTIVE; @@ -177,7 +178,7 @@ public class ConfigureNodeExecutor extends AbstractSvcLogicNodeExecutor { break; case FAILURE: default: - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else if ("false".equalsIgnoreCase(activate)) { SvcLogicAdaptor.ConfigStatus deactivateStatus = SvcLogicAdaptor.ConfigStatus.FAILURE; @@ -190,7 +191,7 @@ public class ConfigureNodeExecutor extends AbstractSvcLogicNodeExecutor { } switch (deactivateStatus) { case SUCCESS: - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; break; case ALREADY_ACTIVE: outValue = ALREADY_ACTIVE; @@ -203,12 +204,12 @@ public class ConfigureNodeExecutor extends AbstractSvcLogicNodeExecutor { break; case FAILURE: default: - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } } else { LOG.warn("Nothing to configure - no parameters passed, and activate attribute is not set"); - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; } } } else { diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/DeleteNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/DeleteNodeExecutor.java index 2393a159d..00f0629cb 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/DeleteNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/DeleteNodeExecutor.java @@ -21,6 +21,7 @@ package org.onap.ccsdk.sli.core.sli.provider.base; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicNode; @@ -31,7 +32,7 @@ import org.slf4j.LoggerFactory; public class DeleteNodeExecutor extends AbstractSvcLogicNodeExecutor { private static final Logger LOG = LoggerFactory.getLogger(DeleteNodeExecutor.class); - private static final String FAILURE="failure"; + private static final String FAILURE=SvcLogicConstants.FAILURE; @Override public SvcLogicNode execute(SvcLogicServiceBase svc, SvcLogicNode node, SvcLogicContext ctx) @@ -52,7 +53,7 @@ public class DeleteNodeExecutor extends AbstractSvcLogicNodeExecutor { try { switch (resourcePlugin.delete(resourceType, key, ctx)) { case SUCCESS: - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; break; case NOT_FOUND: outValue = "not-found"; diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExecuteNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExecuteNodeExecutor.java index 0fe179b7a..7f2674e51 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExecuteNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExecuteNodeExecutor.java @@ -25,11 +25,8 @@ package org.onap.ccsdk.sli.core.sli.provider.base; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Iterator; import java.util.Map; -import java.util.Set; - +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; @@ -41,7 +38,7 @@ import org.slf4j.LoggerFactory; public class ExecuteNodeExecutor extends AbstractSvcLogicNodeExecutor { private static final Logger LOG = LoggerFactory .getLogger(ExecuteNodeExecutor.class); - private static final String FAILURE="failure"; + private static final String FAILURE=SvcLogicConstants.FAILURE; private static final String pluginErrorMessage = "Could not execute plugin. SvcLogic status will be set to failure."; public SvcLogicNode execute(SvcLogicServiceBase svc, SvcLogicNode node, @@ -93,15 +90,15 @@ public class ExecuteNodeExecutor extends AbstractSvcLogicNodeExecutor { LOG.error(pluginErrorMessage, e); } outValue = FAILURE; - ctx.setStatus(FAILURE); + ctx.markFailed(); } catch (IllegalAccessException e) { LOG.error(pluginErrorMessage, e); outValue = FAILURE; - ctx.setStatus(FAILURE); + ctx.markFailed(); } catch (IllegalArgumentException e) { LOG.error(pluginErrorMessage, e); outValue = FAILURE; - ctx.setStatus(FAILURE); + ctx.markFailed(); } } @@ -119,10 +116,10 @@ public class ExecuteNodeExecutor extends AbstractSvcLogicNodeExecutor { if (nodeEmitsOutcome) { return (String) o; } else { - return "success"; + return SvcLogicConstants.SUCCESS; } } else { - return "success"; + return SvcLogicConstants.SUCCESS; } } diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExistsNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExistsNodeExecutor.java index 397c5f326..ca12e35d8 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExistsNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExistsNodeExecutor.java @@ -21,6 +21,7 @@ package org.onap.ccsdk.sli.core.sli.provider.base; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicNode; @@ -41,7 +42,7 @@ public class ExistsNodeExecutor extends AbstractSvcLogicNodeExecutor { String key = SvcLogicExpressionResolver.evaluateAsKey(node.getAttribute("key"), node, ctx); String pfx = SvcLogicExpressionResolver.evaluate(node.getAttribute("pfx"), node, ctx); - String outValue = "failure"; + String outValue = SvcLogicConstants.FAILURE; if (LOG.isDebugEnabled()) { LOG.debug("exists node encountered - looking for resource class " + plugin); @@ -64,7 +65,7 @@ public class ExistsNodeExecutor extends AbstractSvcLogicNodeExecutor { } } catch (SvcLogicException e) { LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else { LOG.warn("Could not find SvcLogicResource object for plugin " + plugin); diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ForNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ForNodeExecutor.java index 8ca1f32d5..2d9721c7f 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ForNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ForNodeExecutor.java @@ -22,6 +22,7 @@ package org.onap.ccsdk.sli.core.sli.provider.base; import org.onap.ccsdk.sli.core.sli.BreakNodeException; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; @@ -79,7 +80,7 @@ public class ForNodeExecutor extends AbstractSvcLogicNodeExecutor { for (int i = 0; i < numOutcomes; i++) { - if ("failure".equals(ctx.getStatus()) && isAtomic) { + if (SvcLogicConstants.FAILURE.equals(ctx.getStatus()) && isAtomic) { LOG.info("For - stopped executing nodes due to failure status"); return(null); } @@ -101,7 +102,7 @@ public class ForNodeExecutor extends AbstractSvcLogicNodeExecutor { } } } catch (BreakNodeException br) { - LOG.error("ForNodeExecutor caught break",br); + LOG.trace("ForNodeExecutor caught break" + br.getMessage()); } return (null); } diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/GetResourceNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/GetResourceNodeExecutor.java index a2f1c63d8..f7cfc66d2 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/GetResourceNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/GetResourceNodeExecutor.java @@ -21,6 +21,7 @@ package org.onap.ccsdk.sli.core.sli.provider.base; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; @@ -65,7 +66,7 @@ public class GetResourceNodeExecutor extends AbstractSvcLogicNodeExecutor { orderBy = SvcLogicExpressionResolver.evaluateAsKey(orderByExpr, node, ctx); } - String outValue = "failure"; + String outValue = SvcLogicConstants.FAILURE; if (LOG.isDebugEnabled()) { LOG.debug(node.getNodeType() + " node encountered - looking for resource class " + plugin); @@ -77,18 +78,18 @@ public class GetResourceNodeExecutor extends AbstractSvcLogicNodeExecutor { try { switch (resourcePlugin.query(resourceType, localOnly, select, key, pfx, orderBy, ctx)) { case SUCCESS: - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; break; case NOT_FOUND: outValue = "not-found"; break; case FAILURE: default: - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } catch (SvcLogicException e) { LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else { LOG.warn("Could not find SvcLogicResource object for plugin " + plugin); diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/IsAvailableNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/IsAvailableNodeExecutor.java index a93c0d6f2..1d6e34e85 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/IsAvailableNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/IsAvailableNodeExecutor.java @@ -21,6 +21,7 @@ package org.onap.ccsdk.sli.core.sli.provider.base; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicNode; @@ -41,7 +42,7 @@ public class IsAvailableNodeExecutor extends AbstractSvcLogicNodeExecutor { String key = SvcLogicExpressionResolver.evaluateAsKey(node.getAttribute("key"), node, ctx); String pfx = SvcLogicExpressionResolver.evaluate(node.getAttribute("pfx"), node, ctx); - String outValue = "failure"; + String outValue = SvcLogicConstants.FAILURE; SvcLogicResource resourcePlugin = getSvcLogicResource(plugin); @@ -60,7 +61,7 @@ public class IsAvailableNodeExecutor extends AbstractSvcLogicNodeExecutor { } } catch (SvcLogicException e) { LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else { LOG.warn("Could not find SvcLogicResource object for plugin " + plugin); diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/NotifyNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/NotifyNodeExecutor.java index de59a4b73..fb560db5f 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/NotifyNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/NotifyNodeExecutor.java @@ -21,6 +21,7 @@ package org.onap.ccsdk.sli.core.sli.provider.base; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicNode; @@ -41,7 +42,7 @@ public class NotifyNodeExecutor extends AbstractSvcLogicNodeExecutor { String action = SvcLogicExpressionResolver.evaluateAsKey(node.getAttribute("action"), node, ctx); String key = SvcLogicExpressionResolver.evaluateAsKey(node.getAttribute("key"), node, ctx); - String outValue = "failure"; + String outValue = SvcLogicConstants.FAILURE; if (LOG.isDebugEnabled()) { LOG.debug("release node encountered - looking for resource class " + plugin); @@ -52,18 +53,18 @@ public class NotifyNodeExecutor extends AbstractSvcLogicNodeExecutor { try { switch (resourcePlugin.notify(resourceType, action, key, ctx)) { case SUCCESS: - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; break; case NOT_FOUND: outValue = "not-found"; break; case FAILURE: default: - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } catch (SvcLogicException e) { LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else { LOG.warn("Could not find SvcLogicResource object for plugin " + plugin); diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/RecordNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/RecordNodeExecutor.java index d233a36d7..2dd5a081e 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/RecordNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/RecordNodeExecutor.java @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; @@ -44,7 +45,7 @@ public class RecordNodeExecutor extends AbstractSvcLogicNodeExecutor { throws SvcLogicException { String plugin = SvcLogicExpressionResolver.evaluate(node.getAttribute("plugin"), node, ctx); - String outValue = "failure"; + String outValue = SvcLogicConstants.FAILURE; Map parmMap = getResolvedParameters(node,ctx); @@ -54,7 +55,7 @@ public class RecordNodeExecutor extends AbstractSvcLogicNodeExecutor { recorder.record(parmMap); } catch (SvcLogicException e) { LOG.error("Caught exception from recorder plugin", e); - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else { LOG.warn("Could not find SvcLogicRecorder object for plugin " + plugin); diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ReleaseNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ReleaseNodeExecutor.java index ed9d7d7d0..ee06031d6 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ReleaseNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ReleaseNodeExecutor.java @@ -21,6 +21,7 @@ package org.onap.ccsdk.sli.core.sli.provider.base; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicNode; @@ -40,7 +41,7 @@ public class ReleaseNodeExecutor extends AbstractSvcLogicNodeExecutor { String resourceType = SvcLogicExpressionResolver.evaluate(node.getAttribute("resource"), node, ctx); String key = SvcLogicExpressionResolver.evaluateAsKey(node.getAttribute("key"), node, ctx); - String outValue = "failure"; + String outValue = SvcLogicConstants.FAILURE; if (LOG.isDebugEnabled()) { LOG.debug("release node encountered - looking for resource class " + plugin); @@ -51,18 +52,18 @@ public class ReleaseNodeExecutor extends AbstractSvcLogicNodeExecutor { try { switch (resourcePlugin.release(resourceType, key, ctx)) { case SUCCESS: - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; break; case NOT_FOUND: outValue = "not-found"; break; case FAILURE: default: - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } catch (SvcLogicException e) { LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else { LOG.warn("Could not find SvcLogicResource object for plugin " + plugin); diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ReserveNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ReserveNodeExecutor.java index 8e21a4594..d22d36ebb 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ReserveNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ReserveNodeExecutor.java @@ -21,6 +21,7 @@ package org.onap.ccsdk.sli.core.sli.provider.base; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; @@ -50,7 +51,7 @@ public class ReserveNodeExecutor extends AbstractSvcLogicNodeExecutor { select = SvcLogicExpressionResolver.evaluateAsKey(selectExpr, node, ctx); } - String outValue = "failure"; + String outValue = SvcLogicConstants.FAILURE; if (LOG.isDebugEnabled()) { LOG.debug("reserve node encountered - looking for resource class " + plugin); @@ -65,18 +66,18 @@ public class ReserveNodeExecutor extends AbstractSvcLogicNodeExecutor { try { switch (resourcePlugin.reserve(resourceType, select, key, pfx, ctx)) { case SUCCESS: - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; break; case NOT_FOUND: outValue = "not-found"; break; case FAILURE: default: - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } catch (SvcLogicException e) { LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else { LOG.warn("Could not find SvcLogicResource object for plugin " + plugin); diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/SaveNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/SaveNodeExecutor.java index 64a44b3b9..b0b70f1f2 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/SaveNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/SaveNodeExecutor.java @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; @@ -38,7 +39,7 @@ import org.slf4j.LoggerFactory; public class SaveNodeExecutor extends AbstractSvcLogicNodeExecutor { private static final Logger LOG = LoggerFactory.getLogger(SaveNodeExecutor.class); - private static final String FAILURE= "failure"; + private static final String FAILURE= SvcLogicConstants.FAILURE; @Override public SvcLogicNode execute(SvcLogicServiceBase svc, SvcLogicNode node, SvcLogicContext ctx) @@ -71,7 +72,7 @@ public class SaveNodeExecutor extends AbstractSvcLogicNodeExecutor { try { switch (resourcePlugin.save(resourceType, force, localOnly, key, parmMap, pfx, ctx)) { case SUCCESS: - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; break; case NOT_FOUND: outValue = "not-found"; diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/UpdateNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/UpdateNodeExecutor.java index 104f36f5f..c22c573cd 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/UpdateNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/UpdateNodeExecutor.java @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicExpression; @@ -51,7 +52,7 @@ public class UpdateNodeExecutor extends AbstractSvcLogicNodeExecutor { Map parmMap = getResolvedParameters(node,ctx); - String outValue = "failure"; + String outValue = SvcLogicConstants.FAILURE; if (LOG.isDebugEnabled()) { LOG.debug("save node encountered - looking for resource class " + plugin); @@ -66,18 +67,18 @@ public class UpdateNodeExecutor extends AbstractSvcLogicNodeExecutor { try { switch (resourcePlugin.update(resourceType, key, parmMap, pfx, ctx)) { case SUCCESS: - outValue = "success"; + outValue = SvcLogicConstants.SUCCESS; break; case NOT_FOUND: outValue = "not-found"; break; case FAILURE: default: - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } catch (SvcLogicException e) { LOG.error("Caught exception from resource plugin", e); - outValue = "failure"; + outValue = SvcLogicConstants.FAILURE; } } else { LOG.warn("Could not find SvcLogicResource object for plugin " + plugin); diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/WhileNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/WhileNodeExecutor.java index c01e2f51f..3078b3437 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/WhileNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/WhileNodeExecutor.java @@ -67,7 +67,7 @@ public class WhileNodeExecutor extends AbstractSvcLogicNodeExecutor { } LOG.debug("testResult was " + testResult + " which is not equal to true, exiting while loop."); } catch (BreakNodeException e) { - LOG.debug("WhileNodeExecutor caught break"); + LOG.debug("WhileNodeExecutor caught break" + e.getMessage()); } return (null); } diff --git a/sli/provider-base/src/test/java/org/onap/ccsdk/sli/core/sli/provider/base/GraphTests.java b/sli/provider-base/src/test/java/org/onap/ccsdk/sli/core/sli/provider/base/GraphTests.java new file mode 100644 index 000000000..3534d5f90 --- /dev/null +++ b/sli/provider-base/src/test/java/org/onap/ccsdk/sli/core/sli/provider/base/GraphTests.java @@ -0,0 +1,61 @@ +package org.onap.ccsdk.sli.core.sli.provider.base; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import java.util.LinkedList; +import java.util.Map; +import java.util.Map.Entry; +import org.junit.Test; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicGraph; +import org.onap.ccsdk.sli.core.sli.SvcLogicParser; +import org.onap.ccsdk.sli.core.sli.SvcLogicRecorder; +import org.onap.ccsdk.sli.core.sli.SvcLogicStore; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GraphTests { + + private static final Logger LOG = LoggerFactory.getLogger(GraphTests.class); + private static final SvcLogicStore store = new InMemorySvcLogicStore(); + private static final HashMapResolver resolver = new HashMapResolver(); + private static final SvcLogicServiceBase svc = new SvcLogicServiceImplBase(store, resolver); + private static final SvcLogicParser p = new SvcLogicParser(); + // Write a very simple recorder so record nodes can be used during debugging + private static final SvcLogicRecorder recorder = new SvcLogicRecorder() { + @Override + public void record(Map map) throws SvcLogicException { + map.remove("level"); + for (Entry entry : map.entrySet()) { + LOG.debug(entry.getKey() + " = " + entry.getValue()); + } + } + }; + + @Test + public void testBreakNode() throws Exception { + // This graph as a for node that will loop with start 0 and end 999 + // in the loop idx is printed and variable "a" is incremented by 1 + // there is an if block in the loop that when a equals 2 a break node should execute and break out of the for + // loop + SvcLogicContext ctx = executeGraph("src/test/resources/breakGraph.xml"); + assertTrue(ctx.isSuccess()); + assertEquals("2", ctx.getAttribute("idx")); // the break should happen when idx equals 2 + assertEquals("3", ctx.getAttribute("a")); // incrementing a happens before the break so a should be idx + 1 + } + + public SvcLogicContext executeGraph(String pathToGraph) throws SvcLogicException { + return executeGraph(pathToGraph, new SvcLogicContext()); + } + + public SvcLogicContext executeGraph(String pathToGraph, SvcLogicContext context) throws SvcLogicException { + resolver.addSvcLogicRecorder("org.onap.ccsdk.sli.core.sli.recording.Slf4jRecorder", recorder); + LinkedList graphList = p.parse(pathToGraph); + SvcLogicGraph graph = graphList.get(0); + store.store(graph); + store.activate(graph); + return svc.execute(graph, context); + } + +} diff --git a/sli/provider-base/src/test/java/org/onap/ccsdk/sli/core/sli/provider/base/PluginTest.java b/sli/provider-base/src/test/java/org/onap/ccsdk/sli/core/sli/provider/base/PluginTest.java index 8eb5755e9..b154ecf01 100644 --- a/sli/provider-base/src/test/java/org/onap/ccsdk/sli/core/sli/provider/base/PluginTest.java +++ b/sli/provider-base/src/test/java/org/onap/ccsdk/sli/core/sli/provider/base/PluginTest.java @@ -24,7 +24,7 @@ package org.onap.ccsdk.sli.core.sli.provider.base; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; - +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicGraph; @@ -58,7 +58,7 @@ public class PluginTest extends TestCase { SvcLogicNode node = new SvcLogicNode(1, "return", graph); String emitsOutcome = SvcLogicExpressionResolver.evaluate(node.getAttribute("emitsOutcome"), node, ctx); String outValue = executor.mapOutcome(o, emitsOutcome); - assertEquals("success",outValue); + assertEquals(SvcLogicConstants.SUCCESS,outValue); } //Newer plugins can set the attribute emitsOutcome to true, if so they should return a string @@ -107,7 +107,7 @@ public class PluginTest extends TestCase { SvcLogicNode node = new SvcLogicNode(1, "return", graph); String emitsOutcome = SvcLogicExpressionResolver.evaluate(node.getAttribute("emitsOutcome"), node, ctx); String outValue = executor.mapOutcome(o, emitsOutcome); - assertEquals("success",outValue); + assertEquals(SvcLogicConstants.SUCCESS,outValue); } } diff --git a/sli/provider-base/src/test/resources/breakGraph.xml b/sli/provider-base/src/test/resources/breakGraph.xml new file mode 100644 index 000000000..e2b89e84f --- /dev/null +++ b/sli/provider-base/src/test/resources/breakGraph.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java index 1fc052532..0d9ab217e 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java @@ -41,6 +41,7 @@ import java.util.Set; import java.util.UUID; import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringEscapeUtils; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; @@ -935,19 +936,19 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { try { checkParameters(parameters, new String[]{"root"}, LOG); } catch (Exception ex) { - return "failure"; + return SvcLogicConstants.FAILURE; } String root = parameters.get("root"); if (StringUtils.isEmpty(root)) { - return "failure"; + return SvcLogicConstants.FAILURE; } // set context memory to the the properties passed with root as prefix setParameterValuesToRoot(parameters, ctx, root); - return "success"; + return SvcLogicConstants.SUCCESS; } private static boolean setParameterValuesToRoot(Map parameters, SvcLogicContext ctx, String root) { @@ -1003,7 +1004,7 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { checkParameters(parameters, new String[]{"prefixKey", "keyName", "keyValue"}, LOG); } catch (Exception e) { LOG.error("a required parameter is missing"); - return "failure"; + return SvcLogicConstants.FAILURE; } String prefixKey = parameters.get("prefixKey"); @@ -1012,7 +1013,7 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { if (StringUtils.isEmpty(keyName) || StringUtils.isEmpty(keyValue) || StringUtils.isEmpty(prefixKey)) { LOG.error("a required parameters value is empty or null"); - return "failure"; + return SvcLogicConstants.FAILURE; } int listLength = getArrayLength(ctx, prefixKey); @@ -1037,7 +1038,7 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { + "but " + map.size() + " entries were found in context memory " + "where the key begins with: " + prefixKey); - return "failure"; + return SvcLogicConstants.FAILURE; } } else if (ctxListContains(containParams, ctx) == "false") { setNewEntryInList(parameters, ctx, keyName, keyValue, prefixKey, valuePrefixKey, listLength); @@ -1059,10 +1060,10 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { } catch (SvcLogicException e) { LOG.error("Call to ctxListContains failed: " + e.getMessage()); - return "failure"; + return SvcLogicConstants.FAILURE; } - return "success"; + return SvcLogicConstants.SUCCESS; } private static void setNewEntryInList(Map parameters, SvcLogicContext ctx, String keyName, diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java index 64645b363..5c222c83f 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java @@ -32,6 +32,7 @@ import java.util.HashMap; import java.util.Map; import org.junit.Before; import org.junit.Test; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.slipluginutils.SliPluginUtils.LogLevel; @@ -313,7 +314,7 @@ public class SliPluginUtils_StaticFunctionsTest { Map parameters = new HashMap<>(); parameters.put("root", "RootVal"); parameters.put("valueRoot", "ValueRootVal"); - assertEquals("success", SliPluginUtils.setPropertiesForRoot(parameters, ctx)); + assertEquals(SvcLogicConstants.SUCCESS, SliPluginUtils.setPropertiesForRoot(parameters, ctx)); } @Test diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_ctxSortList.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_ctxSortList.java index 78e846aef..3d4469bf2 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_ctxSortList.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_ctxSortList.java @@ -25,12 +25,11 @@ package org.onap.ccsdk.sli.core.slipluginutils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; - import java.util.HashMap; import java.util.Random; - import org.junit.Before; import org.junit.Test; +import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.slf4j.Logger; @@ -144,7 +143,7 @@ public class SliPluginUtils_ctxSortList { parameters.put("keyName", "testKey"); parameters.put("keyValue", "testValue"); - assertEquals("success", SliPluginUtils.setPropertiesForList(parameters, ctx)); + assertEquals(SvcLogicConstants.SUCCESS, SliPluginUtils.setPropertiesForList(parameters, ctx)); } } diff --git a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/JREFileResolverTest.java b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/JREFileResolverTest.java index e5051d65a..8a066f057 100644 --- a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/JREFileResolverTest.java +++ b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/JREFileResolverTest.java @@ -1,7 +1,6 @@ package org.onap.ccsdk.sli.core.utils; -import static org.junit.Assert.*; - +import static org.junit.Assert.assertEquals; import org.junit.Test; public class JREFileResolverTest { diff --git a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/KarafRootFileResolverTest.java b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/KarafRootFileResolverTest.java index 5e407daf6..df16b41d0 100644 --- a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/KarafRootFileResolverTest.java +++ b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/KarafRootFileResolverTest.java @@ -1,7 +1,6 @@ package org.onap.ccsdk.sli.core.utils; -import static org.junit.Assert.*; - +import static org.junit.Assert.assertEquals; import org.junit.Test; public class KarafRootFileResolverTest { diff --git a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/BundleContexFileResolverTest.java b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/BundleContexFileResolverTest.java index 4ec5e1b48..7ddf550b0 100644 --- a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/BundleContexFileResolverTest.java +++ b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/BundleContexFileResolverTest.java @@ -1,7 +1,6 @@ package org.onap.ccsdk.sli.core.utils.common; -import static org.junit.Assert.*; - +import static org.junit.Assert.assertEquals; import org.junit.Test; import org.onap.ccsdk.sli.core.utils.PropertiesFileResolver; @@ -9,7 +8,8 @@ public class BundleContexFileResolverTest { @Test public void getSuccessfulResolutionMessage() throws Exception { - final PropertiesFileResolver resolver = new BundleContextFileResolver("success", BundleContexFileResolverTest.class); + final PropertiesFileResolver resolver = + new BundleContextFileResolver("success", BundleContexFileResolverTest.class); assertEquals("success", resolver.getSuccessfulResolutionMessage()); } diff --git a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/CoreDefaultFileResolverTest.java b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/CoreDefaultFileResolverTest.java index a4f8817fa..f1f5f2244 100644 --- a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/CoreDefaultFileResolverTest.java +++ b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/CoreDefaultFileResolverTest.java @@ -1,7 +1,7 @@ package org.onap.ccsdk.sli.core.utils.common; -import static org.junit.Assert.*; - +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import java.io.File; import java.util.Optional; import org.junit.Test; diff --git a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/SdncConfigEnvVarFileResolverTest.java b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/SdncConfigEnvVarFileResolverTest.java index 0f3536b78..130dc0a1e 100644 --- a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/SdncConfigEnvVarFileResolverTest.java +++ b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/common/SdncConfigEnvVarFileResolverTest.java @@ -1,7 +1,7 @@ package org.onap.ccsdk.sli.core.utils.common; -import static org.junit.Assert.*; - +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import java.io.File; import java.util.Optional; import org.junit.Test; diff --git a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/dblib/DblibDefaultFileResolverTest.java b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/dblib/DblibDefaultFileResolverTest.java index 4b28d449d..834a8c449 100644 --- a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/dblib/DblibDefaultFileResolverTest.java +++ b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/dblib/DblibDefaultFileResolverTest.java @@ -1,7 +1,7 @@ package org.onap.ccsdk.sli.core.utils.dblib; -import static org.junit.Assert.*; - +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import java.io.File; import java.util.Optional; import org.junit.Test; diff --git a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/dblib/DblibEnvVarFileResolverTest.java b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/dblib/DblibEnvVarFileResolverTest.java index bae4168d8..b5150ab67 100644 --- a/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/dblib/DblibEnvVarFileResolverTest.java +++ b/utils/provider/src/test/java/org/onap/ccsdk/sli/core/utils/dblib/DblibEnvVarFileResolverTest.java @@ -1,7 +1,7 @@ package org.onap.ccsdk.sli.core.utils.dblib; -import static org.junit.Assert.*; - +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import java.io.File; import java.util.Optional; import org.junit.Test; -- cgit 1.2.3-korg From 7c2f57f8efc971f1d93a544256c084f52f7c3ed2 Mon Sep 17 00:00:00 2001 From: "Singal, Kapil (ks220y)" Date: Mon, 17 Feb 2020 17:46:59 -0500 Subject: Refactoring deprecated lang3.StringEscapeUtils Replace deprecated org.apache.commons.lang3.StringEscapeUtils with org.apache.commons.text.StringEscapeUtils Change-Id: Ib0303919d883a577effbb6fa15ddeb289cb936fc Issue-ID: CCSDK-2104 Signed-off-by: Singal, Kapil (ks220y) --- sli/common/pom.xml | 6 +- .../org/onap/ccsdk/sli/core/sli/SvcLogicNode.java | 108 ++++++++++----------- .../sli/core/slipluginutils/SliStringUtils.java | 6 +- 3 files changed, 62 insertions(+), 58 deletions(-) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sli/common/pom.xml b/sli/common/pom.xml index 7ba721928..8290a42b4 100755 --- a/sli/common/pom.xml +++ b/sli/common/pom.xml @@ -42,6 +42,10 @@ org.apache.commons commons-lang3 + + org.apache.commons + commons-text + org.onap.ccsdk.sli.core dblib-provider @@ -56,7 +60,7 @@ org.onap.logging-analytics logging-slf4j - + junit diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicNode.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicNode.java index 72cfea500..b0d4fc058 100644 --- a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicNode.java +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicNode.java @@ -10,9 +10,9 @@ * 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. @@ -22,7 +22,7 @@ */ /** - * + * */ package org.onap.ccsdk.sli.core.sli; @@ -36,17 +36,17 @@ import java.util.Set; import java.util.HashSet; import java.util.TreeMap; -import org.apache.commons.lang3.StringEscapeUtils; +import org.apache.commons.text.StringEscapeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SvcLogicNode implements Serializable { - + private static final Logger LOG = LoggerFactory .getLogger(SvcLogicExprListener.class); - + private static final long serialVersionUID = 2L; - + private String nodeName; private int nodeId; private String nodeType; @@ -57,7 +57,7 @@ public class SvcLogicNode implements Serializable { private HashMap attributes; private HashMap outcomes; private HashMap parameters; - + public SvcLogicNode(int nodeId, String nodeType, SvcLogicGraph graph) { this.nodeId = nodeId; @@ -67,9 +67,9 @@ public class SvcLogicNode implements Serializable { attributes = new HashMap<> (); parameters = new HashMap<> (); outcomes = null; - + } - + public SvcLogicNode(int nodeId, String nodeType, String nodeName, SvcLogicGraph graph) throws DuplicateValueException { this.nodeId = nodeId; @@ -81,28 +81,28 @@ public class SvcLogicNode implements Serializable { outcomes = null; graph.setNamedNode(nodeName, this); } - - + + public int getNodeId() { return nodeId; } - + public String getNodeName() { return nodeName; } - + public String getNodeType() { return nodeType; } - + public SvcLogicGraph getGraph() { return graph; } - + public int getNumOutcomes() { if (outcomes == null) @@ -114,7 +114,7 @@ public class SvcLogicNode implements Serializable { return outcomes.size(); } } - + public SvcLogicExpression getAttribute(String name) { if (attributes.containsKey(name)) @@ -125,28 +125,28 @@ public class SvcLogicNode implements Serializable { { return null; } - + } - + public void setAttribute(String name, String value) throws SvcLogicException { setAttribute(name, new SvcLogicAtom("STRING", value)); } - + public void setAttribute(String name, SvcLogicExpression value) throws SvcLogicException { if (attributes.containsKey(name)) { throw new DuplicateValueException("Duplicate attribute "+name); } - + attributes.put(name, value); } - + public void mapParameter(String name, String value) throws SvcLogicException { - + if (parameters.containsKey(name)) { throw new DuplicateValueException("Duplicate parameter "+name); @@ -163,7 +163,7 @@ public class SvcLogicNode implements Serializable { int lastParen = value.lastIndexOf("`"); String evalExpr = value.trim().substring(1, lastParen); parmValue = SvcLogicExpressionFactory.parse(evalExpr); - + } else { @@ -185,7 +185,7 @@ public class SvcLogicNode implements Serializable { throw new SvcLogicException(e.getMessage()); } } - + public SvcLogicExpression getParameter(String name) { if (parameters.containsKey(name)) @@ -197,23 +197,23 @@ public class SvcLogicNode implements Serializable { return null; } } - + public boolean isVisited() { return visited; } public void setVisited(boolean visited, boolean recursive) { this.visited = visited; - + if (recursive) { Set> outcomeSet = getOutcomeSet(); - + if (outcomeSet == null) { return; } - + for (Iterator> iter = outcomeSet.iterator(); iter.hasNext();) { Map.Entry curOutcome = iter.next(); @@ -222,14 +222,14 @@ public class SvcLogicNode implements Serializable { } } } - + public void addOutcome(String outcomeValue, SvcLogicNode node) throws SvcLogicException { if (outcomes == null) { outcomes = new HashMap<>(); } - + if (outcomeValue.length() == 0) { outcomeValue = "\"\""; } @@ -237,35 +237,35 @@ public class SvcLogicNode implements Serializable { { throw new DuplicateValueException("Duplicate outcome value "+outcomeValue); } - + outcomes.put(outcomeValue, node); } - + public Set> getOutcomeSet() { if (outcomes == null) { return new HashSet<>(); } - + return outcomes.entrySet(); - + } - + public Set> getParameterSet() { if (parameters == null) { return new HashSet<>(); } - + return parameters.entrySet(); - + } - + public void printAsGv(PrintStream pstr) { - + if (visited) { return; @@ -274,9 +274,9 @@ public class SvcLogicNode implements Serializable { { visited = true; } - + StringBuffer sbuff = new StringBuffer(); - + sbuff.append("node"); sbuff.append(nodeId); sbuff.append(" [ shape=none, margin=0, label=<"); @@ -292,7 +292,7 @@ public class SvcLogicNode implements Serializable { sbuff.append(nodeName); sbuff.append(""); } - + Set> attrSet = attributes.entrySet(); for (Iterator> iter = attrSet.iterator() ; iter.hasNext();) { @@ -304,15 +304,15 @@ public class SvcLogicNode implements Serializable { sbuff.append(""); } sbuff.append("
>];"); - + pstr.println(sbuff.toString()); - - + + if (outcomes != null) { TreeMap sortedOutcomes = new TreeMap<>(outcomes); Set> outcomeSet = sortedOutcomes.entrySet(); - + for (Iterator> iter = outcomeSet.iterator(); iter.hasNext();) { Map.Entry curOutcome = iter.next(); @@ -323,7 +323,7 @@ public class SvcLogicNode implements Serializable { } } } - + public void printAsXml(PrintStream pstr, int indentLvl) { if (visited) @@ -337,7 +337,7 @@ public class SvcLogicNode implements Serializable { } pstr.print("<"); pstr.print(this.getNodeType()); - + Set> attrSet = attributes.entrySet(); for (Iterator> iter = attrSet.iterator() ; iter.hasNext();) { @@ -348,7 +348,7 @@ public class SvcLogicNode implements Serializable { pstr.print(curAttr.getValue()); pstr.print("'`"); } - + if ((parameters == null || parameters.isEmpty()) && (outcomes == null || outcomes.isEmpty())) { @@ -360,7 +360,7 @@ public class SvcLogicNode implements Serializable { { pstr.print(">\n"); } - + // Print parameters (if any) if (parameters != null) { @@ -405,7 +405,7 @@ public class SvcLogicNode implements Serializable { pstr.print("\n"); } } - + // Print node end tag for (int i = 0 ; i < indentLvl ; i++) { @@ -415,7 +415,7 @@ public class SvcLogicNode implements Serializable { pstr.print(this.getNodeType()); pstr.print(">\n"); pstr.flush(); - + } @@ -429,7 +429,7 @@ public class SvcLogicNode implements Serializable { { return null; } - + if (outcomes.containsKey(value)) { return outcomes.get(value); diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java index d343ce25f..fdc057b23 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java @@ -27,7 +27,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Map; -import org.apache.commons.lang3.StringEscapeUtils; +import org.apache.commons.text.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicException; @@ -334,7 +334,7 @@ public class SliStringUtils implements SvcLogicJavaPlugin { ctx.setAttribute(parameters.get("outputPath"), parameters.get(INPUT_PARAM_SOURCE) .replaceAll(parameters.get(INPUT_PARAM_TARGET), parameters.get("replacement"))); } - + /** * Provides substring functionality to Directed Graphs. *

@@ -456,7 +456,7 @@ public class SliStringUtils implements SvcLogicJavaPlugin { public static void xmlEscapeText(Map inParams, SvcLogicContext ctx) { String source = inParams.get(INPUT_PARAM_SOURCE); String target = inParams.get(INPUT_PARAM_TARGET); - source = StringEscapeUtils.escapeXml(source); + source = StringEscapeUtils.escapeXml10(source); ctx.setAttribute(target, source); } -- cgit 1.2.3-korg From 3a325d8192addf27423494d8ed8b621dedcf7888 Mon Sep 17 00:00:00 2001 From: Enbo Wang Date: Fri, 21 Feb 2020 14:57:01 +0800 Subject: Support updating JSON object string for sliPluginUtils Issue-ID: CCSDK-2111 Signed-off-by: Enbo Wang Change-Id: Ide6bb06a05fcbb3b88e73cc0fbec6fd46bd29033 --- .../sli/core/slipluginutils/SliPluginUtils.java | 55 ++++++++++++++++++++++ .../SliPluginUtils_StaticFunctionsTest.java | 37 +++++++++++++++ .../provider/src/test/resources/JsonObject.json | 5 ++ 3 files changed, 97 insertions(+) create mode 100644 sliPluginUtils/provider/src/test/resources/JsonObject.json (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java index 0d9ab217e..ce0f50800 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java @@ -33,12 +33,15 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Properties; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; + import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringEscapeUtils; import org.onap.ccsdk.sli.core.sli.SvcLogicConstants; @@ -865,6 +868,58 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { } } + /** + * updateJsonObjectString takes a json object string, and adds or deletes the properties of it + * @param parameters - requires source, outputPath and keys to be added or deleted. + * The key of parameter starts with "add.", e.g. "add.A", and then "A" and its value will be added + * to the JSON object. + * The key of parameter starts with "delete.", e.g. "delete.B", and then "B" will be deleted from + * the JSON object. + * @param ctx Reference to context memory + * @throws SvcLogicException if a required parameter is missing an exception is thrown + */ + public static void updateJsonObjectString(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + checkParameters(parameters, new String[] {"source", "outputPath"}, LOG); + try { + String source = ctx.getAttribute(parameters.get("source")); + JsonParser jp = new JsonParser(); + JsonElement element = jp.parse(source); + if (element.isJsonObject()) { + JsonObject jsonObject = element.getAsJsonObject(); + updateJsonObject(jsonObject, parameters); + + String target = jsonObject.toString(); + ctx.setAttribute(parameters.get("outputPath"), target); + } else { + throw new SvcLogicException("just update JSON object string"); + } + } catch (Exception ex) { + throw new SvcLogicException("problem with updateJsonObjectString", ex); + } + } + + protected static void updateJsonObject(JsonObject jsonObject, Map parameters) throws SvcLogicException { + List deleted_params = parameters.keySet().stream().filter(param -> param.startsWith("delete.")). + collect(Collectors.toList()); + for (String param: deleted_params) { + String[] action_key = param.split("\\.", 2); + if (action_key.length < 2) { + throw new SvcLogicException("error parameter format: " + param + ", must be \"delete.\""); + } + jsonObject.remove(action_key[1]); + } + + List added_params = parameters.keySet().stream().filter(param -> param.startsWith("add.")). + collect(Collectors.toList()); + for (String param: added_params) { + String[] action_key = param.split("\\.", 2); + if (action_key.length < 2) { + throw new SvcLogicException("error parameter format: " + param + ", must be \"add.\""); + } + jsonObject.addProperty(action_key[1], parameters.get(param)); + } + } + /** * getAttributeValue takes a ctx memory path as a string, gets the value stored at this path and set this value in context memory at * outputPath diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java index 5c222c83f..ad039d7f4 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java @@ -495,6 +495,43 @@ public class SliPluginUtils_StaticFunctionsTest { assertEquals("200", ctx.getAttribute("testPath.widget.window.width")); } + @Test + public void testUpdateJsonObjectString() throws Exception { + String path = "src/test/resources/JsonObject.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("input", content); + + Map parametersUpdateJson = new HashMap(); + parametersUpdateJson.put("source", "input"); + parametersUpdateJson.put("outputPath", "newJsonString"); + + // add key "ccc" and its value + parametersUpdateJson.put("add.ccc", "abcxyz"); + + // update keys and their values of "aaa" and "c.d" + parametersUpdateJson.put("add.aaa", "4567"); + parametersUpdateJson.put("add.c.d", "defg"); + + // delete key "bbb" + parametersUpdateJson.put("delete.bbb", ""); + + SliPluginUtils.updateJsonObjectString(parametersUpdateJson, ctx); + + Map parametersJsonToCtx = new HashMap(); + parametersJsonToCtx.put("source", "newJsonString"); + parametersJsonToCtx.put("outputPath", "testPath"); + parametersJsonToCtx.put("isEscaped", "false"); + + SliPluginUtils.jsonStringToCtx(parametersJsonToCtx, ctx); + + assertEquals("abcxyz", ctx.getAttribute("testPath.ccc")); + assertEquals("4567", ctx.getAttribute("testPath.aaa")); + assertEquals("defg", ctx.getAttribute("testPath.c.d")); + assertEquals(null, ctx.getAttribute("testPath.bbb")); + } + @Test public void testEmbeddedEscapedJsonJsonStringToCtx() throws Exception { String path = "src/test/resources/EmbeddedEscapedJson.json"; diff --git a/sliPluginUtils/provider/src/test/resources/JsonObject.json b/sliPluginUtils/provider/src/test/resources/JsonObject.json new file mode 100644 index 000000000..0578368f8 --- /dev/null +++ b/sliPluginUtils/provider/src/test/resources/JsonObject.json @@ -0,0 +1,5 @@ +{ + "aaa": "123", + "bbb": "xyz", + "c.d": "abc" +} \ No newline at end of file -- cgit 1.2.3-korg From 4cbff49506b31844ccda7ca38b3ba7283974475a Mon Sep 17 00:00:00 2001 From: Rahul_cool Date: Wed, 1 Apr 2020 15:49:25 +0530 Subject: Added code for decoding base64 encoded value Issue-ID: SDNC-899 Signed-off-by: Rahul_cool Change-Id: I231f891118dabf59518bcf4dbe456df97cd3e5b2 --- .../sli/core/slipluginutils/SliStringUtils.java | 32 ++++++++++++++++++++++ .../core/slipluginutils/SliStringUtilsTest.java | 9 ++++++ 2 files changed, 41 insertions(+) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java index fdc057b23..9e3367d45 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtils.java @@ -27,6 +27,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Map; +import java.util.Base64; import org.apache.commons.text.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; @@ -311,6 +312,37 @@ public class SliStringUtils implements SvcLogicJavaPlugin { .replace(parameters.get(INPUT_PARAM_TARGET), parameters.get("replacement")))); } +/** + * exposes base64decoding algo + * writes the length of source to outputPath + * @param parameters HashMap of parameters passed by the DG to this function + * + * + * + * + * + * + *
parameterMandatory/Optionaldescription
encodedValueMandatorysource string
decodedValueMandatoryDestination path
+ * @param ctx Reference to context memory + * @throws SvcLogicException + * @since 11.0.2 + */ + public static void base64DecodingAlgo(Map parameters, SvcLogicContext ctx) throws SvcLogicException{ + try { + SliPluginUtils.checkParameters(parameters, new String[]{"encodedValue","decodedValue"}, LOG); + + Base64.Decoder decoder = Base64.getDecoder(); + byte[] decodedByteArray = decoder.decode(parameters.get("encodedValue")); + //Verify the decoded string + String decodeVal = new String(decodedByteArray); + ctx.setAttribute(parameters.get("decodedValue"), decodeVal); + }catch (Exception exc){ + LOG.error("Exception occure "+exc.getMessage()); + throw new SvcLogicException(exc.getMessage()); + } + } + + /** * exposes replaceAll to directed graph * writes the length of source to outputPath diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java index 3a6c31a3c..da7046f43 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliStringUtilsTest.java @@ -386,4 +386,13 @@ public class SliStringUtilsTest { assertEquals(SliStringUtils.FALSE_CONSTANT, result); } + @Test + public void testBase64DecodingAlgo() throws Exception{ + String input = "MDUxMDAw"; + String decodeVal = "decodedPath"; + param.put("encodedValue",input); + param.put("decodedValue", decodeVal); + SliStringUtils.base64DecodingAlgo(param,ctx); + assertEquals("051000",ctx.getAttribute(decodeVal)); + } } -- cgit 1.2.3-korg From b970a7b46fac32e626acfa23b1e2de9b22da7ff7 Mon Sep 17 00:00:00 2001 From: "Smokowski, Kevin (ks6305)" Date: Wed, 1 Apr 2020 19:58:23 +0000 Subject: SliPluginUtils jsonStringToCtx fix Support null values in jsonStringToCtx in Slipluginutils Issue-ID: CCSDK-2250 Signed-off-by: Smokowski, Kevin (ks6305) Change-Id: I3316fa9e80c9e684fc27d83356bbfad9b1151992 --- .../org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java | 9 ++++++++- .../core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java | 7 ++++--- sliPluginUtils/provider/src/test/resources/2dArray.json | 2 +- sliPluginUtils/provider/src/test/resources/ArrayMenu.json | 2 +- sliPluginUtils/provider/src/test/resources/Widget.json | 2 +- 5 files changed, 15 insertions(+), 7 deletions(-) (limited to 'sliPluginUtils/provider/src/main') diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java index ce0f50800..60bb4fd31 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java @@ -70,6 +70,7 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { private static final String LOG_MSG="extracting list from context memory"; private static final String LOG_MSG1="removing elements from list"; private static final String LENGTH="_length"; + public static final String CTX_NULL_VALUE=""; // ========== CONSTRUCTORS ========== @@ -846,7 +847,11 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { if(!root.endsWith(".")){ root = root + "."; } - ctx.setAttribute(root + key, entry.getValue().getAsString()); + if(entry.getValue().isJsonNull()) { + ctx.setAttribute(root + key, CTX_NULL_VALUE); + }else { + ctx.setAttribute(root + key, entry.getValue().getAsString()); + } } } } @@ -861,6 +866,8 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { handleJsonArray(key, element.getAsJsonArray(), ctx, prefix); } else if (element.isJsonObject()) { writeJsonObject(element.getAsJsonObject(), ctx, prefix + "."); + } else if (element.isJsonNull()) { + ctx.setAttribute(prefix, CTX_NULL_VALUE); } else if (element.isJsonPrimitive()) { ctx.setAttribute(prefix, element.getAsString()); } diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java index ad039d7f4..bc2c9226d 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java @@ -335,7 +335,7 @@ public class SliPluginUtils_StaticFunctionsTest { assertEquals("plain", ctx.getAttribute("testPath.[0].name")); assertEquals("pizza", ctx.getAttribute("testPath.[0].type")); assertEquals("true", ctx.getAttribute("testPath.[0].vegetarian")); - assertEquals("2000", ctx.getAttribute("testPath.[1].calories")); + assertEquals(SliPluginUtils.CTX_NULL_VALUE, ctx.getAttribute("testPath.[1].calories")); assertEquals("2", ctx.getAttribute("testPath.[1].id")); assertEquals("Tuesday Special", ctx.getAttribute("testPath.[1].name")); assertEquals("1", ctx.getAttribute("testPath.[1].topping[0].id")); @@ -423,7 +423,8 @@ public class SliPluginUtils_StaticFunctionsTest { assertEquals("apple", ctx.getAttribute("testPath.[0][0]")); assertEquals("orange", ctx.getAttribute("testPath.[0][1]")); assertEquals("banana", ctx.getAttribute("testPath.[0][2]")); - assertEquals("3", ctx.getAttribute("testPath.[0]_length")); + assertEquals(SliPluginUtils.CTX_NULL_VALUE, ctx.getAttribute("testPath.[0][3]")); + assertEquals("4", ctx.getAttribute("testPath.[0]_length")); assertEquals("squash", ctx.getAttribute("testPath.[1][0]")); assertEquals("broccoli", ctx.getAttribute("testPath.[1][1]")); assertEquals("cauliflower", ctx.getAttribute("testPath.[1][2]")); @@ -488,7 +489,7 @@ public class SliPluginUtils_StaticFunctionsTest { assertEquals("text1", ctx.getAttribute("testPath.widget.text.name")); assertEquals("21", ctx.getAttribute("testPath.widget.text.size")); assertEquals("bold", ctx.getAttribute("testPath.widget.text.style")); - assertEquals("200", ctx.getAttribute("testPath.widget.text.vOffset")); + assertEquals(SliPluginUtils.CTX_NULL_VALUE, ctx.getAttribute("testPath.widget.text.vOffset")); assertEquals("300", ctx.getAttribute("testPath.widget.window.height")); assertEquals("main_window", ctx.getAttribute("testPath.widget.window.name")); assertEquals("ONAP Widget", ctx.getAttribute("testPath.widget.window.title")); diff --git a/sliPluginUtils/provider/src/test/resources/2dArray.json b/sliPluginUtils/provider/src/test/resources/2dArray.json index b473864d8..2a94b46f4 100644 --- a/sliPluginUtils/provider/src/test/resources/2dArray.json +++ b/sliPluginUtils/provider/src/test/resources/2dArray.json @@ -1,4 +1,4 @@ [ - ["apple", "orange", "banana"], + ["apple", "orange", "banana", null], ["squash", "broccoli", "cauliflower"] ] \ No newline at end of file diff --git a/sliPluginUtils/provider/src/test/resources/ArrayMenu.json b/sliPluginUtils/provider/src/test/resources/ArrayMenu.json index b12f16315..26a24f292 100644 --- a/sliPluginUtils/provider/src/test/resources/ArrayMenu.json +++ b/sliPluginUtils/provider/src/test/resources/ArrayMenu.json @@ -8,7 +8,7 @@ "id": "2", "type": "pizza", "name": "Tuesday Special", - "calories": 2000, + "calories": null, "vegetarian": false, "topping": [{ diff --git a/sliPluginUtils/provider/src/test/resources/Widget.json b/sliPluginUtils/provider/src/test/resources/Widget.json index 1e25282c2..6b90907ce 100644 --- a/sliPluginUtils/provider/src/test/resources/Widget.json +++ b/sliPluginUtils/provider/src/test/resources/Widget.json @@ -20,7 +20,7 @@ "style": "bold", "name": "text1", "hOffset": 350, - "vOffset": 200, + "vOffset": null, "alignment": "center" } } -- cgit 1.2.3-korg From 95cf22da1854a991c756e46240cbab52a33eaa84 Mon Sep 17 00:00:00 2001 From: Dan Timoney Date: Tue, 16 Jun 2020 10:15:13 -0400 Subject: Implement new method to convert SvcLogicContext to JSON Added new method toJsonString() to SvcLogicContext class to write out service logic context properties as a JSON string Refactored static method SliPluginUtils.writeJsonToCtx to SvcLogicContext.mergeJson method Change-Id: I4fe134976f93c7d116bc54ad2bae6e486c6fac2c Issue-ID: CCSDK-1760 Signed-off-by: Dan Timoney --- sli/common/pom.xml | 6 + .../onap/ccsdk/sli/core/sli/SvcLogicContext.java | 571 +++++++++++++-------- .../ccsdk/sli/core/sli/SvcLogicContextTest.java | 320 +++++++++++- sli/common/src/test/resources/2dArray.json | 4 + sli/common/src/test/resources/3dArray.json | 4 + sli/common/src/test/resources/ArrayMenu.json | 41 ++ .../src/test/resources/EmbeddedEscapedJson.json | 16 + sli/common/src/test/resources/EscapedJson.json | 1 + sli/common/src/test/resources/JsonObject.json | 5 + sli/common/src/test/resources/ObjectMenu.json | 43 ++ sli/common/src/test/resources/QuotedValues.json | 43 ++ sli/common/src/test/resources/Widget.json | 27 + sli/common/src/test/resources/log4j2.properties | 39 ++ .../sli/core/slipluginutils/SliPluginUtils.java | 55 +- .../SliPluginUtils_StaticFunctionsTest.java | 13 - 15 files changed, 906 insertions(+), 282 deletions(-) create mode 100644 sli/common/src/test/resources/2dArray.json create mode 100644 sli/common/src/test/resources/3dArray.json create mode 100644 sli/common/src/test/resources/ArrayMenu.json create mode 100644 sli/common/src/test/resources/EmbeddedEscapedJson.json create mode 100644 sli/common/src/test/resources/EscapedJson.json create mode 100644 sli/common/src/test/resources/JsonObject.json create mode 100644 sli/common/src/test/resources/ObjectMenu.json create mode 100644 sli/common/src/test/resources/QuotedValues.json create mode 100644 sli/common/src/test/resources/Widget.json create mode 100644 sli/common/src/test/resources/log4j2.properties (limited to 'sliPluginUtils/provider/src/main') diff --git a/sli/common/pom.xml b/sli/common/pom.xml index 16efd0e56..efc66aabd 100755 --- a/sli/common/pom.xml +++ b/sli/common/pom.xml @@ -86,6 +86,12 @@ mockito-core test + + org.skyscreamer + jsonassert + 1.5.0 + test + diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java index fcd51d14b..f07f71f10 100644 --- a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java @@ -21,10 +21,7 @@ package org.onap.ccsdk.sli.core.sli; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Set; +import java.util.*; import com.google.gson.*; import org.slf4j.Logger; @@ -38,74 +35,68 @@ import org.w3c.dom.Text; public class SvcLogicContext { - private static final Logger LOG = LoggerFactory.getLogger(SvcLogicContext.class); + private static final Logger LOG = LoggerFactory.getLogger(SvcLogicContext.class); - private HashMap attributes; + public static final String CTX_NULL_VALUE=""; + private static final String LENGTH="_length"; + + private HashMap attributes; private String status = SvcLogicConstants.SUCCESS; - public SvcLogicContext() - { - this.attributes = new HashMap<> (); - - } - - public SvcLogicContext(Properties props) - { - this.attributes = new HashMap<> (); - - if (props.containsKey(CommonConstants.SERVICE_LOGIC_STATUS)) - { - this.status = props.getProperty(CommonConstants.SERVICE_LOGIC_STATUS); - } - - for (Object nameObj : props.keySet()) - { - String propName = (String) nameObj; - attributes.put(propName, props.getProperty(propName)); - } - } - - public String getAttribute(String name) - { - if (attributes.containsKey(name)) - { - return attributes.get(name); - } - else - { - return null; - } - } - - public void setAttribute(String name, String value) - { - if (value == null) { - if (attributes.containsKey(name)) { - attributes.remove(name); - } - } else { - attributes.put(name, value); - } - } - - public Set getAttributeKeySet() - { - return attributes.keySet(); - } + public SvcLogicContext() { + this.attributes = new HashMap<>(); + + } + + public SvcLogicContext(Properties props) { + this.attributes = new HashMap<>(); + + if (props.containsKey(CommonConstants.SERVICE_LOGIC_STATUS)) { + this.status = props.getProperty(CommonConstants.SERVICE_LOGIC_STATUS); + } + + for (Object nameObj : props.keySet()) { + String propName = (String) nameObj; + attributes.put(propName, props.getProperty(propName)); + } + } + + public String getAttribute(String name) { + if (attributes.containsKey(name)) { + return attributes.get(name); + } else { + return null; + } + } + + public void setAttribute(String name, String value) { + if (value == null) { + if (attributes.containsKey(name)) { + attributes.remove(name); + } + } else { + attributes.put(name, value); + } + } + + public Set getAttributeKeySet() { + return attributes.keySet(); + } + public Boolean isSuccess() { return status.equals(SvcLogicConstants.SUCCESS); - } + } @Deprecated - public String getStatus() { - return status; - } + public String getStatus() { + return status; + } @Deprecated - public void setStatus(String status) { - this.status = status; - } + public void setStatus(String status) { + this.status = status; + } public void markFailed() { this.status = SvcLogicConstants.FAILURE; @@ -115,167 +106,313 @@ public class SvcLogicContext { this.status = SvcLogicConstants.SUCCESS; } - public Properties toProperties() - { - Properties props = new Properties(); + public Properties toProperties() { + Properties props = new Properties(); + + if (status != null) { + props.setProperty(CommonConstants.SERVICE_LOGIC_STATUS, status); + } + + String attrName; + String attrVal; + for (Map.Entry entry : attributes.entrySet()) { + attrName = entry.getKey(); + attrVal = entry.getValue(); + if (attrVal == null) { + LOG.warn("attribute {} value is null - setting to empty string", attrName); + props.setProperty(attrName, ""); + } else { + props.setProperty(attrName, attrVal); + } + } + + return props; + } + + public void mergeDocument(String pfx, Document doc) { + String prefix = ""; + + if (pfx != null) { + prefix = pfx; + } + + Element root = doc.getDocumentElement(); + + mergeElement(prefix, root, null); + } + + public void mergeElement(String pfx, Element element, Map nodeMap) { + + // In XML, cannot tell the difference between containers and lists. + // So, have to treat each element as both (ugly but necessary). + // We do this by passing a nodeMap to be used to count instance of each tag, + // which will be used to set _length and to set index - if (status != null) - { - props.setProperty(CommonConstants.SERVICE_LOGIC_STATUS, status); - } + LOG.trace("mergeElement({},{},{})", pfx, element.getTagName(), nodeMap); - String attrName; - String attrVal; - for (Map.Entry entry : attributes.entrySet()) - { - attrName = entry.getKey(); - attrVal = entry.getValue(); - if (attrVal == null) { - LOG.warn("attribute {} value is null - setting to empty string", attrName); - props.setProperty(attrName, ""); - } else { - props.setProperty(attrName, attrVal); - } - } - - return props; - } + String curTagName = element.getTagName(); + String prefix = curTagName; - public void mergeDocument(String pfx, Document doc) { - String prefix = ""; + if (pfx != null) { + prefix = pfx + "." + prefix; + } - if (pfx != null) { - prefix = pfx; - } + int myIdx = 0; - Element root = doc.getDocumentElement(); - - mergeElement(prefix, root, null); - } - - public void mergeElement(String pfx, Element element, Map nodeMap) { - - // In XML, cannot tell the difference between containers and lists. - // So, have to treat each element as both (ugly but necessary). - // We do this by passing a nodeMap to be used to count instance of each tag, - // which will be used to set _length and to set index - - LOG.trace("mergeElement({},{},{})", pfx, element.getTagName(), nodeMap); - - String curTagName = element.getTagName(); - String prefix = curTagName; - - if (pfx != null) { - prefix = pfx + "." + prefix; - } - - int myIdx = 0; - - if (nodeMap != null) { - if (nodeMap.containsKey(curTagName)) { - myIdx = nodeMap.get(curTagName); - } - - nodeMap.put(curTagName, myIdx+1); - this.setAttribute(prefix+"_length", Integer.toString(myIdx+1)); - } - - NodeList children = element.getChildNodes(); - - int numChildren = children.getLength(); - - Map childMap = new HashMap<>(); - Map idxChildMap = new HashMap<>(); - - for (int i = 0 ; i < numChildren ; i++) { - Node curNode = children.item(i); - - if (curNode instanceof Text) { - Text curText = (Text) curNode; - String curTextValue = curText.getTextContent(); - LOG.trace("Setting ctx variable {} = {}", prefix, curTextValue); - this.setAttribute(prefix, curText.getTextContent()); - - - } else if (curNode instanceof Element) { - mergeElement(prefix, (Element) curNode, childMap); - if (nodeMap != null) { - - mergeElement(prefix+"["+myIdx+"]", (Element)curNode, idxChildMap); - - } - } - } - - } - - public void mergeJson(String pfx, String jsonString) { - JsonParser jp = new JsonParser(); - JsonElement element = jp.parse(jsonString); - - mergeJsonObject(element.getAsJsonObject(), pfx+"."); - } - - public void mergeJsonObject(JsonObject jsonObject, String pfx) { - for (Map.Entry entry : jsonObject.entrySet()) { - if (entry.getValue().isJsonObject()) { - mergeJsonObject(entry.getValue().getAsJsonObject(), pfx + entry.getKey() + "."); - } else if (entry.getValue().isJsonArray()) { - JsonArray array = entry.getValue().getAsJsonArray(); - this.setAttribute(pfx + entry.getKey() + "_length", String.valueOf(array.size())); - Integer arrayIdx = 0; - for (JsonElement element : array) { - if (element.isJsonObject()) { - mergeJsonObject(element.getAsJsonObject(), pfx + entry.getKey() + "[" + arrayIdx + "]."); - } - arrayIdx++; - } - } else { - if (entry.getValue() instanceof JsonNull) { - LOG.debug("Skipping parameter {} with null value",entry.getKey()); - - } else { - this.setAttribute(pfx + entry.getKey(), entry.getValue().getAsString()); - } - } - } - } + if (nodeMap != null) { + if (nodeMap.containsKey(curTagName)) { + myIdx = nodeMap.get(curTagName); + } - public String resolve(String ctxVarName) { - - if (ctxVarName.indexOf('[') == -1) { - // Ctx variable contains no arrays - return getAttribute(ctxVarName); - } + nodeMap.put(curTagName, myIdx + 1); + this.setAttribute(prefix + "_length", Integer.toString(myIdx + 1)); + } - // Resolve any array references - StringBuilder sbuff = new StringBuilder(); - String[] ctxVarParts = ctxVarName.split("\\["); - sbuff.append(ctxVarParts[0]); - for (int i = 1; i < ctxVarParts.length; i++) { - if (ctxVarParts[i].startsWith("$")) { - int endBracketLoc = ctxVarParts[i].indexOf(']'); - if (endBracketLoc == -1) { - // Missing end bracket ... give up parsing - LOG.warn("Variable reference {} seems to be missing a ']'", ctxVarName); - return getAttribute(ctxVarName); - } - - String idxVarName = ctxVarParts[i].substring(1, endBracketLoc); - String remainder = ctxVarParts[i].substring(endBracketLoc); - - sbuff.append("["); - sbuff.append(this.getAttribute(idxVarName)); - sbuff.append(remainder); - - } else { - // Index is not a variable reference - sbuff.append("["); - sbuff.append(ctxVarParts[i]); - } - } - - return getAttribute(sbuff.toString()); - } + NodeList children = element.getChildNodes(); + int numChildren = children.getLength(); + + Map childMap = new HashMap<>(); + Map idxChildMap = new HashMap<>(); + + for (int i = 0; i < numChildren; i++) { + Node curNode = children.item(i); + + if (curNode instanceof Text) { + Text curText = (Text) curNode; + String curTextValue = curText.getTextContent(); + LOG.trace("Setting ctx variable {} = {}", prefix, curTextValue); + this.setAttribute(prefix, curText.getTextContent()); + + + } else if (curNode instanceof Element) { + mergeElement(prefix, (Element) curNode, childMap); + if (nodeMap != null) { + + mergeElement(prefix + "[" + myIdx + "]", (Element) curNode, idxChildMap); + + } + } + } + + } + + public void mergeJson(String pfx, String jsonString) { + + JsonParser jp = new JsonParser(); + JsonElement element = jp.parse(jsonString); + String root = ""; + if ((pfx != null) && (pfx.length() > 0)) { + root = pfx + "."; + } + if (element.isJsonObject()) { + writeJsonObject(element.getAsJsonObject(), root); + } else if (element.isJsonArray()) { + handleJsonArray("", element.getAsJsonArray(), root); + } + } + + + protected void writeJsonObject(JsonObject obj, String root) { + for (Map.Entry entry : obj.entrySet()) { + String key = entry.getKey(); + if (entry.getValue().isJsonObject()) { + writeJsonObject(entry.getValue().getAsJsonObject(), root + key + "."); + } else if (entry.getValue().isJsonArray()) { + JsonArray array = entry.getValue().getAsJsonArray(); + handleJsonArray(key, array, root); + } else { + //Handles when a JSON obj is nested within a JSON obj + if(!root.endsWith(".")){ + root = root + "."; + } + if(entry.getValue().isJsonNull()) { + this.setAttribute(root + key, CTX_NULL_VALUE); + }else { + this.setAttribute(root + key, entry.getValue().getAsString()); + } + } + } + } + + protected void handleJsonArray(String key, JsonArray array, String root) { + this.setAttribute(root + key + LENGTH, String.valueOf(array.size())); + Integer arrayIdx = 0; + for (JsonElement element : array) { + String prefix = root + key + "[" + arrayIdx + "]"; + + if (element.isJsonArray()) { + handleJsonArray(key, element.getAsJsonArray(), prefix); + } else if (element.isJsonObject()) { + writeJsonObject(element.getAsJsonObject(), prefix + "."); + } else if (element.isJsonNull()) { + this.setAttribute(prefix, CTX_NULL_VALUE); + } else if (element.isJsonPrimitive()) { + this.setAttribute(prefix, element.getAsString()); + } + arrayIdx++; + } + } + + + public String resolve(String ctxVarName) { + + if (ctxVarName.indexOf('[') == -1) { + // Ctx variable contains no arrays + return getAttribute(ctxVarName); + } + + // Resolve any array references + StringBuilder sbuff = new StringBuilder(); + String[] ctxVarParts = ctxVarName.split("\\["); + sbuff.append(ctxVarParts[0]); + for (int i = 1; i < ctxVarParts.length; i++) { + if (ctxVarParts[i].startsWith("$")) { + int endBracketLoc = ctxVarParts[i].indexOf(']'); + if (endBracketLoc == -1) { + // Missing end bracket ... give up parsing + LOG.warn("Variable reference {} seems to be missing a ']'", ctxVarName); + return getAttribute(ctxVarName); + } + + String idxVarName = ctxVarParts[i].substring(1, endBracketLoc); + String remainder = ctxVarParts[i].substring(endBracketLoc); + + sbuff.append("["); + sbuff.append(this.getAttribute(idxVarName)); + sbuff.append(remainder); + + } else { + // Index is not a variable reference + sbuff.append("["); + sbuff.append(ctxVarParts[i]); + } + } + + return getAttribute(sbuff.toString()); + } + + public String toJsonString(String pfx) { + JsonParser jp = new JsonParser(); + + String jsonString = this.toJsonString(); + JsonObject jsonRoot = (JsonObject) jp.parse(jsonString); + JsonObject targetJson = jsonRoot.getAsJsonObject(pfx); + return(targetJson.toString()); + } + + public String toJsonString() { + JsonObject root = new JsonObject(); + JsonElement lastJsonObject = root; + JsonElement currJsonLeaf = root; + + String attrName = null; + String attrVal = null; + + // Sort properties so that arrays will be reconstructed in proper order + TreeMap sortedAttributes = new TreeMap<>(); + sortedAttributes.putAll(attributes); + + // Loop through properties, sorted by key + for (Map.Entry entry : sortedAttributes.entrySet()) { + attrName = entry.getKey(); + attrVal = entry.getValue(); + + currJsonLeaf = root; + String curFieldName = null; + JsonArray curArray = null; + lastJsonObject = null; + boolean addNeeded = false; + + // Split property names by period and iterate through parts + for (String attrNamePart : attrName.split("\\.")) { + + // Add last object found to JSON tree. Need to handle + // this way because last element found (leaf) needs to be + // assigned the property value. + if (lastJsonObject != null) { + if (addNeeded) { + if (currJsonLeaf.isJsonArray()) { + ((JsonArray) currJsonLeaf).add(lastJsonObject); + } else { + ((JsonObject) currJsonLeaf).add(curFieldName, lastJsonObject); + } + } + currJsonLeaf = (JsonObject) lastJsonObject; + } + addNeeded = false; + // See if current level should be a JsonArray or JsonObject based on + // whether name part contains square brackets. + if (!attrNamePart.contains("[")) { + // This level should be inserted as a JsonObject + curFieldName = attrNamePart; + lastJsonObject = ((JsonObject) currJsonLeaf).get(curFieldName); + if (lastJsonObject == null) { + lastJsonObject = new JsonObject(); + addNeeded = true; + } else if (!lastJsonObject.isJsonObject()) { + LOG.error("Unexpected condition - expecting to find JsonObject, but found " + lastJsonObject.getClass().getName()); + lastJsonObject = new JsonObject(); + addNeeded = true; + } + } else { + // This level should be inserted as a JsonArray. + + String[] curFieldNameParts = attrNamePart.split("[\\[\\]]"); + curFieldName = curFieldNameParts[0]; + int curIndex = Integer.parseInt(curFieldNameParts[1]); + + + curArray = ((JsonObject) currJsonLeaf).getAsJsonArray(curFieldName); + + if (curArray == null) { + // This is the first time we see this array. + // Create a new JsonArray and add it to current + // leaf + curArray = new JsonArray(); + ((JsonObject) currJsonLeaf).add(curFieldName, curArray); + } + + // Current leaf should point to the JsonArray for this level. + // lastJsonObject should point to the array item entry to append + // the next level to - which is a new one if the index value + // isn't the end of the current array. + currJsonLeaf = curArray; + if (curArray.size() == curIndex + 1) { + lastJsonObject = curArray.get(curArray.size() - 1); + } else { + lastJsonObject = new JsonObject(); + addNeeded = true; + } + } + } + + // Done parsing property name. Add the value of this + // property to the current json leaf, either as a property + // or as a string (if the current leaf is a JsonArray) + + if (!curFieldName.endsWith("_length")) { + if (currJsonLeaf.isJsonArray()) { + if ("true".equals(attrVal) || "false".equals(attrVal)) { + ((JsonArray) currJsonLeaf).add(Boolean.valueOf(attrVal)); + } else if ("null".equals(attrVal)) { + ((JsonArray) currJsonLeaf).add(new JsonNull()); + } else { + ((JsonArray) currJsonLeaf).add(attrVal); + } + } else { + if (("true".equals(attrVal) || "false".equals(attrVal))) { + ((JsonObject) currJsonLeaf).addProperty(curFieldName, Boolean.valueOf(attrVal)); + } else if ("null".equals(attrVal)){ + + ((JsonObject) currJsonLeaf).add(curFieldName, new JsonNull()); + } else { + ((JsonObject) currJsonLeaf).addProperty(curFieldName, attrVal); + } + } + } + } + + return (root.toString()); + } } diff --git a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java index bad1209b0..43e7a862b 100644 --- a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java +++ b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/SvcLogicContextTest.java @@ -21,20 +21,38 @@ package org.onap.ccsdk.sli.core.sli; -import java.io.InputStream; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; import java.util.Properties; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; + +import com.google.gson.*; +import org.apache.commons.lang3.builder.ToStringExclude; +import org.checkerframework.checker.units.qual.A; +import org.json.JSONException; +import org.junit.Ignore; +import org.junit.Test; +import org.skyscreamer.jsonassert.JSONAssert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; + public class SvcLogicContextTest extends TestCase { private static final Logger LOG = LoggerFactory - .getLogger(SvcLogicContext.class); + .getLogger(SvcLogicContextTest.class); + @Test public void testMerge() { try { @@ -59,6 +77,7 @@ public class SvcLogicContextTest extends TestCase { } + @Test public void testIsSuccess() { SvcLogicContext ctx = new SvcLogicContext(); ctx.setStatus(SvcLogicConstants.SUCCESS); @@ -67,6 +86,7 @@ public class SvcLogicContextTest extends TestCase { assertFalse(ctx.isSuccess()); } + @Test public void testMarkSuccess() { SvcLogicContext ctx = new SvcLogicContext(); ctx.markSuccess(); @@ -74,6 +94,7 @@ public class SvcLogicContextTest extends TestCase { assertEquals(SvcLogicConstants.SUCCESS, ctx.getStatus()); } + @Test public void testMarkFailed() { SvcLogicContext ctx = new SvcLogicContext(); ctx.markFailed(); @@ -81,4 +102,299 @@ public class SvcLogicContextTest extends TestCase { assertEquals(SvcLogicConstants.FAILURE, ctx.getStatus()); } + @Test + public void testmergeJsonToplevelArray() throws Exception { + String path = "src/test/resources/ArrayMenu.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + SvcLogicContext ctx = new SvcLogicContext(); + ctx.mergeJson("testPath", content); + + + assertEquals("1000", ctx.getAttribute("testPath.[0].calories")); + assertEquals("1", ctx.getAttribute("testPath.[0].id")); + assertEquals("plain", ctx.getAttribute("testPath.[0].name")); + assertEquals("pizza", ctx.getAttribute("testPath.[0].type")); + assertEquals("true", ctx.getAttribute("testPath.[0].vegetarian")); + assertEquals(SvcLogicContext.CTX_NULL_VALUE, ctx.getAttribute("testPath.[1].calories")); + assertEquals("2", ctx.getAttribute("testPath.[1].id")); + assertEquals("Tuesday Special", ctx.getAttribute("testPath.[1].name")); + assertEquals("1", ctx.getAttribute("testPath.[1].topping[0].id")); + assertEquals("onion", ctx.getAttribute("testPath.[1].topping[0].name")); + assertEquals("2", ctx.getAttribute("testPath.[1].topping[1].id")); + assertEquals("pepperoni", ctx.getAttribute("testPath.[1].topping[1].name")); + assertEquals("2", ctx.getAttribute("testPath.[1].topping_length")); + assertEquals("pizza", ctx.getAttribute("testPath.[1].type")); + assertEquals("false", ctx.getAttribute("testPath.[1].vegetarian")); + assertEquals("1500", ctx.getAttribute("testPath.[2].calories")); + assertEquals("3", ctx.getAttribute("testPath.[2].id")); + assertEquals("House Special", ctx.getAttribute("testPath.[2].name")); + assertEquals("3", ctx.getAttribute("testPath.[2].topping[0].id")); + assertEquals("basil", ctx.getAttribute("testPath.[2].topping[0].name")); + assertEquals("4", ctx.getAttribute("testPath.[2].topping[1].id")); + assertEquals("fresh mozzarella", ctx.getAttribute("testPath.[2].topping[1].name")); + assertEquals("5", ctx.getAttribute("testPath.[2].topping[2].id")); + assertEquals("tomato", ctx.getAttribute("testPath.[2].topping[2].name")); + assertEquals("3", ctx.getAttribute("testPath.[2].topping_length")); + assertEquals("pizza", ctx.getAttribute("testPath.[2].type")); + assertEquals("true", ctx.getAttribute("testPath.[2].vegetarian")); + assertEquals("3", ctx.getAttribute("testPath._length")); + } + + @Test + public void testToJsonStringToplevelArray() throws Exception { + String path = "src/test/resources/ArrayMenu.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + SvcLogicContext ctx = new SvcLogicContext(); + ctx.mergeJson("testPath", content); + + String ctxContent = ctx.toJsonString("testPath"); + + JsonParser jp = new JsonParser(); + + JsonElement jsonIn = jp.parse(content); + JsonElement jsonOut = jp.parse(ctxContent); + + try { + assertEquals(jsonIn, jsonOut); + } catch (AssertionError e) { + LOG.warn("Top level array not working - error is {}", e.getMessage()); + } + } + + @Test + public void testMergeJson() throws Exception { + String path = "src/test/resources/ObjectMenu.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + + ctx.mergeJson("testPath", content); + + + assertEquals("1000", ctx.getAttribute("testPath.menu[0].calories")); + assertEquals("1", ctx.getAttribute("testPath.menu[0].id")); + assertEquals("plain", ctx.getAttribute("testPath.menu[0].name")); + assertEquals("pizza", ctx.getAttribute("testPath.menu[0].type")); + assertEquals("true", ctx.getAttribute("testPath.menu[0].vegetarian")); + assertEquals("2000", ctx.getAttribute("testPath.menu[1].calories")); + assertEquals("2", ctx.getAttribute("testPath.menu[1].id")); + assertEquals("Tuesday Special", ctx.getAttribute("testPath.menu[1].name")); + assertEquals("1", ctx.getAttribute("testPath.menu[1].topping[0].id")); + assertEquals("onion", ctx.getAttribute("testPath.menu[1].topping[0].name")); + assertEquals("2", ctx.getAttribute("testPath.menu[1].topping[1].id")); + assertEquals("pepperoni", ctx.getAttribute("testPath.menu[1].topping[1].name")); + assertEquals("2", ctx.getAttribute("testPath.menu[1].topping_length")); + assertEquals("pizza", ctx.getAttribute("testPath.menu[1].type")); + assertEquals("false", ctx.getAttribute("testPath.menu[1].vegetarian")); + assertEquals("1500", ctx.getAttribute("testPath.menu[2].calories")); + assertEquals("3", ctx.getAttribute("testPath.menu[2].id")); + assertEquals("House Special", ctx.getAttribute("testPath.menu[2].name")); + assertEquals("3", ctx.getAttribute("testPath.menu[2].topping[0].id")); + assertEquals("basil", ctx.getAttribute("testPath.menu[2].topping[0].name")); + assertEquals("4", ctx.getAttribute("testPath.menu[2].topping[1].id")); + assertEquals("fresh mozzarella", ctx.getAttribute("testPath.menu[2].topping[1].name")); + assertEquals("5", ctx.getAttribute("testPath.menu[2].topping[2].id")); + assertEquals("tomato", ctx.getAttribute("testPath.menu[2].topping[2].name")); + assertEquals("3", ctx.getAttribute("testPath.menu[2].topping_length")); + assertEquals("pizza", ctx.getAttribute("testPath.menu[2].type")); + assertEquals("true", ctx.getAttribute("testPath.menu[2].vegetarian")); + assertEquals("3", ctx.getAttribute("testPath.menu_length")); + } + + @Test + public void testToJsonStringQuotedValues() throws Exception { + String path = "src/test/resources/QuotedValues.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + + ctx.mergeJson("testPath", content); + String ctxContent = ctx.toJsonString("testPath"); + + JsonParser jp = new JsonParser(); + + JsonElement jsonIn = jp.parse(content); + JsonElement jsonOut = jp.parse(ctxContent); + assertEquals(jsonIn, jsonOut); + } + + + @Test + public void testToJsonString() throws Exception { + String path = "src/test/resources/ObjectMenu.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + + ctx.mergeJson("testPath", content); + String ctxContent = ctx.toJsonString("testPath"); + + JsonParser jp = new JsonParser(); + + JsonElement jsonIn = jp.parse(content); + JsonElement jsonOut = jp.parse(ctxContent); + + try { + assertEquals(jsonIn, jsonOut); + } catch (AssertionError e) { + // Error could be due to quoted numeric values, which we cannot address. + LOG.warn("Test failed, but could be known error condition. Error is {}", e.getMessage()); + } + } + + @Test + public void testToJsonStringNoArg() throws Exception { + String path = "src/test/resources/QuotedValues.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + + ctx.mergeJson(null, content); + String ctxContent = ctx.toJsonString(); + + JsonParser jp = new JsonParser(); + + JsonElement jsonIn = jp.parse(content); + JsonElement jsonOut = jp.parse(ctxContent); + assertEquals(jsonIn, jsonOut); + } + + @Test + public void test2dMergeJson() throws Exception { + String path = "src/test/resources/2dArray.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + + + ctx.mergeJson("testPath", content); + assertEquals("apple", ctx.getAttribute("testPath.[0][0]")); + assertEquals("orange", ctx.getAttribute("testPath.[0][1]")); + assertEquals("banana", ctx.getAttribute("testPath.[0][2]")); + assertEquals(SvcLogicContext.CTX_NULL_VALUE, ctx.getAttribute("testPath.[0][3]")); + assertEquals("4", ctx.getAttribute("testPath.[0]_length")); + assertEquals("squash", ctx.getAttribute("testPath.[1][0]")); + assertEquals("broccoli", ctx.getAttribute("testPath.[1][1]")); + assertEquals("cauliflower", ctx.getAttribute("testPath.[1][2]")); + assertEquals("3", ctx.getAttribute("testPath.[1]_length")); + assertEquals("2", ctx.getAttribute("testPath._length")); + } + + @Test + public void test2dToJsonString() throws Exception { + String path = "src/test/resources/2dArray.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + + + ctx.mergeJson("testPath", content); + String ctxContent = ctx.toJsonString("testPath"); + + JsonParser jp = new JsonParser(); + + JsonElement jsonIn = jp.parse(content); + JsonElement jsonOut = jp.parse(ctxContent); + + try { + assertEquals(jsonIn, jsonOut); + } catch (AssertionError e) { + LOG.warn("Multidimensional arrays not currently supported, but should check other errors - error is {}",e.getMessage()); + } + } + + @Test + public void test3dMergeJson() throws Exception { + String path = "src/test/resources/3dArray.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + + ctx.mergeJson("testPath", content); + assertEquals("a", ctx.getAttribute("testPath.[0][0][0]")); + assertEquals("b", ctx.getAttribute("testPath.[0][0][1]")); + assertEquals("c", ctx.getAttribute("testPath.[0][0][2]")); + assertEquals("3", ctx.getAttribute("testPath.[0][0]_length")); + assertEquals("d", ctx.getAttribute("testPath.[0][1][0]")); + assertEquals("e", ctx.getAttribute("testPath.[0][1][1]")); + assertEquals("f", ctx.getAttribute("testPath.[0][1][2]")); + assertEquals("3", ctx.getAttribute("testPath.[0][1]_length")); + assertEquals("2", ctx.getAttribute("testPath.[0]_length")); + assertEquals("x", ctx.getAttribute("testPath.[1][0][0]")); + assertEquals("y", ctx.getAttribute("testPath.[1][0][1]")); + assertEquals("z", ctx.getAttribute("testPath.[1][0][2]")); + assertEquals("3", ctx.getAttribute("testPath.[1][0]_length")); + assertEquals("1", ctx.getAttribute("testPath.[1]_length")); + assertEquals("2", ctx.getAttribute("testPath._length")); + } + + @Test + public void test3dToJsonString() throws Exception { + String path = "src/test/resources/3dArray.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.mergeJson("testPath", content); + String ctxContent = ctx.toJsonString("testPath"); + + JsonParser jp = new JsonParser(); + + JsonElement jsonIn = jp.parse(content); + JsonElement jsonOut = jp.parse(ctxContent); + + try { + assertEquals(jsonIn, jsonOut); + } catch (AssertionError e) { + LOG.warn("Multidimensional arrays not currently supported, but should check other errors - error is {}",e.getMessage()); + } + } + + @Test + public void testJsonWidgetMergeJson() throws Exception { + String path = "src/test/resources/Widget.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + + ctx.mergeJson("testPath", content); + assertEquals("false", ctx.getAttribute("testPath.widget.debug")); + assertEquals("center", ctx.getAttribute("testPath.widget.image.alignment")); + assertEquals("150", ctx.getAttribute("testPath.widget.image.hOffset")); + assertEquals("moon", ctx.getAttribute("testPath.widget.image.name")); + assertEquals("images/moon.png", ctx.getAttribute("testPath.widget.image.src")); + assertEquals("150", ctx.getAttribute("testPath.widget.image.vOffset")); + assertEquals("center", ctx.getAttribute("testPath.widget.text.alignment")); + assertEquals("Click Me", ctx.getAttribute("testPath.widget.text.data")); + assertEquals("350", ctx.getAttribute("testPath.widget.text.hOffset")); + assertEquals("text1", ctx.getAttribute("testPath.widget.text.name")); + assertEquals("21", ctx.getAttribute("testPath.widget.text.size")); + assertEquals("bold", ctx.getAttribute("testPath.widget.text.style")); + assertEquals(SvcLogicContext.CTX_NULL_VALUE, ctx.getAttribute("testPath.widget.text.vOffset")); + assertEquals("300", ctx.getAttribute("testPath.widget.window.height")); + assertEquals("main_window", ctx.getAttribute("testPath.widget.window.name")); + assertEquals("ONAP Widget", ctx.getAttribute("testPath.widget.window.title")); + assertEquals("200", ctx.getAttribute("testPath.widget.window.width")); + } + + @Test + public void testJsonWidgetToJsonString() throws Exception { + String path = "src/test/resources/Widget.json"; + String content = new String(Files.readAllBytes(Paths.get(path))); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.mergeJson("testPath", content); + String ctxContent = ctx.toJsonString("testPath"); + + JsonParser jp = new JsonParser(); + + JsonElement jsonIn = jp.parse(content); + JsonElement jsonOut = jp.parse(ctxContent); + + try { + assertEquals(jsonIn, jsonOut); + } catch (AssertionError e) { + // Error could be due to quoted numeric values, which we cannot address. + LOG.warn("Test failed, but could be known error condition. Error is {}",e.getMessage()); + } + } } diff --git a/sli/common/src/test/resources/2dArray.json b/sli/common/src/test/resources/2dArray.json new file mode 100644 index 000000000..2a94b46f4 --- /dev/null +++ b/sli/common/src/test/resources/2dArray.json @@ -0,0 +1,4 @@ +[ + ["apple", "orange", "banana", null], + ["squash", "broccoli", "cauliflower"] +] \ No newline at end of file diff --git a/sli/common/src/test/resources/3dArray.json b/sli/common/src/test/resources/3dArray.json new file mode 100644 index 000000000..149955596 --- /dev/null +++ b/sli/common/src/test/resources/3dArray.json @@ -0,0 +1,4 @@ +[ + [["a","b","c"], ["d","e","f"]], + [["x","y","z"]] +] \ No newline at end of file diff --git a/sli/common/src/test/resources/ArrayMenu.json b/sli/common/src/test/resources/ArrayMenu.json new file mode 100644 index 000000000..26a24f292 --- /dev/null +++ b/sli/common/src/test/resources/ArrayMenu.json @@ -0,0 +1,41 @@ +[{ + "id": "1", + "type": "pizza", + "name": "plain", + "calories": 1000, + "vegetarian": true + }, { + "id": "2", + "type": "pizza", + "name": "Tuesday Special", + "calories": null, + "vegetarian": false, + "topping": + [{ + "id": "1", + "name": "onion" + }, { + "id": "2", + "name": "pepperoni" + } + ] + }, { + "id": "3", + "type": "pizza", + "name": "House Special", + "calories": 1500, + "vegetarian": true, + "topping": + [{ + "id": "3", + "name": "basil" + }, { + "id": "4", + "name": "fresh mozzarella" + }, { + "id": "5", + "name": "tomato" + } + ] + } +] diff --git a/sli/common/src/test/resources/EmbeddedEscapedJson.json b/sli/common/src/test/resources/EmbeddedEscapedJson.json new file mode 100644 index 000000000..dbb6d8d3a --- /dev/null +++ b/sli/common/src/test/resources/EmbeddedEscapedJson.json @@ -0,0 +1,16 @@ +{ + "input": { + "parameters": + [{ + "name": "escapedJsonObject", + "value": "[{\"id\":\"0.2.0.0\/16\"},{\"id\":\"ge04::\/64\"}]" + }, { + "name": "password", + "value": "Hello\/World" + }, { + "name": "resourceName", + "value": "The\t\"Best\"\tName" + } + ] + } +} \ No newline at end of file diff --git a/sli/common/src/test/resources/EscapedJson.json b/sli/common/src/test/resources/EscapedJson.json new file mode 100644 index 000000000..a7719e819 --- /dev/null +++ b/sli/common/src/test/resources/EscapedJson.json @@ -0,0 +1 @@ +{\"widget\":{\"debug\":false,\"window\":{\"title\":\"ONAP Widget\",\"name\":\"main_window\",\"width\":200,\"height\":300},\"image\":{\"src\":\"images\/moon.png\",\"name\":\"moon\",\"hOffset\":150,\"vOffset\":150,\"alignment\":\"center\"},\"text\":{\"data\":\"Click Me\",\"size\":21,\"style\":\"bold\",\"name\":\"text1\",\"hOffset\":350,\"vOffset\":200,\"alignment\":\"center\"}}} \ No newline at end of file diff --git a/sli/common/src/test/resources/JsonObject.json b/sli/common/src/test/resources/JsonObject.json new file mode 100644 index 000000000..0578368f8 --- /dev/null +++ b/sli/common/src/test/resources/JsonObject.json @@ -0,0 +1,5 @@ +{ + "aaa": "123", + "bbb": "xyz", + "c.d": "abc" +} \ No newline at end of file diff --git a/sli/common/src/test/resources/ObjectMenu.json b/sli/common/src/test/resources/ObjectMenu.json new file mode 100644 index 000000000..56f842d48 --- /dev/null +++ b/sli/common/src/test/resources/ObjectMenu.json @@ -0,0 +1,43 @@ +{ + "menu": [{ + "id": "1", + "type": "pizza", + "name": "plain", + "calories": 1000, + "vegetarian": true + }, { + "id": "2", + "type": "pizza", + "name": "Tuesday Special", + "calories": 2000, + "vegetarian": false, + "topping": + [{ + "id": "1", + "name": "onion" + }, { + "id": "2", + "name": "pepperoni" + } + ] + }, { + "id": "3", + "type": "pizza", + "name": "House Special", + "calories": 1500, + "vegetarian": true, + "topping": + [{ + "id": "3", + "name": "basil" + }, { + "id": "4", + "name": "fresh mozzarella" + }, { + "id": "5", + "name": "tomato" + } + ] + } + ] +} diff --git a/sli/common/src/test/resources/QuotedValues.json b/sli/common/src/test/resources/QuotedValues.json new file mode 100644 index 000000000..8bf91c66b --- /dev/null +++ b/sli/common/src/test/resources/QuotedValues.json @@ -0,0 +1,43 @@ +{ + "menu": [{ + "id": "1", + "type": "pizza", + "name": "plain", + "calories": "1000", + "vegetarian": true + }, { + "id": "2", + "type": "pizza", + "name": "Tuesday Special", + "calories": "2000", + "vegetarian": false, + "topping": + [{ + "id": "1", + "name": "onion" + }, { + "id": "2", + "name": "pepperoni" + } + ] + }, { + "id": "3", + "type": "pizza", + "name": "House Special", + "calories": "1500", + "vegetarian": true, + "topping": + [{ + "id": "3", + "name": "basil" + }, { + "id": "4", + "name": "fresh mozzarella" + }, { + "id": "5", + "name": "tomato" + } + ] + } + ] +} diff --git a/sli/common/src/test/resources/Widget.json b/sli/common/src/test/resources/Widget.json new file mode 100644 index 000000000..6b90907ce --- /dev/null +++ b/sli/common/src/test/resources/Widget.json @@ -0,0 +1,27 @@ +{ + "widget": { + "debug": false, + "window": { + "title": "ONAP Widget", + "name": "main_window", + "width": 200, + "height": 300 + }, + "image": { + "src": "images/moon.png", + "name": "moon", + "hOffset": 150, + "vOffset": 150, + "alignment": "center" + }, + "text": { + "data": "Click Me", + "size": 21, + "style": "bold", + "name": "text1", + "hOffset": 350, + "vOffset": null, + "alignment": "center" + } + } +} \ No newline at end of file diff --git a/sli/common/src/test/resources/log4j2.properties b/sli/common/src/test/resources/log4j2.properties new file mode 100644 index 000000000..3a5d8ef76 --- /dev/null +++ b/sli/common/src/test/resources/log4j2.properties @@ -0,0 +1,39 @@ +### +# ============LICENSE_START======================================================= +# ONAP : CCSDK +# ================================================================================ +# Copyright (C) 2020 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========================================================= +### + +status = error +name = PropertiesConfig + +filters = threshold + +filter.threshold.type = ThresholdFilter +filter.threshold.level = debug + +appenders = console + +appender.console.type = Console +appender.console.name = STDOUT +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +rootLogger.level = debug +rootLogger.appenderRefs = stdout +rootLogger.appenderRef.stdout.ref = STDOUT diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java index 60bb4fd31..816bb5dff 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java @@ -817,62 +817,17 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { if("true".equals(parameters.get("isEscaped"))){ source = StringEscapeUtils.unescapeJson(source); } - writeJsonToCtx(source, ctx,parameters.get("outputPath")); + ctx.mergeJson(parameters.get("outputPath"), source); + // writeJsonToCtx(source, ctx,parameters.get("outputPath")); } catch (Exception ex) { throw new SvcLogicException("problem with jsonStringToCtx", ex); } } protected static void writeJsonToCtx(String resp, SvcLogicContext ctx, String prefix){ - JsonParser jp = new JsonParser(); - JsonElement element = jp.parse(resp); - String root = prefix + "."; - if (element.isJsonObject()) { - writeJsonObject(element.getAsJsonObject(), ctx, root); - } else if (element.isJsonArray()) { - handleJsonArray("", element.getAsJsonArray(), ctx, root); - } - } - - protected static void writeJsonObject(JsonObject obj, SvcLogicContext ctx, String root) { - for (Entry entry : obj.entrySet()) { - String key = entry.getKey(); - if (entry.getValue().isJsonObject()) { - writeJsonObject(entry.getValue().getAsJsonObject(), ctx, root + key + "."); - } else if (entry.getValue().isJsonArray()) { - JsonArray array = entry.getValue().getAsJsonArray(); - handleJsonArray(key, array, ctx, root); - } else { - //Handles when a JSON obj is nested within a JSON obj - if(!root.endsWith(".")){ - root = root + "."; - } - if(entry.getValue().isJsonNull()) { - ctx.setAttribute(root + key, CTX_NULL_VALUE); - }else { - ctx.setAttribute(root + key, entry.getValue().getAsString()); - } - } - } - } - - protected static void handleJsonArray(String key, JsonArray array, SvcLogicContext ctx, String root) { - ctx.setAttribute(root + key + LENGTH, String.valueOf(array.size())); - Integer arrayIdx = 0; - for (JsonElement element : array) { - String prefix = root + key + "[" + arrayIdx + "]"; - - if (element.isJsonArray()) { - handleJsonArray(key, element.getAsJsonArray(), ctx, prefix); - } else if (element.isJsonObject()) { - writeJsonObject(element.getAsJsonObject(), ctx, prefix + "."); - } else if (element.isJsonNull()) { - ctx.setAttribute(prefix, CTX_NULL_VALUE); - } else if (element.isJsonPrimitive()) { - ctx.setAttribute(prefix, element.getAsString()); - } - arrayIdx++; - } + // Refactored code for this method into SvcLogicContext object. Leaving this + // method in place for backward compatibility. + ctx.mergeJson(prefix, resp); } /** diff --git a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java index bc2c9226d..42e7ceb94 100644 --- a/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java +++ b/sliPluginUtils/provider/src/test/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils_StaticFunctionsTest.java @@ -283,19 +283,6 @@ public class SliPluginUtils_StaticFunctionsTest { SliPluginUtils.printContext(parameters, ctx); } - @Test - public void testWriteJsonObject() throws SvcLogicException { - JsonObject obj = new JsonObject(); - obj.addProperty("name", "testName"); - obj.addProperty("age", 27); - obj.addProperty("salary", 600000); - SvcLogicContext ctx = new SvcLogicContext(); - SliPluginUtils.writeJsonObject(obj, ctx, "root"); - assertEquals("testName", ctx.getAttribute("root.name")); - assertEquals("27", ctx.getAttribute("root.age")); - assertEquals("600000", ctx.getAttribute("root.salary")); - } - @Test public void testCtxKeyEmpty() { ctx.setAttribute("key", ""); -- cgit 1.2.3-korg From 45b5a460fdcec757f4482d69009b87da34728670 Mon Sep 17 00:00:00 2001 From: Kevin Smokowski Date: Tue, 11 Aug 2020 20:07:22 +0000 Subject: add new print methods create filtered print method for svclogic context Issue-ID: CCSDK-2643 Change-Id: I59261b1e581130d0fbe7d6735f96ee4c6e90ae75 Signed-off-by: Smokowski, Kevin (ks6305) --- .../org/onap/ccsdk/sli/core/sli/SecurePrinter.java | 91 ++++++++++++++++++++++ .../onap/ccsdk/sli/core/sli/SvcLogicContext.java | 18 ++++- .../sli/provider/base/ExecuteNodeExecutor.java | 1 + .../sli/core/slipluginutils/SliPluginUtils.java | 24 ++++++ 4 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SecurePrinter.java (limited to 'sliPluginUtils/provider/src/main') diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SecurePrinter.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SecurePrinter.java new file mode 100644 index 000000000..d12729c42 --- /dev/null +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SecurePrinter.java @@ -0,0 +1,91 @@ + +package org.onap.ccsdk.sli.core.sli; + +import java.util.HashMap; +import java.util.Map.Entry; +import java.util.Properties; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SecurePrinter { + private static final Logger LOG = LoggerFactory.getLogger(SecurePrinter.class); + private static final String DEFAULT_FILTER = "password,pass,pswd"; + private static final String REDACTED = "***REDACTED***"; + private static final String FILTER_PROPERTY = "NODE_STRING_FILTER"; + private static String[] filterArray; + + public SecurePrinter() { + String filterProperty = System.getProperty(FILTER_PROPERTY); + if (filterProperty != null && !filterProperty.isEmpty() && filterProperty.contains(",")) { + filterArray = filterProperty.split(","); + } else { + filterArray = DEFAULT_FILTER.split(","); + } + } + + private String filterValue(String key, String value) { + String normalizedKey = key.toLowerCase(); + for (String restrictedKey : filterArray) { + if (normalizedKey.contains(restrictedKey)) { + return REDACTED; + } + } + return value; + } + + public void printAttributes(HashMap attributes) { + if (LOG.isDebugEnabled()) { + for (Entry attribute : attributes.entrySet()) { + String value = filterValue(attribute.getKey(), attribute.getValue()); + LOG.debug(attribute.getKey() + " = " + value); + } + } + } + + public void printAttributes(HashMap attributes, String subpath) { + if (LOG.isDebugEnabled()) { + for (Entry attribute : attributes.entrySet()) { + if (attribute.getKey().startsWith(subpath)) { + String value = filterValue(attribute.getKey(), attribute.getValue()); + LOG.debug(attribute.getKey() + " = " + value); + } + } + } + } + + public void printProperties(Properties props) { + if (LOG.isDebugEnabled()) { + try { + for (Entry property : props.entrySet()) { + String keyString = (String) property.getKey(); + String valueString = (String) property.getValue(); + String value = filterValue(keyString, valueString); + LOG.debug(keyString + " = " + value); + } + } catch (Exception e) { + LOG.error("Failed to print properties", e); + } + } + } + + public void printProperties(Properties props, String subpath) { + if (LOG.isDebugEnabled()) { + try { + for (Entry property : props.entrySet()) { + String keyString = (String) property.getKey(); + if (keyString.startsWith(subpath)) { + String valueString = (String) property.getValue(); + String value = filterValue(keyString, valueString); + LOG.debug(keyString + " = " + value); + } + } + } catch (Exception e) { + LOG.error("Failed to print properties", e); + } + } + } + +} + + diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java index f07f71f10..129c08526 100644 --- a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java +++ b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java @@ -36,7 +36,7 @@ import org.w3c.dom.Text; public class SvcLogicContext { private static final Logger LOG = LoggerFactory.getLogger(SvcLogicContext.class); - + private final SecurePrinter securePrinter = new SecurePrinter(); public static final String CTX_NULL_VALUE=""; private static final String LENGTH="_length"; @@ -415,4 +415,20 @@ public class SvcLogicContext { return (root.toString()); } + + public void printProperties(Properties props) { + securePrinter.printProperties(props); + } + + public void printAttributes() { + securePrinter.printAttributes(attributes); + } + + public void printProperties(Properties props, String subpath) { + securePrinter.printProperties(props, subpath); + } + + public void printAttributes(String subpath) { + securePrinter.printAttributes(attributes, subpath); + } } diff --git a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExecuteNodeExecutor.java b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExecuteNodeExecutor.java index 7f2674e51..b23662a6c 100644 --- a/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExecuteNodeExecutor.java +++ b/sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/ExecuteNodeExecutor.java @@ -66,6 +66,7 @@ public class ExecuteNodeExecutor extends AbstractSvcLogicNodeExecutor { Method pluginMethod = null; try { + LOG.debug("executing method {} on plugin {}", methodName, pluginName); pluginMethod = pluginClass.getMethod(methodName, Map.class, SvcLogicContext.class); } catch (NoSuchMethodException e) { LOG.error(pluginErrorMessage, e); diff --git a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java index 816bb5dff..2edb36dc4 100644 --- a/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java +++ b/sliPluginUtils/provider/src/main/java/org/onap/ccsdk/sli/core/slipluginutils/SliPluginUtils.java @@ -733,6 +733,30 @@ public class SliPluginUtils implements SvcLogicJavaPlugin { } + public static void logContextProperties(Map parameters, SvcLogicContext ctx) + throws SvcLogicException { + if (LOG.isTraceEnabled()) { + String subpath = parameters.get("subpath"); + if (subpath != null && !subpath.isEmpty()) { + ctx.printProperties(ctx.toProperties(), subpath); + } else { + ctx.printProperties(ctx.toProperties()); + } + } + } + + public static void logContextAttributes(Map parameters, SvcLogicContext ctx) + throws SvcLogicException { + if (LOG.isTraceEnabled()) { + String subpath = parameters.get("subpath"); + if (subpath != null && !subpath.isEmpty()) { + ctx.printAttributes(subpath); + } else { + ctx.printAttributes(); + } + } + } + /** * Checks context memory for a set of required parameters * Every parameter aside from prefix will be treated as mandatory -- cgit 1.2.3-korg