Update with callable thread and add set/remove user permission on enroll/disenroll device

feature/traccar-sync
Rushdi Mohamed 3 years ago
parent 74adeda997
commit 515e826711

@ -0,0 +1,141 @@
/*
* 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.jaxrs.service.api;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.annotations.Extension;
import io.swagger.annotations.ExtensionProperty;
import io.swagger.annotations.Info;
import io.swagger.annotations.ResponseHeader;
import io.swagger.annotations.SwaggerDefinition;
import io.swagger.annotations.Tag;
import org.wso2.carbon.apimgt.annotations.api.Scope;
import org.wso2.carbon.apimgt.annotations.api.Scopes;
import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse;
import org.wso2.carbon.device.mgt.jaxrs.beans.OperationList;
import org.wso2.carbon.device.mgt.jaxrs.common.ActivityIdList;
import org.wso2.carbon.device.mgt.jaxrs.util.Constants;
import javax.validation.constraints.Size;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
/**
* traccar related REST-API. This can be used to manipulated traccar related details.
*/
@SwaggerDefinition(
info = @Info(
version = "1.0.0",
title = "",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = "name", value = "TraccarService"),
@ExtensionProperty(name = "context", value = "/api/device-mgt/v1.0/traccar"),
})
}
),
tags = {
@Tag(name = "traccar_service", description = "")
}
)
@Scopes(
scopes = {
@Scope(
name = "Return Traccar User token ",
description = "Enroll a Traccar User if not exist and return the token",
key = "perm:traccar:user",
roles = {"Internal/devicemgt-user"},
permissions = {"/device-mgt/traccar/manage"}
)
}
)
@Path("/traccar")
@Produces(MediaType.APPLICATION_JSON)
@Api(value = "Traccar Service", description = "Traccar Service")
public interface TraccarService {
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/generate-token")
@ApiOperation(
produces = MediaType.APPLICATION_JSON,
httpMethod = "GET",
value = "Return Traccar User Token",
tags = "Traccar Service",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = Constants.SCOPE, value = "perm:traccar:user")
})
}
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK. \n Successfully retrieved the operations.",
response = OperationList.class,
responseHeaders = {
@ResponseHeader(
name = "Content-Type",
description = "The content type of the body"),
@ResponseHeader(
name = "ETag",
description = "Entity Tag of the response resource.\n" +
"Used by caches, or in conditional requests."),
@ResponseHeader(
name = "Last-Modified",
description = "Date and time the resource has been modified the last " +
"time.\n" +
"Used by caches, or in conditional requests."),
}),
@ApiResponse(
code = 304,
message = "Not Modified. \n Empty body because the client already has the latest version of " +
"the requested resource.\n"),
@ApiResponse(
code = 400,
message = "The incoming request has more than one selection criteria defined via the query parameters.",
response = ErrorResponse.class),
@ApiResponse(
code = 404,
message = "The search criteria did not match any device registered with the server.",
response = ErrorResponse.class),
@ApiResponse(
code = 406,
message = "Not Acceptable.\n The requested media type is not supported."),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Server error occurred while fetching the device list.",
response = ErrorResponse.class)
})
Response getUser(
@ApiParam(
name = "userName",
value = "The user name.",
required = true)
@QueryParam("userName") String userName);
}

@ -0,0 +1,59 @@
/*
* 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.jaxrs.service.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONObject;
import org.wso2.carbon.device.mgt.core.traccar.api.service.impl.DeviceAPIClientServiceImpl;
import org.wso2.carbon.device.mgt.core.util.HttpReportingUtil;
import org.wso2.carbon.device.mgt.jaxrs.service.api.TraccarService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path("/traccar")
@Produces(MediaType.APPLICATION_JSON)
public class TraccarServiceImpl implements TraccarService {
private static final Log log = LogFactory.getLog(TraccarServiceImpl.class);
@GET
@Path("/generate-token")
@Override
public Response getUser(@QueryParam("userName") String userName) {
if (HttpReportingUtil.isTrackerEnabled()) {
JSONObject obj = new JSONObject(DeviceAPIClientServiceImpl.returnUser(userName));
log.info("=================");
log.info(obj.toString());
log.info("==================");
if(obj.has("error")){
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(obj.getString("error")).build();
}else{
return Response.status(Response.Status.OK).entity(obj.getString("token")).build();
}
}else{
return Response.status(Response.Status.BAD_REQUEST).entity("Traccar is not enabled").build();
}
}
}

@ -49,6 +49,7 @@
<ref bean="swaggerResource"/> <ref bean="swaggerResource"/>
<ref bean="analyticsArtifactsManagementService"/> <ref bean="analyticsArtifactsManagementService"/>
<ref bean="metadataService"/> <ref bean="metadataService"/>
<ref bean="traccarService"/>
</jaxrs:serviceBeans> </jaxrs:serviceBeans>
<jaxrs:providers> <jaxrs:providers>
<ref bean="jsonProvider"/> <ref bean="jsonProvider"/>
@ -99,6 +100,7 @@
<bean id="jsonProvider" class="org.wso2.carbon.device.mgt.jaxrs.common.GsonMessageBodyHandler"/> <bean id="jsonProvider" class="org.wso2.carbon.device.mgt.jaxrs.common.GsonMessageBodyHandler"/>
<bean id="analyticsArtifactsManagementService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.AnalyticsArtifactsManagementServiceImpl"/> <bean id="analyticsArtifactsManagementService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.AnalyticsArtifactsManagementServiceImpl"/>
<bean id="metadataService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.MetadataServiceImpl"/> <bean id="metadataService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.MetadataServiceImpl"/>
<bean id="traccarService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.TraccarServiceImpl"/>
<!--<bean id="errorHandler" class="org.wso2.carbon.device.mgt.jaxrs.common.ErrorHandler"/>--> <!--<bean id="errorHandler" class="org.wso2.carbon.device.mgt.jaxrs.common.ErrorHandler"/>-->
<cxf:bus> <cxf:bus>

@ -0,0 +1,54 @@
/*
* 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.common;
import java.io.Serializable;
public class TrackerPermissionInfo implements Serializable {
private static final long serialVersionUID = 1998101712L;
private int traccarUserId;
private int traccarDeviceId;
public TrackerPermissionInfo() {
}
public TrackerPermissionInfo(int traccarUserId, int traccarDeviceId) {
this.traccarUserId = traccarUserId;
this.traccarDeviceId = traccarDeviceId;
}
public int getTraccarUserId() {
return traccarUserId;
}
public void setTraccarUserId(int traccarUserId) {
this.traccarUserId = traccarUserId;
}
public int getTraccarDeviceId() {
return traccarDeviceId;
}
public void setTraccarDeviceId(int traccarDeviceId) {
this.traccarDeviceId = traccarDeviceId;
}
}

@ -0,0 +1,46 @@
/*
* 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.common;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
@ApiModel(value = "User", description = "This class carries all information related to a managed Traccar User.")
public class TrackerUserInfo implements Serializable {
private static final long serialVersionUID = 1998101712L;
@ApiModelProperty(name = "userName", value = "The user's name that can be set on the device by the device user.",
required = true)
private String userName;
public TrackerUserInfo() {
}
public String getUserName() {
return userName;
}
public void setUserName(String UserName) {
this.userName = UserName;
}
}

@ -20,6 +20,7 @@ package org.wso2.carbon.device.mgt.core.dao;
import org.wso2.carbon.device.mgt.common.TrackerDeviceInfo; import org.wso2.carbon.device.mgt.common.TrackerDeviceInfo;
import org.wso2.carbon.device.mgt.common.TrackerGroupInfo; import org.wso2.carbon.device.mgt.common.TrackerGroupInfo;
import org.wso2.carbon.device.mgt.common.TrackerPermissionInfo;
public interface TrackerDAO { public interface TrackerDAO {
@ -90,6 +91,24 @@ public interface TrackerDAO {
*/ */
int removeTrackerGroup(int id) throws TrackerManagementDAOException; int removeTrackerGroup(int id) throws TrackerManagementDAOException;
/**
* give permission to a user to view traccar device.
* @param traccarUserId mapping table.
* @param deviceId mapping table.
* @throws TrackerManagementDAOException
*/
Boolean addTrackerUssrDevicePermission(int traccarUserId, int deviceId) throws TrackerManagementDAOException;
/**
* Remove a permission on viewing a device.
* @param traccarUserId mapping table.
* @param deviceId mapping table.
* @throws TrackerManagementDAOException
*/
Boolean removeTrackerUssrDevicePermission(int traccarUserId, int deviceId) throws TrackerManagementDAOException;
TrackerPermissionInfo getUserIdofPermissionByDeviceId(int deviceId) throws TrackerManagementDAOException;
/** /**
* get trackerGroup info. * get trackerGroup info.
* @param groupId of the device. * @param groupId of the device.

@ -20,6 +20,7 @@ package org.wso2.carbon.device.mgt.core.dao.impl.tracker;
import org.wso2.carbon.device.mgt.common.TrackerDeviceInfo; import org.wso2.carbon.device.mgt.common.TrackerDeviceInfo;
import org.wso2.carbon.device.mgt.common.TrackerGroupInfo; import org.wso2.carbon.device.mgt.common.TrackerGroupInfo;
import org.wso2.carbon.device.mgt.common.TrackerPermissionInfo;
import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOFactory; 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.TrackerManagementDAOException;
import org.wso2.carbon.device.mgt.core.dao.TrackerDAO; import org.wso2.carbon.device.mgt.core.dao.TrackerDAO;
@ -214,6 +215,68 @@ public class TrackerDAOImpl implements TrackerDAO {
} }
} }
@Override
public Boolean addTrackerUssrDevicePermission(int traccarUserId, int deviceId) throws TrackerManagementDAOException {
PreparedStatement stmt = null;
try {
Connection conn = TrackerManagementDAOFactory.getConnection();
String sql = "INSERT INTO DM_EXT_PERMISSION_MAPPING(TRACCAR_USER_ID, TRACCAR_DEVICE_ID) VALUES(?, ?)";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, traccarUserId);
stmt.setInt(2, deviceId);
stmt.execute();
return true;
} catch (SQLException e) {
throw new TrackerManagementDAOException("Error occurred while adding traccar user device mapping", e);
} finally {
TrackerManagementDAOUtil.cleanupResources(stmt, null);
}
}
@Override
public Boolean removeTrackerUssrDevicePermission(int traccarUserId, int deviceId) throws TrackerManagementDAOException {
PreparedStatement stmt = null;
try {
Connection conn = TrackerManagementDAOFactory.getConnection();
String sql = "DELETE FROM DM_EXT_PERMISSION_MAPPING WHERE TRACCAR_USER_ID=? AND TRACCAR_DEVICE_ID=?";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, traccarUserId);
stmt.setInt(2, deviceId);
stmt.execute();
return true;
} catch (SQLException e) {
throw new TrackerManagementDAOException("Error occurred while removing traccar user device permission mapping", e);
} finally {
TrackerManagementDAOUtil.cleanupResources(stmt, null);
}
}
@Override
public TrackerPermissionInfo getUserIdofPermissionByDeviceId(int deviceId) throws TrackerManagementDAOException {
PreparedStatement stmt = null;
ResultSet rs = null;
TrackerPermissionInfo trackerPermissionInfo = null;
try {
Connection conn = TrackerManagementDAOFactory.getConnection();
String sql = "SELECT TRACCAR_DEVICE_ID, TRACCAR_USER_ID FROM DM_EXT_PERMISSION_MAPPING WHERE " +
"TRACCAR_DEVICE_ID = ? ORDER BY TRACCAR_DEVICE_ID DESC LIMIT 1";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, deviceId);
rs = stmt.executeQuery();
if (rs.next()) {
trackerPermissionInfo = this.loadPermission(rs);
}
return trackerPermissionInfo;
} catch (SQLException e) {
throw new TrackerManagementDAOException("Error occurred while retrieving the traccar group information ", e);
} finally {
TrackerManagementDAOUtil.cleanupResources(stmt, rs);
}
}
private TrackerGroupInfo loadTrackerGroup(ResultSet rs) throws SQLException { private TrackerGroupInfo loadTrackerGroup(ResultSet rs) throws SQLException {
TrackerGroupInfo trackerGroupInfo = new TrackerGroupInfo(); TrackerGroupInfo trackerGroupInfo = new TrackerGroupInfo();
trackerGroupInfo.setId(rs.getInt("ID")); trackerGroupInfo.setId(rs.getInt("ID"));
@ -233,4 +296,11 @@ public class TrackerDAOImpl implements TrackerDAO {
trackerDeviceInfo.setStatus(rs.getInt("STATUS")); trackerDeviceInfo.setStatus(rs.getInt("STATUS"));
return trackerDeviceInfo; return trackerDeviceInfo;
} }
private TrackerPermissionInfo loadPermission(ResultSet rs) throws SQLException {
TrackerPermissionInfo trackerPermissionInfo = new TrackerPermissionInfo();
trackerPermissionInfo.setTraccarUserId(rs.getInt("TRACCAR_USER_ID"));
trackerPermissionInfo.setTraccarDeviceId(rs.getInt("TRACCAR_DEVICE_ID"));
return trackerPermissionInfo;
}
} }

@ -53,6 +53,7 @@ import java.util.Calendar;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutionException;
public class DeviceInformationManagerImpl implements DeviceInformationManager { public class DeviceInformationManagerImpl implements DeviceInformationManager {
@ -388,8 +389,16 @@ public class DeviceInformationManagerImpl implements DeviceInformationManager {
//Tracker update GPS Location //Tracker update GPS Location
if (HttpReportingUtil.isLocationPublishing() && HttpReportingUtil.isTrackerEnabled()) { if (HttpReportingUtil.isLocationPublishing() && HttpReportingUtil.isTrackerEnabled()) {
try {
DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() DeviceManagementDataHolder.getInstance().getDeviceAPIClientService()
.updateLocation(device, deviceLocation, CarbonContext.getThreadLocalCarbonContext().getTenantId()); .updateLocation(device, deviceLocation, CarbonContext.getThreadLocalCarbonContext().getTenantId());
} catch (ExecutionException e) {
log.error("ExecutionException : " + e);
//throw new RuntimeException(e);
} catch (InterruptedException e) {
log.error("InterruptedException : " + e);
//throw new RuntimeException(e);
}
} }
//Tracker update GPS Location //Tracker update GPS Location

@ -160,6 +160,17 @@ import java.text.Format;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -412,7 +423,15 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
//enroll Traccar device //enroll Traccar device
if (HttpReportingUtil.isTrackerEnabled()) { if (HttpReportingUtil.isTrackerEnabled()) {
try {
DeviceManagementDataHolder.getInstance().getDeviceAPIClientService().addDevice(device, tenantId); DeviceManagementDataHolder.getInstance().getDeviceAPIClientService().addDevice(device, tenantId);
} catch (ExecutionException e) {
log.error("ExecutionException : " + e);
//throw new RuntimeException(e);
} catch (InterruptedException e) {
log.error("InterruptedException : " + e);
//throw new RuntimeException(e);
}
} }
//enroll Traccar device //enroll Traccar device
@ -581,7 +600,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
//procees to dis-enroll a device from traccar starts //procees to dis-enroll a device from traccar starts
if (HttpReportingUtil.isTrackerEnabled()) { if (HttpReportingUtil.isTrackerEnabled()) {
DeviceManagementDataHolder.getInstance().getDeviceAPIClientService() DeviceManagementDataHolder.getInstance().getDeviceAPIClientService()
.disEndrollDevice(device.getId(), tenantId); .disEnrollDevice(device.getId(), tenantId);
} }
//procees to dis-enroll a device from traccar ends //procees to dis-enroll a device from traccar ends

@ -21,9 +21,12 @@ 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.Device;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation; import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation;
import org.wso2.carbon.device.mgt.common.exceptions.TrackerAlreadyExistException;
import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup;
import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException; import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException;
import java.util.concurrent.ExecutionException;
public interface DeviceAPIClientService { public interface DeviceAPIClientService {
/** /**
@ -33,7 +36,7 @@ public interface DeviceAPIClientService {
* @param deviceLocation to be added to update location of the device * @param deviceLocation to be added to update location of the device
* @throws TraccarConfigurationException errors thrown while inserting location of a device traccar configuration * @throws TraccarConfigurationException errors thrown while inserting location of a device traccar configuration
*/ */
void updateLocation(Device device, DeviceLocation deviceLocation, int tenantId); void updateLocation(Device device, DeviceLocation deviceLocation, int tenantId) throws ExecutionException, InterruptedException;
/** /**
* Create device Traccar configuration records * Create device Traccar configuration records
@ -41,15 +44,7 @@ public interface DeviceAPIClientService {
* @param device to be added * @param device to be added
* @throws TraccarConfigurationException errors thrown while creating a device traccar configuration * @throws TraccarConfigurationException errors thrown while creating a device traccar configuration
*/ */
void addDevice(Device device, int tenantId); void addDevice(Device device, int tenantId) throws ExecutionException, InterruptedException;
/**
* Create device Traccar configuration records
*
* @param device to modify
* @throws TraccarConfigurationException errors thrown while creating a device traccar configuration
*/
void updateDevice(Device device, int tenantId);
/** /**
* Delete a device Traccar configuration records * Delete a device Traccar configuration records
@ -57,7 +52,7 @@ public interface DeviceAPIClientService {
* @param deviceId to be delete a device * @param deviceId to be delete a device
* @throws TraccarConfigurationException errors thrown while deleting a device traccar configuration * @throws TraccarConfigurationException errors thrown while deleting a device traccar configuration
*/ */
void disEndrollDevice(int deviceId, int tenantId); void disEnrollDevice(int deviceId, int tenantId);
/** /**
* Delete a device Traccar configuration records * Delete a device Traccar configuration records
@ -65,7 +60,7 @@ public interface DeviceAPIClientService {
* @param group to be add a group * @param group to be add a group
* @throws TraccarConfigurationException errors thrown while adding a group traccar configuration * @throws TraccarConfigurationException errors thrown while adding a group traccar configuration
*/ */
void addGroup(DeviceGroup group, int groupID, int tenantId); void addGroup(DeviceGroup group, int groupID, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException;
/** /**
* Delete a device Traccar configuration records * Delete a device Traccar configuration records
@ -73,7 +68,7 @@ public interface DeviceAPIClientService {
* @param group to be update the group * @param group to be update the group
* @throws TraccarConfigurationException errors thrown while adding a group traccar configuration * @throws TraccarConfigurationException errors thrown while adding a group traccar configuration
*/ */
void updateGroup(DeviceGroup group, int groupID, int tenantId); void updateGroup(DeviceGroup group, int groupID, int tenantId) throws ExecutionException, InterruptedException, TraccarConfigurationException, TrackerAlreadyExistException;
/** /**
* Delete a device Traccar configuration records * Delete a device Traccar configuration records
@ -82,5 +77,5 @@ public interface DeviceAPIClientService {
* @param tenantId to delete a group * @param tenantId to delete a group
* @throws TraccarConfigurationException errors thrown while adding a group traccar configuration * @throws TraccarConfigurationException errors thrown while adding a group traccar configuration
*/ */
void deleteGroup(int groupId, int tenantId); void deleteGroup(int groupId, int tenantId) throws ExecutionException, InterruptedException, TraccarConfigurationException;
} }

