Fixing the issue where the data-sources are not initalized by the time the mobile device management component is initialized

merge-requests/1/head
prabathabey 10 years ago
parent 6ca7ee6c78
commit decbcc83fc

@ -66,6 +66,7 @@
org.wso2.carbon.core,
org.wso2.carbon.utils.*,
org.wso2.carbon.device.mgt.common.*,
org.wso2.carbon.ndatasource.core
</Import-Package>
<Export-Package>
!org.wso2.carbon.device.mgt.mobile.internal,
@ -116,6 +117,10 @@
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.device.mgt.common</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.ndatasource.core</artifactId>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>

@ -0,0 +1,52 @@
/*
* *
* * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
* *
* * Licensed under the Apache License, Version 2.0 (the "License");
* * you may not use this file except in compliance with the License.
* * You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package org.wso2.carbon.device.mgt.mobile;
public class DataSourceNotAvailableException extends RuntimeException {
private String message;
private static final long serialVersionUID = 2021891706072918866L;
public DataSourceNotAvailableException(String message, Exception nestedException) {
super(message, nestedException);
setErrorMessage(message);
}
public DataSourceNotAvailableException(String message, Throwable cause) {
super(message, cause);
setErrorMessage(message);
}
public DataSourceNotAvailableException(String message) {
super(message);
setErrorMessage(message);
}
public DataSourceNotAvailableException(Throwable cause) {
super(cause);
}
public String getMessage() {
return message;
}
public void setErrorMessage(String errorMessage) {
this.message = errorMessage;
}
}

@ -76,4 +76,5 @@ public class MobileDeviceManagementDAOException extends Exception {
public void setErrorMessage(String errorMessage) {
this.message = errorMessage;
}
}

@ -21,10 +21,13 @@ package org.wso2.carbon.device.mgt.mobile.dao;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.mobile.DataSourceListener;
import org.wso2.carbon.device.mgt.mobile.DataSourceNotAvailableException;
import org.wso2.carbon.device.mgt.mobile.config.datasource.JNDILookupDefinition;
import org.wso2.carbon.device.mgt.mobile.config.datasource.MobileDataSourceConfig;
import org.wso2.carbon.device.mgt.mobile.dao.impl.*;
import org.wso2.carbon.device.mgt.mobile.dao.util.MobileDeviceManagementDAOUtil;
import org.wso2.carbon.device.mgt.mobile.internal.MobileDeviceManagementServiceComponent;
import javax.sql.DataSource;
import java.util.Hashtable;
@ -35,94 +38,104 @@ import java.util.List;
*/
public class MobileDeviceManagementDAOFactory {
private static DataSource dataSource;
private static MobileDataSourceConfig mobileDataSourceConfig;
private static final Log log = LogFactory.getLog(MobileDeviceManagementDAOFactory.class);
public MobileDeviceManagementDAOFactory() {
}
public static void init() {
try {
dataSource = MobileDeviceManagementDAOFactory.resolveDataSource(mobileDataSourceConfig);
} catch (DeviceManagementException e) {
log.error("Exception occurred while initializing the mobile datasource.",e);
}
}
/**
* Resolve data source from the data source definition.
*
* @param config Mobile data source configuration
* @return data source resolved from the data source definition
*/
private static DataSource resolveDataSource(MobileDataSourceConfig config)
throws DeviceManagementException {
DataSource dataSource = null;
if (config == null) {
throw new RuntimeException("Device Management Repository data source configuration " +
"is null and thus, is not initialized");
}
JNDILookupDefinition jndiConfig = config.getJndiLookupDefinition();
if (jndiConfig != null) {
if (log.isDebugEnabled()) {
log.debug("Initializing Device Management Repository data source using the JNDI " +
"Lookup Definition");
}
List<JNDILookupDefinition.JNDIProperty> jndiPropertyList =
jndiConfig.getJndiProperties();
if (jndiPropertyList != null) {
Hashtable<Object, Object> jndiProperties = new Hashtable<Object, Object>();
for (JNDILookupDefinition.JNDIProperty prop : jndiPropertyList) {
jndiProperties.put(prop.getName(), prop.getValue());
}
dataSource =
MobileDeviceManagementDAOUtil
.lookupDataSource(jndiConfig.getJndiName(), jndiProperties);
} else {
dataSource = MobileDeviceManagementDAOUtil
.lookupDataSource(jndiConfig.getJndiName(), null);
}
}
return dataSource;
}
public static MobileDeviceDAO getMobileDeviceDAO() {
return new MobileDeviceDAOImpl(dataSource);
}
public static MobileOperationDAO getMobileOperationDAO() {
return new MobileOperationDAOImpl(dataSource);
}
public static MobileOperationPropertyDAO getMobileOperationPropertyDAO() {
return new MobileOperationPropertyDAOImpl(dataSource);
}
public static MobileDeviceOperationMappingDAO getMobileDeviceOperationDAO() {
return new MobileDeviceOperationMappingDAOImpl(dataSource);
}
public static MobileFeatureDAO getFeatureDAO() {
return new MobileFeatureDAOImpl(dataSource);
}
public static MobileFeaturePropertyDAO getFeaturePropertyDAO() {
return new MobileFeaturePropertyDAOImpl(dataSource);
}
public static MobileDataSourceConfig getMobileDeviceManagementConfig() {
return mobileDataSourceConfig;
}
public static void setMobileDataSourceConfig(
MobileDataSourceConfig mobileDataSourceConfig) {
MobileDeviceManagementDAOFactory.mobileDataSourceConfig =
mobileDataSourceConfig;
}
public static DataSource getDataSource() {
return dataSource;
}
private static DataSource dataSource;
private static MobileDataSourceConfig dsConfig;
private static final Log log = LogFactory.getLog(MobileDeviceManagementDAOFactory.class);
private static boolean isInitialized;
public static void init() throws DeviceManagementException {
dataSource = MobileDeviceManagementDAOFactory.resolveDataSource(dsConfig);
isInitialized = true;
// MobileDeviceManagementServiceComponent.registerDataSourceListener(new DataSourceListener() {
// @Override
// public void notifyObserver() {
// try {
// initDataSource();
// } catch (DeviceManagementException e) {
// log.error("Error occurred while registering data source");
// }
// }
// });
}
/**
* Resolve data source from the data source definition.
*
* @param config Mobile data source configuration
* @return data source resolved from the data source definition
*/
private static DataSource resolveDataSource(MobileDataSourceConfig config)
throws DeviceManagementException {
DataSource dataSource = null;
if (config == null) {
throw new RuntimeException("Device Management Repository data source configuration " +
"is null and thus, is not initialized");
}
JNDILookupDefinition jndiConfig = config.getJndiLookupDefinition();
if (jndiConfig != null) {
if (log.isDebugEnabled()) {
log.debug("Initializing Device Management Repository data source using the JNDI " +
"Lookup Definition");
}
List<JNDILookupDefinition.JNDIProperty> jndiPropertyList =
jndiConfig.getJndiProperties();
if (jndiPropertyList != null) {
Hashtable<Object, Object> jndiProperties = new Hashtable<Object, Object>();
for (JNDILookupDefinition.JNDIProperty prop : jndiPropertyList) {
jndiProperties.put(prop.getName(), prop.getValue());
}
dataSource =
MobileDeviceManagementDAOUtil.lookupDataSource(jndiConfig.getJndiName(), jndiProperties);
} else {
dataSource = MobileDeviceManagementDAOUtil.lookupDataSource(jndiConfig.getJndiName(), null);
}
}
return dataSource;
}
public static MobileDeviceDAO getMobileDeviceDAO() {
assertDataSourceInitialization();
return new MobileDeviceDAOImpl(dataSource);
}
public static MobileOperationDAO getMobileOperationDAO() {
assertDataSourceInitialization();
return new MobileOperationDAOImpl(dataSource);
}
public static MobileOperationPropertyDAO getMobileOperationPropertyDAO() {
assertDataSourceInitialization();
return new MobileOperationPropertyDAOImpl(dataSource);
}
public static MobileDeviceOperationMappingDAO getMobileDeviceOperationDAO() {
assertDataSourceInitialization();
return new MobileDeviceOperationMappingDAOImpl(dataSource);
}
public static MobileFeatureDAO getFeatureDAO() {
assertDataSourceInitialization();
return new MobileFeatureDAOImpl(dataSource);
}
public static MobileFeaturePropertyDAO getFeaturePropertyDAO() {
assertDataSourceInitialization();
return new MobileFeaturePropertyDAOImpl(dataSource);
}
public static void setDatSourceConfig(MobileDataSourceConfig dsConfig) {
MobileDeviceManagementDAOFactory.dsConfig = dsConfig;
}
public static DataSource getDataSource() {
return dataSource;
}
private static void assertDataSourceInitialization() {
if (!isInitialized) {
throw new DataSourceNotAvailableException("Mobile device management metadata repository datasource " +
"is not initialized");
}
}
}

