Convert sql-resource provider to blueprint 93/34893/3
authorRich Tabedzki <richard.tabedzki@att.com>
Fri, 9 Mar 2018 04:28:34 +0000 (04:28 +0000)
committerRich Tabedzki <richard.tabedzki@att.com>
Fri, 16 Mar 2018 19:04:53 +0000 (19:04 +0000)
Changes made:
* Updated SqlResource class to include data members referenced in blueprint.xml
* Added SqlResourceProvider class to resolve properties file
* Added sql-resource-blueprint.xml
* Removed SqlResource Activator
* Added unit test for SqlResourceProvider

Change-Id: Ia2bcc241c3c063176ac2b986f603a1915ba105b2
Issue-ID: CCSDK-206
Signed-off-by: Rich Tabedzki <richard.tabedzki@att.com>
sql-resource/provider/pom.xml
sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResource.java [changed mode: 0644->0755]
sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourceActivator.java [deleted file]
sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourcePropertiesProvider.java [new file with mode: 0755]
sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourcePropertiesProviderImpl.java [new file with mode: 0755]
sql-resource/provider/src/main/resources/org/opendaylight/blueprint/sql-resource-blueprint.xml [new file with mode: 0755]
sql-resource/provider/src/main/resources/sql-resource.properties [new file with mode: 0755]
sql-resource/provider/src/main/resources/svclogic.properties
sql-resource/provider/src/test/java/org/onap/ccsdk/sli/adaptors/resource/sql/ITCaseSqlResource.java [changed mode: 0644->0755]
sql-resource/provider/src/test/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourceProviderTest.java [new file with mode: 0755]
sql-resource/provider/src/test/resources/sql-resource.properties [new file with mode: 0755]

index c72c904..e9b68be 100755 (executable)
         <dependency>
             <groupId>equinoxSDK381</groupId>
             <artifactId>org.eclipse.osgi</artifactId>
+                       <version>${equinox.osgi.version}</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
             <version>${slf4j.version}</version>
         </dependency>
