diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/pom.xml b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/pom.xml
new file mode 100644
index 0000000000..6891ce61a8
--- /dev/null
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/pom.xml
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+ device-mgt-extensions
+ io.entgra.device.mgt.core
+ 5.0.31-SNAPSHOT
+ ../pom.xml
+
+
+
+ io.entgra.device.mgt.core
+ io.entgra.device.mgt.core.device.mgt.common
+ provided
+
+
+ org.wso2.carbon.identity.inbound.auth.oauth2
+ org.wso2.carbon.identity.oauth.stub
+
+
+ org.apache.axis2.wso2
+ axis2-client
+
+
+ org.apache.geronimo.specs.wso2
+ geronimo-stax-api_1.0_spec
+
+
+ org.apache.ws.commons.axiom.wso2
+ axiom
+
+
+ org.codehaus.woodstox
+ woodstox-core-asl
+
+
+ org.codehaus.woodstox
+ wstx-asl
+
+
+
+
+
+
+ org.wso2.carbon.analytics
+ org.wso2.carbon.analytics.api
+
+
+
+
+ io.entgra.device.mgt.core
+ io.entgra.device.mgt.core.device.mgt.extensions
+ provided
+
+
+ org.codehaus.woodstox
+ stax2-api
+
+
+ org.codehaus.woodstox
+ woodstox-core-asl
+
+
+ org.wso2.carbon
+ org.wso2.carbon.securevault
+
+
+ org.apache.ws.commons.axiom.wso2
+ axiom
+
+
+
+
+ org.wso2.carbon
+ org.wso2.carbon.ndatasource.core
+ provided
+
+
+ org.wso2.securevault
+ org.wso2.securevault
+
+
+
+
+ org.wso2.carbon
+ org.wso2.carbon.base
+ provided
+
+
+ org.wso2.securevault
+ org.wso2.securevault
+
+
+ org.apache.ws.commons.axiom.wso2
+ axiom
+
+
+ org.mockito
+ mockito-core
+
+
+
+
+ org.eclipse.osgi
+ org.eclipse.osgi
+ provided
+
+
+ org.eclipse.osgi
+ org.eclipse.osgi.services
+ provided
+
+
+ org.wso2.carbon
+ org.wso2.carbon.core
+ provided
+
+
+ org.wso2.carbon
+ org.wso2.carbon.logging
+ provided
+
+
+ org.wso2.carbon
+ org.wso2.carbon.utils
+ provided
+
+
+ io.entgra.device.mgt.core
+ io.entgra.device.mgt.core.device.mgt.core
+ provided
+
+
+ org.wso2.carbon
+ org.wso2.carbon.registry.api
+ provided
+
+
+ org.wso2.carbon
+ org.wso2.carbon.registry.core
+ provided
+
+
+ org.apache.tomcat.wso2
+ jdbc-pool
+ provided
+
+
+ com.google.code.gson
+ gson
+ provided
+
+
+ io.github.openfeign
+ feign-core
+ provided
+
+
+ io.github.openfeign
+ feign-jackson
+ provided
+
+
+ io.github.openfeign
+ feign-jaxrs
+ provided
+
+
+ io.github.openfeign
+ feign-gson
+ provided
+
+
+ io.github.openfeign
+ feign-okhttp
+ provided
+
+
+ io.github.openfeign
+ feign-slf4j
+ provided
+
+
+ io.entgra.device.mgt.core
+ io.entgra.device.mgt.core.identity.jwt.client.extension
+ provided
+
+
+ commons-validator
+ commons-validator
+ provided
+
+
+ org.apache.cxf
+ cxf-rt-frontend-jaxws
+ provided
+
+
+ org.apache.cxf
+ cxf-rt-frontend-jaxrs
+ provided
+
+
+ org.apache.cxf
+ cxf-rt-transports-http
+ provided
+
+
+ commons-lang.wso2
+ commons-lang
+ provided
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+ provided
+
+
+ org.json
+ json
+ ${json.version}
+ provided
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${fasterxml.jackson.version}
+ provided
+
+
+ org.powermock
+ powermock-module-testng
+ test
+
+
+ org.powermock
+ powermock-api-mockito
+ test
+
+
+ org.testng
+ testng
+ test
+
+
+ com.h2database.wso2
+ h2-database-engine
+ test
+
+
+ org.apache.httpcomponents.wso2
+ httpcore
+ test
+
+
+ org.wso2.apache.httpcomponents
+ httpclient
+ test
+
+
+ org.wso2.securevault
+ org.wso2.securevault
+ test
+
+
+ xerces.wso2
+ xercesImpl
+ test
+
+
+ org.apache.axis2.wso2
+ axis2
+ test
+
+
+ org.wso2.carbon
+ org.wso2.carbon.queuing
+ test
+
+
+ javax.xml.bind
+ jaxb-api
+ test
+
+
+
+ 4.0.0
+ io.entgra.device.mgt.core.device.mgt.extensions.device.organization
+ bundle
+ Entgra IoT - Device Organization Module
+ Entgra IoT - Device Organization Module Implementation
+ http://entgra.io
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ org.apache.felix
+ maven-scr-plugin
+
+
+ org.apache.felix
+ maven-bundle-plugin
+ true
+
+
+ ${project.artifactId}
+ ${project.artifactId}
+ ${io.entgra.device.mgt.core.version}
+ IoT Device Management Device Organization Bundle
+
+ org.wso2.carbon.context,
+ org.apache.commons.lang,
+ org.wso2.carbon.user.api,
+ org.apache.commons.logging,
+ org.wso2.carbon.user.core.service,
+ io.entgra.device.mgt.core.device.mgt.common.*
+
+
+ org.wso2.carbon.logging
+
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+
+ ${basedir}/target/coverage-reports/jacoco-unit.exec
+
+
+
+ jacoco-initialize
+
+ prepare-agent
+
+
+
+ jacoco-site
+ test
+
+ report
+
+
+ ${basedir}/target/coverage-reports/jacoco-unit.exec
+ ${basedir}/target/coverage-reports/site
+
+
+
+
+
+
+
+
+ 8
+ 8
+ UTF-8
+
+
+
\ No newline at end of file
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAO.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAO.java
new file mode 100644
index 0000000000..6fd54216d0
--- /dev/null
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAO.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao;
+
+import io.entgra.device.mgt.core.device.mgt.common.Device;
+import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtDAOException;
+
+import java.util.List;
+
+public interface DeviceOrganizationDAO {
+
+ List getChildDevices(int parentId) throws DeviceOrganizationMgtDAOException;
+
+ List getParentDevices(Integer deviceID) throws DeviceOrganizationMgtDAOException;
+}
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAOFactory.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAOFactory.java
new file mode 100644
index 0000000000..549604e3ca
--- /dev/null
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/DeviceOrganizationDAOFactory.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao;
+
+import io.entgra.device.mgt.core.device.mgt.core.config.datasource.DataSourceConfig;
+import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.impl.DeviceOrganizationDAOImpl;
+import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.ConnectionManagerUtil;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class DeviceOrganizationDAOFactory {
+ private static final Log log = LogFactory.getLog(DeviceOrganizationDAOFactory.class);
+ private static String databaseEngine;
+
+ public static void init(DataSourceConfig dataSourceConfiguration) {
+ if (log.isDebugEnabled()) {
+ log.debug("Initializing Device Organization Data Source");
+ }
+ ConnectionManagerUtil.resolveDataSource(dataSourceConfiguration);
+ databaseEngine = ConnectionManagerUtil.getDatabaseType();
+ }
+
+ public static DeviceOrganizationDAO getDeviceOrganizationDAO() {
+ if (databaseEngine != null) {
+ //noinspection SwitchStatementWithTooFewBranches
+ switch (databaseEngine) {
+ default:
+ return new DeviceOrganizationDAOImpl();
+ }
+ }
+ throw new IllegalStateException("Database engine has not initialized properly.");
+ }
+}
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationDAOImpl.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationDAOImpl.java
new file mode 100644
index 0000000000..3950020071
--- /dev/null
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/impl/DeviceOrganizationDAOImpl.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.impl;
+
+import io.entgra.device.mgt.core.device.mgt.common.Device;
+import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.DeviceOrganizationDAO;
+import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.ConnectionManagerUtil;
+import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DBConnectionException;
+import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DeviceOrganizationMgtDAOException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.DeviceOrganizationDaoUtil.generateParameterPlaceholders;
+import static io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util.DeviceOrganizationDaoUtil.getDeviceFromResultSet;
+
+public class DeviceOrganizationDAOImpl implements DeviceOrganizationDAO {
+
+ private static final Log log = LogFactory.getLog(DeviceOrganizationDAOImpl.class);
+
+ @Override
+ public List getChildDevices(int parentId) throws DeviceOrganizationMgtDAOException {
+ List childDevices = null;
+ try {
+ Connection conn = ConnectionManagerUtil.getDBConnection();
+ String sql = "SELECT d.ID, d.DEVICE_IDENTIFICATION, d.NAME, t.NAME AS DEVICE_TYPE " +
+ "FROM DM_DEVICE d, DM_DEVICE_TYPE t " +
+ "WHERE d.PARENT_DEVICE_ID = ? AND d.DEVICE_TYPE_ID = t.ID";
+
+ try (PreparedStatement stmt = conn.prepareStatement(sql)){
+ stmt.setInt(1, parentId);
+ try (ResultSet rs = stmt.executeQuery()) {
+ childDevices = new ArrayList<>();
+ while (rs.next()) {
+ childDevices.add(getDeviceFromResultSet(rs));
+ }
+ return childDevices;
+ }
+ }
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining DB connection to retrieve all child devices for " +
+ "parent device ID " +
+ parentId;
+ log.error(msg);
+ throw new DeviceOrganizationMgtDAOException(msg, e);
+ } catch (SQLException e) {
+ String msg = "Error occurred while processing SQL to retrieve all child devices for " +
+ "parent device ID" + parentId;
+ log.error(msg);
+ throw new DeviceOrganizationMgtDAOException(msg, e);
+ }
+ }
+
+ @Override
+ public List getParentDevices(Integer deviceID) throws DeviceOrganizationMgtDAOException {
+ List parentDevices = null;
+ try {
+ Connection conn = ConnectionManagerUtil.getDBConnection();
+ String sql = "SELECT d.ID, d.DEVICE_IDENTIFICATION, d.NAME, t.NAME AS DEVICE_TYPE " +
+ "FROM DM_DEVICE d, DM_DEVICE_TYPE t " +
+ "WHERE d.ID IN (SELECT PARENT_DEVICE_ID FROM DM_DEVICE WHERE ID = ?) " +
+ "AND d.DEVICE_TYPE_ID = t.ID";
+
+ try (PreparedStatement stmt = conn.prepareStatement(sql)){
+ stmt.setInt(1, deviceID);
+ try (ResultSet rs = stmt.executeQuery()) {
+ parentDevices = new ArrayList<>();
+ while (rs.next()) {
+ parentDevices.add(getDeviceFromResultSet(rs));
+ }
+ return parentDevices;
+ }
+ }
+ } catch (DBConnectionException e) {
+ String msg = "Error occurred while obtaining DB connection to retrieve all parent devices for " +
+ "child device ID " +
+ deviceID;
+ log.error(msg);
+ throw new DeviceOrganizationMgtDAOException(msg, e);
+ } catch (SQLException e) {
+ String msg = "Error occurred while processing SQL to retrieve all parent devices for " +
+ "child device ID" + deviceID;
+ log.error(msg);
+ throw new DeviceOrganizationMgtDAOException(msg, e);
+ }
+ }
+
+
+ // Simulated database storage
+
+// public void addDevice(Device device) {
+// devices.put(device.getId(), device);
+// }
+//
+// public void addChildDevice(int parentId, int childId) {
+// deviceHierarchy.computeIfAbsent(parentId, k -> new ArrayList<>()).add(childId);
+// }
+//
+// public Device getDeviceById(int deviceId) {
+// return devices.get(deviceId);
+// }
+}
diff --git a/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/ConnectionManagerUtil.java b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/ConnectionManagerUtil.java
new file mode 100644
index 0000000000..9c41704e2a
--- /dev/null
+++ b/components/device-mgt-extensions/io.entgra.device.mgt.core.device.mgt.extensions.device.organization/src/main/java/io/entgra/device/mgt/core/device/mgt/extensions/device/organization/dao/util/ConnectionManagerUtil.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
+ *
+ * Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.device.mgt.extensions.device.organization.dao.util;
+
+import io.entgra.device.mgt.core.device.mgt.extensions.device.organization.exception.DBConnectionException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import io.entgra.device.mgt.core.device.mgt.common.exceptions.IllegalTransactionStateException;
+import io.entgra.device.mgt.core.device.mgt.core.config.datasource.DataSourceConfig;
+import io.entgra.device.mgt.core.device.mgt.core.config.datasource.JNDILookupDefinition;
+
+import javax.naming.InitialContext;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Hashtable;
+import java.util.List;
+
+public class ConnectionManagerUtil {
+
+ private static final Log log = LogFactory.getLog(ConnectionManagerUtil.class);
+ private static final ThreadLocal currentConnection = new ThreadLocal<>();
+ private static DataSource dataSource;
+
+ public static void openDBConnection() throws DBConnectionException {
+ Connection conn = currentConnection.get();
+ if (conn != null) {
+ throw new IllegalTransactionStateException("Database connection has already been obtained.");
+ }
+ try {
+ conn = dataSource.getConnection();
+ } catch (SQLException e) {
+ throw new DBConnectionException("Failed to get a database connection.", e);
+ }
+ currentConnection.set(conn);
+ }
+
+ public static Connection getDBConnection() throws DBConnectionException {
+ Connection conn = currentConnection.get();
+ if (conn == null) {
+ try {
+ conn = dataSource.getConnection();
+ currentConnection.set(conn);
+ } catch (SQLException e) {
+ throw new DBConnectionException("Failed to get database connection.", e);
+ }
+ }
+ return conn;
+ }
+
+ public static void beginDBTransaction() throws DBConnectionException {
+ Connection conn = currentConnection.get();
+ if (conn == null) {
+ conn = getDBConnection();
+ } else if (inTransaction(conn)) {
+ throw new IllegalTransactionStateException("Transaction has already been started.");
+ }
+
+ try {
+ conn.setAutoCommit(false);
+ } catch (SQLException e) {
+ throw new DBConnectionException("Error occurred while starting a database transaction.", e);
+ }
+ }
+
+ public static void endDBTransaction() throws DBConnectionException {
+ Connection conn = currentConnection.get();
+ if (conn == null) {
+ throw new IllegalTransactionStateException("Database connection is not active.");
+ }
+
+ if (!inTransaction(conn)) {
+ throw new IllegalTransactionStateException("Transaction has not been started.");
+ }
+
+ try {
+ conn.setAutoCommit(true);
+ } catch (SQLException e) {
+ throw new DBConnectionException("Error occurred while ending database transaction.", e);
+ }
+ }
+
+ public static void commitDBTransaction() {
+ Connection conn = currentConnection.get();
+ if (conn == null) {
+ throw new IllegalTransactionStateException("Database connection is not active.");
+ }
+
+ if (!inTransaction(conn)) {
+ throw new IllegalTransactionStateException("Transaction has not been started.");
+ }
+
+ try {
+ conn.commit();
+ } catch (SQLException e) {
+ log.error("Error occurred while committing the transaction", e);
+ }
+ }
+
+ public static void rollbackDBTransaction() {
+ Connection conn = currentConnection.get();
+ if (conn == null) {
+ throw new IllegalTransactionStateException("Database connection is not active.");
+ }
+
+ if (!inTransaction(conn)) {
+ throw new IllegalTransactionStateException("Transaction has not been started.");
+ }
+
+ try {
+ conn.rollback();
+ } catch (SQLException e) {
+ log.warn("Error occurred while roll-backing the transaction", e);
+ }
+ }
+
+ public static void closeDBConnection() {
+ Connection conn = currentConnection.get();
+ if (conn == null) {
+ throw new IllegalTransactionStateException("Database connection is not active.");
+ }
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ log.error("Error occurred while closing the connection", e);
+ }
+ currentConnection.remove();
+ }
+
+ private static boolean inTransaction(Connection conn) {
+ boolean inTransaction = true;
+ try {
+ if (conn.getAutoCommit()) {
+ inTransaction = false;
+ }
+ } catch (SQLException e) {
+ throw new IllegalTransactionStateException("Failed to get transaction state.");
+ }
+ return inTransaction;
+ }
+
+ public static boolean isTransactionStarted() throws DBConnectionException {
+ Connection connection = getDBConnection();
+ return inTransaction(connection);
+ }
+
+ /**
+ * Resolve data source from the data source definition.
+ *
+ * @param config Data source configuration
+ * @return data source resolved from the data source definition
+ */
+ public static DataSource resolveDataSource(DataSourceConfig config) {
+ 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