@ -27,33 +27,39 @@ import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarPosition;
import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarUser; import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarUser;
import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException; import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException;
import java.util.concurrent.ExecutionException;
public interface TraccarClient { public interface TraccarClient {
void addDevice(TraccarDevice deviceInfo, int tenantId) throws String fetchAllDevices() throws TraccarConfigurationException, ExecutionException, InterruptedException;
TraccarConfigurationException, TrackerAlreadyExistException;
void updateDevice(TraccarDevice deviceInfo, int tenantId) throws void addDevice(TraccarDevice deviceInfo, int tenantId) throws
TraccarConfigurationException, TrackerAlreadyExistException; TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException;
void updateLocation(TraccarDevice device, TraccarPosition deviceInfo, int tenantId) throws void updateLocation(TraccarDevice device, TraccarPosition deviceInfo, int tenantId) throws
TraccarConfigurationException, TrackerAlreadyExistException; TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException;
void disEndrollDevice(int traccarDeviceId, int tenantId) throws TraccarConfigurationException; void disEnrollDevice(int traccarDeviceId, int tenantId) throws TraccarConfigurationException;
void addGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws void addGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws
TraccarConfigurationException, TrackerAlreadyExistException; TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException;
void updateGroup(TraccarGroups groupInfo, int groupId, int tenantId) void updateGroup(TraccarGroups groupInfo, int groupId, int tenantId)
throws TraccarConfigurationException, TrackerAlreadyExistException; throws TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException;
void deleteGroup(int traccarGroupId, int tenantId) throws TraccarConfigurationException, ExecutionException, InterruptedException;
void setPermission(int userId, int deviceId) throws TraccarConfigurationException, ExecutionException, InterruptedException;
void deleteGroup(int traccarGroupId, int tenantId) throws TraccarConfigurationException; void removePermission(int userId, int deviceId) throws TraccarConfigurationException, ExecutionException, InterruptedException;
void fetchAllUsers(String createUser, TraccarUser traccarUser, int deviceId) throws TraccarConfigurationException; String fetchAllUsers() throws TraccarConfigurationException, ExecutionException, InterruptedException;
void createUser(TraccarUser traccarUser, String method, int deviceId) throws TraccarConfigurationException; String fetchUserInfo(String userName) throws TraccarConfigurationException, ExecutionException, InterruptedException;
void updateUser(JSONObject traccarUser) throws TraccarConfigurationException; String createUser(TraccarUser traccarUser) throws ExecutionException, InterruptedException;
void setPermission(int userId, int deviceId) throws TraccarConfigurationException; String updateUser(TraccarUser traccarUser, int userId) throws ExecutionException, InterruptedException;
String returnUser(String userName) throws TraccarConfigurationException;
} }

