From d1f2bdb296bd38e27fe05c8119fe1526448c655f Mon Sep 17 00:00:00 2001 From: Rushdi Date: Tue, 22 Mar 2022 23:21:54 +0530 Subject: [PATCH] update the threadpool apporoach/ add traccar devices/groups for existing UEM devices/groups --- .../device/mgt/common/TrackerGroupInfo.java | 26 +- .../mgt/TrackerAlreadyExistException.java | 60 +++ .../core/dao/GroupManagementDAOFactory.java | 17 - .../core/dao/TrackerManagementDAOFactory.java | 241 +++++++++++++ .../mgt/core/dao/impl/TrackerDAOImpl.java | 42 +-- .../dao/util/TrackerManagementDAOUtil.java | 96 +++++ .../impl/DeviceInformationManagerImpl.java | 11 +- .../DeviceManagementServiceComponent.java | 2 + .../DeviceManagementProviderServiceImpl.java | 43 +-- .../GroupManagementProviderServiceImpl.java | 51 +-- .../api/service/DeviceAPIClientService.java | 23 +- .../api/service/addons/TrackerClient.java | 341 ++++++++++++------ .../impl/TraccarAPIClientServiceImpl.java | 90 ++++- .../core/traccar/common/TraccarClient.java | 17 +- .../common/TraccarHandlerConstants.java | 27 +- .../traccar/common/beans/TraccarDevice.java | 2 - .../config/TraccarConfigurationManager.java | 2 +- .../src/main/resources/dbscripts/cdm/h2.sql | 22 +- 18 files changed, 790 insertions(+), 323 deletions(-) create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/group/mgt/TrackerAlreadyExistException.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/TrackerManagementDAOFactory.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/util/TrackerManagementDAOUtil.java diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/TrackerGroupInfo.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/TrackerGroupInfo.java index f4d2045f129..6caea83c522 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/TrackerGroupInfo.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/TrackerGroupInfo.java @@ -18,38 +18,26 @@ */ package org.wso2.carbon.device.mgt.common; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - import java.io.Serializable; -@ApiModel(value = "TrackerGroupInfo", description = "This class carries all information related to a add groups.") -public class TrackerInfo implements Serializable { +public class TrackerGroupInfo implements Serializable { private static final long serialVersionUID = 1998101712L; - @ApiModelProperty(name = "id", value = "ID of the device in the WSO2 EMM device information database.", - required = true) private int id; private int traccarGroupId; - private int traccarDeviceId; private int groupId; private int tenantId; - public TrackerInfo() { + public TrackerGroupInfo() { } - public TrackerInfo(int traccarGroupId, int groupId, int tenantId) { + public TrackerGroupInfo(int traccarGroupId, int groupId, int tenantId) { this.traccarGroupId = traccarGroupId; this.groupId = groupId; this.tenantId = tenantId; } - public TrackerInfo(int traccarDeviceId, int groupId) { - this.traccarDeviceId = traccarDeviceId; - this.groupId = groupId; - } - public int getId() { return id; } @@ -81,12 +69,4 @@ public class TrackerInfo implements Serializable { public void setTenantId(int tenantId) { this.tenantId = tenantId; } - - public int getTraccarDeviceId() { - return traccarDeviceId; - } - - public void setTraccarDeviceId(int traccarDeviceId) { - this.traccarDeviceId = traccarDeviceId; - } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/group/mgt/TrackerAlreadyExistException.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/group/mgt/TrackerAlreadyExistException.java new file mode 100644 index 00000000000..c120f78ea9f --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/group/mgt/TrackerAlreadyExistException.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016, 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.common.group.mgt; + +/** + * This class represents a custom exception specified for group management + */ +public class TrackerAlreadyExistException extends Exception { + + private static final long serialVersionUID = -312678379574816874L; + private String errorMessage; + + public TrackerAlreadyExistException(String msg, Exception nestedEx) { + super(msg, nestedEx); + setErrorMessage(msg); + } + + public TrackerAlreadyExistException(String message, Throwable cause) { + super(message, cause); + setErrorMessage(message); + } + + public TrackerAlreadyExistException(String msg) { + super(msg); + setErrorMessage(msg); + } + + public TrackerAlreadyExistException() { + super(); + } + + public TrackerAlreadyExistException(Throwable cause) { + super(cause); + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/GroupManagementDAOFactory.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/GroupManagementDAOFactory.java index a848f947bf4..d4d3f535879 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/GroupManagementDAOFactory.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/GroupManagementDAOFactory.java @@ -26,7 +26,6 @@ import org.wso2.carbon.device.mgt.common.exceptions.TransactionManagementExcepti import org.wso2.carbon.device.mgt.common.exceptions.UnsupportedDatabaseEngineException; import org.wso2.carbon.device.mgt.core.config.datasource.DataSourceConfig; import org.wso2.carbon.device.mgt.core.config.datasource.JNDILookupDefinition; -import org.wso2.carbon.device.mgt.core.dao.impl.TrackerDAOImpl; import org.wso2.carbon.device.mgt.core.dao.impl.group.GenericGroupDAOImpl; import org.wso2.carbon.device.mgt.core.dao.impl.group.OracleGroupDAOImpl; import org.wso2.carbon.device.mgt.core.dao.impl.group.PostgreSQLGroupDAOImpl; @@ -73,22 +72,6 @@ public class GroupManagementDAOFactory { throw new IllegalStateException("Database engine has not initialized properly."); } - public static TrackerDAO getTrackerDAO() { - if (databaseEngine != null) { - switch (databaseEngine) { - case DeviceManagementConstants.DataBaseTypes.DB_TYPE_POSTGRESQL: - case DeviceManagementConstants.DataBaseTypes.DB_TYPE_ORACLE: - case DeviceManagementConstants.DataBaseTypes.DB_TYPE_MSSQL: - case DeviceManagementConstants.DataBaseTypes.DB_TYPE_H2: - case DeviceManagementConstants.DataBaseTypes.DB_TYPE_MYSQL: - return new TrackerDAOImpl(); - default: - throw new UnsupportedDatabaseEngineException("Unsupported database engine : " + databaseEngine); - } - } - throw new IllegalStateException("Database engine has not initialized properly."); - } - public static void init(DataSourceConfig config) { dataSource = resolveDataSource(config); try { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/TrackerManagementDAOFactory.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/TrackerManagementDAOFactory.java new file mode 100644 index 00000000000..912aca3ec5d --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/TrackerManagementDAOFactory.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2015, 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; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; +import org.wso2.carbon.device.mgt.common.exceptions.IllegalTransactionStateException; +import org.wso2.carbon.device.mgt.common.exceptions.TransactionManagementException; +import org.wso2.carbon.device.mgt.common.exceptions.UnsupportedDatabaseEngineException; +import org.wso2.carbon.device.mgt.core.config.datasource.DataSourceConfig; +import org.wso2.carbon.device.mgt.core.config.datasource.JNDILookupDefinition; +import org.wso2.carbon.device.mgt.core.dao.impl.TrackerDAOImpl; +import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Hashtable; +import java.util.List; + +/** + * This class intends to act as the primary entity that hides all DAO instantiation related complexities and logic so + * that the business objection handling layer doesn't need to be aware of the same providing seamless plug-ability of + * different data sources, connection acquisition mechanisms as well as different forms of DAO implementations to the + * high-level implementations that require device management related metadata persistence. + *

+ * In addition, this also provides means to handle transactions across multiple device management related DAO objects. + * Any high-level business logic that requires transaction handling to be done via utility methods provided in + * TrackerManagementDAOFactory should adhere the following guidelines to avoid any unexpected behaviour that can cause + * as a result of improper use of the aforementioned utility method. + *

+ * Any transaction that commits data into the underlying data persistence mechanism MUST follow the sequence of + * operations mentioned below. + *

+ *

+ * {@code
+ * try {
+ *      TrackerManagementDAOFactory.beginTransaction();
+ *      .....
+ *      TrackerManagementDAOFactory.commitTransaction();
+ *      return success;
+ * } catch (Exception e) {
+ *      TrackerManagementDAOFactory.rollbackTransaction();
+ *      throw new DeviceManagementException("Error occurred while ...", e);
+ * } finally {
+ *      TrackerManagementDAOFactory.closeConnection();
+ * }
+ * }
+ * 
+ *

+ * Any transaction that retrieves data from the underlying data persistence mechanism MUST follow the sequence of + * operations mentioned below. + *

+ *

+ * {@code
+ * try {
+ *      TrackerManagementDAOFactory.openConnection();
+ *      .....
+ * } catch (Exception e) {
+ *      throw new DeviceManagementException("Error occurred while ..., e);
+ * } finally {
+ *      TrackerManagementDAOFactory.closeConnection();
+ * }
+ * }
+ * 
+ */ +public class TrackerManagementDAOFactory { + + private static DataSource dataSource; + private static String databaseEngine; + private static final Log log = LogFactory.getLog(TrackerManagementDAOFactory.class); + private static ThreadLocal currentConnection = new ThreadLocal<>(); + + + public static TrackerDAO getTrackerDAO() { + if (databaseEngine != null) { + switch (databaseEngine) { + case DeviceManagementConstants.DataBaseTypes.DB_TYPE_ORACLE: + case DeviceManagementConstants.DataBaseTypes.DB_TYPE_MSSQL: + case DeviceManagementConstants.DataBaseTypes.DB_TYPE_POSTGRESQL: + case DeviceManagementConstants.DataBaseTypes.DB_TYPE_H2: + case DeviceManagementConstants.DataBaseTypes.DB_TYPE_MYSQL: + return new TrackerDAOImpl(); + default: + throw new UnsupportedDatabaseEngineException("Unsupported database engine : " + databaseEngine); + } + } + throw new IllegalStateException("Database engine has not initialized properly."); + } + + + public static void init(DataSourceConfig config) { + dataSource = resolveDataSource(config); + try { + databaseEngine = dataSource.getConnection().getMetaData().getDatabaseProductName(); + } catch (SQLException e) { + log.error("Error occurred while retrieving config.datasource connection", e); + } + } + + public static void init(DataSource dtSource) { + dataSource = dtSource; + try { + databaseEngine = dataSource.getConnection().getMetaData().getDatabaseProductName(); + } catch (SQLException e) { + log.error("Error occurred while retrieving config.datasource connection", e); + } + } + + public static void beginTransaction() throws TransactionManagementException { + Connection conn = currentConnection.get(); + if (conn != null) { + throw new IllegalTransactionStateException("A transaction is already active within the context of " + + "this particular thread. Therefore, calling 'beginTransaction/openConnection' while another " + + "transaction is already active is a sign of improper transaction handling"); + } + try { + conn = dataSource.getConnection(); + conn.setAutoCommit(false); + currentConnection.set(conn); + } catch (SQLException e) { + throw new TransactionManagementException("Error occurred while retrieving config.datasource connection", e); + } + } + + public static void openConnection() throws SQLException { + Connection conn = currentConnection.get(); + if (conn != null) { + throw new IllegalTransactionStateException("A transaction is already active within the context of " + + "this particular thread. Therefore, calling 'beginTransaction/openConnection' while another " + + "transaction is already active is a sign of improper transaction handling"); + } + conn = dataSource.getConnection(); + currentConnection.set(conn); + } + + public static Connection getConnection() throws SQLException { + Connection conn = currentConnection.get(); + if (conn == null) { + throw new IllegalTransactionStateException("No connection is associated with the current transaction. " + + "This might have ideally been caused by not properly initiating the transaction via " + + "'beginTransaction'/'openConnection' methods"); + } + return conn; + } + + public static void commitTransaction() { + Connection conn = currentConnection.get(); + if (conn == null) { + throw new IllegalTransactionStateException("No connection is associated with the current transaction. " + + "This might have ideally been caused by not properly initiating the transaction via " + + "'beginTransaction'/'openConnection' methods"); + } + try { + conn.commit(); + } catch (SQLException e) { + log.error("Error occurred while committing the transaction", e); + } + } + + public static void rollbackTransaction() { + Connection conn = currentConnection.get(); + if (conn == null) { + throw new IllegalTransactionStateException("No connection is associated with the current transaction. " + + "This might have ideally been caused by not properly initiating the transaction via " + + "'beginTransaction'/'openConnection' methods"); + } + try { + conn.rollback(); + } catch (SQLException e) { + log.warn("Error occurred while roll-backing the transaction", e); + } + } + + public static void closeConnection() { + Connection conn = currentConnection.get(); + if (conn == null) { + throw new IllegalTransactionStateException("No connection is associated with the current transaction. " + + "This might have ideally been caused by not properly initiating the transaction via " + + "'beginTransaction'/'openConnection' methods"); + } + try { + conn.close(); + } catch (SQLException e) { + log.warn("Error occurred while close the connection"); + } + currentConnection.remove(); + } + + + /** + * Resolve data source from the data source definition + * + * @param config data source configuration + * @return data source resolved from the data source definition + */ + private static DataSource resolveDataSource(DataSourceConfig config) { + 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 = DeviceManagementDAOUtil.lookupDataSource(jndiConfig.getJndiName(), jndiProperties); + } else { + dataSource = DeviceManagementDAOUtil.lookupDataSource(jndiConfig.getJndiName(), null); + } + } + return dataSource; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/TrackerDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/TrackerDAOImpl.java index df317e282f9..11f5284af83 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/TrackerDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/TrackerDAOImpl.java @@ -20,12 +20,10 @@ package org.wso2.carbon.device.mgt.core.dao.impl; import org.wso2.carbon.device.mgt.common.TrackerDeviceInfo; import org.wso2.carbon.device.mgt.common.TrackerGroupInfo; -import org.wso2.carbon.device.mgt.core.dao.GroupManagementDAOFactory; -import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOFactory; import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.TrackerDAO; -import org.wso2.carbon.device.mgt.core.dao.util.GroupManagementDAOUtil; -import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; +import org.wso2.carbon.device.mgt.core.dao.util.TrackerManagementDAOUtil; import java.sql.Connection; import java.sql.PreparedStatement; @@ -38,8 +36,8 @@ public class TrackerDAOImpl implements TrackerDAO { public Boolean addTraccarDevice(int traccarDeviceId, int deviceId, int tenantId) throws TrackerManagementDAOException { PreparedStatement stmt = null; try { - Connection conn = DeviceManagementDAOFactory.getConnection(); - String sql = "INSERT INTO DM_TRACCAR_DEVICE_MAPPING(TRACCAR_DEVICE_ID, DEVICE_ID, TENANT_ID) VALUES(?, ?, ?)"; + Connection conn = TrackerManagementDAOFactory.getConnection(); + String sql = "INSERT INTO DM_EXT_DEVICE_MAPPING(TRACCAR_DEVICE_ID, DEVICE_ID, TENANT_ID) VALUES(?, ?, ?)"; stmt = conn.prepareStatement(sql); stmt.setInt(1, traccarDeviceId); stmt.setInt(2, deviceId); @@ -50,7 +48,7 @@ public class TrackerDAOImpl implements TrackerDAO { } catch (SQLException e) { throw new TrackerManagementDAOException("Error occurred while adding traccar device mapping", e); } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, null); + TrackerManagementDAOUtil.cleanupResources(stmt, null); } } @@ -60,8 +58,8 @@ public class TrackerDAOImpl implements TrackerDAO { ResultSet rs = null; int status = -1; try { - Connection conn = DeviceManagementDAOFactory.getConnection(); - String sql = "DELETE FROM DM_TRACCAR_DEVICE_MAPPING WHERE DEVICE_ID = ? AND TENANT_ID = ? "; + Connection conn = TrackerManagementDAOFactory.getConnection(); + String sql = "DELETE FROM DM_EXT_DEVICE_MAPPING WHERE DEVICE_ID = ? AND TENANT_ID = ? "; stmt = conn.prepareStatement(sql, new String[] {"id"}); stmt.setInt(1, deviceId); stmt.setInt(2, tenantId); @@ -74,7 +72,7 @@ public class TrackerDAOImpl implements TrackerDAO { } catch (SQLException e) { throw new TrackerManagementDAOException("Error occurred while removing traccar device", e); } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, null); + TrackerManagementDAOUtil.cleanupResources(stmt, null); } } @@ -84,8 +82,8 @@ public class TrackerDAOImpl implements TrackerDAO { ResultSet rs = null; TrackerDeviceInfo trackerDeviceInfo = null; try { - Connection conn = DeviceManagementDAOFactory.getConnection(); - String sql = "SELECT ID, TRACCAR_DEVICE_ID, DEVICE_ID, TENANT_ID FROM DM_TRACCAR_DEVICE_MAPPING WHERE " + + Connection conn = TrackerManagementDAOFactory.getConnection(); + String sql = "SELECT ID, TRACCAR_DEVICE_ID, DEVICE_ID, TENANT_ID FROM DM_EXT_DEVICE_MAPPING WHERE " + "DEVICE_ID = ? AND TENANT_ID = ? ORDER BY ID DESC LIMIT 1"; stmt = conn.prepareStatement(sql); stmt.setInt(1, deviceId); @@ -98,7 +96,7 @@ public class TrackerDAOImpl implements TrackerDAO { } catch (SQLException e) { throw new TrackerManagementDAOException("Error occurred while retrieving the traccar device information ", e); } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, rs); + TrackerManagementDAOUtil.cleanupResources(stmt, rs); } } @@ -107,8 +105,8 @@ public class TrackerDAOImpl implements TrackerDAO { PreparedStatement stmt = null; try { - Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "INSERT INTO DM_TRACCAR_GROUP_MAPPING(TRACCAR_GROUP_ID, GROUP_ID, TENANT_ID) VALUES(?, ?, ?)"; + Connection conn = TrackerManagementDAOFactory.getConnection(); + String sql = "INSERT INTO DM_EXT_GROUP_MAPPING(TRACCAR_GROUP_ID, GROUP_ID, TENANT_ID) VALUES(?, ?, ?)"; stmt = conn.prepareStatement(sql); stmt.setInt(1, traccarGroupId); stmt.setInt(2, groupId); @@ -120,7 +118,7 @@ public class TrackerDAOImpl implements TrackerDAO { String msg = "Error occurred while adding traccar group mapping"; throw new TrackerManagementDAOException(msg, e); } finally { - GroupManagementDAOUtil.cleanupResources(stmt, null); + TrackerManagementDAOUtil.cleanupResources(stmt, null); } } @@ -130,8 +128,8 @@ public class TrackerDAOImpl implements TrackerDAO { ResultSet rs = null; int status = -1; try { - Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "DELETE FROM DM_TRACCAR_GROUP_MAPPING WHERE ID = ? "; + Connection conn = TrackerManagementDAOFactory.getConnection(); + String sql = "DELETE FROM DM_EXT_GROUP_MAPPING WHERE ID = ? "; stmt = conn.prepareStatement(sql, new String[] {"id"}); stmt.setInt(1, id); stmt.executeUpdate(); @@ -143,7 +141,7 @@ public class TrackerDAOImpl implements TrackerDAO { } catch (SQLException e) { throw new TrackerManagementDAOException("Error occurred while removing traccar group", e); } finally { - GroupManagementDAOUtil.cleanupResources(stmt, null); + TrackerManagementDAOUtil.cleanupResources(stmt, null); } } @@ -153,8 +151,8 @@ public class TrackerDAOImpl implements TrackerDAO { ResultSet rs = null; TrackerGroupInfo trackerGroupInfo = null; try { - Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "SELECT ID, TRACCAR_GROUP_ID, GROUP_ID, TENANT_ID FROM DM_TRACCAR_GROUP_MAPPING WHERE " + + Connection conn = TrackerManagementDAOFactory.getConnection(); + String sql = "SELECT ID, TRACCAR_GROUP_ID, GROUP_ID, TENANT_ID FROM DM_EXT_GROUP_MAPPING WHERE " + "GROUP_ID = ? AND TENANT_ID = ?"; stmt = conn.prepareStatement(sql); stmt.setInt(1, groupId); @@ -167,7 +165,7 @@ public class TrackerDAOImpl implements TrackerDAO { } catch (SQLException e) { throw new TrackerManagementDAOException("Error occurred while retrieving the traccar group information ", e); } finally { - GroupManagementDAOUtil.cleanupResources(stmt, rs); + TrackerManagementDAOUtil.cleanupResources(stmt, rs); } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/util/TrackerManagementDAOUtil.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/util/TrackerManagementDAOUtil.java new file mode 100644 index 00000000000..7aab01a40a4 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/util/TrackerManagementDAOUtil.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016, 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. + * + * Copyright (c) 2021, Entgra (pvt) Ltd. (https://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 org.wso2.carbon.device.mgt.core.dao.util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.naming.InitialContext; +import javax.sql.DataSource; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Hashtable; + +/** + * This class represents utilities required to work with group management data + */ +public final class TrackerManagementDAOUtil { + + private static final Log log = LogFactory.getLog(TrackerManagementDAOUtil.class); + + /** + * Cleanup resources used to transaction + * + * @param stmt Prepared statement used + * @param rs Obtained results set + */ + public static void cleanupResources(PreparedStatement stmt, ResultSet rs) { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + log.warn("Error occurred while closing result set", e); + } + } + if (stmt != null) { + try { + stmt.close(); + } catch (SQLException e) { + log.warn("Error occurred while closing prepared statement", e); + } + } + } + + /** + * Lookup datasource using name and jndi properties + * + * @param dataSourceName Name of datasource to lookup + * @param jndiProperties Hash table of JNDI Properties + * @return datasource looked + */ + public static DataSource lookupDataSource(String dataSourceName, + final Hashtable jndiProperties) { + try { + if (jndiProperties == null || jndiProperties.isEmpty()) { + return (DataSource) InitialContext.doLookup(dataSourceName); + } + final InitialContext context = new InitialContext(jndiProperties); + return (DataSource) context.lookup(dataSourceName); + } catch (Exception e) { + throw new RuntimeException("Error in looking up data source: " + e.getMessage(), e); + } + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java index e699d223f2f..50b665f4411 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java @@ -43,7 +43,6 @@ import org.wso2.carbon.device.mgt.core.device.details.mgt.dao.DeviceDetailsMgtDA import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; import org.wso2.carbon.device.mgt.core.report.mgt.Constants; import org.wso2.carbon.device.mgt.core.service.GroupManagementProviderService; -import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException; import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; import org.wso2.carbon.device.mgt.core.util.HttpReportingUtil; import org.wso2.carbon.user.api.UserStoreException; @@ -388,13 +387,9 @@ public class DeviceInformationManagerImpl implements DeviceInformationManager { } //Traccar update GPS Location - try { - if (HttpReportingUtil.isLocationPublishing() && HttpReportingUtil.isTrackerEnabled()) { - DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() - .updateLocation(device, deviceLocation); - } - } catch (TraccarConfigurationException e) { - log.error("Error on Traccar while adding GEO Location" + e); + if (HttpReportingUtil.isLocationPublishing() && HttpReportingUtil.isTrackerEnabled()) { + DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() + .updateLocation(device, deviceLocation, CarbonContext.getThreadLocalCarbonContext().getTenantId()); } //Traccar update GPS Location diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java index fec7cbcbf34..fad8324919a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java @@ -53,6 +53,7 @@ import org.wso2.carbon.device.mgt.core.config.ui.UIConfigurationManager; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; import org.wso2.carbon.device.mgt.core.dao.EventManagementDAOFactory; import org.wso2.carbon.device.mgt.core.dao.GroupManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOFactory; import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInformationManager; import org.wso2.carbon.device.mgt.core.device.details.mgt.impl.DeviceInformationManagerImpl; import org.wso2.carbon.device.mgt.core.event.config.EventConfigurationProviderServiceImpl; @@ -192,6 +193,7 @@ public class DeviceManagementServiceComponent { DeviceManagementDAOFactory.init(dsConfig); GroupManagementDAOFactory.init(dsConfig); + TrackerManagementDAOFactory.init(dsConfig); NotificationManagementDAOFactory.init(dsConfig); OperationManagementDAOFactory.init(dsConfig); MetadataManagementDAOFactory.init(dsConfig); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java index 022fec192aa..7a62186377a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java @@ -47,7 +47,6 @@ import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.protocol.HTTP; -import org.json.JSONObject; import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext; @@ -69,8 +68,6 @@ import org.wso2.carbon.device.mgt.common.OperationMonitoringTaskConfig; import org.wso2.carbon.device.mgt.common.PaginationRequest; import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.common.StartupOperationConfig; -import org.wso2.carbon.device.mgt.common.TrackerDeviceInfo; -import org.wso2.carbon.device.mgt.common.TrackerGroupInfo; import org.wso2.carbon.device.mgt.common.app.mgt.Application; import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; import org.wso2.carbon.device.mgt.common.configuration.mgt.AmbiguousConfigurationException; @@ -138,7 +135,6 @@ import org.wso2.carbon.device.mgt.core.internal.PluginInitializationListener; import org.wso2.carbon.device.mgt.core.metadata.mgt.dao.MetadataDAO; import org.wso2.carbon.device.mgt.core.metadata.mgt.dao.MetadataManagementDAOFactory; import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation; -import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException; import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; import org.wso2.carbon.device.mgt.core.util.HttpReportingUtil; import org.wso2.carbon.email.sender.core.ContentProviderInfo; @@ -181,7 +177,6 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv private MetadataDAO metadataDAO; private final BillingDAO billingDAO; private final DeviceStatusDAO deviceStatusDAO; - private final TrackerDAO trackerDAO; public DeviceManagementProviderServiceImpl() { this.pluginRepository = new DeviceManagementPluginRepository(); @@ -192,7 +187,6 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv this.metadataDAO = MetadataManagementDAOFactory.getMetadataDAO(); this.billingDAO = DeviceManagementDAOFactory.getBillingDAO(); this.deviceStatusDAO = DeviceManagementDAOFactory.getDeviceStatusDAO(); - this.trackerDAO = DeviceManagementDAOFactory.getTrackerDAO(); /* Registering a listener to retrieve events when some device management service plugin is installed after * the component is done getting initialized */ @@ -417,12 +411,8 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv } //enroll Traccar device - try { - if (HttpReportingUtil.isTrackerEnabled()) { - DeviceManagementDataHolder.getInstance().getDeviceAPIClientService().addDevice(device, tenantId); - } - } catch (TraccarConfigurationException e) { - log.error("Error while adding a group to Traccar " + e); + if (HttpReportingUtil.isTrackerEnabled()) { + DeviceManagementDataHolder.getInstance().getDeviceAPIClientService().addDevice(device, tenantId); } //enroll Traccar device @@ -488,18 +478,6 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv deviceDAO.updateDevice(device, tenantId); enrollmentDAO.updateEnrollment(device.getEnrolmentInfo(), tenantId); - //modify Traccar device - if (HttpReportingUtil.isTrackerEnabled()) { - try { - //trackerDAO.removeTraccarDevice(device.getId(), tenantId); - DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() - .updateDevice(device, tenantId); - } catch (TraccarConfigurationException e) { - log.error("Error while disenrolling a device from Traccar " + e); - } - } - //modify Traccar device - DeviceManagementDAOFactory.commitTransaction(); this.removeDeviceFromCache(deviceIdentifier); } catch (DeviceManagementDAOException e) { @@ -600,21 +578,12 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv DeviceManagementDAOFactory.commitTransaction(); this.removeDeviceFromCache(deviceId); - //disenroll Traccar device + //procees to dis-enroll a device from traccar starts if (HttpReportingUtil.isTrackerEnabled()) { - try { - TrackerDeviceInfo res = trackerDAO.getTraccarDevice(device.getId(), tenantId); - JSONObject obj = new JSONObject(res); - //Need to verify this removal - //trackerDAO.removeTraccarDevice(device.getId(), tenantId); - //Need to verify this removal - DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() - .disEndrollDevice(obj.getInt("traccarDeviceId"), tenantId); - } catch (TraccarConfigurationException e) { - log.error("Error while disenrolling a device from Traccar " + e); - } + DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() + .disEndrollDevice(device.getId(), tenantId); } - //procees to dis-enroll a device from traccar ends*/ + //procees to dis-enroll a device from traccar ends } catch (DeviceManagementDAOException e) { DeviceManagementDAOFactory.rollbackTransaction(); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderServiceImpl.java index 098369800b8..369b9d31f3e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderServiceImpl.java @@ -38,7 +38,6 @@ package org.wso2.carbon.device.mgt.core.service; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.json.JSONObject; import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext; @@ -56,6 +55,7 @@ import org.wso2.carbon.device.mgt.common.group.mgt.GroupAlreadyExistException; import org.wso2.carbon.device.mgt.common.group.mgt.GroupManagementException; import org.wso2.carbon.device.mgt.common.group.mgt.GroupNotExistException; import org.wso2.carbon.device.mgt.common.group.mgt.RoleDoesNotExistException; +import org.wso2.carbon.device.mgt.common.group.mgt.TrackerAlreadyExistException; import org.wso2.carbon.device.mgt.core.dao.DeviceDAO; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; @@ -63,6 +63,7 @@ import org.wso2.carbon.device.mgt.core.dao.GroupDAO; import org.wso2.carbon.device.mgt.core.dao.GroupManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.GroupManagementDAOFactory; import org.wso2.carbon.device.mgt.core.dao.TrackerDAO; +import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOException; import org.wso2.carbon.device.mgt.core.event.config.GroupAssignmentEventOperationExecutor; import org.wso2.carbon.device.mgt.core.geo.task.GeoFenceEventOperationManager; import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; @@ -89,7 +90,6 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid private final GroupDAO groupDAO; private final DeviceDAO deviceDAO; - private final TrackerDAO trackerDAO; /** * Set groupDAO from GroupManagementDAOFactory when class instantiate. @@ -97,7 +97,6 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid public GroupManagementProviderServiceImpl() { this.groupDAO = GroupManagementDAOFactory.getGroupDAO(); this.deviceDAO = DeviceManagementDAOFactory.getDeviceDAO(); - this.trackerDAO = DeviceManagementDAOFactory.getTrackerDAO(); } /** @@ -140,27 +139,18 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid GroupManagementDAOFactory.commitTransaction(); //add new group in traccar - try { - if (HttpReportingUtil.isTrackerEnabled()) { - DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() - .addGroup(deviceGroup, updatedGroupID, tenantId); - } - } catch (TraccarConfigurationException e) { - log.error("Error while adding a group to Traccar " + e); + if (HttpReportingUtil.isTrackerEnabled()) { + DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() + .addGroup(deviceGroup, updatedGroupID, tenantId); } //add new group in traccar } else { // add a group if not exist in traccar starts - existingGroup = this.groupDAO.getGroup(deviceGroup.getName(), tenantId); - int groupId = existingGroup.getGroupId(); - TrackerGroupInfo res = trackerDAO.getTraccarGroup(groupId, tenantId); - if(res==null){ - try { - DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() - .addGroup(deviceGroup, groupId, tenantId); - } catch (TraccarConfigurationException e) { - log.error("Error while adding a existing group to Traccar " + e); - } + if (HttpReportingUtil.isTrackerEnabled()){ + existingGroup = this.groupDAO.getGroup(deviceGroup.getName(), tenantId); + int groupId = existingGroup.getGroupId(); + DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() + .addGroup(deviceGroup, groupId, tenantId); } // add a group if not exist in traccar starts @@ -244,14 +234,8 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid //procees to update a group in traccar starts if (HttpReportingUtil.isTrackerEnabled()) { - TrackerGroupInfo res = trackerDAO.getTraccarGroup(groupId, tenantId); - JSONObject obj = new JSONObject(res); - try { - DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() - .updateGroup(deviceGroup, obj.getInt("traccarGroupId"), groupId, tenantId); - } catch (TraccarConfigurationException e) { - log.error("Error while updating the group in Traccar " + e); - } + DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() + .updateGroup(deviceGroup, groupId, tenantId); } //procees to update a group in traccar starts @@ -316,15 +300,8 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid //procees to delete a group from traccar starts if (HttpReportingUtil.isTrackerEnabled()) { - TrackerGroupInfo res = trackerDAO.getTraccarGroup(groupId, tenantId); - JSONObject obj = new JSONObject(res); - trackerDAO.removeTraccarGroup(obj.getInt("id")); - try { - DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() - .deleteGroup(obj.getInt("traccarGroupId"), tenantId); - } catch (TraccarConfigurationException e) { - log.error("Error while disenrolling a device from Traccar " + e); - } + DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() + .deleteGroup(groupId, tenantId); } //procees to delete a group from traccar ends diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/DeviceAPIClientService.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/DeviceAPIClientService.java index fbb4f320c11..99af81e5a99 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/DeviceAPIClientService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/DeviceAPIClientService.java @@ -20,15 +20,10 @@ package org.wso2.carbon.device.mgt.core.traccar.api.service; import org.wso2.carbon.device.mgt.common.Device; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; -import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarGroups; import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException; -import java.io.IOException; - - public interface DeviceAPIClientService { /** @@ -38,7 +33,7 @@ public interface DeviceAPIClientService { * @param deviceLocation to be added to update location of the device * @throws TraccarConfigurationException errors thrown while inserting location of a device traccar configuration */ - void updateLocation(Device device, DeviceLocation deviceLocation) throws TraccarConfigurationException; + void updateLocation(Device device, DeviceLocation deviceLocation, int tenantId); /** * Create device Traccar configuration records @@ -46,7 +41,7 @@ public interface DeviceAPIClientService { * @param device to be added * @throws TraccarConfigurationException errors thrown while creating a device traccar configuration */ - void addDevice(Device device, int tenantId) throws TraccarConfigurationException; + void addDevice(Device device, int tenantId); /** * Create device Traccar configuration records @@ -54,7 +49,7 @@ public interface DeviceAPIClientService { * @param device to modify * @throws TraccarConfigurationException errors thrown while creating a device traccar configuration */ - void updateDevice(Device device, int tenantId) throws TraccarConfigurationException; + void updateDevice(Device device, int tenantId); /** * Delete a device Traccar configuration records @@ -62,7 +57,7 @@ public interface DeviceAPIClientService { * @param deviceId to be delete a device * @throws TraccarConfigurationException errors thrown while deleting a device traccar configuration */ - void disEndrollDevice(int deviceId, int tenantId) throws TraccarConfigurationException; + void disEndrollDevice(int deviceId, int tenantId); /** * Delete a device Traccar configuration records @@ -70,22 +65,22 @@ public interface DeviceAPIClientService { * @param group to be add a group * @throws TraccarConfigurationException errors thrown while adding a group traccar configuration */ - void addGroup(DeviceGroup group, int groupID, int tenantId) throws TraccarConfigurationException; + void addGroup(DeviceGroup group, int groupID, int tenantId); /** * Delete a device Traccar configuration records * - * @param group to be add a group + * @param group to be update the group * @throws TraccarConfigurationException errors thrown while adding a group traccar configuration */ - void updateGroup(DeviceGroup group, int traccarGroupId, int groupID, int tenantId) throws TraccarConfigurationException; + void updateGroup(DeviceGroup group, int groupID, int tenantId); /** * Delete a device Traccar configuration records * - * @param traccarGroupId to delete a group + * @param groupId to delete a group * @param tenantId to delete a group * @throws TraccarConfigurationException errors thrown while adding a group traccar configuration */ - void deleteGroup(int traccarGroupId, int tenantId) throws TraccarConfigurationException; + void deleteGroup(int groupId, int tenantId); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/addons/TrackerClient.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/addons/TrackerClient.java index db013bf6348..414d1ebc57b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/addons/TrackerClient.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/addons/TrackerClient.java @@ -19,6 +19,7 @@ package org.wso2.carbon.device.mgt.core.traccar.api.service.addons; +import com.google.gson.Gson; import okhttp3.ConnectionPool; import okhttp3.MediaType; import okhttp3.OkHttpClient; @@ -29,11 +30,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONException; import org.json.JSONObject; +import org.wso2.carbon.device.mgt.common.TrackerDeviceInfo; +import org.wso2.carbon.device.mgt.common.TrackerGroupInfo; import org.wso2.carbon.device.mgt.common.exceptions.TransactionManagementException; -import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; -import org.wso2.carbon.device.mgt.core.dao.GroupManagementDAOFactory; +import org.wso2.carbon.device.mgt.common.group.mgt.TrackerAlreadyExistException; import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.TrackerDAO; +import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOFactory; import org.wso2.carbon.device.mgt.core.traccar.common.TraccarClient; import org.wso2.carbon.device.mgt.core.traccar.common.TraccarHandlerConstants; import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarDevice; @@ -44,7 +47,9 @@ import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarGateway; import org.wso2.carbon.device.mgt.core.traccar.core.config.TraccarConfigurationManager; import java.io.IOException; +import java.sql.SQLException; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -63,8 +68,7 @@ public class TrackerClient implements TraccarClient { final String defaultPort = traccarGateway.getPropertyByName(TraccarHandlerConstants.TraccarConfig.DEFAULT_PORT).getValue(); final String locationUpdatePort = traccarGateway.getPropertyByName(TraccarHandlerConstants.TraccarConfig.LOCATION_UPDATE_PORT).getValue(); - private final TrackerDAO trackerGroupDAO; - private final TrackerDAO trackerDeviceDAO; + private final TrackerDAO trackerDAO; public TrackerClient() { client = new OkHttpClient.Builder() @@ -73,12 +77,11 @@ public class TrackerClient implements TraccarClient { .readTimeout(45, TimeUnit.SECONDS) .connectionPool(new ConnectionPool(50,30,TimeUnit.SECONDS)) .build(); - this.trackerDeviceDAO = GroupManagementDAOFactory.getTrackerDAO(); - this.trackerGroupDAO = DeviceManagementDAOFactory.getTrackerDAO(); + this.trackerDAO = TrackerManagementDAOFactory.getTrackerDAO(); } private class TrackerExecutor implements Runnable { - final int id; + final int deviceId; final int tenantId; final JSONObject payload; final String context; @@ -86,9 +89,9 @@ public class TrackerClient implements TraccarClient { private final String method; private final String type; - private TrackerExecutor(int id, int tenantId, String publisherUrl, String context, JSONObject payload, + private TrackerExecutor(int deviceId, int tenantId, String publisherUrl, String context, JSONObject payload, String method, String type) { - this.id = id; + this.deviceId = deviceId; this.tenantId = tenantId; this.payload = payload; this.context = context; @@ -106,7 +109,7 @@ public class TrackerClient implements TraccarClient { if(method==TraccarHandlerConstants.Methods.POST){ requestBody = RequestBody.create(payload.toString(), MediaType.parse("application/json; charset=utf-8")); builder = builder.post(requestBody); - }if(method==TraccarHandlerConstants.Methods.PUT){ + }else if(method==TraccarHandlerConstants.Methods.PUT){ requestBody = RequestBody.create(payload.toString(), MediaType.parse("application/json; charset=utf-8")); builder = builder.put(requestBody); }else if(method==TraccarHandlerConstants.Methods.DELETE){ @@ -117,43 +120,33 @@ public class TrackerClient implements TraccarClient { try { response = client.newCall(request).execute(); - if(method==TraccarHandlerConstants.Methods.POST){ - String result = response.body().string(); - JSONObject obj = new JSONObject(result); - int traccarId = obj.getInt("id"); - - if(type==TraccarHandlerConstants.Types.DEVICE){ + JSONObject obj = new JSONObject(response.body().string()); + if (obj != null){ + int traccarId = obj.getInt("id"); try { - DeviceManagementDAOFactory.beginTransaction(); - trackerDeviceDAO.addTraccarDevice(traccarId, id, tenantId); - DeviceManagementDAOFactory.commitTransaction(); + TrackerManagementDAOFactory.beginTransaction(); + if(type==TraccarHandlerConstants.Types.DEVICE){ + trackerDAO.addTraccarDevice(traccarId, deviceId, tenantId); + }else if(type==TraccarHandlerConstants.Types.GROUP){ + trackerDAO.addTraccarGroup(traccarId, deviceId, tenantId); + } + TrackerManagementDAOFactory.commitTransaction(); } catch (TransactionManagementException e) { - DeviceManagementDAOFactory.rollbackTransaction(); + TrackerManagementDAOFactory.rollbackTransaction(); String msg = "Error occurred establishing the DB connection ."; log.error(msg, e); } catch (TrackerManagementDAOException e) { - DeviceManagementDAOFactory.rollbackTransaction(); - String msg = "Error occurred while mapping traccarDeviceId with deviceId ."; + TrackerManagementDAOFactory.rollbackTransaction(); + String msg = null; + if(type==TraccarHandlerConstants.Types.DEVICE){ + msg = "Error occurred while mapping with deviceId ."; + }else if(type==TraccarHandlerConstants.Types.GROUP){ + msg = "Error occurred while mapping with groupId ."; + } log.error(msg, e); } finally { - DeviceManagementDAOFactory.closeConnection(); - } - }else if(type==TraccarHandlerConstants.Types.GROUP){ - try { - GroupManagementDAOFactory.beginTransaction(); - trackerGroupDAO.addTraccarGroup(traccarId, id, tenantId); - GroupManagementDAOFactory.commitTransaction(); - } catch (TransactionManagementException e) { - GroupManagementDAOFactory.rollbackTransaction(); - String msg = "Error occurred establishing the DB connection ."; - log.error(msg, e); - } catch (TrackerManagementDAOException e) { - GroupManagementDAOFactory.rollbackTransaction(); - String msg = "Error occurred while mapping traccarGroupId with groupId ."; - log.error(msg, e); - } finally { - GroupManagementDAOFactory.closeConnection(); + TrackerManagementDAOFactory.closeConnection(); } } } @@ -162,7 +155,6 @@ public class TrackerClient implements TraccarClient { } } catch (IOException e) { log.error("Error occurred", e); - } } } @@ -173,19 +165,31 @@ public class TrackerClient implements TraccarClient { * Model, Contact, Category, fenceIds * @throws TraccarConfigurationException Failed while add Traccar Device the operation */ - public void addDevice(TraccarDevice deviceInfo, int tenantId) throws TraccarConfigurationException { - try{ - JSONObject payload = payload(deviceInfo); - String context = defaultPort+"/api/devices"; - Runnable trackerExecutor = - new TrackerExecutor( deviceInfo.getId(),tenantId, endpoint, context, payload, - TraccarHandlerConstants.Methods.POST, TraccarHandlerConstants.Types.DEVICE); - executor.execute(trackerExecutor); - }catch (Exception e){ - String msg="Could not enroll traccar device"; - log.error(msg, e); - throw new TraccarConfigurationException(msg, e); + public void addDevice(TraccarDevice deviceInfo, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException { + TrackerDeviceInfo res = null; + try { + TrackerManagementDAOFactory.openConnection(); + res = trackerDAO.getTraccarDevice(deviceInfo.getId(), tenantId); + if(res!=null){ + throw new TrackerAlreadyExistException("The device already exit"); + } + } catch (TrackerManagementDAOException e) { + String msg = "Error occurred while mapping with deviceId ."; + log.error(msg, e); + throw new TraccarConfigurationException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred establishing the DB connection ."; + log.error(msg, e); + throw new TraccarConfigurationException(msg, e); + } finally { + TrackerManagementDAOFactory.closeConnection(); } + + JSONObject payload = payload(deviceInfo); + String context = defaultPort+"/api/devices"; + Runnable trackerExecutor = new TrackerExecutor(deviceInfo.getId(), tenantId, endpoint, context, payload, + TraccarHandlerConstants.Methods.POST, TraccarHandlerConstants.Types.DEVICE); + executor.execute(trackerExecutor); } /** @@ -194,17 +198,45 @@ public class TrackerClient implements TraccarClient { * Model, Contact, Category, fenceIds * @throws TraccarConfigurationException Failed while add Traccar Device the operation */ - public void updateDevice(TraccarDevice deviceInfo, int tenantId) throws TraccarConfigurationException { - try{ + public void updateDevice(TraccarDevice deviceInfo, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException { + TrackerDeviceInfo res = null; + try { + TrackerManagementDAOFactory.openConnection(); + res = trackerDAO.getTraccarDevice(deviceInfo.getId(), tenantId); + } catch (TrackerManagementDAOException e) { + String msg = "Error occurred while mapping with deviceId ."; + log.error(msg, e); + throw new TraccarConfigurationException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred establishing the DB connection ."; + log.error(msg, e); + throw new TraccarConfigurationException(msg, e); + } finally { + TrackerManagementDAOFactory.closeConnection(); + } + + if(res==null){ + try { + TrackerClient trackerClient = new TrackerClient(); + TraccarDevice device = deviceInfo; + String lastUpdatedTime = String.valueOf((new Date().getTime())); + device.setLastUpdate(lastUpdatedTime); + trackerClient.addDevice(deviceInfo, tenantId); + } catch (TraccarConfigurationException e) { + String msg = "Error occurred while mapping with groupId"; + log.error(msg, e); + throw new TraccarConfigurationException(msg, e); + } catch (TrackerAlreadyExistException e) { + String msg = "The group already exist"; + log.error(msg, e); + throw new TrackerAlreadyExistException(msg, e); + } + }else{ JSONObject payload = payload(deviceInfo); String context = defaultPort+"/api/devices"; Runnable trackerExecutor = new TrackerExecutor(deviceInfo.getId(), tenantId, endpoint, context, payload, TraccarHandlerConstants.Methods.PUT, TraccarHandlerConstants.Types.DEVICE); executor.execute(trackerExecutor); - }catch (Exception e){ - String msg="Could not enroll traccar device"; - log.error(msg, e); - throw new TraccarConfigurationException(msg, e); } } @@ -231,38 +263,78 @@ public class TrackerClient implements TraccarClient { * Add Device GPS Location operation. * @param deviceInfo with DeviceIdentifier, Timestamp, Lat, Lon, Bearing, Speed, ignition */ - public void updateLocation(TraccarPosition deviceInfo) throws TraccarConfigurationException { - try{ - String context = locationUpdatePort+"/?id="+deviceInfo.getDeviceIdentifier()+"×tamp="+deviceInfo.getTimestamp()+ - "&lat="+deviceInfo.getLat()+"&lon="+deviceInfo.getLon()+"&bearing="+deviceInfo.getBearing()+ - "&speed="+deviceInfo.getSpeed()+"&ignition=true"; - Runnable trackerExecutor = new TrackerExecutor(0, 0, endpoint, context, null, - TraccarHandlerConstants.Methods.GET, TraccarHandlerConstants.Types.DEVICE); - executor.execute(trackerExecutor); - log.info("Device GPS location added on traccar"); - }catch (Exception e){ - String msg="Could not add GPS location"; - log.error(msg, e); - throw new TraccarConfigurationException(msg, e); - } + public void updateLocation(TraccarDevice device, TraccarPosition deviceInfo, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException { + TrackerDeviceInfo res = null; + try { + TrackerManagementDAOFactory.openConnection(); + res = trackerDAO.getTraccarDevice(device.getId(), tenantId); + } catch (SQLException e) { + String msg = "Error occurred establishing the DB connection ."; + log.error(msg, e); + } catch (TrackerManagementDAOException e) { + String msg="Could not update the traccar group"; + log.error(msg, e); + } finally{ + TrackerManagementDAOFactory.closeConnection(); + } + + if (res == null){ + try { + TrackerClient trackerClient = new TrackerClient(); + trackerClient.addDevice(device, tenantId); + log.info("===================================="); + log.info(device); + log.info(trackerClient); + log.info(tenantId); + log.info("===================================="); + } catch (TraccarConfigurationException e) { + String msg = "Error occurred while mapping with groupId"; + log.error(msg, e); + throw new TraccarConfigurationException(msg, e); + } catch (TrackerAlreadyExistException e) { + String msg = "The device already exist"; + log.error(msg, e); + throw new TrackerAlreadyExistException(msg, e); + } + }else{ + String context = locationUpdatePort+"/?id="+deviceInfo.getDeviceIdentifier()+"×tamp="+deviceInfo.getTimestamp()+ + "&lat="+deviceInfo.getLat()+"&lon="+deviceInfo.getLon()+"&bearing="+deviceInfo.getBearing()+ + "&speed="+deviceInfo.getSpeed()+"&ignition=true"; + Runnable trackerExecutor = new TrackerExecutor(0, 0, endpoint, context, null, + TraccarHandlerConstants.Methods.GET, TraccarHandlerConstants.Types.DEVICE); + executor.execute(trackerExecutor); + log.info("Device GPS location added on traccar"); + } + } /** * Dis-enroll a Device operation. - * @param traccarDeviceId identified via deviceIdentifier + * @param deviceId identified via deviceIdentifier * @throws TraccarConfigurationException Failed while dis-enroll a Traccar Device operation */ - public void disEndrollDevice(int traccarDeviceId, int tenantId) throws TraccarConfigurationException { - try{ - String context = defaultPort+"/api/devices/"+traccarDeviceId; - Runnable trackerExecutor = new TrackerExecutor(traccarDeviceId, tenantId, endpoint, context, null, + public void disEndrollDevice(int deviceId, int tenantId) throws TraccarConfigurationException { + try { + TrackerManagementDAOFactory.beginTransaction(); + TrackerDeviceInfo res = trackerDAO.getTraccarDevice(deviceId, tenantId); + JSONObject obj = new JSONObject(res); + trackerDAO.removeTraccarDevice(deviceId, tenantId); + + String context = defaultPort+"/api/devices/"+obj.getInt("traccarDeviceId"); + Runnable trackerExecutor = new TrackerExecutor(obj.getInt("traccarDeviceId"), tenantId, endpoint, context, null, TraccarHandlerConstants.Methods.DELETE, TraccarHandlerConstants.Types.DEVICE); executor.execute(trackerExecutor); - log.info("Device successfully dis-enrolled"); - }catch (JSONException e){ - String msg = "Could not find the device information to dis-enroll the device"; + TrackerManagementDAOFactory.commitTransaction(); + } catch (TransactionManagementException e) { + TrackerManagementDAOFactory.rollbackTransaction(); + String msg = "Error occurred establishing the DB connection"; + log.error(msg, e); + } catch (TrackerManagementDAOException e) { + TrackerManagementDAOFactory.rollbackTransaction(); + String msg = "Error occurred while mapping with deviceId"; log.error(msg, e); - throw new TraccarConfigurationException(msg); + } finally { + TrackerManagementDAOFactory.closeConnection(); } } @@ -271,22 +343,34 @@ public class TrackerClient implements TraccarClient { * @param groupInfo with groupName * @throws TraccarConfigurationException Failed while add Traccar Device the operation */ - public void addGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws TraccarConfigurationException { - try{ - JSONObject payload = new JSONObject(); - payload.put("name", groupInfo.getName()); - payload.put("attributes", new JSONObject()); + public void addGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException { - String context = defaultPort+"/api/groups"; - Runnable trackerExecutor = new TrackerExecutor(groupId, tenantId, endpoint, context, payload, - TraccarHandlerConstants.Methods.POST, TraccarHandlerConstants.Types.GROUP); - executor.execute(trackerExecutor); - log.info("Group successfully added on traccar"); - }catch (Exception e){ - String msg="Could not add a traccar group"; + try { + TrackerManagementDAOFactory.openConnection(); + TrackerGroupInfo res = trackerDAO.getTraccarGroup(groupId, tenantId); + if(res!=null){ + throw new TrackerAlreadyExistException("The group already exit"); + } + } catch (TrackerManagementDAOException e) { + String msg = "Error occurred while mapping with deviceId ."; + log.error(msg, e); + throw new TraccarConfigurationException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred establishing the DB connection ."; log.error(msg, e); throw new TraccarConfigurationException(msg, e); + } finally { + TrackerManagementDAOFactory.closeConnection(); } + + JSONObject payload = new JSONObject(); + payload.put("name", groupInfo.getName()); + payload.put("attributes", new JSONObject()); + + String context = defaultPort+"/api/groups"; + Runnable trackerExecutor = new TrackerExecutor(groupId, tenantId, endpoint, context, payload, + TraccarHandlerConstants.Methods.POST, TraccarHandlerConstants.Types.GROUP); + executor.execute(trackerExecutor); } /** @@ -294,45 +378,80 @@ public class TrackerClient implements TraccarClient { * @param groupInfo with groupName * @throws TraccarConfigurationException Failed while add Traccar Device the operation */ - public void updateGroup(TraccarGroups groupInfo, int traccarGroupId, int groupId, int tenantId) throws TraccarConfigurationException { - try{ + public void updateGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException { + TrackerGroupInfo res = null; + try { + TrackerManagementDAOFactory.openConnection(); + res = trackerDAO.getTraccarGroup(groupId, tenantId); + } catch (SQLException e) { + String msg = "Error occurred establishing the DB connection ."; + log.error(msg, e); + } catch (TrackerManagementDAOException e) { + String msg="Could not update the traccar group"; + log.error(msg, e); + } finally{ + TrackerManagementDAOFactory.closeConnection(); + } + + if (res == null){ + try { + TrackerClient trackerClient = new TrackerClient(); + trackerClient.addGroup(groupInfo, groupId, tenantId); + } catch (TraccarConfigurationException e) { + String msg = "Error occurred while mapping with groupId"; + log.error(msg, e); + throw new TraccarConfigurationException(msg, e); + } catch (TrackerAlreadyExistException e) { + String msg = "The group already exist"; + log.error(msg, e); + throw new TrackerAlreadyExistException(msg, e); + } + }else{ + JSONObject obj = new JSONObject(res); JSONObject payload = new JSONObject(); - payload.put("id", traccarGroupId); + payload.put("id", obj.getInt("traccarGroupId")); payload.put("name", groupInfo.getName()); payload.put("attributes", new JSONObject()); - String context = defaultPort+"/api/groups/"+traccarGroupId; + String context = defaultPort+"/api/groups/"+obj.getInt("traccarGroupId"); Runnable trackerExecutor = new TrackerExecutor(groupId, tenantId, endpoint, context, payload, TraccarHandlerConstants.Methods.PUT, TraccarHandlerConstants.Types.GROUP); executor.execute(trackerExecutor); - log.info("Group successfully updated on traccar"); - }catch (Exception e){ - String msg="Could not update the traccar group"; - log.error(msg, e); - throw new TraccarConfigurationException(msg, e); } } /** * Add Traccar Device operation. - * @param traccarGroupId + * @param groupId * @throws TraccarConfigurationException Failed while add Traccar Device the operation */ - public void deleteGroup(int traccarGroupId, int tenantId) throws TraccarConfigurationException { - try{ - String context = defaultPort+"/api/groups/"+traccarGroupId; - Runnable trackerExecutor = new TrackerExecutor(traccarGroupId, tenantId, endpoint, context, + public void deleteGroup(int groupId, int tenantId) throws TraccarConfigurationException { + try { + TrackerManagementDAOFactory.beginTransaction(); + TrackerGroupInfo res = trackerDAO.getTraccarGroup(groupId, tenantId); + JSONObject obj = new JSONObject(res); + trackerDAO.removeTraccarGroup(obj.getInt("id")); + + String context = defaultPort+"/api/groups/"+obj.getInt("traccarGroupId"); + Runnable trackerExecutor = new TrackerExecutor(obj.getInt("traccarGroupId"), tenantId, endpoint, context, null, TraccarHandlerConstants.Methods.DELETE, TraccarHandlerConstants.Types.GROUP); executor.execute(trackerExecutor); - }catch (JSONException e){ - String msg = "Could not find the device information to dis-enroll the device"; + TrackerManagementDAOFactory.commitTransaction(); + } catch (TransactionManagementException e) { + TrackerManagementDAOFactory.rollbackTransaction(); + String msg = "Error occurred establishing the DB connection"; + log.error(msg, e); + } catch (TrackerManagementDAOException e) { + TrackerManagementDAOFactory.rollbackTransaction(); + String msg = "Error occurred while mapping with groupId"; log.error(msg, e); - throw new TraccarConfigurationException(msg); + } finally { + TrackerManagementDAOFactory.closeConnection(); } } private TraccarGateway getTraccarGateway(){ return TraccarConfigurationManager.getInstance().getTraccarConfig().getTraccarGateway( - TraccarHandlerConstants.GATEWAY_NAME); + TraccarHandlerConstants.TraccarConfig.GATEWAY_NAME); } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/impl/TraccarAPIClientServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/impl/TraccarAPIClientServiceImpl.java index e5a59467e86..08b9b85eeda 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/impl/TraccarAPIClientServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/api/service/impl/TraccarAPIClientServiceImpl.java @@ -19,9 +19,12 @@ package org.wso2.carbon.device.mgt.core.traccar.api.service.impl; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; +import org.wso2.carbon.device.mgt.common.group.mgt.TrackerAlreadyExistException; import org.wso2.carbon.device.mgt.core.traccar.api.service.DeviceAPIClientService; import org.wso2.carbon.device.mgt.core.traccar.api.service.addons.TrackerClient; import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarDevice; @@ -33,53 +36,110 @@ import java.util.Date; public class TraccarAPIClientServiceImpl implements DeviceAPIClientService { - public void addDevice(Device device, int tenantId) throws TraccarConfigurationException { + private static final Log log = LogFactory.getLog(TraccarAPIClientServiceImpl.class); + + public void addDevice(Device device, int tenantId) { TrackerClient client = new TrackerClient(); String lastUpdatedTime = String.valueOf((new Date().getTime())); - TraccarDevice traccarDeviceInfo = new TraccarDevice(device.getId(), device.getName(), device.getDeviceIdentifier(), + TraccarDevice traccarDevice = new TraccarDevice(device.getId(), device.getName(), device.getDeviceIdentifier(), "online", "false", lastUpdatedTime, "", "", "", "", "", ""); - client.addDevice(traccarDeviceInfo, tenantId); + try { + client.addDevice(traccarDevice, tenantId); + } catch (TraccarConfigurationException e) { + String msg = "Error occurred while mapping with deviceId"; + log.error(msg, e); + } catch (TrackerAlreadyExistException e) { + String msg = "The device already exist"; + log.error(msg, e); + } } - public void updateDevice(Device device, int tenantId) throws TraccarConfigurationException { + public void updateDevice(Device device, int tenantId) { TrackerClient client = new TrackerClient(); String lastUpdatedTime = String.valueOf((new Date().getTime())); TraccarDevice traccarDeviceInfo = new TraccarDevice(device.getId(), device.getName(), device.getDeviceIdentifier(), "online", "false", lastUpdatedTime, "", "", "", "", "", ""); - client.updateDevice(traccarDeviceInfo, tenantId); + try { + client.updateDevice(traccarDeviceInfo, tenantId); + } catch (TraccarConfigurationException e) { + String msg = "Error occurred while mapping with deviceId"; + log.error(msg, e); + } catch (TrackerAlreadyExistException e) { + String msg = "The device already exist"; + log.error(msg, e); + } } - public void updateLocation(Device device, DeviceLocation deviceLocation) throws TraccarConfigurationException { + public void updateLocation(Device device, DeviceLocation deviceLocation, int tenantId) { TrackerClient client = new TrackerClient(); TraccarPosition traccarPosition = new TraccarPosition(device.getDeviceIdentifier(), deviceLocation.getUpdatedTime().getTime(), deviceLocation.getLatitude(), deviceLocation.getLongitude(), deviceLocation.getBearing(), deviceLocation.getSpeed()); - client.updateLocation(traccarPosition); + + String lastUpdatedTime = String.valueOf((new Date().getTime())); + TraccarDevice traccarDevice = new TraccarDevice(device.getId(), device.getName(), device.getDeviceIdentifier(), + "online", "false", lastUpdatedTime, "", "", "", "", + "", ""); + try { + client.updateLocation(traccarDevice, traccarPosition, tenantId); + } catch (TraccarConfigurationException e) { + String msg = "Error occurred while mapping with deviceId"; + log.error(msg, e); + }catch (TrackerAlreadyExistException e) { + String msg = "The device already exist"; + log.error(msg, e); + } } - public void disEndrollDevice(int deviceId, int tenantId) throws TraccarConfigurationException { + public void disEndrollDevice(int deviceId, int tenantId) { TrackerClient client = new TrackerClient(); - client.disEndrollDevice(deviceId, tenantId); + try { + client.disEndrollDevice(deviceId, tenantId); + } catch (TraccarConfigurationException e) { + String msg = "Error occurred while mapping with deviceId"; + log.error(msg, e); + } } - public void addGroup(DeviceGroup group, int groupId, int tenantId) throws TraccarConfigurationException { + public void addGroup(DeviceGroup group, int groupId, int tenantId) { TrackerClient client = new TrackerClient(); TraccarGroups traccarGroups = new TraccarGroups(group.getName()); - client.addGroup(traccarGroups, groupId, tenantId); + try { + client.addGroup(traccarGroups, groupId, tenantId); + } catch (TraccarConfigurationException e) { + String msg = "Error occurred while mapping with groupId"; + log.error(msg, e); + } catch (TrackerAlreadyExistException e) { + String msg = "The group already exist"; + log.error(msg, e); + } } - public void updateGroup(DeviceGroup group, int traccarGroupId, int groupId, int tenantId) throws TraccarConfigurationException { + public void updateGroup(DeviceGroup group, int groupId, int tenantId) { TrackerClient client = new TrackerClient(); TraccarGroups traccarGroups = new TraccarGroups(group.getName()); - client.updateGroup(traccarGroups, traccarGroupId, groupId, tenantId); + try { + client.updateGroup(traccarGroups, groupId, tenantId); + } catch (TraccarConfigurationException e) { + String msg = "Error occurred while mapping with groupId"; + log.error(msg, e); + } catch (TrackerAlreadyExistException e) { + String msg = "The group already exist"; + log.error(msg, e); + } } - public void deleteGroup(int traccarGroupId, int tenantId) throws TraccarConfigurationException { + public void deleteGroup(int groupId, int tenantId) { TrackerClient client = new TrackerClient(); - client.deleteGroup(traccarGroupId, tenantId); + try { + client.deleteGroup(groupId, tenantId); + } catch (TraccarConfigurationException e) { + String msg = "Error occurred while mapping with groupId"; + log.error(msg, e); + } } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/TraccarClient.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/TraccarClient.java index e1ae84351b0..cd6cff23c5f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/TraccarClient.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/TraccarClient.java @@ -19,6 +19,7 @@ package org.wso2.carbon.device.mgt.core.traccar.common; +import org.wso2.carbon.device.mgt.common.group.mgt.TrackerAlreadyExistException; import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarDevice; import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarGroups; import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarPosition; @@ -26,16 +27,22 @@ import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfiguratio public interface TraccarClient { - void addDevice(TraccarDevice deviceInfo, int tenantId) throws TraccarConfigurationException; + void addDevice(TraccarDevice deviceInfo, int tenantId) throws + TraccarConfigurationException, TrackerAlreadyExistException; - void updateLocation(TraccarPosition deviceInfo) throws TraccarConfigurationException; + void updateDevice(TraccarDevice deviceInfo, int tenantId) throws + TraccarConfigurationException, TrackerAlreadyExistException; + + void updateLocation(TraccarDevice device, TraccarPosition deviceInfo, int tenantId) throws + TraccarConfigurationException, TrackerAlreadyExistException; void disEndrollDevice(int traccarDeviceId, int tenantId) throws TraccarConfigurationException; - void addGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws TraccarConfigurationException; + void addGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws + TraccarConfigurationException, TrackerAlreadyExistException; - void updateGroup(TraccarGroups groupInfo, int traccarGroupId, int groupId, int tenantId) throws TraccarConfigurationException; + void updateGroup(TraccarGroups groupInfo, int groupId, int tenantId) + throws TraccarConfigurationException, TrackerAlreadyExistException; void deleteGroup(int traccarGroupId, int tenantId) throws TraccarConfigurationException; - } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/TraccarHandlerConstants.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/TraccarHandlerConstants.java index 0aab658d477..d11024936e6 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/TraccarHandlerConstants.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/TraccarHandlerConstants.java @@ -20,13 +20,16 @@ package org.wso2.carbon.device.mgt.core.traccar.common; public class TraccarHandlerConstants { - public static final String TRACCAR_CONFIG_XML_NAME = "traccar-config.xml"; - public static final String GATEWAY_NAME = "sample"; - public static final String ENDPOINT = "api-endpoint"; - public static final String AUTHORIZATION = "authorization"; - public static final String AUTHORIZATION_KEY = "authorization-key"; - public static final String DEFAULT_PORT = "default-port"; - public static final String LOCATION_UPDATE_PORT = "location-update-port"; + + public static class TraccarConfig { + public static final String TRACCAR_CONFIG_XML_NAME = "traccar-config.xml"; + public static final String GATEWAY_NAME = "sample"; + public static final String ENDPOINT = "api-endpoint"; + public static final String AUTHORIZATION = "authorization"; + public static final String AUTHORIZATION_KEY = "authorization-key"; + public static final String DEFAULT_PORT = "default-port"; + public static final String LOCATION_UPDATE_PORT = "location-update-port"; + } public static class Methods { public static final String POST = "POST"; @@ -40,14 +43,4 @@ public class TraccarHandlerConstants { public static final String GROUP = "GROUP"; } - - public static class TraccarConfig { - public static final String TRACCAR_CONFIG_XML_NAME = "traccar-config.xml"; - public static final String GATEWAY_NAME = "sample"; - public static final String ENDPOINT = "api-endpoint"; - public static final String AUTHORIZATION = "authorization"; - public static final String AUTHORIZATION_KEY = "authorization-key"; - public static final String DEFAULT_PORT = "default-port"; - public static final String LOCATION_UPDATE_PORT = "location-update-port"; - } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/beans/TraccarDevice.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/beans/TraccarDevice.java index cafc8483731..163ae4f3a5d 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/beans/TraccarDevice.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/common/beans/TraccarDevice.java @@ -19,8 +19,6 @@ package org.wso2.carbon.device.mgt.core.traccar.common.beans; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; - public class TraccarDevice { private int id; private String deviceIdentifier; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/core/config/TraccarConfigurationManager.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/core/config/TraccarConfigurationManager.java index d1164bdb352..b79ad078665 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/core/config/TraccarConfigurationManager.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/traccar/core/config/TraccarConfigurationManager.java @@ -39,7 +39,7 @@ public class TraccarConfigurationManager { private static TraccarConfigurationManager traccarConfigurationManager; private TraccarConfiguration traccarConfiguration; private static final String CarbonUtilsFile = CarbonUtils.getCarbonConfigDirPath() + File.separator; - private static final String TRACCAR_CONFIG_PATH = CarbonUtilsFile + TraccarHandlerConstants.TRACCAR_CONFIG_XML_NAME; + private static final String TRACCAR_CONFIG_PATH = CarbonUtilsFile + TraccarHandlerConstants.TraccarConfig.TRACCAR_CONFIG_XML_NAME; /** * Retrieve an instance of {@link TraccarConfigurationManager} diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql index 24fab102c2a..a9525c4081d 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql @@ -749,28 +749,22 @@ CREATE TABLE IF NOT EXISTS DM_GEOFENCE_EVENT_MAPPING ( -- END OF DM_GEOFENCE_GROUP_MAPPING TABLE-- --- DM_TRACCAR_GROUP_MAPPING TABLE-- -CREATE TABLE IF NOT EXISTS DM_TRACCAR_GROUP_MAPPING ( +-- DM_EXT_GROUP_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_EXT_GROUP_MAPPING ( ID INT NOT NULL AUTO_INCREMENT, TRACCAR_GROUP_ID INT NOT NULL, GROUP_ID INT NOT NULL, TENANT_ID INT NOT NULL, - PRIMARY KEY (ID), - CONSTRAINT fk_dm_group_traccar_group_mapping FOREIGN KEY (GROUP_ID) REFERENCES - DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, - CONSTRAINT uk_traccar_group UNIQUE (TRACCAR_GROUP_ID, GROUP_ID, TENANT_ID) + PRIMARY KEY (ID) ); --- END OF DM_TRACCAR_GROUP_MAPPING TABLE-- +-- END OF DM_EXT_GROUP_MAPPING TABLE-- --- END OF DM_TRACCAR_DEVICE_MAPPING TABLE-- -CREATE TABLE IF NOT EXISTS DM_TRACCAR_DEVICE_MAPPING ( +-- END OF DM_EXT_DEVICE_MAPPING TABLE-- +CREATE TABLE IF NOT EXISTS DM_EXT_DEVICE_MAPPING ( ID INT NOT NULL AUTO_INCREMENT, TRACCAR_DEVICE_ID INT NOT NULL, DEVICE_ID INT NOT NULL, TENANT_ID INT NOT NULL, - PRIMARY KEY (ID), - CONSTRAINT fk_dm_device_traccar_device_mapping FOREIGN KEY (DEVICE_ID) REFERENCES - DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, - CONSTRAINT uk_traccar_device UNIQUE (TRACCAR_DEVICE_ID, DEVICE_ID, TENANT_ID) + PRIMARY KEY (ID) ); --- END OF DM_TRACCAR_DEVICE_MAPPING TABLE-- +-- END OF DM_EXT_DEVICE_MAPPING TABLE--