-
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>jcl-over-slf4j</artifactId>
+                       <version>${slf4j.version}</version>
+               </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-simple</artifactId>
old mode 100644 (file)
new mode 100755 (executable)
index b2b77b5..869b898
@@ -3,7 +3,7 @@
  * openECOMP : SDN-C
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights
- *                     reserved.
+ *             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -42,7 +42,6 @@ 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.SvcLogicResource;
-import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.FrameworkUtil;
@@ -52,361 +51,382 @@ import org.slf4j.LoggerFactory;
 
 public class SqlResource implements SvcLogicResource, SvcLogicJavaPlugin {
 
-       private static final Logger LOG = LoggerFactory.getLogger(SqlResource.class);
-
-       private static final String DBLIB_SERVICE = "org.onap.ccsdk.sli.core.dblib.DbLibService";
-
-       private static String CRYPT_KEY = "";
-
-       public SqlResource() {
-       }
-
-       // For sql-resource, is-available is the same as exists
-       @Override
-       public QueryStatus isAvailable(String resource, String key, String prefix, SvcLogicContext ctx)
-                       throws SvcLogicException {
-
-               return (exists(resource, key, prefix, ctx));
-
-       }
-
-       @Override
-       public QueryStatus exists(String resource, String key, String prefix, SvcLogicContext ctx)
-                       throws SvcLogicException {
-
-               DbLibService dblibSvc = getDbLibService();
-               if (dblibSvc == null) {
-                       return (QueryStatus.FAILURE);
-               }
-
-               String theStmt = resolveCtxVars(key, ctx);
-
-               try {
-                       CachedRowSet results = dblibSvc.getData(theStmt, null, null);
-
-                       if (!results.next()) {
-                               return (QueryStatus.NOT_FOUND);
-                       }
-
-                       int numRows = results.getInt(1);
-
-                       if (numRows > 0) {
-                               return (QueryStatus.SUCCESS);
-                       } else {
-                               return (QueryStatus.NOT_FOUND);
-                       }
-               } catch (Exception e) {
-                       LOG.error("Caught SQL exception", e);
-                       return (QueryStatus.FAILURE);
-               }
-       }
-
-       // @Override
-       public QueryStatus query(String resource, boolean localOnly, String select, String key, String prefix,
-                       String orderBy, SvcLogicContext ctx) throws SvcLogicException {
-
-               DbLibService dblibSvc = getDbLibService();
-
-               if (dblibSvc == null) {
-                       return (QueryStatus.FAILURE);
-               }
-
-               String sqlQuery = resolveCtxVars(key, ctx);
-
-               try {
-
-                       CachedRowSet results = dblibSvc.getData(sqlQuery, null, null);
-
-                       QueryStatus retval = QueryStatus.SUCCESS;
-
-                       if (!results.next()) {
-                               retval = QueryStatus.NOT_FOUND;
-                               LOG.debug("No data found");
-                       } else {
-                               saveCachedRowSetToCtx(results, ctx, prefix, dblibSvc);
-                       }
-                       return (retval);
-               } catch (Exception e) {
-                       LOG.error("Caught SQL exception", e);
-                       return (QueryStatus.FAILURE);
-               }
-       }
-
-       public void saveCachedRowSetToCtx(CachedRowSet results, SvcLogicContext ctx, String prefix, DbLibService dblibSvc)
-                       throws SQLException {
-               if (ctx != null) {
-                       if ((prefix != null) && prefix.endsWith("[]")) {
-                               // Return an array.
-                               String pfx = prefix.substring(0, prefix.length() - 2);
-                               int idx = 0;
-                               do {
-                                       ResultSetMetaData rsMeta = results.getMetaData();
-                                       int numCols = rsMeta.getColumnCount();
-
-                                       for (int i = 0; i < numCols; i++) {
-                                               String colValue = null;
-                                               String tableName = rsMeta.getTableName(i + 1);
-                                               if (rsMeta.getColumnType(i + 1) == java.sql.Types.VARBINARY) {
-                                                       colValue = decryptColumn(tableName, rsMeta.getColumnName(i + 1), results.getBytes(i + 1),
-                                                                       dblibSvc);
-                                               } else {
-                                                       colValue = results.getString(i + 1);
-                                               }
-                                               LOG.debug("Setting " + pfx + "[" + idx + "]."
-                                                               + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-") + " = " + colValue);
-                                               ctx.setAttribute(pfx + "[" + idx + "]." + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-"),
-                                                               colValue);
-                                       }
-                                       idx++;
-                               } while (results.next());
-                               LOG.debug("Setting " + pfx + "_length = " + idx);
-                               ctx.setAttribute(pfx + "_length", "" + idx);
-                       } else {
-                               ResultSetMetaData rsMeta = results.getMetaData();
-                               int numCols = rsMeta.getColumnCount();
-
-                               for (int i = 0; i < numCols; i++) {
-                                       String colValue = null;
-                                       String tableName = rsMeta.getTableName(i + 1);
-                                       if ("VARBINARY".equalsIgnoreCase(rsMeta.getColumnTypeName(i + 1))) {
-                                               colValue = decryptColumn(tableName, rsMeta.getColumnName(i + 1), results.getBytes(i + 1),
-                                                               dblibSvc);
-                                       } else {
-                                               colValue = results.getString(i + 1);
-                                       }
-                                       if (prefix != null) {
-                                               LOG.debug("Setting " + prefix + "." + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-") + " = "
-                                                               + colValue);
-                                               ctx.setAttribute(prefix + "." + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-"), colValue);
-                                       } else {
-                                               LOG.debug("Setting " + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-") + " = " + colValue);
-                                               ctx.setAttribute(rsMeta.getColumnLabel(i + 1).replaceAll("_", "-"), colValue);
-                                       }
-                               }
-                       }
-               }
-       }
-
-       // reserve is no-op
-       @Override
-       public QueryStatus reserve(String resource, String select, String key, String prefix, SvcLogicContext ctx)
-                       throws SvcLogicException {
-               return (QueryStatus.SUCCESS);
-       }
-
-       // release is no-op
-       @Override
-       public QueryStatus release(String resource, String key, SvcLogicContext ctx) throws SvcLogicException {
-               return (QueryStatus.SUCCESS);
-       }
-
-       private QueryStatus executeSqlWrite(String key, SvcLogicContext ctx) throws SvcLogicException {
-               QueryStatus retval = QueryStatus.SUCCESS;
-
-               DbLibService dblibSvc = getDbLibService();
-
-               if (dblibSvc == null) {
-                       return (QueryStatus.FAILURE);
-               }
-
-               String sqlStmt = resolveCtxVars(key, ctx);
-
-               LOG.debug("key = [" + key + "]; sqlStmt = [" + sqlStmt + "]");
-               try {
-
-                       if (!dblibSvc.writeData(sqlStmt, null, null)) {
-                               retval = QueryStatus.FAILURE;
-                       }
-               } catch (Exception e) {
-                       LOG.error("Caught SQL exception", e);
-                       retval = QueryStatus.FAILURE;
-               }
-
-               return (retval);
-
-       }
-
-       private String resolveCtxVars(String key, SvcLogicContext ctx) {
-               if (key == null) {
-                       return (null);
-               }
-
-               if (key.startsWith("'") && key.endsWith("'")) {
-                       key = key.substring(1, key.length() - 1);
-                       LOG.debug("Stripped outer single quotes - key is now [" + key + "]");
-               }
-
-               String[] keyTerms = key.split("\\s+");
-
-               StringBuffer sqlBuffer = new StringBuffer();
-
-               for (int i = 0; i < keyTerms.length; i++) {
-                       sqlBuffer.append(resolveTerm(keyTerms[i], ctx));
-                       sqlBuffer.append(" ");
-               }
-
-               return (sqlBuffer.toString());
-       }
-
-       private String resolveTerm(String term, SvcLogicContext ctx) {
-               if (term == null) {
-                       return (null);
-               }
-
-               LOG.trace("resolveTerm: term is " + term);
-
-               if (term.startsWith("$") && (ctx != null)) {
-                       // Resolve any index variables.
-                       term = resolveCtxVariable(term.substring(1), ctx);
-                       // Escape single quote
-                       if (term != null) {
-                               term = term.replaceAll("'", "''");
-                       }
-                       return ("'" + term + "'");
-               } else {
-                       return (term);
-               }
-
-       }
-
-       private String resolveCtxVariable(String ctxVarName, SvcLogicContext ctx) {
-
-               if (ctxVarName.indexOf('[') == -1) {
-                       // Ctx variable contains no arrays
-                       if ("CRYPT_KEY".equals(ctxVarName)) {
-                               // Handle crypt key as special case. If it's set as a context
-                               // variable, use it. Otherwise, use
-                               // configured crypt key.
-                               String cryptKey = ctx.getAttribute(ctxVarName);
-                               if ((cryptKey != null) && (cryptKey.length() > 0)) {
-                                       return (cryptKey);
-                               } else {
-                                       return (CRYPT_KEY);
-                               }
-                       }
-                       return (ctx.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 (ctx.getAttribute(ctxVarName));
-                               }
-
-                               String idxVarName = ctxVarParts[i].substring(1, endBracketLoc);
-                               String remainder = ctxVarParts[i].substring(endBracketLoc);
-
-                               sbuff.append("[");
-                               sbuff.append(ctx.getAttribute(idxVarName));
-                               sbuff.append(remainder);
-
-                       } else {
-                               // Index is not a variable reference
-                               sbuff.append("[");
-                               sbuff.append(ctxVarParts[i]);
-                       }
-               }
-
-               return (ctx.getAttribute(sbuff.toString()));
-       }
-
-       @Override
-       public QueryStatus save(String resource, boolean force, boolean localOnly, String key, Map<String, String> parms,
-                       String prefix, SvcLogicContext ctx) throws SvcLogicException {
-               return (executeSqlWrite(key, ctx));
-       }
-
-       private DbLibService getDbLibService() {
-               // Try to get dblib as an OSGI service
-               DbLibService dblibSvc = null;
-               BundleContext bctx = null;
-               ServiceReference sref = null;
-
-               Bundle bundle = FrameworkUtil.getBundle(SqlResource.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 + ")");
-                       }
-               }
-
-               if (dblibSvc == null) {
-                       // Must not be running in an OSGI container. See if you can load it
-                       // as a
-                       // a POJO then.
-
-                       // If $SDNC_CONFIG_DIR/dblib.properties exists, that should
-                       // be the properties passed to DBResourceManager constructor.
-                       // If not, as default just use system properties.
-                       Properties dblibProps = System.getProperties();
-                       String cfgDir = System.getenv("SDNC_CONFIG_DIR");
-
-                       if ((cfgDir == null) || (cfgDir.length() == 0)) {
-                               cfgDir = "/opt/sdnc/data/properties";
-                       }
-
-                       File dblibPropFile = new File(cfgDir + "/dblib.properties");
-                       if (dblibPropFile.exists()) {
-                               try {
-                                       dblibProps = new Properties();
-                                       dblibProps.load(new FileInputStream(dblibPropFile));
-                               } catch (Exception e) {
-                                       LOG.warn("Could not load properties file " + dblibPropFile.getAbsolutePath(), e);
-
-                                       dblibProps = System.getProperties();
-                               }
-                       }
-
-                       try {
-                               dblibSvc = new DBResourceManager(dblibProps);
-                       } catch (Exception e) {
-                               LOG.error("Caught exception trying to create dblib service", e);
-                       }
-
-                       if (dblibSvc == null) {
-                               LOG.warn("Could not create new DBResourceManager");
-                       }
-               }
-
-               return (dblibSvc);
-       }
-
-       @Override
-       public QueryStatus notify(String resource, String action, String key, SvcLogicContext ctx)
-                       throws SvcLogicException {
-               if (LOG.isDebugEnabled()) {
-                       LOG.debug("SqlResource.notify called with resource=" + resource + ", action=" + action);
-               }
-               return QueryStatus.SUCCESS;
-       }
-
-       @Override
-       public QueryStatus delete(String resource, String key, SvcLogicContext ctx) throws SvcLogicException {
-               return (executeSqlWrite(key, ctx));
-       }
-
-       public QueryStatus update(String resource, String key, Map<String, String> parms, String prefix,
-                       SvcLogicContext ctx) throws SvcLogicException {
-               return (executeSqlWrite(key, ctx));
-       }
+    private static final Logger LOG = LoggerFactory.getLogger(SqlResource.class);
+
+    private static final String DBLIB_SERVICE = "org.onap.ccsdk.sli.core.dblib.DbLibService";
+
+    private static String CRYPT_KEY = "";
+
+    DbLibService dblibSvc = null;
+
+    public SqlResource(SqlResourcePropertiesProvider propProvider) {
+        this(propProvider, null);
+    }
+
+    public SqlResource(SqlResourcePropertiesProvider propProvider, DbLibService dblibSvc) {
+
+        this.dblibSvc = dblibSvc;
+
+        Properties properties = propProvider.getProperties();
+
+        String cryptKey = properties.getProperty("org.onap.sdnc.resource.sql.cryptkey");
+
+        if ((cryptKey == null) || (cryptKey.length() == 0)) {
+            cryptKey = properties.getProperty("org.openecomp.sdnc.resource.sql.cryptkey");
+        }
+
+        SqlResource.setCryptKey(cryptKey);
+    }
+
+    // For sql-resource, is-available is the same as exists
+    @Override
+    public QueryStatus isAvailable(String resource, String key, String prefix, SvcLogicContext ctx)
+            throws SvcLogicException {
+
+        return (exists(resource, key, prefix, ctx));
+
+    }
+
+    @Override
+    public QueryStatus exists(String resource, String key, String prefix, SvcLogicContext ctx)
+            throws SvcLogicException {
+
+        DbLibService dblibSvc = getDbLibService();
+        if (dblibSvc == null) {
+            return (QueryStatus.FAILURE);
+        }
+
+        String theStmt = resolveCtxVars(key, ctx);
+
+        try {
+            CachedRowSet results = dblibSvc.getData(theStmt, null, null);
+
+            if (!results.next()) {
+                return (QueryStatus.NOT_FOUND);
+            }
+
+            int numRows = results.getInt(1);
+
+            if (numRows > 0) {
+                return (QueryStatus.SUCCESS);
+            } else {
+                return (QueryStatus.NOT_FOUND);
+            }
+        } catch (Exception e) {
+            LOG.error("Caught SQL exception", e);
+            return (QueryStatus.FAILURE);
+        }
+    }
+
+    // @Override
+    public QueryStatus query(String resource, boolean localOnly, String select, String key, String prefix,
+            String orderBy, SvcLogicContext ctx) throws SvcLogicException {
+
+        DbLibService dblibSvc = getDbLibService();
+
+        if (dblibSvc == null) {
+            return (QueryStatus.FAILURE);
+        }
+
+        String sqlQuery = resolveCtxVars(key, ctx);
+
+        try {
+
+            CachedRowSet results = dblibSvc.getData(sqlQuery, null, null);
+
+            QueryStatus retval = QueryStatus.SUCCESS;
+
+            if (!results.next()) {
+                retval = QueryStatus.NOT_FOUND;
+                LOG.debug("No data found");
+            } else {
+                saveCachedRowSetToCtx(results, ctx, prefix, dblibSvc);
+            }
+            return (retval);
+        } catch (Exception e) {
+            LOG.error("Caught SQL exception", e);
+            return (QueryStatus.FAILURE);
+        }
+    }
+
+    public void saveCachedRowSetToCtx(CachedRowSet results, SvcLogicContext ctx, String prefix, DbLibService dblibSvc)
+            throws SQLException {
+        if (ctx != null) {
+            if ((prefix != null) && prefix.endsWith("[]")) {
+                // Return an array.
+                String pfx = prefix.substring(0, prefix.length() - 2);
+                int idx = 0;
+                do {
+                    ResultSetMetaData rsMeta = results.getMetaData();
+                    int numCols = rsMeta.getColumnCount();
+
+                    for (int i = 0; i < numCols; i++) {
+                        String colValue = null;
+                        String tableName = rsMeta.getTableName(i + 1);
+                        if (rsMeta.getColumnType(i + 1) == java.sql.Types.VARBINARY) {
+                            colValue = decryptColumn(tableName, rsMeta.getColumnName(i + 1), results.getBytes(i + 1),
+                                    dblibSvc);
+                        } else {
+                            colValue = results.getString(i + 1);
+                        }
+                        LOG.debug("Setting " + pfx + "[" + idx + "]."
+                                + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-") + " = " + colValue);
+                        ctx.setAttribute(pfx + "[" + idx + "]." + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-"),
+                                colValue);
+                    }
+                    idx++;
+                } while (results.next());
+                LOG.debug("Setting " + pfx + "_length = " + idx);
+                ctx.setAttribute(pfx + "_length", "" + idx);
+            } else {
+                ResultSetMetaData rsMeta = results.getMetaData();
+                int numCols = rsMeta.getColumnCount();
+
+                for (int i = 0; i < numCols; i++) {
+                    String colValue = null;
+                    String tableName = rsMeta.getTableName(i + 1);
+                    if ("VARBINARY".equalsIgnoreCase(rsMeta.getColumnTypeName(i + 1))) {
+                        colValue = decryptColumn(tableName, rsMeta.getColumnName(i + 1), results.getBytes(i + 1),
+                                dblibSvc);
+                    } else {
+                        colValue = results.getString(i + 1);
+                    }
+                    if (prefix != null) {
+                        LOG.debug("Setting " + prefix + "." + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-") + " = "
+                                + colValue);
+                        ctx.setAttribute(prefix + "." + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-"), colValue);
+                    } else {
+                        LOG.debug("Setting " + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-") + " = " + colValue);
+                        ctx.setAttribute(rsMeta.getColumnLabel(i + 1).replaceAll("_", "-"), colValue);
+                    }
+                }
+            }
+        }
+    }
+
+    // reserve is no-op
+    @Override
+    public QueryStatus reserve(String resource, String select, String key, String prefix, SvcLogicContext ctx)
+            throws SvcLogicException {
+        return (QueryStatus.SUCCESS);
+    }
+
+    // release is no-op
+    @Override
+    public QueryStatus release(String resource, String key, SvcLogicContext ctx) throws SvcLogicException {
+        return (QueryStatus.SUCCESS);
+    }
+
+    private QueryStatus executeSqlWrite(String key, SvcLogicContext ctx) throws SvcLogicException {
+        QueryStatus retval = QueryStatus.SUCCESS;
+
+        DbLibService dblibSvc = getDbLibService();
+
+        if (dblibSvc == null) {
+            return (QueryStatus.FAILURE);
+        }
+
+        String sqlStmt = resolveCtxVars(key, ctx);
+
+        LOG.debug("key = [" + key + "]; sqlStmt = [" + sqlStmt + "]");
+        try {
+
+            if (!dblibSvc.writeData(sqlStmt, null, null)) {
+                retval = QueryStatus.FAILURE;
+            }
+        } catch (Exception e) {
+            LOG.error("Caught SQL exception", e);
+            retval = QueryStatus.FAILURE;
+        }
+
+        return (retval);
+
+    }
+
+    private String resolveCtxVars(String key, SvcLogicContext ctx) {
+        if (key == null) {
+            return (null);
+        }
+
+        if (key.startsWith("'") && key.endsWith("'")) {
+            key = key.substring(1, key.length() - 1);
+            LOG.debug("Stripped outer single quotes - key is now [" + key + "]");
+        }
+
+        String[] keyTerms = key.split("\\s+");
+
+        StringBuffer sqlBuffer = new StringBuffer();
+
+        for (int i = 0; i < keyTerms.length; i++) {
+            sqlBuffer.append(resolveTerm(keyTerms[i], ctx));
+            sqlBuffer.append(" ");
+        }
+
+        return (sqlBuffer.toString());
+    }
+
+    private String resolveTerm(String term, SvcLogicContext ctx) {
+        if (term == null) {
+            return (null);
+        }
+
+        LOG.trace("resolveTerm: term is " + term);
+
+        if (term.startsWith("$") && (ctx != null)) {
+            // Resolve any index variables.
+            term = resolveCtxVariable(term.substring(1), ctx);
+            // Escape single quote
+            if (term != null) {
+                term = term.replaceAll("'", "''");
+            }
+            return ("'" + term + "'");
+        } else {
+            return (term);
+        }
+
+    }
+
+    private String resolveCtxVariable(String ctxVarName, SvcLogicContext ctx) {
+
+        if (ctxVarName.indexOf('[') == -1) {
+            // Ctx variable contains no arrays
+            if ("CRYPT_KEY".equals(ctxVarName)) {
+                // Handle crypt key as special case. If it's set as a context
+                // variable, use it. Otherwise, use
+                // configured crypt key.
+                String cryptKey = ctx.getAttribute(ctxVarName);
+                if ((cryptKey != null) && (cryptKey.length() > 0)) {
+                    return (cryptKey);
+                } else {
+                    return (CRYPT_KEY);
+                }
+            }
+            return (ctx.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 (ctx.getAttribute(ctxVarName));
+                }
+
+                String idxVarName = ctxVarParts[i].substring(1, endBracketLoc);
+                String remainder = ctxVarParts[i].substring(endBracketLoc);
+
+                sbuff.append("[");
+                sbuff.append(ctx.getAttribute(idxVarName));
+                sbuff.append(remainder);
+
+            } else {
+                // Index is not a variable reference
+                sbuff.append("[");
+                sbuff.append(ctxVarParts[i]);
+            }
+        }
+
+        return (ctx.getAttribute(sbuff.toString()));
+    }
+
+    @Override
+    public QueryStatus save(String resource, boolean force, boolean localOnly, String key, Map<String, String> parms,
+            String prefix, SvcLogicContext ctx) throws SvcLogicException {
+        return (executeSqlWrite(key, ctx));
+    }
+
+    private DbLibService getDbLibService() {
+
+        if (dblibSvc != null) {
+            return(dblibSvc);
+        }
+        // Try to get dblib as an OSGI service
+        BundleContext bctx = null;
+        ServiceReference sref = null;
+
+        Bundle bundle = FrameworkUtil.getBundle(SqlResource.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 + ")");
+            }
+        }
+
+        if (dblibSvc == null) {
+            // Must not be running in an OSGI container. See if you can load it
+            // as a
+            // a POJO then.
+
+            // If $SDNC_CONFIG_DIR/dblib.properties exists, that should
+            // be the properties passed to DBResourceManager constructor.
+            // If not, as default just use system properties.
+            Properties dblibProps = System.getProperties();
+            String cfgDir = System.getenv("SDNC_CONFIG_DIR");
+
+            if ((cfgDir == null) || (cfgDir.length() == 0)) {
+                cfgDir = "/opt/sdnc/data/properties";
+            }
+
+            File dblibPropFile = new File(cfgDir + "/dblib.properties");
+            if (dblibPropFile.exists()) {
+                try {
+                    dblibProps = new Properties();
+                    dblibProps.load(new FileInputStream(dblibPropFile));
+                } catch (Exception e) {
+                    LOG.warn("Could not load properties file " + dblibPropFile.getAbsolutePath(), e);
+
+                    dblibProps = System.getProperties();
+                }
+            }
+
+            try {
+                dblibSvc = new DBResourceManager(dblibProps);
+            } catch (Exception e) {
+                LOG.error("Caught exception trying to create dblib service", e);
+            }
+
+            if (dblibSvc == null) {
+                LOG.warn("Could not create new DBResourceManager");
+            }
+        }
+
+        return (dblibSvc);
+    }
+
+    @Override
+    public QueryStatus notify(String resource, String action, String key, SvcLogicContext ctx)
+            throws SvcLogicException {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("SqlResource.notify called with resource=" + resource + ", action=" + action);
+        }
+        return QueryStatus.SUCCESS;
+    }
+
+    @Override
+    public QueryStatus delete(String resource, String key, SvcLogicContext ctx) throws SvcLogicException {
+        return (executeSqlWrite(key, ctx));
+    }
+
+    public QueryStatus update(String resource, String key, Map<String, String> parms, String prefix,
+            SvcLogicContext ctx) throws SvcLogicException {
+        return (executeSqlWrite(key, ctx));
+    }
 
     private String decryptColumn(String tableName, String colName, byte[] colValue, DbLibService dblibSvc) {
         String strValue = new String(colValue);
@@ -444,68 +464,68 @@ public class SqlResource implements SvcLogicResource, SvcLogicJavaPlugin {
         return (strValue);
     }
 
-       public static String getCryptKey() {
-               return (CRYPT_KEY);
-       }
-
-       public static String setCryptKey(String key) {
-               CRYPT_KEY = key;
-               return (CRYPT_KEY);
-       }
-
-       public String parameterizedQuery(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
-               DbLibService dblibSvc = getDbLibService();
-               String prefix = parameters.get("prefix");
-               String query = parameters.get("query");
-
-               ArrayList<String> arguments = new ArrayList<String>();
-               for (Entry<String, String> a : parameters.entrySet()) {
-                       if (a.getKey().startsWith("param")) {
-                               arguments.add(a.getValue());
-                       }
-               }
-
-               try {
-                       if (dblibSvc == null) {
-                               return mapQueryStatus(QueryStatus.FAILURE);
-                       }
-                       if (query.contains("count") || query.contains("COUNT")) {
-                               CachedRowSet results = dblibSvc.getData(query, arguments, null);
-
-                               if (!results.next()) {
-                                       return mapQueryStatus(QueryStatus.FAILURE);
-                               }
-
-                               int numRows = results.getInt(1);
-                               ctx.setAttribute(prefix + ".count", String.valueOf(numRows));
-                               if (numRows > 0) {
-                                       return "true";
-                               } else {
-                                       return "false";
-                               }
-                       } else if (query.startsWith("select") || query.startsWith("SELECT")) {
-                               CachedRowSet results = dblibSvc.getData(query, arguments, null);
-                               if (!results.next()) {
-                                       return mapQueryStatus(QueryStatus.NOT_FOUND);
-                               } else {
-                                       saveCachedRowSetToCtx(results, ctx, prefix, dblibSvc);
-                               }
-                       } else {
-                               if (!dblibSvc.writeData(query, arguments, null)) {
-                                       return mapQueryStatus(QueryStatus.FAILURE);
-                               }
-                       }
-                       return mapQueryStatus(QueryStatus.SUCCESS);
-               } catch (SQLException e) {
-                       LOG.error("Caught SQL exception", e);
-                       return mapQueryStatus(QueryStatus.FAILURE);
-               }
-       }
-
-       protected String mapQueryStatus(QueryStatus status) {
-               String str = status.toString();
-               str = str.toLowerCase();
-               str = str.replaceAll("_", "-");
-               return str;
-       }
+    public static String getCryptKey() {
+        return (CRYPT_KEY);
+    }
+
+    public static String setCryptKey(String key) {
+        CRYPT_KEY = key;
+        return (CRYPT_KEY);
+    }
+
+    public String parameterizedQuery(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        DbLibService dblibSvc = getDbLibService();
+        String prefix = parameters.get("prefix");
+        String query = parameters.get("query");
+
+        ArrayList<String> arguments = new ArrayList<String>();
+        for (Entry<String, String> a : parameters.entrySet()) {
+            if (a.getKey().startsWith("param")) {
+                arguments.add(a.getValue());
+            }
+        }
+
+        try {
+            if (dblibSvc == null) {
+                return mapQueryStatus(QueryStatus.FAILURE);
+            }
+            if (query.contains("count") || query.contains("COUNT")) {
+                CachedRowSet results = dblibSvc.getData(query, arguments, null);
+
+                if (!results.next()) {
+                    return mapQueryStatus(QueryStatus.FAILURE);
+                }
+
+                int numRows = results.getInt(1);
+                ctx.setAttribute(prefix + ".count", String.valueOf(numRows));
+                if (numRows > 0) {
+                    return "true";
+                } else {
+                    return "false";
+                }
+            } else if (query.startsWith("select") || query.startsWith("SELECT")) {
+                CachedRowSet results = dblibSvc.getData(query, arguments, null);
+                if (!results.next()) {
+                    return mapQueryStatus(QueryStatus.NOT_FOUND);
+                } else {
+                    saveCachedRowSetToCtx(results, ctx, prefix, dblibSvc);
+                }
+            } else {
+                if (!dblibSvc.writeData(query, arguments, null)) {
+                    return mapQueryStatus(QueryStatus.FAILURE);
+                }
+            }
+            return mapQueryStatus(QueryStatus.SUCCESS);
+        } catch (SQLException e) {
+            LOG.error("Caught SQL exception", e);
+            return mapQueryStatus(QueryStatus.FAILURE);
+        }
+    }
+
+    protected String mapQueryStatus(QueryStatus status) {
+        String str = status.toString();
+        str = str.toLowerCase();
+        str = str.replaceAll("_", "-");
+        return str;
+    }
 }
