diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/pom.xml index e6974c9192..9724e4eaf4 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/pom.xml @@ -66,6 +66,7 @@ org.wso2.carbon.core, org.wso2.carbon.utils.*, org.wso2.carbon.device.mgt.common.*, + org.wso2.carbon.ndatasource.core !org.wso2.carbon.device.mgt.mobile.internal, @@ -116,6 +117,10 @@ org.wso2.carbon.devicemgt org.wso2.carbon.device.mgt.common + + org.wso2.carbon + org.wso2.carbon.ndatasource.core + org.testng testng diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/DataSourceNotAvailableException.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/DataSourceNotAvailableException.java new file mode 100644 index 0000000000..5a9e5b8f48 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/DataSourceNotAvailableException.java @@ -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; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceManagementDAOException.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceManagementDAOException.java index 0fdb337b10..0b04818d96 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceManagementDAOException.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceManagementDAOException.java @@ -76,4 +76,5 @@ public class MobileDeviceManagementDAOException extends Exception { public void setErrorMessage(String errorMessage) { this.message = errorMessage; } + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceManagementDAOFactory.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceManagementDAOFactory.java index 34348e046a..0dc2d7fbd0 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceManagementDAOFactory.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/dao/MobileDeviceManagementDAOFactory.java @@ -21,6 +21,7 @@ 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.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.*; @@ -36,94 +37,93 @@ import java.util.Map; */ public class MobileDeviceManagementDAOFactory { - private static final Log log = LogFactory.getLog(MobileDeviceManagementDAOFactory.class); - private static Map mobileDataSourceConfigMap; - private static Map dataSourceMap; + private static final Log log = LogFactory.getLog(MobileDeviceManagementDAOFactory.class); + private static Map mobileDataSourceConfigMap; + private static Map dataSourceMap; private String pluginProvider; private DataSource dataSource; + private static boolean isInitialized; - public MobileDeviceManagementDAOFactory(String pluginProvider) { + public MobileDeviceManagementDAOFactory(String pluginProvider) { this.pluginProvider = pluginProvider; this.dataSource = dataSourceMap.get(pluginProvider); - } - - public static void init() { - try { - DataSource dataSource; - for(String pluginType:mobileDataSourceConfigMap.keySet()){ - dataSource = MobileDeviceManagementDAOFactory.resolveDataSource(mobileDataSourceConfigMap.get - (pluginType)); - dataSourceMap.put(pluginType,dataSource); + } + + public static void init() throws DeviceManagementException { + + DataSource dataSource; + for (String pluginType : mobileDataSourceConfigMap.keySet()) { + dataSource = MobileDeviceManagementDAOFactory.resolveDataSource(mobileDataSourceConfigMap.get + (pluginType)); + dataSourceMap.put(pluginType, dataSource); + } + isInitialized = true; + } + + /** + * 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 jndiPropertyList = + jndiConfig.getJndiProperties(); + if (jndiPropertyList != null) { + Hashtable jndiProperties = new Hashtable(); + for (JNDILookupDefinition.JNDIProperty prop : jndiPropertyList) { + jndiProperties.put(prop.getName(), prop.getValue()); + } + dataSource = + MobileDeviceManagementDAOUtil + .lookupDataSource(jndiConfig.getJndiName(), jndiProperties); + } else { + dataSource = MobileDeviceManagementDAOUtil + .lookupDataSource(jndiConfig.getJndiName(), null); } - } catch (DeviceManagementException e) { - log.error("Exception occurred while initializing the mobile data source.",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 jndiPropertyList = - jndiConfig.getJndiProperties(); - if (jndiPropertyList != null) { - Hashtable jndiProperties = new Hashtable(); - 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 MobileDeviceDAO getMobileDeviceDAO() { - return new MobileDeviceDAOImpl(dataSource); - } - - public MobileOperationDAO getMobileOperationDAO() { - return new MobileOperationDAOImpl(dataSource); - } - - public MobileOperationPropertyDAO getMobileOperationPropertyDAO() { - return new MobileOperationPropertyDAOImpl(dataSource); - } - - public MobileDeviceOperationMappingDAO getMobileDeviceOperationDAO() { - return new MobileDeviceOperationMappingDAOImpl(dataSource); - } - - public MobileFeatureDAO getFeatureDAO() { - return new MobileFeatureDAOImpl(dataSource); - } - - public MobileFeaturePropertyDAO getFeaturePropertyDAO() { - return new MobileFeaturePropertyDAOImpl(dataSource); - } - - public MobileDataSourceConfig getMobileDeviceManagementConfig(String pluginType) { - return mobileDataSourceConfigMap.get(pluginType); - } + } + return dataSource; + } + + public MobileDeviceDAO getMobileDeviceDAO() { + return new MobileDeviceDAOImpl(dataSource); + } + + public MobileOperationDAO getMobileOperationDAO() { + return new MobileOperationDAOImpl(dataSource); + } + + public MobileOperationPropertyDAO getMobileOperationPropertyDAO() { + return new MobileOperationPropertyDAOImpl(dataSource); + } + + public MobileDeviceOperationMappingDAO getMobileDeviceOperationDAO() { + return new MobileDeviceOperationMappingDAOImpl(dataSource); + } + + public MobileFeatureDAO getFeatureDAO() { + return new MobileFeatureDAOImpl(dataSource); + } + + public MobileFeaturePropertyDAO getFeaturePropertyDAO() { + return new MobileFeaturePropertyDAOImpl(dataSource); + } + + public MobileDataSourceConfig getMobileDeviceManagementConfig(String pluginType) { + return mobileDataSourceConfigMap.get(pluginType); + } public static Map getMobileDataSourceConfigMap() { return mobileDataSourceConfigMap; @@ -133,11 +133,18 @@ public class MobileDeviceManagementDAOFactory { MobileDeviceManagementDAOFactory.mobileDataSourceConfigMap = mobileDataSourceConfigMap; } - public DataSource getDataSource(String type) { - return dataSourceMap.get(type); - } + public DataSource getDataSource(String type) { + return dataSourceMap.get(type); + } public static Map getDataSourceMap() { return dataSourceMap; } + + private static void assertDataSourceInitialization() { + if (!isInitialized) { + throw new DataSourceNotAvailableException("Mobile device management metadata repository datasource " + + "is not initialized"); + } + } } \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementBundleActivator.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementBundleActivator.java index 0fbb6a54fe..e2482e6926 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementBundleActivator.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementBundleActivator.java @@ -65,7 +65,6 @@ public class MobileDeviceManagementBundleActivator implements BundleActivator, B .getMobileDeviceManagementConfig(); Map mobileDataSourceConfigMap = config.getMobileDeviceMgtRepository().getMobileDataSourceConfigMap(); - MobileDeviceManagementDAOFactory.setMobileDataSourceConfigMap(mobileDataSourceConfigMap); androidServiceRegRef = diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementServiceComponent.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementServiceComponent.java index 18be1fbb60..4798236c37 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementServiceComponent.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/internal/MobileDeviceManagementServiceComponent.java @@ -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,6 +34,7 @@ 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; import javax.sql.DataSource; import java.util.Map; @@ -40,6 +42,12 @@ import java.util.Map; /** * @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" *

* 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,10 +55,10 @@ import java.util.Map; */ public class MobileDeviceManagementServiceComponent { - private ServiceRegistration androidServiceRegRef; - private ServiceRegistration iOSServiceRegRef; - private ServiceRegistration windowsServiceRegRef; private ServiceRegistration serverStartupObserverRef; + private ServiceRegistration androidServiceRegRef; + private ServiceRegistration iOSServiceRegRef; + private ServiceRegistration windowsServiceRegRef; private static final Log log = LogFactory.getLog(MobileDeviceManagementServiceComponent.class); @@ -67,7 +75,6 @@ public class MobileDeviceManagementServiceComponent { .getMobileDeviceManagementConfig(); Map dsConfigMap = config.getMobileDeviceMgtRepository().getMobileDataSourceConfigMap(); - MobileDeviceManagementDAOFactory.setMobileDataSourceConfigMap(dsConfigMap); MobileDeviceManagementDAOFactory.init(); String setupOption = System.getProperty("setup"); @@ -108,11 +115,15 @@ public class MobileDeviceManagementServiceComponent { log.debug("De-activating Mobile Device Management Service Component"); } try { - androidServiceRegRef.unregister(); - iOSServiceRegRef.unregister(); - windowsServiceRegRef.unregister(); - serverStartupObserverRef.unregister(); - + if (androidServiceRegRef != null) { + androidServiceRegRef.unregister(); + } + if (iOSServiceRegRef != null) { + iOSServiceRegRef.unregister(); + } + if (windowsServiceRegRef != null) { + windowsServiceRegRef.unregister(); + } if (log.isDebugEnabled()) { log.debug( "Mobile Device Management Service Component has been successfully de-activated"); @@ -122,4 +133,17 @@ 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 + } } diff --git a/pom.xml b/pom.xml index 64fee61f49..641e15eabf 100644 --- a/pom.xml +++ b/pom.xml @@ -196,8 +196,13 @@ + + org.wso2.carbon + org.wso2.carbon.ndatasource.core + ${carbon.kernel.version} + - + org.wso2.carbon.devicemgt org.wso2.carbon.device.mgt.core