forked from community/device-mgt-core
parent
fd55faaf2e
commit
ea92bc904a
@ -0,0 +1,241 @@
|
||||
/*
|
||||
* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.wso2.carbon.device.mgt.core.config;
|
||||
|
||||
import org.apache.commons.dbcp.BasicDataSource;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.device.mgt.common.DeviceManagementConstants;
|
||||
|
||||
import javax.naming.Context;
|
||||
import javax.naming.InitialContext;
|
||||
import javax.naming.NamingException;
|
||||
import javax.sql.DataSource;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
||||
public final class DeviceMgtDBUtil {
|
||||
|
||||
private static final Log log = LogFactory.getLog(DeviceMgtDBUtil.class);
|
||||
|
||||
private static volatile DataSource dataSource = null;
|
||||
private static final String DB_CHECK_SQL = DeviceManagementConstants.DataSourceProperties.DB_CHECK_QUERY;
|
||||
|
||||
private static final String DB_CONFIG = "Database.";
|
||||
private static final String DB_DRIVER = DB_CONFIG + "Driver";
|
||||
private static final String DB_URL = DB_CONFIG + "URL";
|
||||
private static final String DB_USER = DB_CONFIG + "Username";
|
||||
private static final String DB_PASSWORD = DB_CONFIG + "Password";
|
||||
|
||||
private static final String DATA_SOURCE_NAME = "DataSourceName";
|
||||
|
||||
/**
|
||||
* Initializes the data source
|
||||
*
|
||||
*/
|
||||
public static void initialize() throws Exception {
|
||||
if (dataSource != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (DeviceMgtDBUtil.class) {
|
||||
if (dataSource == null) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Initializing data source");
|
||||
}
|
||||
APIManagerConfiguration config = ServiceReferenceHolder.getInstance().
|
||||
getAPIManagerConfigurationService().getAPIManagerConfiguration();
|
||||
String dataSourceName = config.getFirstProperty(DATA_SOURCE_NAME);
|
||||
|
||||
if (dataSourceName != null) {
|
||||
try {
|
||||
Context ctx = new InitialContext();
|
||||
dataSource = (DataSource) ctx.lookup(dataSourceName);
|
||||
} catch (NamingException e) {
|
||||
throw new APIManagementException("Error while looking up the data " +
|
||||
"source: " + dataSourceName);
|
||||
}
|
||||
} else {
|
||||
DBConfiguration configuration = getDBConfig(config);
|
||||
String dbUrl = configuration.getDbUrl();
|
||||
String driver = configuration.getDriverName();
|
||||
String username = configuration.getUserName();
|
||||
String password = configuration.getPassword();
|
||||
if (dbUrl == null || driver == null || username == null || password == null) {
|
||||
log.warn("Required DB configuration parameters unspecified. So API Store and API Publisher " +
|
||||
"will not work as expected.");
|
||||
}
|
||||
|
||||
BasicDataSource basicDataSource = new BasicDataSource();
|
||||
basicDataSource.setDriverClassName(driver);
|
||||
basicDataSource.setUrl(dbUrl);
|
||||
basicDataSource.setUsername(username);
|
||||
basicDataSource.setPassword(password);
|
||||
dataSource = basicDataSource;
|
||||
}
|
||||
}
|
||||
setupAPIManagerDatabase();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the APIManager Database if not created already.
|
||||
*
|
||||
* @throws Exception if an error occurs while creating the APIManagerDatabase.
|
||||
*/
|
||||
private static void setupAPIManagerDatabase() throws Exception {
|
||||
|
||||
String value = System.getProperty("setup");
|
||||
if (value != null) {
|
||||
LocalDatabaseCreator databaseCreator = new LocalDatabaseCreator(dataSource);
|
||||
try {
|
||||
if (!databaseCreator.isDatabaseStructureCreated(DB_CHECK_SQL)) {
|
||||
databaseCreator.createRegistryDatabase();
|
||||
} else {
|
||||
log.info("APIManager database already exists. Not creating a new database.");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
String msg = "Error in creating the APIManager database";
|
||||
throw new Exception(msg, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to get a new database connection
|
||||
*
|
||||
* @return Connection
|
||||
* @throws java.sql.SQLException if failed to get Connection
|
||||
*/
|
||||
public static Connection getConnection() throws SQLException {
|
||||
if (dataSource != null) {
|
||||
return dataSource.getConnection();
|
||||
}
|
||||
throw new SQLException("Data source is not configured properly.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to close the connection streams.
|
||||
* @param preparedStatement PreparedStatement
|
||||
* @param connection Connection
|
||||
* @param resultSet ResultSet
|
||||
*/
|
||||
public static void closeAllConnections(PreparedStatement preparedStatement, Connection connection,
|
||||
ResultSet resultSet) {
|
||||
closeConnection(connection);
|
||||
closeResultSet(resultSet);
|
||||
closeStatement(preparedStatement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close Connection
|
||||
* @param dbConnection Connection
|
||||
*/
|
||||
private static void closeConnection(Connection dbConnection) {
|
||||
if (dbConnection != null) {
|
||||
try {
|
||||
dbConnection.close();
|
||||
} catch (SQLException e) {
|
||||
log.warn("Database error. Could not close database connection. Continuing with " +
|
||||
"others. - " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Close ResultSet
|
||||
* @param resultSet ResultSet
|
||||
*/
|
||||
private static void closeResultSet(ResultSet resultSet) {
|
||||
if (resultSet != null) {
|
||||
try {
|
||||
resultSet.close();
|
||||
} catch (SQLException e) {
|
||||
log.warn("Database error. Could not close ResultSet - " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Close PreparedStatement
|
||||
* @param preparedStatement PreparedStatement
|
||||
*/
|
||||
private static void closeStatement(PreparedStatement preparedStatement) {
|
||||
if (preparedStatement != null) {
|
||||
try {
|
||||
preparedStatement.close();
|
||||
} catch (SQLException e) {
|
||||
log.warn("Database error. Could not close PreparedStatement. Continuing with" +
|
||||
" others. - " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the DBConfiguration
|
||||
*
|
||||
* @param config APIManagerConfiguration containing the JDBC settings
|
||||
* @return DBConfiguration
|
||||
*/
|
||||
private static DBConfiguration getDBConfig(APIManagerConfiguration config) {
|
||||
DBConfiguration dbConfiguration = new DBConfiguration();
|
||||
dbConfiguration.setDbUrl(config.getFirstProperty(DB_URL));
|
||||
dbConfiguration.setDriverName(config.getFirstProperty(DB_DRIVER));
|
||||
dbConfiguration.setUserName(config.getFirstProperty(DB_USER));
|
||||
dbConfiguration.setPassword(config.getFirstProperty(DB_PASSWORD));
|
||||
return dbConfiguration;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function converts IS to String
|
||||
* Used for handling blobs
|
||||
* @param is
|
||||
* @return
|
||||
*/
|
||||
public static String getStringFromInputStream(InputStream is) {
|
||||
BufferedReader br = null;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
String line;
|
||||
try {
|
||||
|
||||
br = new BufferedReader(new InputStreamReader(is));
|
||||
while ((line = br.readLine()) != null) {
|
||||
sb.append(line);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (br != null) {
|
||||
try {
|
||||
br.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.wso2.carbon.device.mgt.core.dao;
|
||||
|
||||
import org.wso2.carbon.device.mgt.core.dao.util.DeviceDAOUtil;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
public class DeviceDAO {
|
||||
|
||||
private DataSource dataSource;
|
||||
|
||||
public DeviceDAO(DataSource dataSource) {
|
||||
this.dataSource = ;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright (c) 2013, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
*
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.wso2.carbon.device.mgt.core.dao.util;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.base.MultitenantConstants;
|
||||
import org.wso2.carbon.context.CarbonContext;
|
||||
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
|
||||
import org.wso2.carbon.device.mgt.core.internal.DeviceManagerDataHolder;
|
||||
import org.wso2.carbon.user.api.TenantManager;
|
||||
import org.wso2.carbon.user.api.UserStoreException;
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* Util class for RSS DAO operations
|
||||
*/
|
||||
public class DeviceDAOUtil {
|
||||
private static final Log log = LogFactory.getLog(DeviceDAOUtil.class);
|
||||
|
||||
/**
|
||||
* Clean up database resources
|
||||
* @param resultSet result set to be closed
|
||||
* @param statement prepared statement to be closed
|
||||
* @param conn connection to be closed
|
||||
* @param task occurred when clean up the resources
|
||||
*/
|
||||
public static synchronized void cleanupResources(ResultSet resultSet, PreparedStatement statement,
|
||||
Connection conn, String task) {
|
||||
if (resultSet != null) {
|
||||
try {
|
||||
resultSet.close();
|
||||
} catch (SQLException e) {
|
||||
log.error("Error occurred while closing the result set " + task, e);
|
||||
}
|
||||
}
|
||||
if (statement != null) {
|
||||
try {
|
||||
statement.close();
|
||||
} catch (SQLException e) {
|
||||
log.error("Error occurred while closing the statement " + task, e);
|
||||
}
|
||||
}
|
||||
if (conn != null) {
|
||||
try {
|
||||
conn.close();
|
||||
} catch (SQLException e) {
|
||||
log.error("Error occurred while closing the connection "+ task, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll back database updates on error
|
||||
*
|
||||
* @param connection database connection
|
||||
* @param task task which was executing at the error.
|
||||
*/
|
||||
public static synchronized void rollback(Connection connection, String task) {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.rollback();
|
||||
} catch (SQLException e) {
|
||||
log.error("Rollback failed on " + task, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized static int getTenantId() throws DeviceManagementException {
|
||||
CarbonContext ctx = CarbonContext.getThreadLocalCarbonContext();
|
||||
int tenantId = ctx.getTenantId();
|
||||
if (tenantId != MultitenantConstants.INVALID_TENANT_ID) {
|
||||
return tenantId;
|
||||
}
|
||||
String tenantDomain = ctx.getTenantDomain();
|
||||
if (null != tenantDomain) {
|
||||
try {
|
||||
TenantManager tenantManager = DeviceManagerDataHolder.getInstance().getTenantManager();
|
||||
tenantId = tenantManager.getTenantId(tenantDomain);
|
||||
} catch (UserStoreException e) {
|
||||
throw new DeviceManagementException("Error while retrieving the tenant Id for " +
|
||||
"tenant domain : " + tenantDomain, e);
|
||||
}
|
||||
}
|
||||
return tenantId;
|
||||
}
|
||||
|
||||
public static synchronized int getTenantId(String tenantDomain) throws DeviceManagementException {
|
||||
int tenantId = MultitenantConstants.INVALID_TENANT_ID;
|
||||
if (null != tenantDomain) {
|
||||
try {
|
||||
TenantManager tenantManager = DeviceManagerDataHolder.getInstance().getTenantManager();
|
||||
tenantId = tenantManager.getTenantId(tenantDomain);
|
||||
} catch (UserStoreException e) {
|
||||
throw new DeviceManagementException("Error while retrieving the tenant Id for " +
|
||||
"tenant domain : " + tenantDomain, e);
|
||||
}
|
||||
}
|
||||
return tenantId;
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.wso2.carbon.device.mgt.core.dao.util;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.wso2.carbon.device.mgt.core.dao.exception.DeviceDAOException;
|
||||
|
||||
import java.sql.SQLException;
|
||||
|
||||
public class ErrorHandler {
|
||||
|
||||
private String errorMsg = "";
|
||||
private Log log;
|
||||
|
||||
public ErrorHandler(String msg, Log log) {
|
||||
errorMsg = msg;
|
||||
this.log = log;
|
||||
}
|
||||
|
||||
public void handleDAOException(String msg, SQLException e) throws DeviceDAOException {
|
||||
|
||||
log.error(msg, e);
|
||||
throw new DeviceDAOException(msg, e);
|
||||
}
|
||||
}
|
@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
*
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.wso2.carbon.device.mgt.core.internal;
|
||||
|
||||
import org.wso2.carbon.context.CarbonContext;
|
||||
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
|
||||
import org.wso2.carbon.ndatasource.core.DataSourceService;
|
||||
import org.wso2.carbon.securevault.SecretCallbackHandlerService;
|
||||
import org.wso2.carbon.user.api.UserStoreException;
|
||||
import org.wso2.carbon.user.core.service.RealmService;
|
||||
import org.wso2.carbon.user.core.tenant.TenantManager;
|
||||
import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
|
||||
import javax.transaction.TransactionManager;
|
||||
|
||||
public class DeviceManagerDataHolder {
|
||||
|
||||
private DataSourceService dataSourceService;
|
||||
|
||||
private RealmService realmService;
|
||||
|
||||
private TransactionManager transactionManager;
|
||||
|
||||
private SecretCallbackHandlerService secretCallbackHandlerService;
|
||||
|
||||
private TenantManager tenantManager;
|
||||
|
||||
private static DeviceManagerDataHolder thisInstance = new DeviceManagerDataHolder();
|
||||
|
||||
private DeviceManagerDataHolder() {
|
||||
}
|
||||
|
||||
public static DeviceManagerDataHolder getInstance() {
|
||||
return thisInstance;
|
||||
}
|
||||
|
||||
public DataSourceService getDataSourceService() {
|
||||
return dataSourceService;
|
||||
}
|
||||
|
||||
public void setDataSourceService(DataSourceService dataSourceService) {
|
||||
this.dataSourceService = dataSourceService;
|
||||
}
|
||||
|
||||
public RealmService getRealmService() {
|
||||
return realmService;
|
||||
}
|
||||
|
||||
public void setRealmService(RealmService realmService) {
|
||||
this.realmService = realmService;
|
||||
}
|
||||
|
||||
public TransactionManager getTransactionManager() {
|
||||
return transactionManager;
|
||||
}
|
||||
|
||||
public void setTransactionManager(TransactionManager transactionManager) {
|
||||
this.transactionManager = transactionManager;
|
||||
}
|
||||
|
||||
public SecretCallbackHandlerService getSecretCallbackHandlerService() {
|
||||
return secretCallbackHandlerService;
|
||||
}
|
||||
|
||||
public void setSecretCallbackHandlerService(
|
||||
SecretCallbackHandlerService secretCallbackHandlerService) {
|
||||
this.secretCallbackHandlerService = secretCallbackHandlerService;
|
||||
}
|
||||
|
||||
public static void setThisInstance(DeviceManagerDataHolder thisInstance) {
|
||||
DeviceManagerDataHolder.thisInstance = thisInstance;
|
||||
}
|
||||
|
||||
public TenantManager getTenantManager() throws DeviceManagementException {
|
||||
RealmService realmService = getRealmService();
|
||||
if (realmService == null) {
|
||||
throw new DeviceManagementException("Realm service is not initialized properly");
|
||||
}
|
||||
return realmService.getTenantManager();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tenant id of the current tenant
|
||||
*
|
||||
* @return tenant id
|
||||
* @throws DeviceManagementException if error occurred when getting tenant id
|
||||
*/
|
||||
public int getTenantId() throws DeviceManagementException {
|
||||
CarbonContext context = CarbonContext.getThreadLocalCarbonContext();
|
||||
int tenantId = context.getTenantId();
|
||||
if (tenantId != MultitenantConstants.INVALID_TENANT_ID) {
|
||||
return tenantId;
|
||||
}
|
||||
String tenantDomain = context.getTenantDomain();
|
||||
if (tenantDomain == null) {
|
||||
String msg = "Tenant domain is not properly set and thus, is null";
|
||||
throw new DeviceManagementException(msg);
|
||||
}
|
||||
TenantManager tenantManager = getTenantManager();
|
||||
try {
|
||||
tenantId = tenantManager.getTenantId(tenantDomain);
|
||||
} catch (UserStoreException e) {
|
||||
String msg = "Error occurred while retrieving id from the domain of tenant " +
|
||||
tenantDomain;
|
||||
throw new DeviceManagementException(msg);
|
||||
}
|
||||
return tenantId;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in new issue