@ -65,7 +65,7 @@ public class MobileDeviceManagementBundleActivator implements BundleActivator, B
MobileDataSourceConfig dsConfig =
config.getMobileDeviceMgtRepository().getMobileDataSourceConfig();
MobileDeviceManagementDAOFactory.setMobileDataSourceConfig(dsConfig);
MobileDeviceManagementDAOFactory.setDatSourceConfig(dsConfig);
androidServiceRegRef =
bundleContext.registerService(DeviceManager.class.getName(),

@ -25,6 +25,7 @@ import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.ComponentContext;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.spi.DeviceManager;
import org.wso2.carbon.device.mgt.mobile.DataSourceListener;
import org.wso2.carbon.device.mgt.mobile.config.MobileDeviceConfigurationManager;
import org.wso2.carbon.device.mgt.mobile.config.MobileDeviceManagementConfig;
import org.wso2.carbon.device.mgt.mobile.config.datasource.MobileDataSourceConfig;
@ -33,10 +34,17 @@ import org.wso2.carbon.device.mgt.mobile.dao.util.MobileDeviceManagementDAOUtil;
import org.wso2.carbon.device.mgt.mobile.impl.android.AndroidDeviceManager;
import org.wso2.carbon.device.mgt.mobile.impl.ios.IOSDeviceManager;
import org.wso2.carbon.device.mgt.mobile.impl.windows.WindowsDeviceManager;
import org.wso2.carbon.ndatasource.core.DataSourceService;
/**
* @scr.component name="org.wso2.carbon.device.mgt.mobile.impl.internal.MobileDeviceManagementServiceComponent"
* immediate="true"
* @scr.reference name="org.wso2.carbon.ndatasource"
* interface="org.wso2.carbon.ndatasource.core.DataSourceService"
* cardinality="1..1"
* policy="dynamic"
* bind="setDataSourceService"
* unbind="unsetDataSourceService"
* <p/>
* Adding reference to API Manager Configuration service is an unavoidable hack to get rid of NPEs thrown while
* initializing APIMgtDAOs attempting to register APIs programmatically. APIMgtDAO needs to be proper cleaned up
@ -47,7 +55,6 @@ public class MobileDeviceManagementServiceComponent {
private ServiceRegistration androidServiceRegRef;
private ServiceRegistration iOSServiceRegRef;
private ServiceRegistration windowsServiceRegRef;
private ServiceRegistration serverStartupObserverRef;
private static final Log log = LogFactory.getLog(MobileDeviceManagementServiceComponent.class);
@ -65,8 +72,7 @@ public class MobileDeviceManagementServiceComponent {
MobileDataSourceConfig dsConfig =
config.getMobileDeviceMgtRepository().getMobileDataSourceConfig();
MobileDeviceManagementDAOFactory.setMobileDataSourceConfig(dsConfig);
MobileDeviceManagementDAOFactory.init();
MobileDeviceManagementDAOFactory.setDatSourceConfig(dsConfig);
String setupOption = System.getProperty("setup");
if (setupOption != null) {
if (log.isDebugEnabled()) {
@ -121,5 +127,18 @@ public class MobileDeviceManagementServiceComponent {
}
}
protected void setDataSourceService(DataSourceService dataSourceService) {
/* This is to avoid mobile device management component getting initialized before the underlying datasources
are registered */
try {
MobileDeviceManagementDAOFactory.init();
} catch (DeviceManagementException e) {
log.error("Error occurred while initializing mobile device management repository datasource", e);
}
}
protected void unsetDataSourceService(DataSourceService dataSourceService) {
//do nothing
}
}

@ -196,8 +196,13 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.ndatasource.core</artifactId>
<version>${carbon.kernel.version}</version>
</dependency>
<!--CDM core dependencies-->
<!-- Device Management Core dependencies -->
<dependency>
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.device.mgt.core</artifactId>

Loading…
Cancel
Save