@ -29,17 +29,18 @@ import okhttp3.Response;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.mgt.common.TrackerDeviceInfo; import org.wso2.carbon.device.mgt.common.TrackerDeviceInfo;
import org.wso2.carbon.device.mgt.common.TrackerGroupInfo; import org.wso2.carbon.device.mgt.common.TrackerGroupInfo;
import org.wso2.carbon.device.mgt.common.TrackerPermissionInfo;
import org.wso2.carbon.device.mgt.common.exceptions.TransactionManagementException; import org.wso2.carbon.device.mgt.common.exceptions.TransactionManagementException;
import org.wso2.carbon.device.mgt.common.exceptions.TrackerAlreadyExistException; import org.wso2.carbon.device.mgt.common.exceptions.TrackerAlreadyExistException;
import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOException; 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.TrackerDAO;
import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOFactory; import org.wso2.carbon.device.mgt.core.dao.TrackerManagementDAOFactory;
import org.wso2.carbon.device.mgt.core.traccar.api.service.TraccarClient; import org.wso2.carbon.device.mgt.core.traccar.api.service.TraccarClient;
import org.wso2.carbon.device.mgt.core.traccar.api.service.impl.DeviceAPIClientServiceImpl;
import org.wso2.carbon.device.mgt.core.traccar.common.TraccarHandlerConstants; import org.wso2.carbon.device.mgt.core.traccar.common.TraccarHandlerConstants;
import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarDevice; 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.TraccarGroups;
@ -47,16 +48,20 @@ import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarPosition;
import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarUser; import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarUser;
import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException; import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException;
import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarGateway; import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarGateway;
import org.wso2.carbon.device.mgt.core.traccar.common.util.TraccarUtil;
import org.wso2.carbon.device.mgt.core.traccar.core.config.TraccarConfigurationManager; import org.wso2.carbon.device.mgt.core.traccar.core.config.TraccarConfigurationManager;
import java.io.IOException;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.Objects;
import java.util.Random; import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class TraccarClientImpl implements TraccarClient { public class TraccarClientImpl implements TraccarClient {
@ -79,213 +84,237 @@ public class TraccarClientImpl implements TraccarClient {
.connectTimeout(30, TimeUnit.SECONDS) .connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(45, TimeUnit.SECONDS) .readTimeout(45, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(50,30,TimeUnit.SECONDS)) .connectionPool(new ConnectionPool(100,50,TimeUnit.SECONDS))
.build(); .build();
this.trackerDAO = TrackerManagementDAOFactory.getTrackerDAO(); this.trackerDAO = TrackerManagementDAOFactory.getTrackerDAO();
} }
private class TrackerExecutor implements Runnable { private class OkHttpClientThreadPool implements Callable {
final int deviceId; final String publisherUrlWithContext;
final int groupId;
final int tenantId;
final JSONObject payload; final JSONObject payload;
final String context;
final String publisherUrl;
private final String method; private final String method;
private final String type;
private TrackerExecutor(int id, int tenantId, String publisherUrl, String context, JSONObject payload, private OkHttpClientThreadPool(String publisherUrlWithContext, JSONObject payload, String method) {
String method, String type) { this.publisherUrlWithContext = publisherUrlWithContext;
this.deviceId = id;
this.groupId = id;
this.tenantId = tenantId;
this.payload = payload; this.payload = payload;
this.context = context;
this.publisherUrl = publisherUrl;
this.method = method; this.method = method;
this.type = type;
} }
public void run() { @Override
public String call() throws Exception {
RequestBody requestBody; RequestBody requestBody;
Request.Builder builder = new Request.Builder(); Request.Builder builder = new Request.Builder();
Request request; Request request;
Response response; Response response;
if(method==TraccarHandlerConstants.Methods.POST){ if(Objects.equals(method, TraccarHandlerConstants.Methods.POST)){
requestBody = RequestBody.create(payload.toString(), MediaType.parse("application/json; charset=utf-8")); requestBody = RequestBody.create(payload.toString(), MediaType.parse("application/json; charset=utf-8"));
builder = builder.post(requestBody); builder = builder.post(requestBody);
}else if(method==TraccarHandlerConstants.Methods.PUT){ }else if(Objects.equals(method, TraccarHandlerConstants.Methods.PUT)){
requestBody = RequestBody.create(payload.toString(), MediaType.parse("application/json; charset=utf-8")); requestBody = RequestBody.create(payload.toString(), MediaType.parse("application/json; charset=utf-8"));
builder = builder.put(requestBody); builder = builder.put(requestBody);
}else if(method==TraccarHandlerConstants.Methods.DELETE){ }else if(Objects.equals(method, TraccarHandlerConstants.Methods.DELETE)){
builder = builder.delete(); builder = builder.delete();
} }
request = builder.url(publisherUrl + context).addHeader(authorization, authorizationKey).build(); request = builder.url(endpoint+publisherUrlWithContext).addHeader(authorization, authorizationKey).build();
try {
response = client.newCall(request).execute(); response = client.newCall(request).execute();
if(method==TraccarHandlerConstants.Methods.POST){ return response.body().string();
String result = response.body().string();
log.info(result);
if(type==TraccarHandlerConstants.Types.PERMISSION){
String msg ="";
if(result == ""){
msg ="Successfully the device is assigned to the user";
}else{
msg = "Error occurred while fetching users .";
} }
log.info(msg); }
}else if(result.charAt(0)=='{'){
JSONObject obj = new JSONObject(result); public String fetchAllUsers() throws ExecutionException, InterruptedException {
if (obj.has("id")){ String method = TraccarHandlerConstants.Methods.GET;
int traccarId = obj.getInt("id"); String url = defaultPort+"/api/users";
Future<String> result = executor.submit(new OkHttpClientThreadPool(url, null, method));
String res = result.get();
//executor.shutdown();
return res;
}
public String fetchUserInfo(String userName) throws ExecutionException, InterruptedException {
String allUsers = fetchAllUsers(); //get all users
JSONArray fetchAllUsers = new JSONArray(allUsers); //loop users
for(int i=0; i<fetchAllUsers.length();i++){
//if login is null then check the name or if login is not null then check the login
if((!fetchAllUsers.getJSONObject(i).isNull("login") &&
fetchAllUsers.getJSONObject(i).getString("login").equals(userName)) ||
(fetchAllUsers.getJSONObject(i).isNull("login") &&
fetchAllUsers.getJSONObject(i).getString("name").equals(userName)) ){
return fetchAllUsers.getJSONObject(i).toString();
}
}
return TraccarHandlerConstants.Types.USER_NOT_FOUND;
}
public String returnUser(String userName) throws TraccarConfigurationException{
try{ try{
TrackerManagementDAOFactory.beginTransaction(); String result = DeviceAPIClientServiceImpl.fetchUserInfo(userName);
if(type==TraccarHandlerConstants.Types.DEVICE){ Date today = new Date();
trackerDAO.addTrackerDevice(traccarId, deviceId, tenantId); LocalDateTime tomorrow = LocalDateTime.from(today.toInstant().atZone(ZoneId.of("UTC"))).plusDays(1);
TrackerDeviceInfo res = trackerDAO.getTrackerDevice(deviceId, tenantId); String token = DeviceAPIClientServiceImpl.generateRandomString(TraccarHandlerConstants.Types.TRACCAR_TOKEN);
if(res.getStatus()==0){
trackerDAO.updateTrackerDeviceIdANDStatus(res.getTraccarDeviceId(), deviceId, tenantId, 1);
TraccarUser traccarUser = new TraccarUser(); TraccarUser traccarUser = new TraccarUser();
traccarUser.setName(username); traccarUser.setToken(token);
traccarUser.setLogin(username);
traccarUser.setEmail(username); if(Objects.equals(result, TraccarHandlerConstants.Types.USER_NOT_FOUND)){
traccarUser.setPassword(generateRandomString(10)); //create user
traccarUser.setToken(generateRandomString(32)); traccarUser.setName(userName);
traccarUser.setLogin(userName);
traccarUser.setEmail(userName);
traccarUser.setPassword(DeviceAPIClientServiceImpl.generateRandomString(TraccarHandlerConstants.Types.DEFAULT_RANDOM));
traccarUser.setDeviceLimit(-1); traccarUser.setDeviceLimit(-1);
traccarUser.setUserLimit(-1);
traccarUser.setExpirationTime(tomorrow.toString());
DeviceAPIClientServiceImpl.createUser(traccarUser);
}else{
//update user
JSONObject obj = new JSONObject(result);
log.info("============================="); traccarUser.setId(obj.getInt("id"));
log.info(new Gson().toJson(traccarUser)); traccarUser.setName(obj.getString("name"));
log.info("============================="); traccarUser.setLogin(obj.getString("login"));
//device is available traccarUser.setEmail(obj.getString("email"));
//device is not available traccarUser.setDeviceLimit(obj.getInt("deviceLimit"));
//user is available traccarUser.setUserLimit(obj.getInt("userLimit"));
//user is not available traccarUser.setAdministrator(obj.getBoolean("administrator"));
fetchAllUsers(TraccarHandlerConstants.Types.USER_CREATE_WITH_INSERT_DEVICE, traccarUser, traccarId); traccarUser.setDisabled(obj.getBoolean("disabled"));
} traccarUser.setReadonly(obj.getBoolean("readonly"));
}else if(type==TraccarHandlerConstants.Types.GROUP){ if(!obj.getBoolean("administrator")){
trackerDAO.addTrackerGroup(traccarId, groupId, tenantId); traccarUser.setExpirationTime(tomorrow.toString());
TrackerGroupInfo res = trackerDAO.getTrackerGroup(groupId, tenantId); }else if(!obj.isNull("expirationTime")){
if(res.getStatus()==0){ traccarUser.setExpirationTime(obj.getString("expirationTime"));
trackerDAO.updateTrackerGroupIdANDStatus(res.getTraccarGroupId(), groupId, tenantId, 1); }
DeviceAPIClientServiceImpl.updateUser(traccarUser, obj.getInt("id"));
}
result = DeviceAPIClientServiceImpl.fetchUserInfo(userName);
return result;
} catch (InterruptedException | ExecutionException e) {
JSONObject obj=new JSONObject();
String msg = "Error occurred while executing enrollment status of the device.";
obj.put("error",msg);
obj.put("e",e);
log.error(msg, e);
return obj.toString();
}
}
public String createUser(TraccarUser traccarUser) throws ExecutionException, InterruptedException {
String method = TraccarHandlerConstants.Methods.POST;
String url = defaultPort+"/api/users";
JSONObject payload = TraccarUtil.TraccarUserPayload(traccarUser);
Future<String> res = executor.submit(new OkHttpClientThreadPool(url, payload, method));
String result = res.get();
//executor.shutdown();
return result;
} }
}else if(type==TraccarHandlerConstants.Types.USER_CREATE){
log.info("============="); public String updateUser(TraccarUser traccarUser, int userId) throws ExecutionException, InterruptedException {
log.info("User inserted"); String method = TraccarHandlerConstants.Methods.PUT;
log.info("============="); String url = defaultPort+"/api/users/"+userId;
}else if(type==TraccarHandlerConstants.Types.USER_CREATE_WITH_INSERT_DEVICE){ JSONObject payload = TraccarUtil.TraccarUserPayload(traccarUser);
int userId = traccarId;
log.info("============="); Future<String> res = executor.submit(new OkHttpClientThreadPool(url, payload, method));
log.info("User inserted and setting to create session"); String result = res.get();
log.info("============="); //executor.shutdown();
setPermission(userId, deviceId); return result;
} }
public void setPermission(int userId, int deviceId) throws TraccarConfigurationException, ExecutionException, InterruptedException {
JSONObject payload = new JSONObject();
payload.put("userId", userId);
payload.put("deviceId", deviceId);
String method = TraccarHandlerConstants.Methods.POST;
String url = defaultPort+"/api/permissions";
Future<String> res = executor.submit(new OkHttpClientThreadPool(url, payload, method));
String result = res.get();
//executor.shutdown();
if(result!=null){
try {
TrackerManagementDAOFactory.beginTransaction();
trackerDAO.addTrackerUssrDevicePermission(userId, deviceId);
TrackerManagementDAOFactory.commitTransaction(); TrackerManagementDAOFactory.commitTransaction();
} catch (JSONException e) { } catch (TrackerManagementDAOException e) {
TrackerManagementDAOFactory.rollbackTransaction(); TrackerManagementDAOFactory.rollbackTransaction();
String msg = "Error occurred on JSON object ."; String msg = "Error occurred while mapping with deviceId .";
log.error(msg, e); log.error(msg, e);
throw new TraccarConfigurationException(msg, e);
} catch (TransactionManagementException e) { } catch (TransactionManagementException e) {
TrackerManagementDAOFactory.rollbackTransaction(); TrackerManagementDAOFactory.rollbackTransaction();
String msg = "Error occurred establishing the DB connection ."; String msg = "Error occurred establishing the DB connection .";
log.error(msg, e); log.error(msg, e);
} catch (TrackerManagementDAOException e) { throw new TraccarConfigurationException(msg, e);
TrackerManagementDAOFactory.rollbackTransaction();
String msg = null;
if(type==TraccarHandlerConstants.Types.DEVICE){
msg = "Already device with deviceId " + deviceId + " exists" ;
}else if(type==TraccarHandlerConstants.Types.GROUP){
msg = "Already the group with groupId - " + groupId + " exists!";
}else if(type==TraccarHandlerConstants.Types.USER){
msg = "Error occurred while fetching users.";
}else if(type==TraccarHandlerConstants.Types.PERMISSION){
msg = "Error occurred while assigning the device to the user." + traccarId + deviceId;
}
log.error(msg, e);
} finally { } finally {
TrackerManagementDAOFactory.closeConnection(); TrackerManagementDAOFactory.closeConnection();
} }
} }
response.close();
}
if (log.isDebugEnabled()) {
log.debug("Successfully the request is proceed and communicated with Traccar");
} }
}else if(method==TraccarHandlerConstants.Methods.GET){
if(type!=TraccarHandlerConstants.Types.DEVICE){
response = client.newCall(request).execute();
String result = response.body().string();
JSONArray fetchAllUsers = new JSONArray(result); public void removePermission(int userId, int deviceId) throws TraccarConfigurationException, ExecutionException, InterruptedException {
int userAvailability = 0; JSONObject payload = new JSONObject();
int userId = 0; payload.put("userId", userId);
for(int i=0; i<fetchAllUsers.length();i++){ payload.put("deviceId", deviceId);
if(fetchAllUsers.getJSONObject(i).getString("login").equals(username)){
//TODO :: when user is available then assgin the device to the user String method = TraccarHandlerConstants.Methods.DELETE;
String url = defaultPort+"/api/permissions";
userAvailability=1; Future<String> res = executor.submit(new OkHttpClientThreadPool(url, payload, method));
log.info(fetchAllUsers.getJSONObject(i)); String result = res.get();
log.info(new Gson().toJson(fetchAllUsers.getJSONObject(i))); //executor.shutdown();
log.info("Token: "+fetchAllUsers.getJSONObject(i).getString("token"));
userId = fetchAllUsers.getJSONObject(i).getInt("id");
break;
}
}
if(type==TraccarHandlerConstants.Types.USER_CREATE_WITH_INSERT_DEVICE){ if(result!=null){
if(userAvailability==0){ try {
log.info("============"); TrackerManagementDAOFactory.beginTransaction();
log.info("Creating User"); trackerDAO.removeTrackerUssrDevicePermission(userId, deviceId);
TraccarUser traccarUser = (TraccarUser) payload.get("data"); TrackerManagementDAOFactory.commitTransaction();
log.info(traccarUser); } catch (TrackerManagementDAOException e) {
log.info("============"); TrackerManagementDAOFactory.rollbackTransaction();
createUser(traccarUser, type, deviceId); String msg = "Error occurred while mapping with deviceId .";
}else{ log.error(msg, e);
if(userId!=0){ throw new TraccarConfigurationException(msg, e);
log.info("============="); } catch (TransactionManagementException e) {
log.info("User inserted and setting to create session"); TrackerManagementDAOFactory.rollbackTransaction();
log.info("============="); String msg = "Error occurred establishing the DB connection .";
setPermission(userId, deviceId); log.error(msg, e);
}else{ throw new TraccarConfigurationException(msg, e);
log.info("UserId is null"); } finally {
} TrackerManagementDAOFactory.closeConnection();
} }
}else if(type==TraccarHandlerConstants.Types.USER_CREATE){
/*if(userAvailability==1){
log.info("Update User");
log.info(payload);
log.info(new Gson().toJson(payload));
updateUser(payload);
log.info("Update User");
}*/
} }
} }
} public String fetchAllDevices() throws ExecutionException, InterruptedException {
String method = TraccarHandlerConstants.Methods.GET;
String url = defaultPort+"/api/devices";
} catch (IOException | TraccarConfigurationException e) { Future<String> result = executor.submit(new OkHttpClientThreadPool(url, null, method));
log.error("Couldnt connect to traccar.", e); String res = result.get();
} //executor.shutdown();
} return res;
} }
/** /**
* Add Traccar Device operation. * Add Traccar Device operation.
* @param deviceInfo with DeviceName UniqueId, Status, Disabled LastUpdate, PositionId, GroupId * @param traccarDevice with DeviceName UniqueId, Status, Disabled LastUpdate, PositionId, GroupId
* Model, Contact, Category, fenceIds * Model, Contact, Category, fenceIds
* @throws TraccarConfigurationException Failed while add Traccar Device the operation * @throws TraccarConfigurationException Failed while add Traccar Device the operation
*/ */
public void addDevice(TraccarDevice deviceInfo, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException { public void addDevice(TraccarDevice traccarDevice, int tenantId) throws
TrackerDeviceInfo res = null; TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException {
TrackerDeviceInfo trackerDeviceInfo = null;
try { try {
TrackerManagementDAOFactory.openConnection(); TrackerManagementDAOFactory.openConnection();
res = trackerDAO.getTrackerDevice(deviceInfo.getId(), tenantId); trackerDeviceInfo = trackerDAO.getTrackerDevice(traccarDevice.getId(), tenantId);
if(res!=null){ if(trackerDeviceInfo!=null){
String msg = "The device already exit"; String msg = "The device already exist";
log.error(msg); log.error(msg);
throw new TrackerAlreadyExistException(msg); throw new TrackerAlreadyExistException(msg);
} }
@ -301,29 +330,35 @@ public class TraccarClientImpl implements TraccarClient {
TrackerManagementDAOFactory.closeConnection(); TrackerManagementDAOFactory.closeConnection();
} }
JSONObject payload = payload(deviceInfo); if(trackerDeviceInfo==null){
String context = defaultPort+"/api/devices"; //add the device
Runnable trackerExecutor = new TrackerExecutor(deviceInfo.getId(), tenantId, endpoint, context, payload, String method = TraccarHandlerConstants.Methods.POST;
TraccarHandlerConstants.Methods.POST, TraccarHandlerConstants.Types.DEVICE); String url = defaultPort+"/api/devices";
executor.execute(trackerExecutor); JSONObject payload = TraccarUtil.TraccarDevicePayload(traccarDevice);
}
/** Future<String> res = executor.submit(new OkHttpClientThreadPool(url, payload, method));
* update Traccar Device operation. String result = res.get();
* @param deviceInfo with DeviceName UniqueId, Status, Disabled LastUpdate, PositionId, GroupId if(result.charAt(0)=='{'){
* Model, Contact, Category, fenceIds JSONObject obj = new JSONObject(result);
* @throws TraccarConfigurationException Failed while add Traccar Device the operation if (obj.has("id")){
*/ int traccarDeviceId = obj.getInt("id");
public void updateDevice(TraccarDevice deviceInfo, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException { int deviceId = traccarDevice.getId();
TrackerDeviceInfo res = null;
try { try {
TrackerManagementDAOFactory.openConnection(); TrackerManagementDAOFactory.beginTransaction();
res = trackerDAO.getTrackerDevice(deviceInfo.getId(), tenantId); trackerDAO.addTrackerDevice(traccarDeviceId, deviceId, tenantId);
trackerDeviceInfo = trackerDAO.getTrackerDevice(deviceId, tenantId);
if(trackerDeviceInfo.getStatus()==0){
trackerDAO.updateTrackerDeviceIdANDStatus(trackerDeviceInfo.getTraccarDeviceId(), deviceId, tenantId, 1);
}
TrackerManagementDAOFactory.commitTransaction();
} catch (TrackerManagementDAOException e) { } catch (TrackerManagementDAOException e) {
TrackerManagementDAOFactory.rollbackTransaction();
String msg = "Error occurred while mapping with deviceId ."; String msg = "Error occurred while mapping with deviceId .";
log.error(msg, e); log.error(msg, e);
throw new TraccarConfigurationException(msg, e); throw new TraccarConfigurationException(msg, e);
} catch (SQLException e) { } catch (TransactionManagementException e) {
TrackerManagementDAOFactory.rollbackTransaction();
String msg = "Error occurred establishing the DB connection ."; String msg = "Error occurred establishing the DB connection .";
log.error(msg, e); log.error(msg, e);
throw new TraccarConfigurationException(msg, e); throw new TraccarConfigurationException(msg, e);
@ -331,105 +366,56 @@ public class TraccarClientImpl implements TraccarClient {
TrackerManagementDAOFactory.closeConnection(); TrackerManagementDAOFactory.closeConnection();
} }
if ((res==null) || (res.getTraccarDeviceId()==0)){ JSONObject returnUser = new JSONObject(returnUser(username));
try { setPermission(returnUser.getInt("id"),deviceId);
TraccarDevice device = deviceInfo; }else{
String lastUpdatedTime = String.valueOf((new Date().getTime())); log.error("Something went wrong_1: " + result);
device.setLastUpdate(lastUpdatedTime);
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 if (res!=null && (res.getTraccarDeviceId()!=0 && res.getStatus()==0)){
//update the traccarGroupId and status
try {
TrackerManagementDAOFactory.beginTransaction();
trackerDAO.updateTrackerDeviceIdANDStatus(res.getTraccarDeviceId(), deviceInfo.getId(), tenantId, 1);
TrackerManagementDAOFactory.commitTransaction();
} catch (TransactionManagementException e) {
String msg = "Error occurred establishing the DB connection .";
log.error(msg, e);
} catch (TrackerManagementDAOException e) {
String msg="Could not add the traccar group";
log.error(msg, e);
} finally{
TrackerManagementDAOFactory.closeConnection();
} }
}else{ }else{
JSONObject payload = payload(deviceInfo); log.error("Something went wrong_2: " + result);
String context = defaultPort+"/api/devices";
Runnable trackerExecutor = new TrackerExecutor(deviceInfo.getId(), tenantId, endpoint, context, payload,
TraccarHandlerConstants.Methods.PUT, TraccarHandlerConstants.Types.DEVICE);
executor.execute(trackerExecutor);
} }
} }
//executor.shutdown();
private JSONObject payload(TraccarDevice deviceInfo){
JSONObject payload = new JSONObject();
payload.put("name", deviceInfo.getDeviceName());
payload.put("uniqueId", deviceInfo.getUniqueId());
payload.put("status", deviceInfo.getStatus());
payload.put("disabled", deviceInfo.getDisabled());
payload.put("lastUpdate", deviceInfo.getLastUpdate());
payload.put("positionId", deviceInfo.getPositionId());
payload.put("groupId", deviceInfo.getGroupId());
payload.put("phone", deviceInfo.getPhone());
payload.put("model", deviceInfo.getModel());
payload.put("contact", deviceInfo.getContact());
payload.put("category", deviceInfo.getCategory());
List<String> geoFenceIds = new ArrayList<>();
payload.put("geofenceIds", geoFenceIds);
payload.put("attributes", new JSONObject());
return payload;
} }
/** /**
* Add Device GPS Location operation. * Add Device GPS Location operation.
* @param deviceInfo with DeviceIdentifier, Timestamp, Lat, Lon, Bearing, Speed, ignition * @param deviceInfo with DeviceIdentifier, Timestamp, Lat, Lon, Bearing, Speed, ignition
*/ */
public void updateLocation(TraccarDevice device, TraccarPosition deviceInfo, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException { public void updateLocation(TraccarDevice device, TraccarPosition deviceInfo, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException {
TrackerDeviceInfo res = null; TrackerDeviceInfo trackerDeviceInfo = null;
try { try {
TrackerManagementDAOFactory.openConnection(); TrackerManagementDAOFactory.openConnection();
res = trackerDAO.getTrackerDevice(device.getId(), tenantId); trackerDeviceInfo = trackerDAO.getTrackerDevice(device.getId(), tenantId);
log.info(trackerDeviceInfo);
} catch (SQLException e) { } catch (SQLException e) {
String msg = "Error occurred establishing the DB connection ."; String msg = "Error occurred establishing the DB connection .";
log.error(msg, e); log.error(msg, e);
throw new TraccarConfigurationException(msg, e);
} catch (TrackerManagementDAOException e) { } catch (TrackerManagementDAOException e) {
String msg="Could add new device location"; String msg="Could not add new device location";
log.error(msg, e); log.error(msg, e);
throw new TraccarConfigurationException(msg, e);
} finally{ } finally{
TrackerManagementDAOFactory.closeConnection(); TrackerManagementDAOFactory.closeConnection();
} }
if (res == null){ //check if the device is already exist before updating the location
try { if (trackerDeviceInfo == null){
//add device if not exist
log.info(trackerDeviceInfo);
addDevice(device, tenantId); addDevice(device, tenantId);
} catch (TraccarConfigurationException e) {
String msg = "Error occurred add the new device";
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{ }else{
String context = locationUpdatePort+"/?id="+deviceInfo.getDeviceIdentifier()+"&timestamp="+deviceInfo.getTimestamp()+ //Update Location
"&lat="+deviceInfo.getLat()+"&lon="+deviceInfo.getLon()+"&bearing="+deviceInfo.getBearing()+ String method = TraccarHandlerConstants.Methods.GET;
String url = locationUpdatePort+"/?id="+deviceInfo.getDeviceIdentifier()+
"&timestamp="+deviceInfo.getTimestamp()+"&lat="+deviceInfo.getLat()+
"&lon="+deviceInfo.getLon()+"&bearing="+deviceInfo.getBearing()+
"&speed="+deviceInfo.getSpeed()+"&ignition=true"; "&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");
}
executor.submit(new OkHttpClientThreadPool(url, null, method));
//executor.shutdown();
}
} }
/** /**
@ -437,36 +423,54 @@ public class TraccarClientImpl implements TraccarClient {
* @param deviceId identified via deviceIdentifier * @param deviceId identified via deviceIdentifier
* @throws TraccarConfigurationException Failed while dis-enroll a Traccar Device operation * @throws TraccarConfigurationException Failed while dis-enroll a Traccar Device operation
*/ */
public void disEndrollDevice(int deviceId, int tenantId) throws TraccarConfigurationException { public void disEnrollDevice(int deviceId, int tenantId) throws TraccarConfigurationException {
TrackerDeviceInfo res = null; TrackerDeviceInfo trackerDeviceInfo = null;
JSONObject obj = null; TrackerPermissionInfo trackerPermissionInfo = null;
JSONObject trackerDevice = null;
try { try {
TrackerManagementDAOFactory.beginTransaction(); TrackerManagementDAOFactory.beginTransaction();
res = trackerDAO.getTrackerDevice(deviceId, tenantId); trackerDeviceInfo = trackerDAO.getTrackerDevice(deviceId, tenantId);
if(res!=null){ trackerPermissionInfo = trackerDAO.getUserIdofPermissionByDeviceId(deviceId);
obj = new JSONObject(res); if(trackerDeviceInfo!=null){
if(obj!=null){ trackerDevice = new JSONObject(trackerDeviceInfo);
trackerDAO.removeTrackerDevice(deviceId, tenantId); trackerDAO.removeTrackerDevice(deviceId, tenantId);
TrackerManagementDAOFactory.commitTransaction(); TrackerManagementDAOFactory.commitTransaction();
}
} }
} catch (TransactionManagementException e) { } catch (TransactionManagementException e) {
TrackerManagementDAOFactory.rollbackTransaction(); TrackerManagementDAOFactory.rollbackTransaction();
String msg = "Error occurred establishing the DB connection"; String msg = "Error occurred establishing the DB connection";
log.error(msg, e); log.error(msg, e);
throw new TraccarConfigurationException(msg, e);
} catch (TrackerManagementDAOException e) { } catch (TrackerManagementDAOException e) {
TrackerManagementDAOFactory.rollbackTransaction(); TrackerManagementDAOFactory.rollbackTransaction();
String msg = "Error occurred while mapping with deviceId"; String msg = "Error occurred while mapping with deviceId";
log.error(msg, e); log.error(msg, e);
throw new TraccarConfigurationException(msg, e);
} finally { } finally {
TrackerManagementDAOFactory.closeConnection(); TrackerManagementDAOFactory.closeConnection();
} }
if(obj != null){ //Delete from traccar
String context = defaultPort+"/api/devices/"+obj.getInt("traccarDeviceId"); if(trackerDevice!=null){
Runnable trackerExecutor = new TrackerExecutor(obj.getInt("traccarDeviceId"), tenantId, endpoint, context, null, String method = TraccarHandlerConstants.Methods.DELETE;
TraccarHandlerConstants.Methods.DELETE, TraccarHandlerConstants.Types.DEVICE); String url = defaultPort+"/api/devices/"+trackerDevice.getInt("traccarDeviceId");
executor.execute(trackerExecutor); executor.submit(new OkHttpClientThreadPool(url, null, method));
//executor.shutdown();
//remove permissions
log.info(new Gson().toJson(trackerPermissionInfo));
log.info(trackerPermissionInfo);
if(trackerPermissionInfo!=null){
try {
removePermission(trackerPermissionInfo.getTraccarUserId(),deviceId);
} catch (ExecutionException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
} }
} }
@ -475,18 +479,19 @@ public class TraccarClientImpl implements TraccarClient {
* @param groupInfo with groupName * @param groupInfo with groupName
* @throws TraccarConfigurationException Failed while add Traccar Device the operation * @throws TraccarConfigurationException Failed while add Traccar Device the operation
*/ */
public void addGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException { public void addGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws
TrackerGroupInfo res = null; TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException {
TrackerGroupInfo trackerGroupInfo = null;
try { try {
TrackerManagementDAOFactory.openConnection(); TrackerManagementDAOFactory.openConnection();
res = trackerDAO.getTrackerGroup(groupId, tenantId); trackerGroupInfo = trackerDAO.getTrackerGroup(groupId, tenantId);
if (res!=null){ if (trackerGroupInfo!=null){
String msg = "The group already exit"; String msg = "The group already exit";
log.error(msg); log.error(msg);
throw new TrackerAlreadyExistException(msg); throw new TrackerAlreadyExistException(msg);
} }
} catch (TrackerManagementDAOException e) { } catch (TrackerManagementDAOException e) {
String msg = "Error occurred while mapping with deviceId ."; String msg = "Error occurred while mapping with groupId.";
log.error(msg, e); log.error(msg, e);
throw new TraccarConfigurationException(msg, e); throw new TraccarConfigurationException(msg, e);
} catch (SQLException e) { } catch (SQLException e) {
@ -497,16 +502,48 @@ public class TraccarClientImpl implements TraccarClient {
TrackerManagementDAOFactory.closeConnection(); TrackerManagementDAOFactory.closeConnection();
} }
if (res==null){
JSONObject payload = new JSONObject(); JSONObject payload = new JSONObject();
payload.put("name", groupInfo.getName()); payload.put("name", groupInfo.getName());
payload.put("attributes", new JSONObject()); payload.put("attributes", new JSONObject());
String context = defaultPort+"/api/groups"; String method = TraccarHandlerConstants.Methods.POST;
Runnable trackerExecutor = new TrackerExecutor(groupId, tenantId, endpoint, context, payload, String url = defaultPort+"/api/groups";
TraccarHandlerConstants.Methods.POST, TraccarHandlerConstants.Types.GROUP);
executor.execute(trackerExecutor); Future<String> res = executor.submit(new OkHttpClientThreadPool(url, payload, method));
String result = res.get();
if(result.charAt(0)=='{'){
JSONObject obj = new JSONObject(result);
if (obj.has("id")){
int traccarGroupId = obj.getInt("id");
try {
TrackerManagementDAOFactory.beginTransaction();
trackerDAO.addTrackerGroup(traccarGroupId, groupId, tenantId);
trackerGroupInfo = trackerDAO.getTrackerGroup(groupId, tenantId);
if(trackerGroupInfo.getStatus()==0){
trackerDAO.updateTrackerGroupIdANDStatus(trackerGroupInfo.getTraccarGroupId(), groupId, tenantId, 1);
} }
} catch (TrackerManagementDAOException e) {
String msg = "Error occurred while mapping with deviceId .";
log.error(msg, e);
TrackerManagementDAOFactory.rollbackTransaction();
throw new TraccarConfigurationException(msg, e);
} catch (TransactionManagementException e) {
String msg = "Error occurred establishing the DB connection .";
log.error(msg, e);
TrackerManagementDAOFactory.rollbackTransaction();
throw new TraccarConfigurationException(msg, e);
} finally {
TrackerManagementDAOFactory.closeConnection();
}
}else{
log.error("Something went wrong_1: " + result);
}
}else{
log.error("Something went wrong_2: " + result);
}
//executor.shutdown();
} }
/** /**
@ -514,7 +551,8 @@ public class TraccarClientImpl implements TraccarClient {
* @param groupInfo with groupName * @param groupInfo with groupName
* @throws TraccarConfigurationException Failed while add Traccar Device the operation * @throws TraccarConfigurationException Failed while add Traccar Device the operation
*/ */
public void updateGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException { public void updateGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws
TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException {
TrackerGroupInfo res = null; TrackerGroupInfo res = null;
try { try {
TrackerManagementDAOFactory.openConnection(); TrackerManagementDAOFactory.openConnection();
@ -531,29 +569,23 @@ public class TraccarClientImpl implements TraccarClient {
if ((res==null) || (res.getTraccarGroupId()==0)){ if ((res==null) || (res.getTraccarGroupId()==0)){
//add a new traccar group //add a new traccar group
try {
addGroup(groupInfo, groupId, tenantId); 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 if (res!=null && (res.getTraccarGroupId()!=0 && res.getStatus()==0)){ }else if (res!=null && (res.getTraccarGroupId()!=0 && res.getStatus()==0)){
//update the traccargroupId and status //update the traccargroupId and status
try { try {
TrackerManagementDAOFactory.beginTransaction(); TrackerManagementDAOFactory.beginTransaction();
trackerDAO.updateTrackerGroupIdANDStatus(res.getTraccarGroupId(), groupId, tenantId, 1); trackerDAO.updateTrackerGroupIdANDStatus(res.getTraccarGroupId(), groupId, tenantId, 1);
TrackerManagementDAOFactory.commitTransaction(); TrackerManagementDAOFactory.commitTransaction();
} catch (TrackerManagementDAOException e) {
TrackerManagementDAOFactory.rollbackTransaction();
String msg="Could not update the traccar group";
log.error(msg, e);
throw new TraccarConfigurationException(msg, e);
} catch (TransactionManagementException e) { } catch (TransactionManagementException e) {
TrackerManagementDAOFactory.rollbackTransaction();
String msg = "Error occurred establishing the DB connection ."; String msg = "Error occurred establishing the DB connection .";
log.error(msg, e); log.error(msg, e);
} catch (TrackerManagementDAOException e) { throw new TraccarConfigurationException(msg, e);
String msg="Could not add the traccar group";
log.error(msg, e);
} finally{ } finally{
TrackerManagementDAOFactory.closeConnection(); TrackerManagementDAOFactory.closeConnection();
} }
@ -564,10 +596,11 @@ public class TraccarClientImpl implements TraccarClient {
payload.put("name", groupInfo.getName()); payload.put("name", groupInfo.getName());
payload.put("attributes", new JSONObject()); payload.put("attributes", new JSONObject());
String context = defaultPort+"/api/groups/"+obj.getInt("traccarGroupId"); String method = TraccarHandlerConstants.Methods.PUT;
Runnable trackerExecutor = new TrackerExecutor(groupId, tenantId, endpoint, context, payload, String url = defaultPort+"/api/groups/"+obj.getInt("traccarGroupId");
TraccarHandlerConstants.Methods.PUT, TraccarHandlerConstants.Types.GROUP);
executor.execute(trackerExecutor); executor.submit(new OkHttpClientThreadPool(url, payload, method));
//executor.shutdown();
} }
} }
@ -576,7 +609,7 @@ public class TraccarClientImpl implements TraccarClient {
* @param groupId * @param groupId
* @throws TraccarConfigurationException Failed while add Traccar Device the operation * @throws TraccarConfigurationException Failed while add Traccar Device the operation
*/ */
public void deleteGroup(int groupId, int tenantId) throws TraccarConfigurationException { public void deleteGroup(int groupId, int tenantId) throws TraccarConfigurationException, ExecutionException, InterruptedException {
TrackerGroupInfo res = null; TrackerGroupInfo res = null;
JSONObject obj = null; JSONObject obj = null;
try { try {
@ -587,6 +620,12 @@ public class TraccarClientImpl implements TraccarClient {
if(obj!=null){ if(obj!=null){
trackerDAO.removeTrackerGroup(obj.getInt("id")); trackerDAO.removeTrackerGroup(obj.getInt("id"));
TrackerManagementDAOFactory.commitTransaction(); TrackerManagementDAOFactory.commitTransaction();
String method = TraccarHandlerConstants.Methods.DELETE;
String url = defaultPort+"/api/groups/"+obj.getInt("traccarGroupId");
executor.submit(new OkHttpClientThreadPool(url, null, method));
//executor.shutdown();
} }
} }
} catch (TransactionManagementException e) { } catch (TransactionManagementException e) {
@ -600,66 +639,6 @@ public class TraccarClientImpl implements TraccarClient {
} finally { } finally {
TrackerManagementDAOFactory.closeConnection(); TrackerManagementDAOFactory.closeConnection();
} }
if(obj!=null){
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);
}
}
public void fetchAllUsers(String type, TraccarUser traccarUser, int deviceId) throws TraccarConfigurationException {
String context = defaultPort+"/api/users/";
JSONObject payload = new JSONObject();
payload.put("data", traccarUser);
Runnable trackerExecutor = new TrackerExecutor(deviceId, 0, endpoint, context,
payload, TraccarHandlerConstants.Methods.GET, type);
executor.execute(trackerExecutor);
}
private JSONObject TraccarUserPayload(TraccarUser traccarUser){
JSONObject payload = new JSONObject();
payload.put("name", traccarUser.getName());
payload.put("login", traccarUser.getLogin());
payload.put("email", traccarUser.getEmail());
payload.put("password", traccarUser.getPassword());
payload.put("token", traccarUser.getToken());
payload.put("administrator", traccarUser.getAdministrator());
payload.put("deviceLimit", traccarUser.getDeviceLimit());
payload.put("userLimit", traccarUser.getUserLimit());
payload.put("disabled", traccarUser.getDisabled());
payload.put("deviceReadonly", traccarUser.getDeviceReadonly());
return payload;
}
public void createUser(TraccarUser traccarUser, String type, int deviceId) throws TraccarConfigurationException {
JSONObject payload = TraccarUserPayload(traccarUser);
String context = defaultPort+"/api/users";
Runnable trackerExecutor = new TrackerExecutor(deviceId, 0, endpoint, context, payload,
TraccarHandlerConstants.Methods.POST, type);
executor.execute(trackerExecutor);
}
public void updateUser(JSONObject traccarUser) throws TraccarConfigurationException {
/*JSONObject payload = traccarUser;
String context = defaultPort+"/api/users";
Runnable trackerExecutor = new TrackerExecutor(0, 0, endpoint, context, payload,
TraccarHandlerConstants.Methods.PUT, TraccarHandlerConstants.Types.USER);
executor.execute(trackerExecutor);*/
}
public void setPermission(int userId, int deviceId) throws TraccarConfigurationException {
JSONObject payload = new JSONObject();
payload.put("userId", userId);
payload.put("deviceId", deviceId);
String context = defaultPort+"/api/permissions";
Runnable trackerExecutor = new TrackerExecutor(deviceId, 0, endpoint, context, payload,
TraccarHandlerConstants.Methods.POST, TraccarHandlerConstants.Types.PERMISSION);
executor.execute(trackerExecutor);
} }
public String generateRandomString(int len) { public String generateRandomString(int len) {

@ -0,0 +1,777 @@
/*
* Copyright (C) 2018 - 2022 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
*
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
*
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://entgra.io/licenses/entgra-commercial/1.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.traccar.api.service.addons;
import com.google.gson.Gson;
import okhttp3.ConnectionPool;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.mgt.common.TrackerDeviceInfo;
import org.wso2.carbon.device.mgt.common.TrackerGroupInfo;
import org.wso2.carbon.device.mgt.common.exceptions.TrackerAlreadyExistException;
import org.wso2.carbon.device.mgt.common.exceptions.TransactionManagementException;
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.dao.TrackerManagementDAOFactory;
import org.wso2.carbon.device.mgt.core.traccar.api.service.TraccarClient;
import org.wso2.carbon.device.mgt.core.traccar.common.TraccarHandlerConstants;
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;
import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarUser;
import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException;
import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarGateway;
import org.wso2.carbon.device.mgt.core.traccar.common.util.TraccarUtil;
import org.wso2.carbon.device.mgt.core.traccar.core.config.TraccarConfigurationManager;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Date;
import java.util.Objects;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class TraccarClientImplCopy /*implements TraccarClient*/ {
private static final Log log = LogFactory.getLog(TraccarClientImplCopy.class);
private static final int THREAD_POOL_SIZE = 50;
private final OkHttpClient client;
private final ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
final TraccarGateway traccarGateway = getTraccarGateway();
final String endpoint = traccarGateway.getPropertyByName(TraccarHandlerConstants.TraccarConfig.ENDPOINT).getValue();
final String authorization = traccarGateway.getPropertyByName(TraccarHandlerConstants.TraccarConfig.AUTHORIZATION).getValue();
final String authorizationKey = traccarGateway.getPropertyByName(TraccarHandlerConstants.TraccarConfig.AUTHORIZATION_KEY).getValue();
final String defaultPort = traccarGateway.getPropertyByName(TraccarHandlerConstants.TraccarConfig.DEFAULT_PORT).getValue();
final String locationUpdatePort = traccarGateway.getPropertyByName(TraccarHandlerConstants.TraccarConfig.LOCATION_UPDATE_PORT).getValue();
final String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
private final TrackerDAO trackerDAO;
public TraccarClientImplCopy() {
client = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(45, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(50,30,TimeUnit.SECONDS))
.build();
this.trackerDAO = TrackerManagementDAOFactory.getTrackerDAO();
}
private class TrackerExecutor implements Runnable {
final int deviceId;
final int groupId;
final int tenantId;
final JSONObject payload;
final String context;
final String publisherUrl;
private final String method;
private final String type;
private TrackerExecutor(int id, int tenantId, String publisherUrl, String context, JSONObject payload,
String method, String type) {
this.deviceId = id;
this.groupId = id;
this.tenantId = tenantId;
this.payload = payload;
this.context = context;
this.publisherUrl = publisherUrl;
this.method = method;
this.type = type;
}
public void run() {
RequestBody requestBody;
Request.Builder builder = new Request.Builder();
Request request;
Response response;
if(Objects.equals(method, TraccarHandlerConstants.Methods.POST)){
requestBody = RequestBody.create(payload.toString(), MediaType.parse("application/json; charset=utf-8"));
builder = builder.post(requestBody);
}else if(Objects.equals(method, TraccarHandlerConstants.Methods.PUT)){
requestBody = RequestBody.create(payload.toString(), MediaType.parse("application/json; charset=utf-8"));
builder = builder.put(requestBody);
}else if(Objects.equals(method, TraccarHandlerConstants.Methods.DELETE)){
builder = builder.delete();
}
request = builder.url(publisherUrl + context).addHeader(authorization, authorizationKey).build();
String msg;
try {
response = client.newCall(request).execute();
if(Objects.equals(method, TraccarHandlerConstants.Methods.POST)){
String result = response.body().string();
log.info(result);
if(Objects.equals(type, TraccarHandlerConstants.Types.PERMISSION)){
if(result.equals("")){
msg ="Successfully the device is assigned to the user";
}else{
msg = "Error occurred while fetching users .";
}
log.info(msg);
}else if(result.charAt(0)=='{'){
JSONObject obj = new JSONObject(result);
if (obj.has("id")){
int traccarId = obj.getInt("id");
try {
TrackerManagementDAOFactory.beginTransaction();
if(Objects.equals(type, TraccarHandlerConstants.Types.DEVICE)){
trackerDAO.addTrackerDevice(traccarId, deviceId, tenantId);
TrackerDeviceInfo res = trackerDAO.getTrackerDevice(deviceId, tenantId);
if(res.getStatus()==0){
trackerDAO.updateTrackerDeviceIdANDStatus(res.getTraccarDeviceId(), deviceId, tenantId, 1);
TraccarUser traccarUser = new TraccarUser();
traccarUser.setName(username);
traccarUser.setLogin(username);
traccarUser.setEmail(username);
traccarUser.setPassword(generateRandomString(10));
traccarUser.setToken(generateRandomString(32));
traccarUser.setDeviceLimit(-1);
log.info("=============="+new Gson().toJson(traccarUser)+"==============");
//device is available
//device is not available
//user is available
//user is not available
fetchAllUsers(TraccarHandlerConstants.Types.USER_CREATE_WITH_INSERT_DEVICE, traccarUser, traccarId);
}
}else if(Objects.equals(type, TraccarHandlerConstants.Types.GROUP)){
trackerDAO.addTrackerGroup(traccarId, groupId, tenantId);
TrackerGroupInfo res = trackerDAO.getTrackerGroup(groupId, tenantId);
if(res.getStatus()==0){
trackerDAO.updateTrackerGroupIdANDStatus(res.getTraccarGroupId(), groupId, tenantId, 1);
}
}else if(Objects.equals(type, TraccarHandlerConstants.Types.USER_CREATE)){
log.info("=============User inserted=============");
}else if(Objects.equals(type, TraccarHandlerConstants.Types.USER_CREATE_WITH_INSERT_DEVICE)){
int userId = traccarId;
log.info("=============User inserted and setting to create session=============");
setPermission(userId, deviceId);
}
TrackerManagementDAOFactory.commitTransaction();
} catch (JSONException e) {
TrackerManagementDAOFactory.rollbackTransaction();
msg = "Error occurred on JSON object .";
log.error(msg, e);
} catch (TransactionManagementException e) {
TrackerManagementDAOFactory.rollbackTransaction();
msg = "Error occurred establishing the DB connection .";
log.error(msg, e);
} catch (TrackerManagementDAOException e) {
TrackerManagementDAOFactory.rollbackTransaction();
msg = null;
switch (type) {
case TraccarHandlerConstants.Types.DEVICE:
msg = "Already device with deviceId " + deviceId + " exists";
break;
case TraccarHandlerConstants.Types.GROUP:
msg = "Already the group with groupId - " + groupId + " exists!";
break;
case TraccarHandlerConstants.Types.USER:
msg = "Error occurred while fetching users.";
break;
case TraccarHandlerConstants.Types.PERMISSION:
msg = "Error occurred while assigning the device to the user." + traccarId + deviceId;
break;
}
log.error(msg, e);
} finally {
TrackerManagementDAOFactory.closeConnection();
}
}
response.close();
}
if (log.isDebugEnabled()) {
log.debug("Successfully the request is proceed and communicated with Traccar");
}
}else if(Objects.equals(method, TraccarHandlerConstants.Methods.GET)){
if(!Objects.equals(type, TraccarHandlerConstants.Types.DEVICE)){
response = client.newCall(request).execute();
String result = response.body().string();
JSONArray fetchAllUsers = new JSONArray(result);
int userAvailability = 0;
int userId = 0;
for(int i=0; i<fetchAllUsers.length();i++){
if(fetchAllUsers.getJSONObject(i).getString("login").equals(username)){
//TODO :: when user is available then assgin the device to the user
userAvailability=1;
log.info(fetchAllUsers.getJSONObject(i));
log.info(new Gson().toJson(fetchAllUsers.getJSONObject(i)));
log.info("Token: "+fetchAllUsers.getJSONObject(i).getString("token"));
userId = fetchAllUsers.getJSONObject(i).getInt("id");
break;
}
}
if(Objects.equals(type, TraccarHandlerConstants.Types.USER_CREATE_WITH_INSERT_DEVICE)){
if(userAvailability==0){
log.info("============");
log.info("Creating User");
TraccarUser traccarUser = (TraccarUser) payload.get("data");
log.info(traccarUser);
log.info("============");
createUser(traccarUser, type, deviceId);
}else{
if(userId!=0){
log.info("=============");
log.info("User inserted and setting to create session");
log.info("=============");
setPermission(userId, deviceId);
}else{
log.info("UserId is null");
}
}
}else if(Objects.equals(type, TraccarHandlerConstants.Types.USER_CREATE)){
/*if(userAvailability==1){
log.info("Update User");
log.info(payload);
log.info(new Gson().toJson(payload));
updateUser(payload);
log.info("Update User");
}*/
}
}
}
} catch (IOException | TraccarConfigurationException e) {
log.error("Couldnt connect to traccar.", e);
}
}
}
/**
* Add Traccar Device operation.
* @param deviceInfo with DeviceName UniqueId, Status, Disabled LastUpdate, PositionId, GroupId
* Model, Contact, Category, fenceIds
* @throws TraccarConfigurationException Failed while add Traccar Device the operation
*/
public void addDevice(TraccarDevice deviceInfo, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException {
try {
TrackerManagementDAOFactory.openConnection();
TrackerDeviceInfo res = trackerDAO.getTrackerDevice(deviceInfo.getId(), tenantId);
if(res!=null){
String msg = "The device already exist";
log.error(msg);
throw new TrackerAlreadyExistException(msg);
}
} 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 = TraccarUtil.TraccarDevicePayload(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);
}
/**
* update Traccar Device operation.
* @param deviceInfo with DeviceName UniqueId, Status, Disabled LastUpdate, PositionId, GroupId
* Model, Contact, Category, fenceIds
* @throws TraccarConfigurationException Failed while add Traccar Device the operation
*/
public void updateDevice(TraccarDevice deviceInfo, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException {
TrackerDeviceInfo res = null;
String msg;
try {
TrackerManagementDAOFactory.openConnection();
res = trackerDAO.getTrackerDevice(deviceInfo.getId(), tenantId);
} catch (TrackerManagementDAOException e) {
msg = "Error occurred while mapping with deviceId .";
log.error(msg, e);
throw new TraccarConfigurationException(msg, e);
} catch (SQLException e) {
msg = "Error occurred establishing the DB connection .";
log.error(msg, e);
throw new TraccarConfigurationException(msg, e);
} finally {
TrackerManagementDAOFactory.closeConnection();
}
if ((res==null) || (res.getTraccarDeviceId()==0)){
try {
String lastUpdatedTime = String.valueOf((new Date().getTime()));
deviceInfo.setLastUpdate(lastUpdatedTime);
addDevice(deviceInfo, tenantId);
} catch (TraccarConfigurationException e) {
msg = "Error occurred while mapping with groupId";
log.error(msg, e);
throw new TraccarConfigurationException(msg, e);
} catch (TrackerAlreadyExistException e) {
msg = "The group already exist";
log.error(msg, e);
throw new TrackerAlreadyExistException(msg, e);
}
}else if (res!=null && (res.getTraccarDeviceId()!=0 && res.getStatus()==0)){
//update the traccarGroupId and status
try {
TrackerManagementDAOFactory.beginTransaction();
trackerDAO.updateTrackerDeviceIdANDStatus(res.getTraccarDeviceId(), deviceInfo.getId(), tenantId, 1);
TrackerManagementDAOFactory.commitTransaction();
} catch (TransactionManagementException e) {
msg = "Error occurred establishing the DB connection .";
log.error(msg, e);
} catch (TrackerManagementDAOException e) {
msg="Could not add the traccar group";
log.error(msg, e);
} finally{
TrackerManagementDAOFactory.closeConnection();
}
}else{
JSONObject payload = TraccarUtil.TraccarDevicePayload(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);
}
}
/*private JSONObject TraccarDevicePayload(TraccarDevice deviceInfo){
JSONObject payload = new JSONObject();
payload.put("name", deviceInfo.getDeviceName());
payload.put("uniqueId", deviceInfo.getUniqueId());
payload.put("status", deviceInfo.getStatus());
payload.put("disabled", deviceInfo.getDisabled());
payload.put("lastUpdate", deviceInfo.getLastUpdate());
payload.put("positionId", deviceInfo.getPositionId());
payload.put("groupId", deviceInfo.getGroupId());
payload.put("phone", deviceInfo.getPhone());
payload.put("model", deviceInfo.getModel());
payload.put("contact", deviceInfo.getContact());
payload.put("category", deviceInfo.getCategory());
List<String> geoFenceIds = new ArrayList<>();
payload.put("geofenceIds", geoFenceIds);
payload.put("attributes", new JSONObject());
return payload;
}*/
/**
* Add Device GPS Location operation.
* @param deviceInfo with DeviceIdentifier, Timestamp, Lat, Lon, Bearing, Speed, ignition
*/
public void updateLocation(TraccarDevice device, TraccarPosition deviceInfo, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException {
TrackerDeviceInfo res = null;
try {
TrackerManagementDAOFactory.openConnection();
res = trackerDAO.getTrackerDevice(device.getId(), tenantId);
} catch (SQLException e) {
String msg = "Error occurred establishing the DB connection .";
log.error(msg, e);
} catch (TrackerManagementDAOException e) {
String msg="Could add new device location";
log.error(msg, e);
} finally{
TrackerManagementDAOFactory.closeConnection();
}
if (res == null){
try {
addDevice(device, tenantId);
} catch (TraccarConfigurationException e) {
String msg = "Error occurred add the new device";
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()+"&timestamp="+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 deviceId identified via deviceIdentifier
* @throws TraccarConfigurationException Failed while dis-enroll a Traccar Device operation
*/
public void disEndrollDevice(int deviceId, int tenantId) throws TraccarConfigurationException {
TrackerDeviceInfo res = null;
JSONObject obj = null;
try {
TrackerManagementDAOFactory.beginTransaction();
res = trackerDAO.getTrackerDevice(deviceId, tenantId);
if(res!=null){
obj = new JSONObject(res);
if(obj!=null){
trackerDAO.removeTrackerDevice(deviceId, tenantId);
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);
} finally {
TrackerManagementDAOFactory.closeConnection();
}
if(obj != null){
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);
}
}
/**
* Add Traccar Device operation.
* @param groupInfo with groupName
* @throws TraccarConfigurationException Failed while add Traccar Device the operation
*/
public void addGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException {
TrackerGroupInfo res = null;
try {
TrackerManagementDAOFactory.openConnection();
res = trackerDAO.getTrackerGroup(groupId, tenantId);
if (res!=null){
String msg = "The group already exit";
log.error(msg);
throw new TrackerAlreadyExistException(msg);
}
} 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();
}
log.info("response.body().string()");
try {
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
Request request = new Request.Builder()
.url("http://localhost/?token=b2zNFM9CvXAaHVxaQcLw22GgCXnaluy9")
.method("GET", null)
.build();
Response response = client.newCall(request).execute();
log.info(response.body().string());
/*Desktop desktop = java.awt.Desktop.getDesktop();
URI oURL = new URI("http://localhost:8085");
desktop.browse(oURL);*/
} catch (IOException e) {
log.info("IOException e" +e);
} catch (Exception e) {
log.info("Exception e" +e );
}
log.info("response.body().string()");
if (res==null){
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);
}
}
/**
* update Traccar Group operation.
* @param groupInfo with groupName
* @throws TraccarConfigurationException Failed while add Traccar Device the operation
*/
public void updateGroup(TraccarGroups groupInfo, int groupId, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException {
TrackerGroupInfo res = null;
try {
TrackerManagementDAOFactory.openConnection();
res = trackerDAO.getTrackerGroup(groupId, tenantId);
} catch (SQLException e) {
String msg = "Error occurred establishing the DB connection .";
log.error(msg, e);
} catch (TrackerManagementDAOException e) {
String msg="Could not find traccar group details";
log.error(msg, e);
} finally{
TrackerManagementDAOFactory.closeConnection();
}
if ((res==null) || (res.getTraccarGroupId()==0)){
//add a new traccar group
try {
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 if (res!=null && (res.getTraccarGroupId()!=0 && res.getStatus()==0)){
//update the traccargroupId and status
try {
TrackerManagementDAOFactory.beginTransaction();
trackerDAO.updateTrackerGroupIdANDStatus(res.getTraccarGroupId(), groupId, tenantId, 1);
TrackerManagementDAOFactory.commitTransaction();
} catch (TransactionManagementException e) {
String msg = "Error occurred establishing the DB connection .";
log.error(msg, e);
} catch (TrackerManagementDAOException e) {
String msg="Could not add the traccar group";
log.error(msg, e);
} finally{
TrackerManagementDAOFactory.closeConnection();
}
}else{
JSONObject obj = new JSONObject(res);
JSONObject payload = new JSONObject();
payload.put("id", obj.getInt("traccarGroupId"));
payload.put("name", groupInfo.getName());
payload.put("attributes", new JSONObject());
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);
}
}
/**
* Add Traccar Device operation.
* @param groupId
* @throws TraccarConfigurationException Failed while add Traccar Device the operation
*/
public void deleteGroup(int groupId, int tenantId) throws TraccarConfigurationException {
TrackerGroupInfo res = null;
JSONObject obj = null;
try {
TrackerManagementDAOFactory.beginTransaction();
res = trackerDAO.getTrackerGroup(groupId, tenantId);
if(res!=null){
obj = new JSONObject(res);
if(obj!=null){
trackerDAO.removeTrackerGroup(obj.getInt("id"));
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);
} finally {
TrackerManagementDAOFactory.closeConnection();
}
if(obj!=null){
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);
}
}
public void fetchAllUsers(String type, TraccarUser traccarUser, int deviceId) throws TraccarConfigurationException {
String context = defaultPort+"/api/users/";
JSONObject payload = new JSONObject();
payload.put("data", traccarUser);
Runnable trackerExecutor = new TrackerExecutor(deviceId, 0, endpoint, context,
payload, TraccarHandlerConstants.Methods.GET, type);
executor.execute(trackerExecutor);
}
/*private JSONObject TraccarUserPayload(TraccarUser traccarUser){
JSONObject payload = new JSONObject();
payload.put("id", traccarUser.getId());
payload.put("name", traccarUser.getName());
payload.put("login", traccarUser.getLogin());
payload.put("email", traccarUser.getEmail());
payload.put("password", traccarUser.getPassword());
payload.put("token", traccarUser.getToken());
payload.put("administrator", traccarUser.getAdministrator());
payload.put("deviceLimit", traccarUser.getDeviceLimit());
payload.put("userLimit", traccarUser.getUserLimit());
payload.put("disabled", traccarUser.getDisabled());
payload.put("deviceReadonly", traccarUser.getDeviceReadonly());
payload.put("readonly", traccarUser.getReadonly());
payload.put("expirationTime", traccarUser.getExpirationTime());
return payload;
}*/
public void createUser(TraccarUser traccarUser, String type, int deviceId) throws TraccarConfigurationException {
JSONObject payload = TraccarUtil.TraccarUserPayload(traccarUser);
String context = defaultPort+"/api/users";
Runnable trackerExecutor = new TrackerExecutor(deviceId, 0, endpoint, context, payload,
TraccarHandlerConstants.Methods.POST, type);
executor.execute(trackerExecutor);
}
public void updateUser(JSONObject traccarUser) throws TraccarConfigurationException {
/*JSONObject payload = traccarUser;
String context = defaultPort+"/api/users";
Runnable trackerExecutor = new TrackerExecutor(0, 0, endpoint, context, payload,
TraccarHandlerConstants.Methods.PUT, TraccarHandlerConstants.Types.USER);
executor.execute(trackerExecutor);*/
}
public void setPermission(int userId, int deviceId) throws TraccarConfigurationException {
JSONObject payload = new JSONObject();
payload.put("userId", userId);
payload.put("deviceId", deviceId);
String context = defaultPort+"/api/permissions";
Runnable trackerExecutor = new TrackerExecutor(deviceId, 0, endpoint, context, payload,
TraccarHandlerConstants.Methods.POST, TraccarHandlerConstants.Types.PERMISSION);
executor.execute(trackerExecutor);
}
public String fetchAllUsers() {
OkHttpClient client = new OkHttpClient().newBuilder().build();
Request request = new Request.Builder()
.url(endpoint+defaultPort+"/api/users")
.method("GET", null)
.addHeader(authorization, authorizationKey)
.build();
try {
Response response = client.newCall(request).execute();
return response.body().string();
} catch (IOException e) {
return e.toString();
}
}
public String fetchUserInfo(String userName) throws TraccarConfigurationException {
String allUsers = fetchAllUsers(); //get all users
JSONArray fetchAllUsers = new JSONArray(allUsers); //loop users
for(int i=0; i<fetchAllUsers.length();i++){
//if login is null then check the name or if login is not null then check the login
if(
(!fetchAllUsers.getJSONObject(i).isNull("login") &&
fetchAllUsers.getJSONObject(i).getString("login").equals(userName)) ||
(fetchAllUsers.getJSONObject(i).isNull("login") &&
fetchAllUsers.getJSONObject(i).getString("name").equals(userName))
){
return fetchAllUsers.getJSONObject(i).toString();
}
}
return TraccarHandlerConstants.Types.USER_NOT_FOUND;
}
public String createUser(TraccarUser traccarUser) throws TraccarConfigurationException {
JSONObject payload = TraccarUtil.TraccarUserPayload(traccarUser);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(payload.toString(), mediaType);
Request request = new Request.Builder()
.url(endpoint+defaultPort+"/api/users")
.method("POST", body)
.addHeader(authorization, authorizationKey)
.build();
try {
Response response = client.newCall(request).execute();
return response.body().string();
} catch (IOException e) {
return e.toString();
}
}
public String updateUser(TraccarUser traccarUser, int userId) throws TraccarConfigurationException {
JSONObject payload = TraccarUtil.TraccarUserPayload(traccarUser);
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(payload.toString(), mediaType);
Request request = new Request.Builder()
.url(endpoint+defaultPort+"/api/users/"+userId)
.method("PUT", body)
.addHeader("Content-Type", "application/json")
.addHeader(authorization, authorizationKey)
.build();
try {
Response response = client.newCall(request).execute();
return response.body().string();
} catch (IOException e) {
return e.toString();
}
}
public String generateRandomString(int len) {
String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Random rnd = new Random();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++)
sb.append(chars.charAt(rnd.nextInt(chars.length())));
return sb.toString();
}
private TraccarGateway getTraccarGateway(){
return TraccarConfigurationManager.getInstance().getTraccarConfig().getTraccarGateway(
TraccarHandlerConstants.TraccarConfig.GATEWAY_NAME);
}
}

@ -21,6 +21,7 @@ package org.wso2.carbon.device.mgt.core.traccar.api.service.impl;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.json.JSONObject;
import org.wso2.carbon.device.mgt.common.Device; 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.device.details.DeviceLocation;
import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup;
@ -30,15 +31,17 @@ import org.wso2.carbon.device.mgt.core.traccar.api.service.addons.TraccarClientI
import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarDevice; 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.TraccarGroups;
import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarPosition; import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarPosition;
import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarUser;
import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException; import org.wso2.carbon.device.mgt.core.traccar.common.config.TraccarConfigurationException;
import java.util.Date; import java.util.Date;
import java.util.concurrent.ExecutionException;
public class DeviceAPIClientServiceImpl implements DeviceAPIClientService { public class DeviceAPIClientServiceImpl implements DeviceAPIClientService {
private static final Log log = LogFactory.getLog(DeviceAPIClientServiceImpl.class); private static final Log log = LogFactory.getLog(DeviceAPIClientServiceImpl.class);
public void addDevice(Device device, int tenantId) { public void addDevice(Device device, int tenantId) throws ExecutionException, InterruptedException {
TraccarClientImpl client = new TraccarClientImpl(); TraccarClientImpl client = new TraccarClientImpl();
String lastUpdatedTime = String.valueOf((new Date().getTime())); String lastUpdatedTime = String.valueOf((new Date().getTime()));
TraccarDevice traccarDevice = new TraccarDevice(device.getId(), device.getName(), device.getDeviceIdentifier(), TraccarDevice traccarDevice = new TraccarDevice(device.getId(), device.getName(), device.getDeviceIdentifier(),
@ -55,24 +58,7 @@ public class DeviceAPIClientServiceImpl implements DeviceAPIClientService {
} }
} }
public void updateDevice(Device device, int tenantId) { public void updateLocation(Device device, DeviceLocation deviceLocation, int tenantId) throws ExecutionException, InterruptedException {
TraccarClientImpl client = new TraccarClientImpl();
String lastUpdatedTime = String.valueOf((new Date().getTime()));
TraccarDevice traccarDeviceInfo = new TraccarDevice(device.getId(), device.getName(), device.getDeviceIdentifier(),
"online", "false", lastUpdatedTime, "", "", "", "",
"", "");
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, int tenantId) {
TraccarClientImpl client = new TraccarClientImpl(); TraccarClientImpl client = new TraccarClientImpl();
TraccarPosition traccarPosition = new TraccarPosition(device.getDeviceIdentifier(), TraccarPosition traccarPosition = new TraccarPosition(device.getDeviceIdentifier(),
deviceLocation.getUpdatedTime().getTime(), deviceLocation.getUpdatedTime().getTime(),
@ -94,52 +80,68 @@ public class DeviceAPIClientServiceImpl implements DeviceAPIClientService {
} }
} }
public void disEndrollDevice(int deviceId, int tenantId) { public void disEnrollDevice(int deviceId, int tenantId) {
TraccarClientImpl client = new TraccarClientImpl(); TraccarClientImpl client = new TraccarClientImpl();
try { try {
client.disEndrollDevice(deviceId, tenantId); client.disEnrollDevice(deviceId, tenantId);
} catch (TraccarConfigurationException e) { } catch (TraccarConfigurationException e) {
String msg = "Error occurred while mapping with deviceId"; String msg = "Error occurred while dis-enrolling the device";
log.error(msg, e); log.error(msg, e);
} }
} }
public void addGroup(DeviceGroup group, int groupId, int tenantId) { public void addGroup(DeviceGroup group, int groupId, int tenantId) throws
TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException {
TraccarClientImpl client = new TraccarClientImpl(); TraccarClientImpl client = new TraccarClientImpl();
TraccarGroups traccarGroups = new TraccarGroups(group.getName()); TraccarGroups traccarGroups = new TraccarGroups(group.getName());
try {
client.addGroup(traccarGroups, groupId, tenantId); 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 groupId, int tenantId) { public void updateGroup(DeviceGroup group, int groupId, int tenantId) throws TraccarConfigurationException, TrackerAlreadyExistException, ExecutionException, InterruptedException {
TraccarClientImpl client = new TraccarClientImpl(); TraccarClientImpl client = new TraccarClientImpl();
TraccarGroups traccarGroups = new TraccarGroups(group.getName()); TraccarGroups traccarGroups = new TraccarGroups(group.getName());
try {
client.updateGroup(traccarGroups, groupId, tenantId); 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 groupId, int tenantId) throws
TraccarConfigurationException, ExecutionException, InterruptedException {
TraccarClientImpl client = new TraccarClientImpl();
client.deleteGroup(groupId, tenantId);
} }
public void deleteGroup(int groupId, int tenantId) { public static String fetchUserInfo(String userName) throws
TraccarConfigurationException, ExecutionException, InterruptedException {
TraccarClientImpl client = new TraccarClientImpl();
return client.fetchUserInfo(userName);
}
public static String createUser(TraccarUser traccarUser) throws
TraccarConfigurationException, ExecutionException, InterruptedException {
TraccarClientImpl client = new TraccarClientImpl();
return client.createUser(traccarUser);
}
public static String updateUser(TraccarUser traccarUser, int userId) throws
TraccarConfigurationException, ExecutionException, InterruptedException {
TraccarClientImpl client = new TraccarClientImpl();
return client.updateUser(traccarUser, userId);
}
public static String returnUser(String userName) {
TraccarClientImpl client = new TraccarClientImpl(); TraccarClientImpl client = new TraccarClientImpl();
try { try {
client.deleteGroup(groupId, tenantId); return client.returnUser(userName);
} catch (TraccarConfigurationException e) { } catch (TraccarConfigurationException e) {
String msg = "Error occurred while mapping with groupId"; JSONObject obj = new JSONObject();
log.error(msg, e); String msg = "Error occurred while creating a user: "+ e;
obj.put("error", msg);
return obj.toString();
}
} }
public static String generateRandomString(int len) {
TraccarClientImpl client = new TraccarClientImpl();
return client.generateRandomString(len);
} }
} }

@ -48,7 +48,14 @@ public class TraccarHandlerConstants {
public static final String USER_CREATE_WITH_INSERT_DEVICE = "USER_CREATE_WITH_INSERT_DEVICE"; public static final String USER_CREATE_WITH_INSERT_DEVICE = "USER_CREATE_WITH_INSERT_DEVICE";
public static final String USER_UPDATE = "USER_UPDATE"; public static final String USER_UPDATE = "USER_UPDATE";
public static final String USER_UPDATE_WITH_INSERT_DEVICE = "USER_UPDATE_WITH_INSERT_DEVICE"; public static final String USER_UPDATE_WITH_INSERT_DEVICE = "USER_UPDATE_WITH_INSERT_DEVICE";
public static final String USER_SEACRCH = "USER_SEACRCH"; public static final String USER_SEARCH = "USER_SEARCH";
public static final String FETCH_ALL_USERS = "FETCH_ALL_USERS";
public static final String FETCH_ALL_DEVICES = "FETCH_ALL_DEVICES";
public static final String USER_NOT_FOUND = "USER_NOT_FOUND";
public static final int DEFAULT_RANDOM = 10;
public static final int TRACCAR_TOKEN = 32;
} }
} }

@ -0,0 +1,47 @@
package org.wso2.carbon.device.mgt.core.traccar.common.util;
import org.json.JSONObject;
import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarDevice;
import org.wso2.carbon.device.mgt.core.traccar.common.beans.TraccarUser;
import java.util.ArrayList;
import java.util.List;
public class TraccarUtil {
public static JSONObject TraccarUserPayload(TraccarUser traccarUser){
JSONObject payload = new JSONObject();
payload.put("id", traccarUser.getId());
payload.put("name", traccarUser.getName());
payload.put("login", traccarUser.getLogin());
payload.put("email", traccarUser.getEmail());
payload.put("password", traccarUser.getPassword());
payload.put("token", traccarUser.getToken());
payload.put("administrator", traccarUser.getAdministrator());
payload.put("deviceLimit", traccarUser.getDeviceLimit());
payload.put("userLimit", traccarUser.getUserLimit());
payload.put("disabled", traccarUser.getDisabled());
payload.put("deviceReadonly", traccarUser.getDeviceReadonly());
payload.put("readonly", traccarUser.getReadonly());
payload.put("expirationTime", traccarUser.getExpirationTime());
return payload;
}
public static JSONObject TraccarDevicePayload(TraccarDevice deviceInfo){
JSONObject payload = new JSONObject();
payload.put("name", deviceInfo.getDeviceName());
payload.put("uniqueId", deviceInfo.getUniqueId());
payload.put("status", deviceInfo.getStatus());
payload.put("disabled", deviceInfo.getDisabled());
payload.put("lastUpdate", deviceInfo.getLastUpdate());
payload.put("positionId", deviceInfo.getPositionId());
payload.put("groupId", deviceInfo.getGroupId());
payload.put("phone", deviceInfo.getPhone());
payload.put("model", deviceInfo.getModel());
payload.put("contact", deviceInfo.getContact());
payload.put("category", deviceInfo.getCategory());
List<String> geoFenceIds = new ArrayList<>();
payload.put("geofenceIds", geoFenceIds);
payload.put("attributes", new JSONObject());
return payload;
}
}

@ -574,3 +574,31 @@ CREATE TABLE IF NOT EXISTS DM_BILLING (
CONSTRAINT fk_DM_BILLING_DM_DEVICE2 FOREIGN KEY (DEVICE_ID) CONSTRAINT fk_DM_BILLING_DM_DEVICE2 FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
); );
-- DM_EXT_GROUP_MAPPING TABLE--
CREATE TABLE IF NOT EXISTS DM_EXT_GROUP_MAPPING (
ID INT NOT NULL AUTO_INCREMENT,
TRACCAR_GROUP_ID INT DEFAULT 0,
GROUP_ID INT NOT NULL,
TENANT_ID INT NOT NULL,
STATUS INT DEFAULT 0,
PRIMARY KEY (ID)
);
-- END OF DM_EXT_GROUP_MAPPING TABLE--
-- 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 DEFAULT 0,
DEVICE_ID INT NOT NULL,
TENANT_ID INT NOT NULL,
STATUS INT DEFAULT 0,
PRIMARY KEY (ID)
);
-- END OF DM_EXT_DEVICE_MAPPING TABLE--
-- END OF DM_EXT_PERMISSION_MAPPING TABLE--
CREATE TABLE IF NOT EXISTS DM_EXT_PERMISSION_MAPPING (
TRACCAR_DEVICE_ID INT DEFAULT 0,
TRACCAR_USER_ID INT DEFAULT 0
);
-- END OF DM_EXT_PERMISSION_MAPPING TABLE--

@ -770,3 +770,10 @@ CREATE TABLE IF NOT EXISTS DM_EXT_DEVICE_MAPPING (
PRIMARY KEY (ID) PRIMARY KEY (ID)
); );
-- END OF DM_EXT_DEVICE_MAPPING TABLE-- -- END OF DM_EXT_DEVICE_MAPPING TABLE--
-- END OF DM_EXT_PERMISSION_MAPPING TABLE--
CREATE TABLE IF NOT EXISTS DM_EXT_PERMISSION_MAPPING (
TRACCAR_DEVICE_ID INT DEFAULT 0,
TRACCAR_USER_ID INT DEFAULT 0
);
-- END OF DM_EXT_PERMISSION_MAPPING TABLE--

Loading…
Cancel
Save