diff options
Diffstat (limited to 'dblib/provider/src/main')
26 files changed, 0 insertions, 3809 deletions
diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java deleted file mode 100755 index b9a0f071b..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java +++ /dev/null @@ -1,593 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.io.Closeable; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.sql.Blob; -import java.sql.Connection; -import java.sql.Date; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Observer; -import javax.sql.DataSource; -import javax.sql.rowset.CachedRowSet; -import javax.sql.rowset.RowSetProvider; -import org.apache.tomcat.jdbc.pool.PoolExhaustedException; -import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; -import org.onap.ccsdk.sli.core.dblib.pm.SQLExecutionMonitor; -import org.onap.ccsdk.sli.core.dblib.pm.SQLExecutionMonitor.TestObject; -import org.onap.ccsdk.sli.core.dblib.pm.SQLExecutionMonitorObserver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @version $Revision: 1.14 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ - -public abstract class CachedDataSource implements DataSource, SQLExecutionMonitorObserver { - - private static final Logger LOGGER = LoggerFactory.getLogger(CachedDataSource.class); - - private static final String SQL_FAILURE = "SQL FAILURE. time(ms): "; - private static final String FAILED_TO_EXECUTE = "> Failed to execute: "; - private static final String WITH_ARGUMENTS = " with arguments: "; - private static final String WITH_NO_ARGUMENTS = " with no arguments. "; - private static final String DATA_SOURCE_CONNECT_SUCCESS = "SQL DataSource < {} > connected to {}, read-only is {}, tested successfully"; - private static final String DATA_SOURCE_CONNECT_FAILURE = "SQL DataSource < {} > test failed. Cause : {}> test failed. Cause : {}"; - - protected long connReqTimeout = 30L; - protected long dataReqTimeout = 100L; - - private final SQLExecutionMonitor monitor; - protected final DataSource ds; - protected String connectionName = null; - protected boolean initialized = false; - - private long interval = 1000; - private long initialDelay = 5000; - private long expectedCompletionTime = 50L; - private boolean canTakeOffLine = true; - private long unprocessedFailoverThreshold = 3L; - - private long nextErrorReportTime = 0L; - - private String globalHostName = null; - private final int index; - - private boolean isDerby = false; - - public CachedDataSource(BaseDBConfiguration jdbcElem) throws DBConfigException { - ds = configure(jdbcElem); - index = initializeIndex(jdbcElem); - if ("org.apache.derby.jdbc.EmbeddedDriver".equals(jdbcElem.getDriverName())) { - isDerby = true; - } - monitor = new SQLExecutionMonitor(this); - } - - protected abstract DataSource configure(BaseDBConfiguration jdbcElem) throws DBConfigException; - protected abstract int getAvailableConnections(); - - protected int initializeIndex(BaseDBConfiguration jdbcElem) { - if(jdbcElem.containsKey(BaseDBConfiguration.DATABASE_HOSTS)) { - String hosts = jdbcElem.getProperty(BaseDBConfiguration.DATABASE_HOSTS); - String name = jdbcElem.getProperty(BaseDBConfiguration.CONNECTION_NAME); - List<String> numbers = Arrays.asList(hosts.split(",")); - return numbers.indexOf(name); - } else - return -1; - } - - /* - * (non-Javadoc) - * - * @see javax.sql.DataSource#getConnection() - */ - @Override - public Connection getConnection() throws SQLException { - LapsedTimer lt = new LapsedTimer(); - try { - return ds.getConnection(); - } finally { - if(LOGGER.isTraceEnabled()) { - LOGGER.trace(String.format("SQL Connection aquisition time : %s", lt.lapsedTime())); - } - } - } - - public CachedRowSet getData(String statement, List<Object> arguments) throws SQLException { - TestObject testObject = monitor.registerRequest(); - - try (Connection connection = this.getConnection()) { - if (connection == null) { - throw new SQLException("Connection invalid"); - } - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Obtained connection <{}>: {}", connectionName, connection); - } - return executePreparedStatement(connection, statement, arguments, true); - } finally { - monitor.deregisterRequest(testObject); - } - } - - public boolean writeData(String statement, List<Object> arguments) throws SQLException { - TestObject testObject = monitor.registerRequest(); - - try (Connection connection = this.getConnection()) { - if (connection == null) { - throw new SQLException("Connection invalid"); - } - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Obtained connection <{}>: {}", connectionName, connection); - } - return executeUpdatePreparedStatement(connection, statement, arguments, true); - } finally { - monitor.deregisterRequest(testObject); - } - } - - CachedRowSet executePreparedStatement(Connection conn, String statement, List<Object> arguments, boolean close) - throws SQLException { - long time = System.currentTimeMillis(); - - CachedRowSet data = null; - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("SQL Statement: {}", statement); - if (arguments != null && !arguments.isEmpty()) { - LOGGER.debug("Argunments: {}", arguments); - } - } - - ResultSet rs = null; - try (PreparedStatement ps = conn.prepareStatement(statement)) { - data = RowSetProvider.newFactory().createCachedRowSet(); - if (arguments != null) { - for (int i = 0, max = arguments.size(); i < max; i++) { - ps.setObject(i + 1, arguments.get(i)); - } - } - rs = ps.executeQuery(); - data.populate(rs); - // Point the rowset Cursor to the start - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("SQL SUCCESS. rows returned: {}, time(ms): {}", data.size(), - (System.currentTimeMillis() - time)); - } - } catch (SQLException exc) { - handleSqlExceptionForExecuteStatement(conn, statement, arguments, exc, time); - } finally { - handleFinallyBlockForExecutePreparedStatement(rs, conn, close); - } - - return data; - } - - private void handleSqlExceptionForExecuteStatement(Connection conn, String statement, List<Object> arguments, - SQLException exc, long time) throws SQLException { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug(SQL_FAILURE + (System.currentTimeMillis() - time)); - } - try { - conn.rollback(); - } catch (Exception thr) { - LOGGER.error(thr.getLocalizedMessage(), thr); - } - if (arguments != null && !arguments.isEmpty()) { - LOGGER.error(String.format("<%s%s%s%s%s", connectionName, FAILED_TO_EXECUTE, statement, WITH_ARGUMENTS, - arguments), exc); - } else { - LOGGER.error(String.format("<%s%s%s%s", connectionName, FAILED_TO_EXECUTE, statement, WITH_NO_ARGUMENTS), - exc); - } - throw exc; - } - - private void handleFinallyBlockForExecutePreparedStatement(ResultSet rs, Connection conn, boolean close) { - try { - if (rs != null) { - rs.close(); - } - } catch (Exception exc) { - LOGGER.error(exc.getLocalizedMessage(), exc); - } - try { - if (conn != null && close) { - conn.close(); - } - } catch (Exception exc) { - LOGGER.error(exc.getLocalizedMessage(), exc); - } - } - - boolean executeUpdatePreparedStatement(Connection conn, String statement, List<Object> arguments, boolean close) - throws SQLException { - long time = System.currentTimeMillis(); - - try (PreparedStatement ps = conn.prepareStatement(statement); - CachedRowSet data = RowSetProvider.newFactory().createCachedRowSet()) { - if (arguments != null) { - prepareStatementForExecuteUpdate(arguments, ps); - } - ps.executeUpdate(); - // Point the rowset Cursor to the start - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("SQL SUCCESS. rows returned: {}, time(ms): {}", data.size(), - (System.currentTimeMillis() - time)); - } - } catch (SQLException exc) { - handleSqlExceptionForExecuteStatement(conn, statement, arguments, exc, time); - } finally { - try { - if (close) { - conn.close(); - } - } catch (Exception exc) { - LOGGER.error(exc.getLocalizedMessage(), exc); - } - } - - return true; - } - - private void prepareStatementForExecuteUpdate(List<Object> arguments, PreparedStatement ps) throws SQLException { - for (int i = 0, max = arguments.size(); i < max; i++) { - Object value = arguments.get(i); - if (value instanceof Blob) { - ps.setBlob(i + 1, (Blob) value); - } else if (value instanceof Timestamp) { - ps.setTimestamp(i + 1, (Timestamp) value); - } else if (value instanceof Integer) { - ps.setInt(i + 1, (Integer) value); - } else if (value instanceof Long) { - ps.setLong(i + 1, (Long) value); - } else if (value instanceof Date) { - ps.setDate(i + 1, (Date) value); - } else { - ps.setObject(i + 1, value); - } - } - } - - /* - * (non-Javadoc) - * - * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String) - */ - @Override - public Connection getConnection(String username, String password) throws SQLException { - return ds.getConnection(username, password); - } - - /* - * (non-Javadoc) - * - * @see javax.sql.DataSource#getLogWriter() - */ - @Override - public PrintWriter getLogWriter() throws SQLException { - return ds.getLogWriter(); - } - - /* - * (non-Javadoc) - * - * @see javax.sql.DataSource#getLoginTimeout() - */ - @Override - public int getLoginTimeout() throws SQLException { - return ds.getLoginTimeout(); - } - - /* - * (non-Javadoc) - * - * @see javax.sql.DataSource#setLogWriter(java.io.PrintWriter) - */ - @Override - public void setLogWriter(PrintWriter out) throws SQLException { - ds.setLogWriter(out); - } - - /* - * (non-Javadoc) - * - * @see javax.sql.DataSource#setLoginTimeout(int) - */ - @Override - public void setLoginTimeout(int seconds) throws SQLException { - ds.setLoginTimeout(seconds); - } - - @Override - public final String getDbConnectionName() { - return connectionName; - } - - protected final void setDbConnectionName(String name) { - this.connectionName = name; - } - - public void cleanUp() { - if (ds != null && ds instanceof Closeable) { - try { - ((Closeable) ds).close(); - } catch (IOException e) { - LOGGER.warn(e.getMessage()); - } - } - monitor.deleteObservers(); - monitor.cleanup(); - } - - public boolean isInitialized() { - return initialized; - } - - protected boolean testConnection() { - return testConnection(false); - } - - protected boolean testConnection(boolean errorLevel) { - - String testQuery = "SELECT @@global.read_only, @@global.hostname"; - if (isDerby) { - testQuery = "SELECT 'false', 'localhost' FROM SYSIBM.SYSDUMMY1"; - } - ResultSet rs = null; - try (Connection conn = this.getConnection(); Statement stmt = conn.createStatement()) { - Boolean readOnly; - String hostname; - rs = stmt.executeQuery(testQuery); // ("SELECT 1 FROM DUAL"); //"select - // BANNER from SYS.V_$VERSION" - while (rs.next()) { - readOnly = rs.getBoolean(1); - hostname = rs.getString(2); - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug(DATA_SOURCE_CONNECT_SUCCESS,getDbConnectionName(),hostname,readOnly); - } - } - } catch (Exception exc) { - if (errorLevel) { - LOGGER.error(DATA_SOURCE_CONNECT_FAILURE, this.getDbConnectionName(),exc.getMessage()); - } else { - LOGGER.info(DATA_SOURCE_CONNECT_FAILURE, this.getDbConnectionName(),exc.getMessage()); - } - return false; - } finally { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - LOGGER.error(e.getLocalizedMessage(), e); - } - } - } - return true; - } - - @Override - public boolean isWrapperFor(Class<?> iface) throws SQLException { - return false; - } - - @Override - public <T> T unwrap(Class<T> iface) throws SQLException { - return null; - } - - public void addObserver(Observer observer) { - monitor.addObserver(observer); - } - - public void deleteObserver(Observer observer) { - monitor.deleteObserver(observer); - } - - public int getIndex() { - return index; - } - - @Override - public long getInterval() { - return interval; - } - - @Override - public long getInitialDelay() { - return initialDelay; - } - - @Override - public void setInterval(long value) { - interval = value; - } - - @Override - public void setInitialDelay(long value) { - initialDelay = value; - } - - @Override - public long getExpectedCompletionTime() { - return expectedCompletionTime; - } - - @Override - public void setExpectedCompletionTime(long value) { - expectedCompletionTime = value; - } - - @Override - public long getUnprocessedFailoverThreshold() { - return unprocessedFailoverThreshold; - } - - @Override - public void setUnprocessedFailoverThreshold(long value) { - this.unprocessedFailoverThreshold = value; - } - - public boolean canTakeOffLine() { - return canTakeOffLine; - } - - public void blockImmediateOffLine() { - canTakeOffLine = false; - final Thread offLineTimer = new Thread(() -> { - try { - Thread.sleep(30000L); - } catch (Exception exc) { - LOGGER.error(exc.getLocalizedMessage(), exc); - } finally { - canTakeOffLine = true; - } - }); - offLineTimer.setDaemon(true); - offLineTimer.start(); - } - - /** - * @return the monitor - */ - final SQLExecutionMonitor getMonitor() { - return monitor; - } - - protected boolean isSlave() throws PoolExhaustedException { - - // If using Apache derby, just return false - if (isDerby) { - return false; - } - CachedRowSet rs; - boolean isSlave; - String hostname = "UNDETERMINED"; - try { - boolean localSlave = true; - rs = this.getData("SELECT @@global.read_only, @@global.hostname", new ArrayList<>()); - while (rs.next()) { - localSlave = rs.getBoolean(1); - hostname = rs.getString(2); - } - isSlave = localSlave; - } catch (PoolExhaustedException peexc) { - throw peexc; - } catch (Exception e) { - LOGGER.error("", e); - isSlave = true; - } - if (isSlave) { - LOGGER.debug("SQL SLAVE : {} on server {}, pool {}", connectionName, getDbConnectionName(), getAvailableConnections()); - } else { - LOGGER.debug("SQL MASTER : {} on server {}, pool {}", connectionName, getDbConnectionName(), getAvailableConnections()); - } - return isSlave; - } - - public boolean isFabric() { - return false; - } - - protected boolean lockTable(Connection conn, String tableName) { - boolean retValue = false; - String query = "LOCK TABLES " + tableName + " WRITE"; - try (Statement preStmt = conn.createStatement(); - Statement lock = conn.prepareStatement(query)) { - if (tableName != null) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Executing 'LOCK TABLES " + tableName + " WRITE' on connection " + conn.toString()); - if ("SVC_LOGIC".equals(tableName)) { - Exception e = new Exception(); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - LOGGER.debug(sw.toString()); - } - } - lock.execute(query); - retValue = true; - } - } catch (Exception exc) { - LOGGER.error("", exc); - retValue = false; - } - return retValue; - } - - protected boolean unlockTable(Connection conn) { - boolean retValue; - try (Statement lock = conn.createStatement()) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Executing 'UNLOCK TABLES' on connection {}", conn); - } - retValue = lock.execute("UNLOCK TABLES"); - } catch (Exception exc) { - LOGGER.error("", exc); - retValue = false; - } - return retValue; - } - - public void getPoolInfo(boolean allocation) { - - } - - public long getNextErrorReportTime() { - return nextErrorReportTime; - } - - public void setNextErrorReportTime(long nextTime) { - this.nextErrorReportTime = nextTime; - } - - public void setGlobalHostName(String hostname) { - this.globalHostName = hostname; - } - - public String getGlobalHostName() { - return globalHostName; - } - - static class LapsedTimer { - private final long msTime = System.currentTimeMillis(); - - public String lapsedTime() { - double timediff = System.currentTimeMillis() - msTime; - timediff = timediff/1000; - return String.valueOf( timediff)+"s"; - } - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSourceFactory.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSourceFactory.java deleted file mode 100644 index 15aa7a1d0..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSourceFactory.java +++ /dev/null @@ -1,46 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Modifications Copyright (C) 2018 IBM. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - - -import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; -import org.onap.ccsdk.sli.core.dblib.config.JDBCConfiguration; -import org.onap.ccsdk.sli.core.dblib.jdbc.JdbcDBCachedDataSource; - -/** - * @version $Revision: 1.1 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ -public class CachedDataSourceFactory { - - public static CachedDataSource createDataSource(BaseDBConfiguration config) { - if(config instanceof JDBCConfiguration) - return JdbcDBCachedDataSource.createInstance(config); - - return null; - } - -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBConfigException.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBConfigException.java deleted file mode 100644 index e41e29b5d..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBConfigException.java +++ /dev/null @@ -1,47 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - - -/** - * @version $Revision: 1.1 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ -public class DBConfigException extends RuntimeException -{ - /** - * - */ - private static final long serialVersionUID = 4752405152537680257L; - - public DBConfigException(Exception e) - { - super(e.toString()); - } - - public DBConfigException(String msg) - { - super(msg); - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLIBResourceProvider.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLIBResourceProvider.java deleted file mode 100755 index 45e5a7870..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLIBResourceProvider.java +++ /dev/null @@ -1,165 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Optional; -import java.util.Properties; -import java.util.Vector; -import org.onap.ccsdk.sli.core.utils.JREFileResolver; -import org.onap.ccsdk.sli.core.utils.KarafRootFileResolver; -import org.onap.ccsdk.sli.core.utils.PropertiesFileResolver; -import org.onap.ccsdk.sli.core.utils.common.CoreDefaultFileResolver; -import org.onap.ccsdk.sli.core.utils.common.SdncConfigEnvVarFileResolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Responsible for determining the properties file to use and instantiating the <code>DBResourceManager</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>dblib.properties</code></li> - * <li>A <code>dblib.properties</code> file located in the karaf root directory</li> - * </ol> - * - * Encryption Support - * <ol> - * <li>Uses ecryption provided by <code>AAAEncryptionService</code></li> - * <li>AAA Configuration file is <code>aaa-cert-config.xml</code></li> - * </ol> - */ -public class DBLIBResourceProvider { - - private static final Logger LOG = LoggerFactory.getLogger(DBLIBResourceProvider.class); - - /** - * The name of the properties file for database configuration - */ - private static final String DBLIB_PROP_FILE_NAME = "dblib.properties"; - - private static final String DBLIB_PROPERTY_NAME = "org.onap.ccsdk.sli.jdbc.password"; - - /** - * A prioritized list of strategies for resolving dblib properties files. - */ - private Vector<PropertiesFileResolver> dblibPropertiesFileResolvers = 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 DBLIBResourceProvider() { - dblibPropertiesFileResolvers.add(new SdncConfigEnvVarFileResolver( - "Using property file (1) from environment variable" - )); - dblibPropertiesFileResolvers.add(new CoreDefaultFileResolver( - "Using property file (2) from default directory" - )); - dblibPropertiesFileResolvers.add(new JREFileResolver( - "Using property file (3) from JRE argument", DBLIBResourceProvider.class - )); - dblibPropertiesFileResolvers.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 DblibConfigurationException("Failed to load properties for file: " - + propertiesFile.toString(), e)); - } - } - } - - /** - * Extract db config properties. - * - * @return the db 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 dblibConfigurationException An exception describing what went wrong during resolution - */ - private static void reportFailure(final String message, - final DblibConfigurationException dblibConfigurationException) { - - LOG.error("{}", message, dblibConfigurationException); - } - - /** - * Determines the dblib 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>dblib.properties</code></li> - * <li>A <code>dblib.properties</code> file located in the karaf root directory</li> - * </ol> - */ - File determinePropertiesFile(final DBLIBResourceProvider dblibResourceProvider) { - - for (final PropertiesFileResolver dblibPropertiesFileResolver : dblibPropertiesFileResolvers) { - final Optional<File> fileOptional = dblibPropertiesFileResolver.resolveFile(DBLIB_PROP_FILE_NAME); - if (fileOptional.isPresent()) { - return reportSuccess(dblibPropertiesFileResolver.getSuccessfulResolutionMessage(), fileOptional); - } - } - - reportFailure("Missing configuration properties resource(3)", - new DblibConfigurationException("Missing configuration properties resource(3): " - + DBLIB_PROP_FILE_NAME)); - return null; - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibConnection.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibConnection.java deleted file mode 100644 index 65d0b9512..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibConnection.java +++ /dev/null @@ -1,387 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.sql.Array; -import java.sql.Blob; -import java.sql.CallableStatement; -import java.sql.Clob; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.NClob; -import java.sql.PreparedStatement; -import java.sql.SQLClientInfoException; -import java.sql.SQLException; -import java.sql.SQLWarning; -import java.sql.SQLXML; -import java.sql.Savepoint; -import java.sql.Statement; -import java.sql.Struct; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.Executor; -import javax.sql.rowset.CachedRowSet; -import org.apache.tomcat.jdbc.pool.PooledConnection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DBLibConnection implements Connection { - - private static final Logger LOGGER = LoggerFactory.getLogger(DBLibConnection.class); - - private final Connection connection; - private final CachedDataSource dataSource; - private boolean locked = false; - private String tableName = null; - - public DBLibConnection(Connection con, CachedDataSource dataSource) { - this.connection = con; - this.dataSource = dataSource; - locked = false; - dataSource.getPoolInfo(true); - } - - public boolean lockTable(String tablename) { - this.tableName = tablename; - locked = dataSource.lockTable(connection, tableName); - return locked; - } - - public void resetInactivityTimer() { - Class<org.apache.tomcat.jdbc.pool.PooledConnection> iface = PooledConnection.class; - try { - PooledConnection pc = connection.unwrap(iface); - pc.setTimestamp(System.currentTimeMillis()); - } catch (SQLException e) { - LOGGER.warn("Failed resetting timeout timer", e); - } - } - - public boolean unlock() { - dataSource.unlockTable(connection); - locked = false; - return false; - } - - public boolean writeData(String statement, List<String> arguments) throws Throwable { - ArrayList<Object> newList = new ArrayList<>(); - if (arguments != null && !arguments.isEmpty()) { - newList.addAll(arguments); - } - resetInactivityTimer(); - return dataSource.executeUpdatePreparedStatement(connection, statement, newList, false); - } - - public CachedRowSet getData(String statement, List<String> arguments) throws Throwable { - ArrayList<Object> newList = new ArrayList<>(); - if (arguments != null && !arguments.isEmpty()) { - newList.addAll(arguments); - } - resetInactivityTimer(); - return dataSource.executePreparedStatement(connection, statement, newList, false); - } - - @Override - public <T> T unwrap(Class<T> iFace) throws SQLException { - return connection.unwrap(iFace); - } - - @Override - public boolean isWrapperFor(Class<?> iFace) throws SQLException { - return connection.isWrapperFor(iFace); - } - - @Override - public Statement createStatement() throws SQLException { - return connection.createStatement(); - } - - @Override - public PreparedStatement prepareStatement(String sql) throws SQLException { - return connection.prepareStatement(sql); - } - - @Override - public CallableStatement prepareCall(String sql) throws SQLException { - return connection.prepareCall(sql); - } - - @Override - public String nativeSQL(String sql) throws SQLException { - return connection.nativeSQL(sql); - } - - @Override - public void setAutoCommit(boolean autoCommit) throws SQLException { - connection.setAutoCommit(autoCommit); - } - - @Override - public boolean getAutoCommit() throws SQLException { - return connection.getAutoCommit(); - } - - @Override - public void commit() throws SQLException { - connection.commit(); - } - - @Override - public void rollback() throws SQLException { - connection.rollback(); - } - - @Override - public void close() throws SQLException { - if (this.locked) { - try { - this.unlock(); - } catch (Exception th) { - LOGGER.error("Failed unlocking", th); - } - } - if (connection != null && !connection.isClosed()) { - connection.close(); - } - dataSource.getPoolInfo(false); - } - - @Override - public boolean isClosed() throws SQLException { - return connection.isClosed(); - } - - @Override - public DatabaseMetaData getMetaData() throws SQLException { - return connection.getMetaData(); - } - - @Override - public void setReadOnly(boolean readOnly) throws SQLException { - connection.setReadOnly(readOnly); - } - - @Override - public boolean isReadOnly() throws SQLException { - return connection.isReadOnly(); - } - - @Override - public void setCatalog(String catalog) throws SQLException { - connection.setCatalog(catalog); - } - - @Override - public String getCatalog() throws SQLException { - return connection.getCatalog(); - } - - @Override - public void setTransactionIsolation(int level) throws SQLException { - connection.setTransactionIsolation(level); - } - - @Override - public int getTransactionIsolation() throws SQLException { - return connection.getTransactionIsolation(); - } - - @Override - public SQLWarning getWarnings() throws SQLException { - return connection.getWarnings(); - } - - @Override - public void clearWarnings() throws SQLException { - connection.clearWarnings(); - } - - @Override - public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { - return connection.createStatement(resultSetType, resultSetConcurrency); - } - - @Override - public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) - throws SQLException { - return connection.prepareStatement(sql, resultSetType, resultSetConcurrency); - } - - @Override - public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { - return connection.prepareCall(sql, resultSetType, resultSetConcurrency); - } - - @Override - public Map<String, Class<?>> getTypeMap() throws SQLException { - return connection.getTypeMap(); - } - - @Override - public void setTypeMap(Map<String, Class<?>> map) throws SQLException { - connection.setTypeMap(map); - } - - @Override - public void setHoldability(int holdability) throws SQLException { - connection.setHoldability(holdability); - } - - @Override - public int getHoldability() throws SQLException { - return connection.getHoldability(); - } - - @Override - public Savepoint setSavepoint() throws SQLException { - return connection.setSavepoint(); - } - - @Override - public Savepoint setSavepoint(String name) throws SQLException { - return connection.setSavepoint(name); - } - - @Override - public void rollback(Savepoint savepoint) throws SQLException { - connection.rollback(savepoint); - } - - @Override - public void releaseSavepoint(Savepoint savepoint) throws SQLException { - connection.releaseSavepoint(savepoint); - } - - @Override - public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) - throws SQLException { - return connection.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); - } - - @Override - public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, - int resultSetHoldability) throws SQLException { - return connection.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); - } - - @Override - public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, - int resultSetHoldability) throws SQLException { - return connection.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); - } - - @Override - public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { - return connection.prepareStatement(sql, autoGeneratedKeys); - } - - @Override - public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { - return connection.prepareStatement(sql, columnIndexes); - } - - @Override - public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { - return connection.prepareStatement(sql, columnNames); - } - - @Override - public Clob createClob() throws SQLException { - return connection.createClob(); - } - - @Override - public Blob createBlob() throws SQLException { - return connection.createBlob(); - } - - @Override - public NClob createNClob() throws SQLException { - return connection.createNClob(); - } - - @Override - public SQLXML createSQLXML() throws SQLException { - return connection.createSQLXML(); - } - - @Override - public boolean isValid(int timeout) throws SQLException { - return connection.isValid(timeout); - } - - @Override - public void setClientInfo(String name, String value) throws SQLClientInfoException { - connection.setClientInfo(name, value); - } - - @Override - public void setClientInfo(Properties properties) throws SQLClientInfoException { - connection.setClientInfo(properties); - } - - @Override - public String getClientInfo(String name) throws SQLException { - return connection.getClientInfo(name); - } - - @Override - public Properties getClientInfo() throws SQLException { - return connection.getClientInfo(); - } - - @Override - public Array createArrayOf(String typeName, Object[] elements) throws SQLException { - return connection.createArrayOf(typeName, elements); - } - - @Override - public Struct createStruct(String typeName, Object[] attributes) throws SQLException { - return connection.createStruct(typeName, attributes); - } - - @Override - public void setSchema(String schema) throws SQLException { - connection.setSchema(schema); - } - - @Override - public String getSchema() throws SQLException { - return connection.getSchema(); - } - - @Override - public void abort(Executor executor) throws SQLException { - connection.abort(executor); - } - - @Override - public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { - connection.setNetworkTimeout(executor, milliseconds); - } - - @Override - public int getNetworkTimeout() throws SQLException { - return connection.getNetworkTimeout(); - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibException.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibException.java deleted file mode 100644 index de241f478..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBLibException.java +++ /dev/null @@ -1,39 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.sql.SQLException; - -/** - * An exception time for handling DBLIB specific error handling. - */ -public class DBLibException extends SQLException { - - /** - * - */ - private static final long serialVersionUID = -5345059355083984696L; - - public DBLibException(String message){ - super(message); - } - -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceManager.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceManager.java deleted file mode 100755 index 7c71bcc81..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceManager.java +++ /dev/null @@ -1,983 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Modifications Copyright (C) 2018 IBM. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.io.PrintWriter; -import java.sql.Connection; -import java.sql.Driver; -import java.sql.SQLDataException; -import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; -import java.sql.SQLIntegrityConstraintViolationException; -import java.sql.SQLNonTransientConnectionException; -import java.sql.SQLSyntaxErrorException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Map; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Observable; -import java.util.Properties; -import java.util.Set; -import java.util.SortedSet; -import java.util.TimerTask; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ConcurrentSkipListSet; -import java.util.stream.Collectors; - -import javax.sql.DataSource; -import javax.sql.rowset.CachedRowSet; - -import org.apache.tomcat.jdbc.pool.PoolExhaustedException; -import org.onap.ccsdk.sli.core.dblib.config.DbConfigPool; -import org.onap.ccsdk.sli.core.dblib.config.JDBCConfiguration; -import org.onap.ccsdk.sli.core.dblib.config.TerminatingConfiguration; -import org.onap.ccsdk.sli.core.dblib.factory.DBConfigFactory; -import org.onap.ccsdk.sli.core.dblib.pm.PollingWorker; -import org.onap.ccsdk.sli.core.dblib.pm.SQLExecutionMonitor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @version $Revision: 1.15 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */ -public class DBResourceManager implements DataSource, DataAccessor, DBResourceObserver, DbLibService { - private static final Logger LOGGER = LoggerFactory.getLogger(DBResourceManager.class); - private static final String DATABASE_URL = "org.onap.ccsdk.sli.jdbc.url"; - - transient boolean terminating = false; - transient protected long retryInterval = 10000L; - transient boolean recoveryMode = true; - - SortedSet<CachedDataSource> dsQueue = new ConcurrentSkipListSet<>(new DataSourceComparator()); - protected final Set<CachedDataSource> broken = Collections.synchronizedSet(new HashSet<CachedDataSource>()); - protected final Object monitor = new Object(); - protected final Properties configProps; - protected final Thread worker; - - protected final long terminationTimeOut; - protected final boolean monitorDbResponse; - protected final long monitoringInterval; - protected final long monitoringInitialDelay; - protected final long expectedCompletionTime; - protected final long unprocessedFailoverThreshold; - private static final String LOGGER_ALARM_MSG="Generated alarm: DBResourceManager.getData - No active DB connection pools are available."; - private static final String EXCEPTION_MSG= "No active DB connection pools are available in RequestDataNoRecovery call."; - - public DBResourceManager(final DBLIBResourceProvider configuration) { - this(configuration.getProperties()); - } - - public DBResourceManager(final Properties properties) { - this.configProps = processSystemVariables(properties); - - // TODO : hack to force classloader to cache mariadb driver. This shouldnt be necessary, - // but for some reason it is (without this, dblib throws ClassNotFound on mariadb driver - // and fails to load). - LOGGER.info("Creating dummy instance of org.mariadb.jdbc.Driver"); - Driver dvr = new org.mariadb.jdbc.Driver(); - dvr = null; - - // get retry interval value - retryInterval = getLongFromProperties(configProps, "org.onap.dblib.connection.retry", 10000L); - - // get recovery mode flag - recoveryMode = getBooleanFromProperties(configProps, "org.onap.dblib.connection.recovery", true); - if(!recoveryMode) - { - recoveryMode = false; - LOGGER.info("Recovery Mode disabled"); - } - // get time out value for thread cleanup - terminationTimeOut = getLongFromProperties(configProps, "org.onap.dblib.termination.timeout", 300000L); - // get properties for monitoring - monitorDbResponse = getBooleanFromProperties(configProps, "org.onap.dblib.connection.monitor", false); - monitoringInterval = getLongFromProperties(configProps, "org.onap.dblib.connection.monitor.interval", 1000L); - monitoringInitialDelay = getLongFromProperties(configProps, "org.onap.dblib.connection.monitor.startdelay", 5000L); - expectedCompletionTime = getLongFromProperties(configProps, "org.onap.dblib.connection.monitor.expectedcompletiontime", 5000L); - unprocessedFailoverThreshold = getLongFromProperties(configProps, "org.onap.dblib.connection.monitor.unprocessedfailoverthreshold", 3L); - - // initialize performance monitor - PollingWorker.createInistance(configProps); - - // initialize recovery thread - worker = new RecoveryMgr(); - worker.setName("DBResourcemanagerWatchThread"); - worker.setDaemon(true); - worker.start(); - - try { - this.config(configProps); - } catch (final Exception e) { - // TODO: config throws <code>Exception</code> which is poor practice. Eliminate this in a separate patch. - LOGGER.error("Fatal Exception encountered while configuring DBResourceManager", e); - } - } - - public static Properties processSystemVariables(Properties properties) { - Map<Object, Object> hmap = new Properties(); - hmap.putAll(properties); - - Map<Object, Object> result = hmap.entrySet().stream() - .filter(map -> map.getValue().toString().startsWith("${")) - .filter(map -> map.getValue().toString().endsWith("}")) - .collect(Collectors.toMap(map -> map.getKey(), map -> map.getValue())); - - result.forEach((name, propEntries) -> { - hmap.put(name, replace(propEntries.toString())); - }); - - if(hmap.containsKey(DATABASE_URL) && hmap.get(DATABASE_URL).toString().contains("${")) { - String url = hmap.get(DATABASE_URL).toString(); - String[] innerChunks = url.split("\\$\\{"); - for(String chunk : innerChunks) { - if(chunk.contains("}")) { - String subChunk = chunk.substring(0, chunk.indexOf("}")); - String varValue = System.getenv(subChunk); - url = url.replace("${"+subChunk+"}", varValue); - } - } - hmap.put(DATABASE_URL, url); - } - return Properties.class.cast(hmap); - } - - - private static String replace(String value) { - String globalVariable = value.substring(2, value.length() -1); - String varValue = System.getenv(globalVariable); - return (varValue != null) ? varValue : value; - } - - - private void config(Properties configProps) throws Exception { - final ConcurrentLinkedQueue<CachedDataSource> semaphore = new ConcurrentLinkedQueue<>(); - final DbConfigPool dbConfig = DBConfigFactory.createConfig(configProps); - - long startTime = System.currentTimeMillis(); - - try { - JDBCConfiguration[] config = dbConfig.getJDBCbSourceArray(); - CachedDataSource[] cachedDS = new CachedDataSource[config.length]; - if (cachedDS == null || cachedDS.length == 0) { - LOGGER.error("Initialization of CachedDataSources failed. No instance was created."); - throw new Exception("Failed to initialize DB Library. No data source was created."); - } - - for(int i = 0; i < config.length; i++) { - cachedDS[i] = CachedDataSourceFactory.createDataSource(config[i]); - if(cachedDS[i] == null) - continue; - semaphore.add(cachedDS[i]); - cachedDS[i].setInterval(monitoringInterval); - cachedDS[i].setInitialDelay(monitoringInitialDelay); - cachedDS[i].setExpectedCompletionTime(expectedCompletionTime); - cachedDS[i].setUnprocessedFailoverThreshold(unprocessedFailoverThreshold); - cachedDS[i].addObserver(DBResourceManager.this); - } - - DataSourceTester[] tester = new DataSourceTester[config.length]; - - for(int i=0; i<tester.length; i++){ - tester[i] = new DataSourceTester(cachedDS[i], DBResourceManager.this, semaphore); - tester[i].start(); - } - - // the timeout param is set is seconds. - long timeout = ((dbConfig.getTimeout() <= 0) ? 60L : dbConfig.getTimeout()); - LOGGER.debug("Timeout set to {} seconds", timeout); - timeout *= 1000; - - - synchronized (semaphore) { - semaphore.wait(timeout); - } - } catch(Exception exc){ - LOGGER.warn("DBResourceManager.initWorker", exc); - } finally { - startTime = System.currentTimeMillis() - startTime; - LOGGER.info("Completed wait with {} active datasource(s) in {} ms", dsQueue.size(), startTime); - } - } - - - private final class DataSourceComparator implements Comparator<CachedDataSource> { - @Override - public int compare(CachedDataSource left, CachedDataSource right) { - if(LOGGER.isTraceEnabled()) - LOGGER.trace("----------SORTING-------- () : ()", left.getDbConnectionName(), right.getDbConnectionName()); - try { - if(left == right) { - return 0; - } - if(left == null){ - return 1; - } - if(right == null){ - return -1; - } - - boolean leftMaster = !left.isSlave(); - if(leftMaster) { - if(left.getIndex() <= right.getIndex()) - return -1; - else { - boolean rightMaster = !right.isSlave(); - if(rightMaster) { - if(left.getIndex() <= right.getIndex()) - return -1; -// if(left.getIndex() > right.getIndex()) - else { - return 1; - } - } else { - return -1; - } - } - } - if(!right.isSlave()) - return 1; - - if(left.getIndex() <= right.getIndex()) - return -1; - if(left.getIndex() > right.getIndex()) - return 1; - - - } catch (Throwable e) { - LOGGER.warn("", e); - } - return -1; - } - } - - class DataSourceTester extends Thread { - - private final CachedDataSource ds; - private final DBResourceManager manager; - private final ConcurrentLinkedQueue<CachedDataSource> semaphoreQ; - - public DataSourceTester(CachedDataSource ds, DBResourceManager manager, ConcurrentLinkedQueue<CachedDataSource> semaphore) { - this.ds = ds; - this.manager = manager; - this.semaphoreQ = semaphore; - } - - @Override - public void run() { - manager.setDataSource(ds); - boolean slave = true; - if(ds != null) { - try { - slave = ds.isSlave(); - } catch (Exception exc) { - LOGGER.warn("", exc); - } - } - if(!slave) { - LOGGER.info("Adding MASTER {} to active queue", ds.getDbConnectionName()); - try { - synchronized (semaphoreQ) { - semaphoreQ.notifyAll(); - } - } catch(Exception exc) { - LOGGER.warn("", exc); - } - } - try { - synchronized (semaphoreQ) { - semaphoreQ.remove(ds); - } - if(semaphoreQ.isEmpty()) { - synchronized (semaphoreQ) { - semaphoreQ.notifyAll(); - } - } - } catch(Exception exc) { - LOGGER.warn("", exc); - } - if(ds != null) - LOGGER.info("Thread DataSourceTester terminated {} for {}", this.getName(), ds.getDbConnectionName()); - } - - } - - - private long getLongFromProperties(Properties props, String property, long defaultValue) - { - String value = null; - long tmpLongValue = defaultValue; - try { - value = props.getProperty(property); - if(value != null) - tmpLongValue = Long.parseLong(value); - - } catch(NumberFormatException exc) { - if(LOGGER.isWarnEnabled()){ - LOGGER.warn("'"+property+"'=" + value+" is invalid. It should be a numeric value"); - } - } catch(Exception exc) { - } - return tmpLongValue; - - } - - private boolean getBooleanFromProperties(Properties props, String property, boolean defaultValue) - { - boolean tmpValue = defaultValue; - String value = null; - - try { - value = props.getProperty(property); - if(value != null) - tmpValue = Boolean.parseBoolean(value); - - } catch(NumberFormatException exc) { - if(LOGGER.isWarnEnabled()){ - LOGGER.warn("'"+property+"'=" + value+" is invalid. It should be a boolean value"); - } - } catch(Exception exc) { - } - return tmpValue; - - } - - - @Override - public void update(Observable observable, Object data) { - // if observable is active and there is a standby available, switch - if(observable instanceof SQLExecutionMonitor) - { - SQLExecutionMonitor monitor = (SQLExecutionMonitor)observable; - if(monitor.getParent() instanceof CachedDataSource) - { - CachedDataSource dataSource = (CachedDataSource)monitor.getParent(); - if(dataSource == dsQueue.first()) - { - if(recoveryMode && dsQueue.size() > 1){ - handleGetConnectionException(dataSource, new Exception(data.toString())); - } - } - } - } - } - - public void testForceRecovery() - { - CachedDataSource active = this.dsQueue.first(); - handleGetConnectionException(active, new Exception("test")); - } - - class RecoveryMgr extends Thread { - - @Override - public void run() { - while(!terminating) - { - try { - Thread.sleep(retryInterval); - } catch (InterruptedException e1) { } - CachedDataSource brokenSource = null; - try { - if (!broken.isEmpty()) { - CachedDataSource[] sourceArray = broken.toArray(new CachedDataSource[0]); - for (int i = 0; i < sourceArray.length; i++) - { - brokenSource = sourceArray[i]; - if (brokenSource instanceof TerminatingCachedDataSource) - break; - if (resetConnectionPool(brokenSource)) { - broken.remove(brokenSource); - brokenSource.blockImmediateOffLine(); - dsQueue.add(brokenSource); - LOGGER.info("DataSource <" - + brokenSource.getDbConnectionName() - + "> recovered."); - } - brokenSource = null; - } - } - } catch (Exception exc) { - LOGGER.warn(exc.getMessage()); - if(brokenSource != null){ - try { - if(!broken.contains(brokenSource)) - broken.add(brokenSource); - brokenSource = null; - } catch (Exception e1) { } - } - } - } - LOGGER.info("DBResourceManager.RecoveryMgr <"+this.toString() +"> terminated." ); - } - - private boolean resetConnectionPool(CachedDataSource dataSource){ - try { - return dataSource.testConnection(); - } catch (Exception exc) { - LOGGER.info("DataSource <" + dataSource.getDbConnectionName() + "> resetCache failed with error: "+ exc.getMessage()); - return false; - } - } - } - - /* (non-Javadoc) - * @see org.onap.ccsdk.sli.resource.dblib.DbLibService#getData(java.lang.String, java.util.ArrayList, java.lang.String) - */ - @Override - public CachedRowSet getData(String statement, ArrayList<String> arguments, String preferredDS) throws SQLException { - ArrayList<Object> newList= new ArrayList<>(); - if(arguments != null && !arguments.isEmpty()) { - newList.addAll(arguments); - } - if(recoveryMode) - return requestDataWithRecovery(statement, newList, preferredDS); - else - return requestDataNoRecovery(statement, newList, preferredDS); - } - - private CachedRowSet requestDataWithRecovery(String statement, ArrayList<Object> arguments, String preferredDS) throws SQLException { - Throwable lastException = null; - - // test if there are any connection pools available - if(this.dsQueue.isEmpty()){ - LOGGER.error(LOGGER_ALARM_MSG); - throw new DBLibException("No active DB connection pools are available in RequestDataWithRecovery call."); - } - - // loop through available data sources to retrieve data. - for(int i=0; i< 2; i++) - { - CachedDataSource active = this.dsQueue.first(); - - long time = System.currentTimeMillis(); - try { - if(!active.isFabric()) { - if(this.dsQueue.size() > 1 && active.isSlave()) { - CachedDataSource master = findMaster(); - if(master != null) { - active = master; - } - } - } - - return active.getData(statement, arguments); - } catch(SQLDataException | SQLSyntaxErrorException | SQLIntegrityConstraintViolationException exc){ - throw exc; - } catch(Throwable exc){ - if(exc instanceof SQLException) { - SQLException sqlExc = (SQLException)exc; - int code = sqlExc.getErrorCode(); - String state = sqlExc.getSQLState(); - LOGGER.debug("SQLException code: {} state: {}", code, state); - if("07001".equals(sqlExc.getSQLState())) { - throw sqlExc; - } - } - lastException = exc; - LOGGER.error("Generated alarm: {}", active.getDbConnectionName(), exc); - handleGetConnectionException(active, exc); - } finally { - if(LOGGER.isDebugEnabled()){ - time = System.currentTimeMillis() - time; - LOGGER.debug("getData processing time : {} {} miliseconds.", active.getDbConnectionName(), time); - } - } - } - if(lastException instanceof SQLException){ - throw (SQLException)lastException; - } - // repackage the exception - // you are here because either you run out of available data sources - // or the last exception was not of SQLException type. - // repackage the exception - if(lastException == null) { - throw new DBLibException("The operation timed out while waiting to acquire a new connection." ); - } else { - SQLException exception = new DBLibException(lastException.getMessage()); - exception.setStackTrace(lastException.getStackTrace()); - if(lastException.getCause() instanceof SQLException) { - throw (SQLException)lastException.getCause(); - } - throw exception; - } - } - - private CachedRowSet requestDataNoRecovery(String statement, ArrayList<Object> arguments, String preferredDS) throws SQLException { - if(dsQueue.isEmpty()){ - LOGGER.error(LOGGER_ALARM_MSG); - throw new DBLibException(EXCEPTION_MSG); - } - CachedDataSource active = this.dsQueue.first(); - long time = System.currentTimeMillis(); - try { - if(!active.isFabric()) { - if(this.dsQueue.size() > 1 && active.isSlave()) { - CachedDataSource master = findMaster(); - if(master != null) { - active = master; - } - } - } - return active.getData(statement, arguments); - - } catch(Throwable exc){ - String message = exc.getMessage(); - if(message == null) - message = exc.getClass().getName(); - LOGGER.error("Generated alarm: {} - {}",active.getDbConnectionName(), message); - if(exc instanceof SQLException) - throw (SQLException)exc; - else { - DBLibException excptn = new DBLibException(exc.getMessage()); - excptn.setStackTrace(exc.getStackTrace()); - throw excptn; - } - } finally { - if(LOGGER.isDebugEnabled()){ - time = System.currentTimeMillis() - time; - LOGGER.debug(">> getData : {} {} miliseconds.", active.getDbConnectionName(), time); - } - } - } - - - /* (non-Javadoc) - * @see org.onap.ccsdk.sli.resource.dblib.DbLibService#writeData(java.lang.String, java.util.ArrayList, java.lang.String) - */ - @Override - public boolean writeData(String statement, ArrayList<String> arguments, String preferredDS) throws SQLException - { - ArrayList<Object> newList= new ArrayList<>(); - if(arguments != null && !arguments.isEmpty()) { - newList.addAll(arguments); - } - - return writeDataNoRecovery(statement, newList, preferredDS); - } - - synchronized CachedDataSource findMaster() throws SQLException { - final CachedDataSource[] clone = this.dsQueue.toArray(new CachedDataSource[0]); - - for(final CachedDataSource dss : clone) { - if(!dss.isSlave()) { - final CachedDataSource first = this.dsQueue.first(); - if(first != dss) { - if(LOGGER.isDebugEnabled()) - LOGGER.debug("----------REODRERING--------"); - dsQueue.clear(); - if(!dsQueue.addAll(Arrays.asList(clone))) { - LOGGER.error("Failed adding datasources"); - } - } - return dss; - } - } - LOGGER.warn("MASTER not found."); - return null; - } - - - private boolean writeDataNoRecovery(String statement, ArrayList<Object> arguments, String preferredDS) throws SQLException { - if(dsQueue.isEmpty()){ - LOGGER.error(LOGGER_ALARM_MSG); - throw new DBLibException(EXCEPTION_MSG); - } - - boolean initialRequest = true; - boolean retryAllowed = true; - CachedDataSource active = this.dsQueue.first(); - long time = System.currentTimeMillis(); - while(initialRequest) { - initialRequest = false; - try { - if(!active.isFabric()) { - if(this.dsQueue.size() > 1 && active.isSlave()) { - CachedDataSource master = findMaster(); - if(master != null) { - active = master; - } - } - } - - return active.writeData(statement, arguments); - } catch(Throwable exc){ - String message = exc.getMessage(); - if(message == null) - message = exc.getClass().getName(); - LOGGER.error("Generated alarm: {} - {}", active.getDbConnectionName(), message); - if(exc instanceof SQLException) { - SQLException sqlExc = SQLException.class.cast(exc); - // handle read-only exception - if(sqlExc.getErrorCode() == 1290 && "HY000".equals(sqlExc.getSQLState())) { - LOGGER.warn("retrying due to: {}", sqlExc.getMessage()); - this.findMaster(); - if(retryAllowed){ - retryAllowed = false; - initialRequest = true; - continue; - } - } - throw (SQLException)exc; - } else { - DBLibException excptn = new DBLibException(exc.getMessage()); - excptn.setStackTrace(exc.getStackTrace()); - throw excptn; - } - } finally { - if(LOGGER.isDebugEnabled()){ - time = System.currentTimeMillis() - time; - LOGGER.debug("writeData processing time : {} {} miliseconds.", active.getDbConnectionName(), time); - } - } - } - return true; - } - - public void setDataSource(CachedDataSource dataSource) { - if(this.dsQueue.contains(dataSource)) - return; - if(this.broken.contains(dataSource)) - return; - - if(dataSource.testConnection(true)){ - this.dsQueue.add(dataSource); - } else { - this.broken.add(dataSource); - } - } - - @Override - public Connection getConnection() throws SQLException { - Throwable lastException = null; - CachedDataSource active = null; - - if(dsQueue.isEmpty()){ - throw new DBLibException("No active DB connection pools are available in GetConnection call."); - } - - try { - active = dsQueue.first(); - - if(!active.isFabric()) { - if(this.dsQueue.size() > 1 && active.isSlave()) { - LOGGER.debug("Forcing reorder on: {}", dsQueue.toString()); - CachedDataSource master = findMaster(); - if(master != null) { - active = master; - } - } - } - return new DBLibConnection(active.getConnection(), active); - } catch(javax.sql.rowset.spi.SyncFactoryException exc){ - LOGGER.debug("Free memory (bytes): " + Runtime.getRuntime().freeMemory()); - LOGGER.warn("CLASSPATH issue. Allowing retry", exc); - lastException = exc; - } catch(PoolExhaustedException exc) { - throw new NoAvailableConnectionsException(exc); - } catch(SQLNonTransientConnectionException exc){ - throw new NoAvailableConnectionsException(exc); - } catch(Exception exc){ - lastException = exc; - if(recoveryMode){ - handleGetConnectionException(active, exc); - } else { - if(exc instanceof SQLException) { - throw (SQLException)exc; - } else { - DBLibException excptn = new DBLibException(exc.getMessage()); - excptn.setStackTrace(exc.getStackTrace()); - throw excptn; - } - } - } catch (Throwable trwb) { - DBLibException excptn = new DBLibException(trwb.getMessage()); - excptn.setStackTrace(trwb.getStackTrace()); - throw excptn; - } finally { - if(LOGGER.isDebugEnabled()){ - displayState(); - } - } - - if(lastException instanceof SQLException){ - throw (SQLException)lastException; - } - // repackage the exception - if(lastException == null) { - throw new DBLibException("The operation timed out while waiting to acquire a new connection." ); - } else { - SQLException exception = new DBLibException(lastException.getMessage()); - exception.setStackTrace(lastException.getStackTrace()); - if(lastException.getCause() instanceof SQLException) { - - throw (SQLException)lastException.getCause(); - } - throw exception; - } - } - - @Override - public Connection getConnection(String username, String password) - throws SQLException { - CachedDataSource active = null; - - if(dsQueue.isEmpty()){ - throw new DBLibException("No active DB connection pools are available in GetConnection call."); - } - - - try { - active = dsQueue.first(); - if(!active.isFabric()) { - if(this.dsQueue.size() > 1 && active.isSlave()) { - CachedDataSource master = findMaster(); - if(master != null) { - active = master; - } - } - } - return active.getConnection(username, password); - } catch(Throwable exc){ - if(recoveryMode){ - handleGetConnectionException(active, exc); - } else { - if(exc instanceof SQLException) - throw (SQLException)exc; - else { - DBLibException excptn = new DBLibException(exc.getMessage()); - excptn.setStackTrace(exc.getStackTrace()); - throw excptn; - } - } - - } - - throw new DBLibException("No connections available in DBResourceManager in GetConnection call."); - } - - private void handleGetConnectionException(final CachedDataSource source, Throwable exc) { - try { - if(!source.canTakeOffLine()) - { - LOGGER.error("Could not switch due to blocking"); - return; - } - - boolean removed = dsQueue.remove(source); - if(!broken.contains(source)) - { - if(broken.add(source)) - { - LOGGER.warn("DB Recovery: DataSource <" + source.getDbConnectionName() + "> put in the recovery mode. Reason : " + exc.getMessage()); - } else { - LOGGER.warn("Error putting DataSource <" +source.getDbConnectionName()+ "> in recovery mode."); - } - } else { - LOGGER.info("DB Recovery: DataSource <" + source.getDbConnectionName() + "> already in recovery queue"); - } - if(removed) - { - if(!dsQueue.isEmpty()) - { - LOGGER.warn("DB DataSource <" + dsQueue.first().getDbConnectionName() + "> became active"); - } - } - } catch (Exception e) { - LOGGER.error("", e); - } - } - - public void cleanUp() { - for(Iterator<CachedDataSource> it=dsQueue.iterator();it.hasNext();){ - CachedDataSource cds = it.next(); - it.remove(); - cds.cleanUp(); - } - - try { - this.terminating = true; - if(broken != null) - { - try { - broken.add( new TerminatingCachedDataSource(new TerminatingConfiguration())); - } catch(Exception exc){ - LOGGER.error("Waiting for Worker to stop", exc); - } - } - worker.join(terminationTimeOut); - LOGGER.info("DBResourceManager.RecoveryMgr <"+worker.toString() +"> termination was successful: " + worker.getState()); - } catch(Exception exc){ - LOGGER.error("Waiting for Worker thread to terminate ", exc); - } - } - - @Override - public PrintWriter getLogWriter() throws SQLException { - return this.dsQueue.first().getLogWriter(); - } - - @Override - public int getLoginTimeout() throws SQLException { - return this.dsQueue.first().getLoginTimeout(); - } - - @Override - public void setLogWriter(PrintWriter out) throws SQLException { - this.dsQueue.first().setLogWriter(out); - } - - @Override - public void setLoginTimeout(int seconds) throws SQLException { - this.dsQueue.first().setLoginTimeout(seconds); - } - - public void displayState(){ - if(LOGGER.isDebugEnabled()){ - LOGGER.debug("POOLS : Active = "+dsQueue.size() + ";\t Broken = "+broken.size()); - CachedDataSource current = dsQueue.first(); - if(current != null) { - LOGGER.debug("POOL : Active name = \'"+current.getDbConnectionName()+ "\'"); - } - } - } - - /* (non-Javadoc) - * @see org.onap.ccsdk.sli.resource.dblib.DbLibService#isActive() - */ - @Override - public boolean isActive() { - return this.dsQueue.size()>0; - } - - public String getActiveStatus(){ - return "Connected: " + dsQueue.size()+"\tIn-recovery: "+broken.size(); - } - - public String getDBStatus(boolean htmlFormat) { - StringBuilder buffer = new StringBuilder(); - - ArrayList<CachedDataSource> list = new ArrayList<>(); - list.addAll(dsQueue); - list.addAll(broken); - if (htmlFormat) - { - buffer.append("<tr class=\"headerRow\"><th id=\"header1\">") - .append("Name:").append("</th>"); - for (int i = 0; i < list.size(); i++) { - buffer.append("<th id=\"header").append(2 + i).append("\">"); - buffer.append(list.get(i).getDbConnectionName()).append("</th>"); - } - buffer.append("</tr>"); - - buffer.append("<tr><td>State:</td>"); - for (int i = 0; i < list.size(); i++) { - if (broken.contains(list.get(i))) { - buffer.append("<td>in recovery</td>"); - } - if (dsQueue.contains(list.get(i))) { - if (dsQueue.first() == list.get(i)) - buffer.append("<td>active</td>"); - else - buffer.append("<td>standby</td>"); - } - } - buffer.append("</tr>"); - - } else { - for (int i = 0; i < list.size(); i++) { - buffer.append("Name: ").append(list.get(i).getDbConnectionName()); - buffer.append("\tState: "); - if (broken.contains(list.get(i))) { - buffer.append("in recovery"); - } else - if (dsQueue.contains(list.get(i))) { - if (dsQueue.first() == list.get(i)) - buffer.append("active"); - else - buffer.append("standby"); - } - - buffer.append("\n"); - - } - } - return buffer.toString(); - } - - @Override - public boolean isWrapperFor(Class<?> iface) throws SQLException { - return false; - } - - @Override - public <T> T unwrap(Class<T> iface) throws SQLException { - return null; - } - - /** - * @return the monitorDbResponse - */ - @Override - public final boolean isMonitorDbResponse() { - return recoveryMode && monitorDbResponse; - } - - public void test(){ - CachedDataSource obj = dsQueue.first(); - Exception ption = new Exception(); - try { - for(int i=0; i<5; i++) - { - handleGetConnectionException(obj, ption); - } - } catch(Throwable exc){ - LOGGER.warn("", exc); - } - } - - @Override - public java.util.logging.Logger getParentLogger() - throws SQLFeatureNotSupportedException { - return null; - } - - class RemindTask extends TimerTask { - @Override - public void run() { - CachedDataSource ds = dsQueue.first(); - if(ds != null) - ds.getPoolInfo(false); - } - } - - public int poolSize() { - return dsQueue.size(); - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceObserver.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceObserver.java deleted file mode 100644 index f30212dca..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DBResourceObserver.java +++ /dev/null @@ -1,27 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.util.Observer; - -public interface DBResourceObserver extends Observer { - boolean isMonitorDbResponse(); -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataAccessor.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataAccessor.java deleted file mode 100644 index 93d8b6bf5..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataAccessor.java +++ /dev/null @@ -1,34 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.sql.SQLException; -import java.util.ArrayList; - -import javax.sql.rowset.CachedRowSet; - -@FunctionalInterface -public interface DataAccessor { - - CachedRowSet getData(String statement, ArrayList<String> arguments, String preferredDS) - throws SQLException; - -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataSourceComparator.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataSourceComparator.java deleted file mode 100644 index 4cfcc7318..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DataSourceComparator.java +++ /dev/null @@ -1,33 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.util.Comparator; - -public interface DataSourceComparator extends Comparator <CachedDataSource>{ - - CachedDataSource getLastUsed(); - - void setLastUsed(CachedDataSource lastUsed); - - int compare(CachedDataSource ds1, CachedDataSource ds2); - -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DbLibService.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DbLibService.java deleted file mode 100644 index b30ad7bbf..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DbLibService.java +++ /dev/null @@ -1,50 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.ArrayList; - -import javax.sql.DataSource; -import javax.sql.rowset.CachedRowSet; - -public interface DbLibService extends DataSource { - - /* (non-Javadoc) - * @see DataAccessor#getData(java.lang.String, java.util.ArrayList) - */ - CachedRowSet getData(String statement, - ArrayList<String> arguments, String preferredDS) - throws SQLException; - - /* (non-Javadoc) - * @see DataAccessor#writeData(java.lang.String, java.util.ArrayList) - */ - boolean writeData(String statement, - ArrayList<String> arguments, String preferredDS) - throws SQLException; - - boolean isActive(); - - Connection getConnection() throws SQLException; - -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DblibConfigurationException.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DblibConfigurationException.java deleted file mode 100644 index be493aa1f..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/DblibConfigurationException.java +++ /dev/null @@ -1,45 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - - -public class DblibConfigurationException extends Exception { - - /** - * - */ - private static final long serialVersionUID = 1L; - - public DblibConfigurationException() - { - super(); - } - - public DblibConfigurationException(String msg) - { - super(msg); - } - - public DblibConfigurationException(String msg, Throwable t) - { - super(msg, t); - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/NoAvailableConnectionsException.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/NoAvailableConnectionsException.java deleted file mode 100644 index a39e5c5b4..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/NoAvailableConnectionsException.java +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.sql.SQLException; - -public class NoAvailableConnectionsException extends SQLException { - - /** - * - */ - private static final long serialVersionUID = -6259205931674413018L; - - public NoAvailableConnectionsException(Exception exc) { - super(exc); - } - -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/TerminatingCachedDataSource.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/TerminatingCachedDataSource.java deleted file mode 100755 index 852dda3c7..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/TerminatingCachedDataSource.java +++ /dev/null @@ -1,59 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib; - -import java.sql.SQLFeatureNotSupportedException; -import java.util.logging.Logger; -import javax.sql.DataSource; -import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; -import org.onap.ccsdk.sli.core.dblib.pm.SQLExecutionMonitorObserver; - - -public class TerminatingCachedDataSource extends CachedDataSource implements SQLExecutionMonitorObserver { - - private static final int DEFAULT_AVAILABLE_CONNECTIONS = 0; - private static final int DEFAULT_INDEX = -1; - - public TerminatingCachedDataSource(BaseDBConfiguration jdbcElem) throws DBConfigException { - super(jdbcElem); - } - - @Override - protected DataSource configure(BaseDBConfiguration jdbcElem) throws DBConfigException { - return null; - } - - @Override - public Logger getParentLogger() throws SQLFeatureNotSupportedException { - return null; - } - - @Override - protected int getAvailableConnections() { - return DEFAULT_AVAILABLE_CONNECTIONS; - } - - @Override - protected int initializeIndex(BaseDBConfiguration jdbcElem) { - return DEFAULT_INDEX; - } - -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/BaseDBConfiguration.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/BaseDBConfiguration.java deleted file mode 100755 index ea6bc450d..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/BaseDBConfiguration.java +++ /dev/null @@ -1,258 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * Modifications Copyright (C) 2018 IBM. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib.config; - -import java.util.Properties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** - * Base class responsible for parsing business logic for database configuration from given <code>Properties</code>. - */ -public abstract class BaseDBConfiguration { - - private static final Logger LOGGER = LoggerFactory.getLogger(BaseDBConfiguration.class); - /** - * Property key within a properties configuration File for db type - */ - public static final String DATABASE_TYPE = "org.onap.ccsdk.sli.dbtype"; - - /** - * Property key with a properties configuration File for db url - */ - public static final String DATABASE_URL = "org.onap.ccsdk.sli.jdbc.url"; - - /** - * Property key with a properties configuration File for database name - */ - public static final String DATABASE_NAME = "org.onap.ccsdk.sli.jdbc.database"; - - /** - * Property key with a properties configuration File for jdbc driver - */ - public static final String DRIVER_NAME = "org.onap.ccsdk.sli.jdbc.driver"; - - /** - * Property key with a properties configuration File for db database connection name - */ - public static final String CONNECTION_NAME = "org.onap.ccsdk.sli.jdbc.connection.name"; - - /** - * Property key with a properties configuration File for database user - */ - public static final String DATABASE_USER = "org.onap.ccsdk.sli.jdbc.user"; - - /** - * Property key with a properties configuration File for database password - * for associated with <code>org.onap.ccsdk.sli.jdbc.user</code>. - */ - public static final String DATABASE_PSSWD = "org.onap.ccsdk.sli.jdbc.password"; - - /** - * Property key with a properties configuration File for database connection - * timeout - */ - public static final String CONNECTION_TIMEOUT="org.onap.ccsdk.sli.jdbc.connection.timeout"; - - /** - * Property key with a properties configuration File for database request - * timeout - */ - public static final String REQUEST_TIMEOUT = "org.onap.ccsdk.sli.jdbc.request.timeout"; - - /** - * Property key with a properties configuration File for database minimum - * limit - */ - public static final String MIN_LIMIT = "org.onap.ccsdk.sli.jdbc.limit.min"; - - /** - * Property key with a properties configuration File for database maximum - * limit - */ - public static final String MAX_LIMIT = "org.onap.ccsdk.sli.jdbc.limit.max"; - - /** - * Property key with a properties configuration File for database initial - * limit - */ - public static final String INIT_LIMIT = "org.onap.ccsdk.sli.jdbc.limit.init"; - - /** - * Property key with a properties configuration File for database hosts - */ - public static final String DATABASE_HOSTS = "org.onap.ccsdk.sli.jdbc.hosts"; - - /** - * default value when the connection timeout is not present or cannot be - * parsed. - */ - private static final String DEFAULT_REJECT_CHANGE_VALUE = "-1"; - - /** - * A set of properties with database configuration information. - */ - protected final Properties properties; - - /** - * Builds a configuration based on given properties - * - * @param properties - * properties represented by the public constant keys defined by - * this class - */ - public BaseDBConfiguration(final Properties properties) { - this.properties = properties; - } - - /** - * Extracts the connection timeout. - * - * @return the connection timeout, or - * <code>DEFAULT_REJECT_CHANGE_VALUE</code> if not present - */ - public int getConnTimeout() { - try { - String value = properties.getProperty(CONNECTION_TIMEOUT, DEFAULT_REJECT_CHANGE_VALUE); - return Integer.parseInt(value); - } catch (Exception exc) { - LOGGER.error("Exception",exc); - return Integer.parseInt(DEFAULT_REJECT_CHANGE_VALUE); - } - } - - /** - * Extracts the request timeout. - * - * @return the request timeout, or <code>DEFAULT_REQUEST_TIMEOUT</code> if - * not present - */ - public int getRequestTimeout() { - try { - String value = properties.getProperty(REQUEST_TIMEOUT, DEFAULT_REJECT_CHANGE_VALUE); - return Integer.parseInt(value); - } catch (Exception exc) { - LOGGER.error("Exception",exc); - return Integer.parseInt(DEFAULT_REJECT_CHANGE_VALUE); - } - } - - /** - * Extracts the db connection name. - * - * @return the db connection name, or <code>null</code> if not present - */ - public String getDbConnectionName() { - return properties.getProperty(CONNECTION_NAME); - } - - /** - * Extracts the db name. - * - * @return the db name, or <code>null</code> if not present - */ - public String getDatabaseName() { - return properties.getProperty(DATABASE_NAME); - } - - /** - * Extracts the jdbc driver's name. - * - * @return the jdbc name, or <code>com.mysql.jdbc.Driver</code> if not present - */ - public String getDriverName() { - return properties.getProperty(DRIVER_NAME, "com.mysql.jdbc.Driver"); - } - - /** - * Extracts the db user id. - * - * @return the db user id, or <code>null</code> if not present - */ - public String getDbUserId() { - return properties.getProperty(DATABASE_USER); - } - - /** - * Extracts the db password. - * - * @return the db password, or <code>null</code> if not present - */ - public String getDbPasswd() { - return properties.getProperty(DATABASE_PSSWD); - } - - /** - * Extracts the db min limit. - * - * @return the db min limit - * @throws NumberFormatException - * if the property is not specified, or cannot be parsed as an - * <code>Integer</code>. - */ - public int getDbMinLimit() throws NumberFormatException { - String value = properties.getProperty(MIN_LIMIT, "-1"); - return Integer.parseInt(value); - } - - /** - * Extracts the db max limit. - * - * @return the db max limit - * @throws NumberFormatException - * if the property is not specified, or cannot be parsed as an - * <code>Integer</code>. - */ - public int getDbMaxLimit() throws NumberFormatException { - String value = properties.getProperty(MAX_LIMIT, "-1"); - return Integer.parseInt(value); - } - - /** - * Extracts the db initial limit. - * - * @return the db initial limit - * @throws NumberFormatException - * if the property is not specified, or cannot be parsed as an - * <code>Integer</code>. - */ - public int getDbInitialLimit() throws NumberFormatException { - String value = properties.getProperty(INIT_LIMIT, "-1"); - return Integer.parseInt(value); - } - - /** - * Extracts the db url. - * - * @return the db url, or <code>null</code> if not present - */ - public String getDbUrl() { - return properties.getProperty(DATABASE_URL); - } - - public boolean containsKey(String propertyname) { - return properties.containsKey(propertyname); - } - - public String getProperty(String propertyname) { - return properties.getProperty(propertyname); - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/DbConfigPool.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/DbConfigPool.java deleted file mode 100644 index ea7b3fdc8..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/DbConfigPool.java +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Modifications Copyright (C) 2018 IBM. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib.config; - -import java.util.ArrayList; -import java.util.Properties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @version $Revision: 1.15 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */
-public class DbConfigPool { - private static final Logger LOGGER = LoggerFactory.getLogger(DbConfigPool.class); - private final String type; - private static final int timeOut=0; - private ArrayList<BaseDBConfiguration> configurations = new ArrayList<>(); - - public DbConfigPool(Properties properties) { - LOGGER.debug("Initializing DbConfigType"); - type = properties.getProperty(BaseDBConfiguration.DATABASE_TYPE, "JDBC").toUpperCase(); - } - - public int getTimeout() { - return timeOut; - } - - public String getType() { - return type; - } - - public JDBCConfiguration[] getJDBCbSourceArray() { - return configurations.toArray(new JDBCConfiguration[configurations.size()]); - } - - public void addConfiguration(BaseDBConfiguration config) { - configurations.add(config); - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/JDBCConfiguration.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/JDBCConfiguration.java deleted file mode 100644 index fea103569..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/JDBCConfiguration.java +++ /dev/null @@ -1,31 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib.config; - -import java.util.Properties; - -public class JDBCConfiguration extends BaseDBConfiguration { - - public JDBCConfiguration(Properties xmlElem) { - super(xmlElem); - } - -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/TerminatingConfiguration.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/TerminatingConfiguration.java deleted file mode 100755 index 1ebd1441f..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/config/TerminatingConfiguration.java +++ /dev/null @@ -1,33 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Modifications Copyright (C) 2018 IBM. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib.config; - -import java.util.Properties; - -public class TerminatingConfiguration extends BaseDBConfiguration { - - public TerminatingConfiguration() { - super(new Properties()); - } - -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/DBConfigFactory.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/DBConfigFactory.java deleted file mode 100644 index 1aa907837..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/factory/DBConfigFactory.java +++ /dev/null @@ -1,105 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Modifications Copyright (C) 2018 IBM. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib.factory; - - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Properties; -import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; -import org.onap.ccsdk.sli.core.dblib.config.DbConfigPool; -import org.onap.ccsdk.sli.core.dblib.config.JDBCConfiguration; -import org.slf4j.LoggerFactory; - -/** - * @version $Revision: 1.1 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki 01/17/08 Initial version - */ -public class DBConfigFactory { - - public static DbConfigPool createConfig(Properties resource) { - return getConfigparams(resource); - } - - static DbConfigPool getConfigparams(Properties properties) { - DbConfigPool xmlConfig = new DbConfigPool(properties); - ArrayList<Properties> propertySets = new ArrayList<>(); - - if ("JDBC".equalsIgnoreCase(xmlConfig.getType())) { - String hosts = properties.getProperty(BaseDBConfiguration.DATABASE_HOSTS); - if (hosts == null || hosts.isEmpty()) { - propertySets.add(properties); - } else { - setPropertyWhenHostsNonEmpty(hosts, properties, propertySets); - } - } else { - propertySets.add(properties); - } - try { - Iterator<Properties> it = propertySets.iterator(); - while (it.hasNext()) { - BaseDBConfiguration config = parse(it.next()); - xmlConfig.addConfiguration(config); - } - } catch (Exception e) { - LoggerFactory.getLogger(DBConfigFactory.class).warn("", e); - } - - return xmlConfig; - } - - private static void setPropertyWhenHostsNonEmpty(String hosts, Properties properties, ArrayList<Properties> - propertySets) { - String[] newhost = hosts.split(","); - for (String aNewhost : newhost) { - Properties localSet = new Properties(); - localSet.putAll(properties); - String url = localSet.getProperty(BaseDBConfiguration.DATABASE_URL); - if (url.contains("DBHOST")) { - url = url.replace("DBHOST", aNewhost); - } - if (url.contains("dbhost")) { - url = url.replace("dbhost", aNewhost); - } - localSet.setProperty(BaseDBConfiguration.DATABASE_URL, url); - localSet.setProperty(BaseDBConfiguration.CONNECTION_NAME, aNewhost); - propertySets.add(localSet); - } - } - - public static BaseDBConfiguration parse(Properties props) throws Exception { - - String type = props.getProperty(BaseDBConfiguration.DATABASE_TYPE); - - BaseDBConfiguration config = null; - - if ("JDBC".equalsIgnoreCase(type)) { - config = new JDBCConfiguration(props); - } - - return config; - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDBCachedDataSource.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDBCachedDataSource.java deleted file mode 100755 index a53d18639..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/jdbc/JdbcDBCachedDataSource.java +++ /dev/null @@ -1,201 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib.jdbc; - -import java.sql.SQLFeatureNotSupportedException; -import org.apache.tomcat.jdbc.pool.DataSource; -import org.apache.tomcat.jdbc.pool.PoolProperties; -import org.onap.ccsdk.sli.core.dblib.CachedDataSource; -import org.onap.ccsdk.sli.core.dblib.DBConfigException; -import org.onap.ccsdk.sli.core.dblib.config.BaseDBConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class JdbcDBCachedDataSource extends CachedDataSource { - - private String dbDriver; - private String dbUserId; - private String dbPasswd; - private String dbUrl; - - private int minLimit; - private int maxLimit; - private int initialLimit; - - private static final String AS_CONF_ERROR = "AS_CONF_ERROR: "; - private static final int MIN_LIMIT = 5; - private static final int MAX_LIMIT = 10; - private static final int INITIAL_LIMIT = 10; - - private static final Logger LOGGER = LoggerFactory.getLogger(JdbcDBCachedDataSource.class); - - /** - * @param jdbcElem - */ - public JdbcDBCachedDataSource(BaseDBConfiguration jdbcElem) { - super(jdbcElem); - } - - @Override - protected DataSource configure(BaseDBConfiguration xmlElem) throws DBConfigException { - BaseDBConfiguration jdbcConfig = xmlElem; - if (jdbcConfig.getConnTimeout() > 0) { - this.connReqTimeout = jdbcConfig.getConnTimeout(); - } - if (jdbcConfig.getRequestTimeout() > 0) { - this.dataReqTimeout = jdbcConfig.getRequestTimeout(); - } - - // set connection pool name - String dbConnectionName = jdbcConfig.getDbConnectionName(); - super.setDbConnectionName(dbConnectionName); - // Configure the JDBC connection - dbUserId = jdbcConfig.getDbUserId(); - if (dbUserId == null) { - String errorMsg = "Invalid XML contents: JDBCConnection missing dbUserId attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - - dbPasswd = jdbcConfig.getDbPasswd(); - if (dbPasswd == null) { - String errorMsg = "Invalid XML contents: JDBCConnection missing dbPasswd attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - - dbDriver = jdbcConfig.getDriverName(); - if (dbDriver == null) { - String errorMsg = "Invalid XML contents: JDBCConnection missing dbDriver attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - - minLimit = jdbcConfig.getDbMinLimit(); - if (minLimit == -1) - { - String errorMsg = "Invalid XML contents: JDBC Connection missing minLimit attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - minLimit = MIN_LIMIT; - } - maxLimit = jdbcConfig.getDbMaxLimit(); - if (maxLimit == -1) - { - String errorMsg = "Invalid XML contents: JDBC Connection missing maxLimit attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - maxLimit = MAX_LIMIT; - } - initialLimit = jdbcConfig.getDbInitialLimit(); - if (initialLimit == -1) - { - String errorMsg = "Invalid XML contents: JDBC Connection missing initialLimit attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - initialLimit = INITIAL_LIMIT; - } - - dbUrl = jdbcConfig.getDbUrl(); - if (dbUrl == null) { - String errorMsg = "Invalid XML contents: JDBCConnection missing dbUrl attribute"; - LOGGER.error(AS_CONF_ERROR + errorMsg); - throw new DBConfigException(errorMsg); - } - - try { - - PoolProperties p = new PoolProperties(); - p.setDriverClassName(dbDriver); - p.setUrl(dbUrl); - p.setUsername(dbUserId); - p.setPassword(dbPasswd); - p.setJmxEnabled(true); - p.setTestWhileIdle(false); - p.setTestOnBorrow(true); - p.setValidationQuery("SELECT 1"); - p.setTestOnReturn(false); - p.setValidationInterval(30000); - p.setTimeBetweenEvictionRunsMillis(30000); - p.setInitialSize(initialLimit); - p.setMaxActive(maxLimit); - p.setMaxIdle(maxLimit); - p.setMaxWait(10000); - p.setRemoveAbandonedTimeout(60); - p.setMinEvictableIdleTimeMillis(30000); - p.setMinIdle(minLimit); - p.setLogAbandoned(true); - p.setRemoveAbandoned(true); - p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" - + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); - - final DataSource dataSource = new DataSource(p); - - synchronized (this) { - initialized = true; - } - LOGGER.info(String.format("JdbcDBCachedDataSource <%s> configured successfully. Using URL: %s", - dbConnectionName, dbUrl)); - return dataSource; - } catch (Exception exc) { - initialized = false; - LOGGER.error(String.format("AS_CONF_ERROR: Failed to initialize MySQLCachedDataSource <%s>. Reason: %s", - dbConnectionName, exc.getMessage())); - return null; - } - } - - public final String getDbUrl() { - return dbUrl; - } - - public final String getDbUserId() { - return dbUserId; - } - - public final String getDbPasswd() { - return dbPasswd; - } - - public static JdbcDBCachedDataSource createInstance(BaseDBConfiguration config) /*throws Exception*/ { - return new JdbcDBCachedDataSource(config); - } - - public String toString() { - return getDbConnectionName(); - } - - public java.util.logging.Logger getParentLogger() - throws SQLFeatureNotSupportedException { - return null; - } - - @Override - public void cleanUp() { - DataSource dataSource = (DataSource) ds; - dataSource.getPool().purge(); - dataSource.close(true); - super.cleanUp(); - } - - @Override - protected int getAvailableConnections() { - return org.apache.tomcat.jdbc.pool.DataSource.class.cast(ds).getSize(); - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/PollingWorker.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/PollingWorker.java deleted file mode 100644 index f66250676..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/PollingWorker.java +++ /dev/null @@ -1,259 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Modifications Copyright (C) 2018 IBM. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib.pm; - -import java.util.Iterator; -import java.util.Properties; -import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; -import java.util.TreeSet; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.atomic.AtomicLong; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @version $Revision: 1.15 $ - * Change Log - * Author Date Comments - * ============== ======== ==================================================== - * Rich Tabedzki - */
-public class PollingWorker implements Runnable { - - private static final Logger LOGGER = LoggerFactory.getLogger(PollingWorker.class); - - private static PollingWorker self = null; - - private LinkedBlockingQueue tasks = new LinkedBlockingQueue(100); - private long interval = 1000L; - private Thread worker = null; - private AtomicLong[] counters = null; - private int[] bucketUnit = null; - private static boolean enabled = false; - private Timer timer = null; - - private PollingWorker(Properties ctxprops) { - if (ctxprops == null || ctxprops.getProperty("org.onap.ccsdk.dblib.pm") == null) { - enabled = false; - } else { - if ("true".equalsIgnoreCase((String) ctxprops.getProperty("org.onap.ccsdk.dblib.pm"))) { - enabled = true; - } else { - enabled = false; - } - } - - interval = Long.parseLong((ctxprops == null || ctxprops.getProperty("org.onap.ccsdk.dblib.pm.interval") == null) - ? "60" : (String) ctxprops.getProperty("org.onap.ccsdk.dblib.pm.interval")); - // '0' bucket is to count exceptions - String[] sampling = ((ctxprops == null || ctxprops.getProperty("org.onap.ccsdk.dblib.pm.sampling") == null) - ? "0,2,5,10,20,50,100" : (String) ctxprops.getProperty("org.onap.ccsdk.dblib.pm.sampling")).split(","); - - if (enabled) { - bucketUnit = new int[sampling.length]; - for (int i = 0, max = bucketUnit.length; i < max; i++) { - bucketUnit[i] = Integer.parseInt(sampling[i].trim()); - } - counters = new AtomicLong[bucketUnit.length + 1]; - for (int i = 0, max = counters.length; i < max; i++) { - counters[i] = new AtomicLong(); - } - worker = new Thread(this); - worker.setDaemon(true); - worker.start(); - timer = new Timer(true); - timer.schedule(new MyTimerTask(), interval * 1000L, interval * 1000L); - } - } - - public static void post(long starttime) { - PollingWorker temp = self; - if (temp != null && enabled) { - temp.register(new TestSample(starttime)); - } - } - - public static void createInistance(Properties props) { - self = new PollingWorker(props); - } - - private void register(TestSample object) { - try { - tasks.add(object); - } catch (Throwable exc) { - // if cannot add an object to the queue, do nothing - } - } - - private void deRegister(TestSample object) { - tasks.remove(object); - } - - @Override - public void run() { - for (;;) { - Set data = new TreeSet(); - tasks.drainTo(data); - for (Iterator it = data.iterator(); it.hasNext();) { - Object next = it.next(); - if (next instanceof TestSample) { - consume((TestSample) next); - } else { - System.out.println(next.getClass().getName()); - LOGGER.error(next.getClass().getName()); - } - } - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - - } - } - - } - - public void clearReqister() { - AtomicLong[] tmp = new AtomicLong[counters.length]; - for (int i = 0, max = tmp.length; i < max; i++) { - tmp[i] = new AtomicLong(); - } - AtomicLong[] tmp2 = counters; - synchronized (tmp2) { - counters = tmp; - } - StringBuffer sb = new StringBuffer("CPM: "); - for (int i = 0, max = tmp2.length; i < max; i++) { - if (i == 0 && bucketUnit[0] == 0) { - sb.append("[Exc]="); - } else { - sb.append("["); - if (i == bucketUnit.length) { - sb.append("Other]="); - } else { - sb.append(bucketUnit[i]).append(" ms]="); - } - } - sb.append(tmp2[i].get()).append("\t"); - } - LOGGER.info(sb.toString()); - } - - class MyTimerTask extends TimerTask { - - @Override - public void run() { - - clearReqister(); - } - - } - - private void consume(TestSample probe) { - AtomicLong[] tmp = counters; - synchronized (tmp) { - counters[getBucket(probe.getDuration())].incrementAndGet(); - } - } - - /* - * This method is used to find the offset of the bucket in counters. - * 'counters' array is 1 size longer than bucketUnit, hence by default it - * returns 'bucketUnit.length' - */ - private int getBucket(long difftime) { - for (int i = 0; i < bucketUnit.length; i++) { - if (difftime < bucketUnit[i]) { - return i; - } - } - return bucketUnit.length; - } - - private static boolean isEnabled() { - return enabled; - } - - /** - * @author Rich Tabedzki - * A helper class to pass measured parameter to the counter. - */ - static class TestSample implements Comparable { - private long starttime; - private long endtime; - - public TestSample(long starttime) { - this.endtime = System.currentTimeMillis(); - this.starttime = starttime; - } - - public long getDuration() { - return endtime - starttime; - } - - @Override - public int compareTo(Object o) { - if (o instanceof TestSample) { - TestSample x = (TestSample) o; - if (starttime < x.starttime) - return 1; - if (endtime < x.endtime) - return 1; - if (starttime > x.starttime) - return -1; - if (endtime > x.endtime) - return -1; - return 0; - } - return 1; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (int) (endtime ^ (endtime >>> 32)); - result = prime * result + (int) (starttime ^ (starttime >>> 32)); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - TestSample other = (TestSample) obj; - if (endtime != other.endtime) - return false; - if (starttime != other.starttime) - return false; - return true; - } - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitor.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitor.java deleted file mode 100644 index b6664f3c3..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitor.java +++ /dev/null @@ -1,222 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib.pm; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.Collections; -import java.util.Objects; -import java.util.Observable; -import java.util.Observer; -import java.util.SortedSet; -import java.util.Timer; -import java.util.TimerTask; -import java.util.TreeSet; -import java.util.concurrent.atomic.AtomicLong; -import org.onap.ccsdk.sli.core.dblib.DBResourceObserver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SQLExecutionMonitor extends Observable { - - private static final Logger LOGGER = LoggerFactory.getLogger(SQLExecutionMonitor.class); - - static final long MILISECOND = 1000000L; - static final long SECOND = 1000L * MILISECOND; - - private final Timer timer; - // collection - private final SortedSet<TestObject> innerSet; - private SQLExecutionMonitorObserver parent = null; - private final AtomicLong completionCounter; - private boolean activeState = false; - private final long interval; - private final long initialDelay; - private final long EXPECTED_TIME_TO_COMPLETE; - private final long UNPROCESSED_FAILOVER_THRESHOLD; - - private final class MonitoringTask extends TimerTask { - - @Override - public void run() { - try { - TestObject testObj = new TestObject(); - testObj.setStartTime(testObj.getStartTime() - EXPECTED_TIME_TO_COMPLETE); - - // take a snapshot of the current task list - TestObject[] array = innerSet.toArray(new TestObject[0]); - SortedSet<TestObject> copyCurrent = new TreeSet<>(Arrays.asList(array)); - // get the list of the tasks that are older than the specified - // interval. - SortedSet<TestObject> unprocessed = copyCurrent.headSet(testObj); - - long successfulCount = completionCounter.get(); - int unprocessedCount = unprocessed.size(); - - if (!unprocessed.isEmpty() && unprocessedCount > UNPROCESSED_FAILOVER_THRESHOLD - && successfulCount == 0) { - // switch the Connection Pool to passive - setChanged(); - notifyObservers("Open JDBC requests=" + unprocessedCount + " in " + SQLExecutionMonitor.this.parent - .getDbConnectionName()); - } - } catch (Exception exc) { - LOGGER.error("", exc); - } finally { - completionCounter.set(0L); - } - } - } - - public static class TestObject implements Comparable<TestObject>, Serializable { - - private static final long serialVersionUID = 1L; - private long startTime; - private long randId; - - public TestObject() { - startTime = System.nanoTime(); - } - - public long getStartTime() { - return startTime; - } - - public void setStartTime(long newTime) { - startTime = newTime; - } - - @Override - public int compareTo(TestObject o) { - if (this == o) { - return 0; - } - if (this.startTime > o.getStartTime()) { - return 1; - } - if (this.startTime < o.getStartTime()) { - return -1; - } - - if (this.hashCode() > o.hashCode()) { - return 1; - } - if (this.hashCode() < o.hashCode()) { - return -1; - } - - return 0; - } - - public String toString() { - return Long.toString(startTime) + "#" + this.hashCode(); - } - - public int hashCode() { - return Objects.hash(startTime, randId); - } - - public boolean equals(Object obj) { - return this == obj || (obj instanceof TestObject && startTime == ((TestObject) obj).getStartTime() - && hashCode() == obj.hashCode()); - } - } - - public SQLExecutionMonitor(SQLExecutionMonitorObserver parent) { - this.parent = parent; - completionCounter = new AtomicLong(0L); - interval = parent.getInterval(); - initialDelay = parent.getInitialDelay(); - this.UNPROCESSED_FAILOVER_THRESHOLD = parent.getUnprocessedFailoverThreshold(); - this.EXPECTED_TIME_TO_COMPLETE = parent.getExpectedCompletionTime() * MILISECOND; - - innerSet = Collections.synchronizedSortedSet(new TreeSet<TestObject>()); - timer = new Timer(); - } - - public void cleanup() { - timer.cancel(); - } - - // registerRequest - public TestObject registerRequest() { - if (activeState) { - TestObject test = new TestObject(); - if (innerSet.add(test)) { - return test; - } - } - return null; - } - - // deregisterSuccessfulRequest - public boolean deregisterRequest(TestObject test) { - if (test == null) { - return false; - } - // remove from the collection - if (innerSet.remove(test) && activeState) { - completionCounter.incrementAndGet(); - return true; - } - return false; - } - - public void terminate() { - timer.cancel(); - } - - /** - * @return the parent - */ - public final Object getParent() { - return parent; - } - - @Override - public void addObserver(Observer observer) { - if (observer instanceof DBResourceObserver) { - DBResourceObserver dbObserver = (DBResourceObserver) observer; - if (dbObserver.isMonitorDbResponse() && countObservers() == 0) { - TimerTask remindTask = new MonitoringTask(); - timer.schedule(remindTask, initialDelay, interval); - activeState = true; - } - } - super.addObserver(observer); - } - - @Override - public void deleteObserver(Observer observer) { - super.deleteObserver(observer); - if (observer instanceof DBResourceObserver) { - DBResourceObserver dbObserver = (DBResourceObserver) observer; - if (dbObserver.isMonitorDbResponse() && countObservers() == 0) { - timer.cancel(); - activeState = false; - } - } - } - - public final int getProcessedConnectionsCount() { - return innerSet.size(); - } -} diff --git a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitorObserver.java b/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitorObserver.java deleted file mode 100644 index 2fdde1ee4..000000000 --- a/dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/pm/SQLExecutionMonitorObserver.java +++ /dev/null @@ -1,37 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * onap - * ================================================================================ - * Copyright (C) 2016 - 2017 ONAP - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.ccsdk.sli.core.dblib.pm; - -public interface SQLExecutionMonitorObserver { - String getDbConnectionName(); - - long getInterval(); - void setInterval(long value); - - long getInitialDelay(); - void setInitialDelay(long value); - - long getExpectedCompletionTime(); - void setExpectedCompletionTime(long value); - - long getUnprocessedFailoverThreshold(); - void setUnprocessedFailoverThreshold(long value); -} diff --git a/dblib/provider/src/main/resources/OSGI-INF/blueprint/dblib-blueprint.xml b/dblib/provider/src/main/resources/OSGI-INF/blueprint/dblib-blueprint.xml deleted file mode 100755 index f1d5166db..000000000 --- a/dblib/provider/src/main/resources/OSGI-INF/blueprint/dblib-blueprint.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<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="provider" class="org.onap.ccsdk.sli.core.dblib.DBLIBResourceProvider" /> - - <bean id="dbResourceManager" class="org.onap.ccsdk.sli.core.dblib.DBResourceManager"> - <argument ref="provider" /> - </bean> - <service ref="dbResourceManager"> - <interfaces> - <value>javax.sql.DataSource</value> - <value>org.onap.ccsdk.sli.core.dblib.DbLibService</value> - </interfaces> - </service> - -</blueprint>
\ No newline at end of file diff --git a/dblib/provider/src/main/resources/dblib.properties b/dblib/provider/src/main/resources/dblib.properties deleted file mode 100755 index e0399cc31..000000000 --- a/dblib/provider/src/main/resources/dblib.properties +++ /dev/null @@ -1,14 +0,0 @@ -org.onap.ccsdk.sli.dbtype=jdbc -org.onap.ccsdk.sli.jdbc.hosts=sdnctldb01,sdnctldb02 -org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:sdnctl;create=true -org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver -org.onap.ccsdk.sli.jdbc.database=sdnctl -org.onap.ccsdk.sli.jdbc.user=test -org.onap.ccsdk.sli.jdbc.password=test -org.onap.ccsdk.sli.jdbc.connection.name=sdnctldb01 - -org.onap.ccsdk.sli.jdbc.connection.timeout=50 -org.onap.ccsdk.sli.jdbc.request.timeout=100 -org.onap.ccsdk.sli.jdbc.limit.init=10 -org.onap.ccsdk.sli.jdbc.limit.min=10 -org.onap.ccsdk.sli.jdbc.limit.max=20 diff --git a/dblib/provider/src/main/resources/org/opendaylight/blueprint/dblib-blueprint.xml b/dblib/provider/src/main/resources/org/opendaylight/blueprint/dblib-blueprint.xml deleted file mode 100755 index d9bb99c07..000000000 --- a/dblib/provider/src/main/resources/org/opendaylight/blueprint/dblib-blueprint.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<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="provider" class="org.onap.ccsdk.sli.core.dblib.DBLIBResourceProvider" /> - - <bean id="dbResourceManager" class="org.onap.ccsdk.sli.core.dblib.DBResourceManager"> - <argument ref="provider" /> - </bean> - <service ref="dbResourceManager"> - <interfaces> - <value>javax.sql.DataSource</value> - <value>org.onap.ccsdk.sli.core.dblib.DbLibService</value> - </interfaces> - </service> - - <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0"> - <command name="dblib/encode"> - <action class="org.onap.ccsdk.sli.core.dblib.EncShellCommand"/> - </command> - </command-bundle> - -</blueprint>
\ No newline at end of file |