From 6e4e672bcd7e170bd92ea7dac9cb928c0aa2425c Mon Sep 17 00:00:00 2001 From: Marcus G K Williams Date: Thu, 17 Aug 2017 13:14:25 -0700 Subject: Update sli-adaptor/sql-resource package names Update package names from org.openecomp.sdnc.adaptors.* -> onap.ccsdk.sli.adaptors.* Update groupIds from org.openecomp.sdnc.adaptors -> onap.ccsdk.sli.adaptors Issue-Id: CCSDK-19 Change-Id: Ie588e46c0c9035ec343437f58bd329f7d6c220ce Signed-off-by: Marcus G K Williams --- .../sli/adaptors/resource/sql/SqlResource.java | 516 +++++++++++++++++++++ .../resource/sql/SqlResourceActivator.java | 96 ++++ .../sdnc/sli/resource/sql/SqlResource.java | 516 --------------------- .../sli/resource/sql/SqlResourceActivator.java | 96 ---- .../src/main/resources/svclogic.properties | 24 +- 5 files changed, 624 insertions(+), 624 deletions(-) create mode 100644 sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResource.java create mode 100644 sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourceActivator.java delete mode 100644 sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResource.java delete mode 100644 sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResourceActivator.java (limited to 'sql-resource/provider/src/main') diff --git a/sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResource.java b/sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResource.java new file mode 100644 index 00000000..14e30347 --- /dev/null +++ b/sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResource.java @@ -0,0 +1,516 @@ +/*- + * ============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.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Map; +import java.util.Map.Entry; + +import javax.sql.rowset.CachedRowSet; + +import org.apache.commons.lang3.StringUtils; +import org.onap.ccsdk.sli.core.dblib.DBResourceManager; +import org.onap.ccsdk.sli.core.dblib.DbLibService; +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; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +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.adaptors.resource.dblib.DBResourceManager"; + + 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 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. + try { + dblibSvc = DBResourceManager.create(System.getProperties()); + } 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 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); + + if (StringUtils.isAsciiPrintable(strValue)) { + + // If printable, not encrypted + return (strValue); + } else { + PreparedStatement stmt = null; + Connection conn = null; + ResultSet results = null; + try { + // CachedRowSet results = + // dblibSvc.getData("SELECT + // CAST(AES_DECRYPT('"+strValue+"','"+CRYPT_KEY+"') AS CHAR(50)) + // FROM DUAL", + // null, null); + conn = ((DBResourceManager) dblibSvc).getConnection(); + + stmt = conn.prepareStatement("SELECT CAST(AES_DECRYPT(?, ?) AS CHAR(50)) FROM DUAL"); + + stmt.setBytes(1, colValue); + stmt.setString(2, getCryptKey()); + + results = stmt.executeQuery(); + + if ((results != null) && results.next()) { + strValue = results.getString(1); + LOG.debug("Decrypted value is " + strValue); + } else { + LOG.warn("Cannot decrypt " + tableName + "." + colName); + } + } catch (Exception e) { + LOG.error("Caught exception trying to decrypt " + tableName + "." + colName, e); + } finally { + try { + if (results != null) { + results.close(); + results = null; + } + } catch (Exception exc) { + + } + + try { + if (stmt != null) { + stmt.close(); + stmt = null; + } + } catch (Exception exc) { + + } + + try { + if (conn != null) { + conn.close(); + conn = null; + } + } catch (Exception exc) { + + } + + } + } + 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 parameters, SvcLogicContext ctx) throws SvcLogicException { + DbLibService dblibSvc = getDbLibService(); + String prefix = parameters.get("prefix"); + String query = parameters.get("query"); + + ArrayList arguments = new ArrayList(); + for (Entry 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 new file mode 100644 index 00000000..4e68c1c2 --- /dev/null +++ b/sql-resource/provider/src/main/java/org/onap/ccsdk/sli/adaptors/resource/sql/SqlResourceActivator.java @@ -0,0 +1,96 @@ +/*- + * ============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/openecomp/sdnc/sli/resource/sql/SqlResource.java b/sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResource.java deleted file mode 100644 index 46802b57..00000000 --- a/sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResource.java +++ /dev/null @@ -1,516 +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.resource.sql; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Map; -import java.util.Map.Entry; - -import javax.sql.rowset.CachedRowSet; - -import org.apache.commons.lang3.StringUtils; -import org.onap.ccsdk.sli.core.dblib.DBResourceManager; -import org.onap.ccsdk.sli.core.dblib.DbLibService; -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; -import org.osgi.framework.ServiceReference; -import org.slf4j.Logger; -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.openecomp.sdnc.sli.resource.dblib.DBResourceManager"; - - 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 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. - try { - dblibSvc = DBResourceManager.create(System.getProperties()); - } 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 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); - - if (StringUtils.isAsciiPrintable(strValue)) { - - // If printable, not encrypted - return (strValue); - } else { - PreparedStatement stmt = null; - Connection conn = null; - ResultSet results = null; - try { - // CachedRowSet results = - // dblibSvc.getData("SELECT - // CAST(AES_DECRYPT('"+strValue+"','"+CRYPT_KEY+"') AS CHAR(50)) - // FROM DUAL", - // null, null); - conn = ((DBResourceManager) dblibSvc).getConnection(); - - stmt = conn.prepareStatement("SELECT CAST(AES_DECRYPT(?, ?) AS CHAR(50)) FROM DUAL"); - - stmt.setBytes(1, colValue); - stmt.setString(2, getCryptKey()); - - results = stmt.executeQuery(); - - if ((results != null) && results.next()) { - strValue = results.getString(1); - LOG.debug("Decrypted value is " + strValue); - } else { - LOG.warn("Cannot decrypt " + tableName + "." + colName); - } - } catch (Exception e) { - LOG.error("Caught exception trying to decrypt " + tableName + "." + colName, e); - } finally { - try { - if (results != null) { - results.close(); - results = null; - } - } catch (Exception exc) { - - } - - try { - if (stmt != null) { - stmt.close(); - stmt = null; - } - } catch (Exception exc) { - - } - - try { - if (conn != null) { - conn.close(); - conn = null; - } - } catch (Exception exc) { - - } - - } - } - 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 parameters, SvcLogicContext ctx) throws SvcLogicException { - DbLibService dblibSvc = getDbLibService(); - String prefix = parameters.get("prefix"); - String query = parameters.get("query"); - - ArrayList arguments = new ArrayList(); - for (Entry 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/openecomp/sdnc/sli/resource/sql/SqlResourceActivator.java b/sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResourceActivator.java deleted file mode 100644 index 42c4876d..00000000 --- a/sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResourceActivator.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.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/resources/svclogic.properties b/sql-resource/provider/src/main/resources/svclogic.properties index edd1a850..b7e8928e 100644 --- a/sql-resource/provider/src/main/resources/svclogic.properties +++ b/sql-resource/provider/src/main/resources/svclogic.properties @@ -19,16 +19,16 @@ # ============LICENSE_END========================================================= ### -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=sdnctl -org.openecomp.sdnc.sli.jdbc.password=gamma -org.openecomp.sdnc.sli.jdbc.connection.name=sdnctldb01 +org.onap.ccsdk.sli.adaptors.dbtype=jdbc +org.onap.ccsdk.sli.adaptors.jdbc.hosts=sdnctldb01,sdnctldb02 +org.onap.ccsdk.sli.adaptors.jdbc.url=jdbc:mysql://DBHOST:3306/sdnctl +org.onap.ccsdk.sli.adaptors.jdbc.database=sdnctl +org.onap.ccsdk.sli.adaptors.jdbc.user=sdnctl +org.onap.ccsdk.sli.adaptors.jdbc.password=gamma +org.onap.ccsdk.sli.adaptors.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.adaptors.jdbc.connection.timeout=50 +org.onap.ccsdk.sli.adaptors.jdbc.request.timeout=100 +org.onap.ccsdk.sli.adaptors.jdbc.limit.init=10 +org.onap.ccsdk.sli.adaptors.jdbc.limit.min=10 +org.onap.ccsdk.sli.adaptors.jdbc.limit.max=20 -- cgit 1.2.3-korg