diff --git a/sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourceActivator.java b/sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourceActivator.java
deleted file mode 100644 (file)
index 4e68c1c..0000000
+++ /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.onap.ccsdk.sli.adaptors.resource.sql;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.Properties;
-
-import org.onap.ccsdk.sli.core.sli.SvcLogicResource;
-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 SqlResourceActivator implements BundleActivator {
-
-       private static final String SQLRESOURCE_PROP_PATH = "/sql-resource.properties";
-
-       private ServiceRegistration registration = null;
-
-       private static final Logger LOG = LoggerFactory
-                       .getLogger(SqlResourceActivator.class);
-
-       @Override
-       public void start(BundleContext ctx) throws Exception {
-
-               String cfgDir = System.getenv("SDNC_CONFIG_DIR");
-
-               if ((cfgDir == null) || (cfgDir.length() == 0)) {
-                       cfgDir = "/opt/sdnc/data/properties";
-                       LOG.warn("SDNC_CONFIG_DIR unset - defaulting to "+cfgDir);
-               }
-
-               String cryptKey = "";
-
-               File sqlResourcePropFile = new File(cfgDir+SQLRESOURCE_PROP_PATH);
-               Properties sqlResourceProps = new Properties();
-               if (sqlResourcePropFile.exists()) {
-                       try {
-
-                               sqlResourceProps.load(new FileInputStream(sqlResourcePropFile));
-
-                               cryptKey = sqlResourceProps.getProperty("org.openecomp.sdnc.resource.sql.cryptkey");
-                       } catch (Exception e) {
-                               LOG.warn(
-                                               "Could not load properties file " + sqlResourcePropFile.getAbsolutePath(), e);
-                       }
-               } else {
-                       LOG.warn("Cannot read "+sqlResourcePropFile.getAbsolutePath()+" to find encryption key - using default");
-               }
-
-               SqlResource.setCryptKey(cryptKey);
-
-               // Advertise Sql resource adaptor
-               SvcLogicResource impl = new SqlResource();
-               String regName = impl.getClass().getName();
-
-               if (registration == null)
-               {
-                       LOG.debug("Registering SqlResource 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/sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourcePropertiesProvider.java b/sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourcePropertiesProvider.java
new file mode 100755 (executable)
index 0000000..7970151
--- /dev/null
@@ -0,0 +1,28 @@
+/*-
+ * ============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.adaptors.resource.sql;
+
+import java.util.Properties;
+
+public interface SqlResourcePropertiesProvider {
+
+    public Properties getProperties();
+}
diff --git a/sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourcePropertiesProviderImpl.java b/sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourcePropertiesProviderImpl.java
new file mode 100755 (executable)
index 0000000..7c9f6f1
--- /dev/null
@@ -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.adaptors.resource.sql;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.Vector;
+
+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
+ * <code>SqlResource</code> Service. The priority for properties file
+ * resolution is as follows:
+ *
+ * <ol>
+ * <li>A directory identified by the system environment variable
+ * <code>SDNC_CONFIG_DIR</code></li>
+ * <li>The default directory <code>DEFAULT_DBLIB_PROP_DIR</code></li>
+ * <li>A directory identified by the JRE argument
+ * <code>sql-resource.properties</code></li>
+ * <li>A <code>sql-resource.properties</code> file located in the karaf root
+ * directory</li>
+ * </ol>
+ */
+public class SqlResourcePropertiesProviderImpl implements SqlResourcePropertiesProvider {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SqlResourcePropertiesProviderImpl.class);
+
+    /**
+     * The name of the properties file for database configuration
+     */
+    private static final String SQLRESOURCE_PROP_FILE_NAME = "sql-resource.properties";
+
+    /**
+     * A prioritized list of strategies for resolving sql-resource properties files.
+     */
+    private Vector<PropertiesFileResolver> sqlResourcePropertiesFileResolvers = 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 SqlResourcePropertiesProviderImpl() {
+        sqlResourcePropertiesFileResolvers
+                .add(new SdncConfigEnvVarFileResolver("Using property file (1) from environment variable"));
+        sqlResourcePropertiesFileResolvers.add(new CoreDefaultFileResolver("Using property file (2) from default directory"));
+
+        sqlResourcePropertiesFileResolvers.add(
+                new JREFileResolver("Using property file (3) from JRE argument", SqlResourcePropertiesProviderImpl.class));
+        sqlResourcePropertiesFileResolvers.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("/" + SQLRESOURCE_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): " + SQLRESOURCE_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
+     * <code>Logger</code>.
+     *
+     * @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<File> 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 sql-resource properties file to use based on the following priority:
+     * <ol>
+     * <li>A directory identified by the system environment variable
+     * <code>SDNC_CONFIG_DIR</code></li>
+     * <li>The default directory <code>DEFAULT_DBLIB_PROP_DIR</code></li>
+     * <li>A directory identified by the JRE argument
+     * <code>sql-resource.properties</code></li>
+     * <li>A <code>sql-resource.properties</code> file located in the karaf root
+     * directory</li>
+     * </ol>
+     */
+    File determinePropertiesFile(final SqlResourcePropertiesProviderImpl resourceProvider) {
+
+        for (final PropertiesFileResolver sliPropertiesFileResolver : sqlResourcePropertiesFileResolvers) {
+            final Optional<File> fileOptional = sliPropertiesFileResolver.resolveFile(SQLRESOURCE_PROP_FILE_NAME);
+            if (fileOptional.isPresent()) {
+                return reportSuccess(sliPropertiesFileResolver.getSuccessfulResolutionMessage(), fileOptional);
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/sql-resource/provider/src/main/resources/org/opendaylight/blueprint/sql-resource-blueprint.xml b/sql-resource/provider/src/main/resources/org/opendaylight/blueprint/sql-resource-blueprint.xml
new file mode 100755 (executable)
index 0000000..5e8d339
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights
+                          reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END=========================================================
+  -->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
+           odl:use-default-for-reference-types="true">
+
+    <bean id="propProvider" class="org.onap.ccsdk.sli.adaptors.resource.sql.SqlResourcePropertiesProviderImpl" />
+    <reference id="dblibService" interface="org.onap.ccsdk.sli.core.dblib.DbLibService" />
+
+    <bean id="sqlResourceInstance" class="org.onap.ccsdk.sli.adaptors.resource.sql.SqlResource">
+        <argument ref="propProvider"/>
+        <argument ref="dblibService"/>
+    </bean>
+
+    <service ref="sqlResourceInstance">
+        <interfaces>
+            <value>org.onap.ccsdk.sli.adaptors.resource.sql.SqlResource</value>
+        </interfaces>
+    </service>
+
+</blueprint>
diff --git a/sql-resource/provider/src/main/resources/sql-resource.properties b/sql-resource/provider/src/main/resources/sql-resource.properties
new file mode 100755 (executable)
index 0000000..ac32f77
--- /dev/null
@@ -0,0 +1,23 @@
+###
+# ============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=========================================================
+###
+
+org.openecomp.sdnc.resource.sql.cryptkey=QtfJMKggVk
+
index b7e8928..18718b8 100644 (file)
@@ -3,7 +3,7 @@
 # openECOMP : SDN-C
 # ================================================================================
 # Copyright (C) 2017 AT&T Intellectual Property. All rights
-#                      reserved.
+#             reserved.
 # ================================================================================
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
old mode 100644 (file)
new mode 100755 (executable)
index e66034b..2863c6c
@@ -80,7 +80,7 @@ public class ITCaseSqlResource extends TestCase {
                        System.setProperty(propName, props.getProperty(propName));
                }
 
-               SqlResource sqlResource = new SqlResource();
+               SqlResource sqlResource = new SqlResource(new SqlResourcePropertiesProviderImpl());
 
 
 
diff --git a/sql-resource/provider/src/test/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourceProviderTest.java b/sql-resource/provider/src/test/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourceProviderTest.java
new file mode 100755 (executable)
index 0000000..404783d
--- /dev/null
@@ -0,0 +1,25 @@
+package org.onap.ccsdk.sli.adaptors.resource.sql;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Properties;
+
+import org.junit.Test;
+
+public class SqlResourceProviderTest {
+
+    private static SqlResourcePropertiesProvider provider;
+
+    @Test
+    public void testSqlResourceProvider() {
+        provider = new SqlResourcePropertiesProviderImpl();
+        assertNotNull(provider);
+    }
+
+    @Test
+    public void testGetProperties() {
+        Properties properties = provider.getProperties();
+        assertNotNull(properties);
+    }
+
+}
diff --git a/sql-resource/provider/src/test/resources/sql-resource.properties b/sql-resource/provider/src/test/resources/sql-resource.properties
new file mode 100755 (executable)
index 0000000..ac32f77
--- /dev/null
@@ -0,0 +1,23 @@
+###
+# ============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=========================================================
+###
+
+org.openecomp.sdnc.resource.sql.cryptkey=QtfJMKggVk
+