Merge branch 'application-mgt-new' into 'master'

Change status query param to an array

See merge request entgra/carbon-device-mgt!367
feature/appm-store/pbac
Dharmakeerthi Lasantha 5 years ago
commit 2566ba5a52

@ -183,7 +183,8 @@ class GeoDashboard extends React.Component {
window.location.origin + window.location.origin +
config.serverConfig.invoker.uri + config.serverConfig.invoker.uri +
config.serverConfig.invoker.deviceMgt + config.serverConfig.invoker.deviceMgt +
'/devices?excludeStatus=REMOVED', '/devices?status=ACTIVE&status=INACTIVE&status=UNCLAIMED&status=UNREACHABLE&status=SUSPENDED&' +
'status=DISENROLLMENT_REQUESTED&status=BLOCKED&status=CREATED',
) )
.then(res => { .then(res => {
if (res.status === 200) { if (res.status === 200) {

@ -173,11 +173,10 @@ import java.util.Map;
@Path("/devices") @Path("/devices")
@Api(value = "Device Management", description = "This API carries all device management related operations " + @Api(value = "Device Management", description = "This API carries all device management related operations " +
"such as get all the available devices, etc.") "such as get all the available devices, etc.")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface DeviceManagementService { public interface DeviceManagementService {
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
httpMethod = "GET", httpMethod = "GET",
@ -269,20 +268,12 @@ public interface DeviceManagementService {
@QueryParam("ownership") @QueryParam("ownership")
@Size(max = 45) @Size(max = 45)
String ownership, String ownership,
@ApiParam(
name = "excludeStatus",
value = "Provide the devices that excludes the given status",
required = false)
@QueryParam("excludeStatus")
@Size(max = 45)
String excludeStatus,
@ApiParam( @ApiParam(
name = "status", name = "status",
value = "Provide the device status details, such as active or inactive.", value = "Provide the device status details, such as active or inactive.",
required = false) required = false)
@QueryParam("status") @QueryParam("status")
@Size(max = 45) List<String> status,
String status,
@ApiParam( @ApiParam(
name = "groupId", name = "groupId",
value = "Id of the group which device belongs", value = "Id of the group which device belongs",
@ -328,6 +319,7 @@ public interface DeviceManagementService {
int limit); int limit);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
httpMethod = "GET", httpMethod = "GET",
@ -401,6 +393,7 @@ public interface DeviceManagementService {
int limit); int limit);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{type}/{id}") @Path("/{type}/{id}")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -488,9 +481,9 @@ public interface DeviceManagementService {
String ifModifiedSince); String ifModifiedSince);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{deviceType}/{deviceId}/location-history") @Path("/{deviceType}/{deviceId}/location-history")
@ApiOperation( @ApiOperation(
consumes = "application/json",
produces = "application/json", produces = "application/json",
httpMethod = "GET", httpMethod = "GET",
value = "Getting the Location Details of a Device", value = "Getting the Location Details of a Device",
@ -560,6 +553,7 @@ public interface DeviceManagementService {
@QueryParam("to") long to); @QueryParam("to") long to);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/type/any/id/{id}") @Path("/type/any/id/{id}")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -636,6 +630,7 @@ public interface DeviceManagementService {
@PUT @PUT
@Produces(MediaType.APPLICATION_JSON)
@Path("/{type}/{id}") @Path("/{type}/{id}")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -691,6 +686,7 @@ public interface DeviceManagementService {
@PathParam("id") String deviceId); @PathParam("id") String deviceId);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{type}/{id}/location") @Path("/{type}/{id}/location")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -767,6 +763,7 @@ public interface DeviceManagementService {
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{type}/{id}/info") @Path("/{type}/{id}/info")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -844,6 +841,8 @@ public interface DeviceManagementService {
//device rename request would looks like follows //device rename request would looks like follows
//POST devices/type/virtual_firealarm/id/us06ww93auzp/rename //POST devices/type/virtual_firealarm/id/us06ww93auzp/rename
@POST @POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/type/{device-type}/id/{device-id}/rename") @Path("/type/{device-type}/id/{device-id}/rename")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -919,11 +918,10 @@ public interface DeviceManagementService {
//device remove request would looks like follows //device remove request would looks like follows
//DELETE devices/type/virtual_firealarm/id/us06ww93auzp //DELETE devices/type/virtual_firealarm/id/us06ww93auzp
@DELETE @DELETE
@Consumes(MediaType.WILDCARD) @Produces(MediaType.APPLICATION_JSON)
@Path("/type/{device-type}/id/{device-id}") @Path("/type/{device-type}/id/{device-id}")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
consumes = MediaType.WILDCARD,
httpMethod = "DELETE", httpMethod = "DELETE",
value = "Remove the Device Specified by the Device ID", value = "Remove the Device Specified by the Device ID",
notes = "Returns the status of the deleted device operation and the details of the deleted device.", notes = "Returns the status of the deleted device operation and the details of the deleted device.",
@ -988,9 +986,9 @@ public interface DeviceManagementService {
String deviceId); String deviceId);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{type}/{id}/features") @Path("/{type}/{id}/features")
@ApiOperation( @ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
httpMethod = "GET", httpMethod = "GET",
value = "Getting Feature Details of a Device", value = "Getting Feature Details of a Device",
@ -1078,6 +1076,8 @@ public interface DeviceManagementService {
String ifModifiedSince); String ifModifiedSince);
@POST @POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/search-devices") @Path("/search-devices")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1156,6 +1156,8 @@ public interface DeviceManagementService {
SearchContext searchContext); SearchContext searchContext);
@POST @POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/query-devices") @Path("/query-devices")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1234,6 +1236,7 @@ public interface DeviceManagementService {
PropertyMap map); PropertyMap map);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{type}/{id}/applications") @Path("/{type}/{id}/applications")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1336,6 +1339,7 @@ public interface DeviceManagementService {
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{type}/{id}/operations") @Path("/{type}/{id}/operations")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1446,6 +1450,7 @@ public interface DeviceManagementService {
String ownership); String ownership);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{type}/{id}/effective-policy") @Path("/{type}/{id}/effective-policy")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1535,6 +1540,7 @@ public interface DeviceManagementService {
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{type}/{id}/compliance-data") @Path("{type}/{id}/compliance-data")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1582,6 +1588,8 @@ public interface DeviceManagementService {
String id); String id);
@PUT @PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{type}/{id}/changestatus") @Path("/{type}/{id}/changestatus")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1656,6 +1664,8 @@ public interface DeviceManagementService {
EnrolmentInfo.Status newStatus); EnrolmentInfo.Status newStatus);
@POST @POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/{type}/operations") @Path("/{type}/operations")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1713,6 +1723,7 @@ public interface DeviceManagementService {
@Valid OperationRequest operationRequest); @Valid OperationRequest operationRequest);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/type/{type}/status/{status}/count") @Path("/type/{type}/status/{status}/count")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1781,6 +1792,7 @@ public interface DeviceManagementService {
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/type/{type}/status/{status}/ids") @Path("/type/{type}/status/{status}/ids")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1848,6 +1860,8 @@ public interface DeviceManagementService {
String status); String status);
@PUT @PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/type/{type}/status/{status}") @Path("/type/{type}/status/{status}")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1908,6 +1922,7 @@ public interface DeviceManagementService {
@Valid List<String> deviceList); @Valid List<String> deviceList);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/compliance/{compliance-status}") @Path("/compliance/{compliance-status}")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
@ -1975,6 +1990,7 @@ public interface DeviceManagementService {
int limit); int limit);
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{id}/features") @Path("/{id}/features")
@ApiOperation( @ApiOperation(
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,

@ -99,7 +99,6 @@ import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE; import javax.ws.rs.DELETE;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam; import javax.ws.rs.HeaderParam;
@ -107,7 +106,6 @@ import javax.ws.rs.POST;
import javax.ws.rs.PUT; import javax.ws.rs.PUT;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam; import javax.ws.rs.QueryParam;
import javax.ws.rs.DefaultValue; import javax.ws.rs.DefaultValue;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
@ -119,8 +117,6 @@ import java.util.Date;
import java.util.List; import java.util.List;
@Path("/devices") @Path("/devices")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class DeviceManagementServiceImpl implements DeviceManagementService { public class DeviceManagementServiceImpl implements DeviceManagementService {
public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
@ -155,8 +151,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
@QueryParam("userPattern") String userPattern, @QueryParam("userPattern") String userPattern,
@QueryParam("role") String role, @QueryParam("role") String role,
@QueryParam("ownership") String ownership, @QueryParam("ownership") String ownership,
@QueryParam("status") String status, @QueryParam("status") List<String> status,
@QueryParam("excludeStatus") String excludeStatus,
@QueryParam("groupId") int groupId, @QueryParam("groupId") int groupId,
@QueryParam("since") String since, @QueryParam("since") String since,
@HeaderParam("If-Modified-Since") String ifModifiedSince, @HeaderParam("If-Modified-Since") String ifModifiedSince,
@ -175,11 +170,6 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
DeviceManagementProviderService dms = DeviceMgtAPIUtils.getDeviceManagementService(); DeviceManagementProviderService dms = DeviceMgtAPIUtils.getDeviceManagementService();
DeviceAccessAuthorizationService deviceAccessAuthorizationService = DeviceAccessAuthorizationService deviceAccessAuthorizationService =
DeviceMgtAPIUtils.getDeviceAccessAuthorizationService(); DeviceMgtAPIUtils.getDeviceAccessAuthorizationService();
if (deviceAccessAuthorizationService == null) {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
new ErrorResponse.ErrorResponseBuilder().setMessage("Device access authorization service is " +
"failed").build()).build();
}
PaginationRequest request = new PaginationRequest(offset, limit); PaginationRequest request = new PaginationRequest(offset, limit);
PaginationResult result; PaginationResult result;
DeviceList devices = new DeviceList(); DeviceList devices = new DeviceList();
@ -195,12 +185,17 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
request.setOwnership(ownership); request.setOwnership(ownership);
} }
if (status != null && !status.isEmpty()) { if (status != null && !status.isEmpty()) {
RequestValidationUtil.validateStatus(status); boolean isStatusEmpty = true;
request.setStatus(status); for (String statusString : status){
} if (StringUtils.isNotBlank(statusString)){
if (excludeStatus != null && !excludeStatus.isEmpty()) { isStatusEmpty = false;
RequestValidationUtil.validateStatus(excludeStatus); break;
request.setExcludeStatus(excludeStatus); }
}
if (!isStatusEmpty) {
RequestValidationUtil.validateStatus(status);
request.setStatusList(status);
}
} }
// this is the user who initiates the request // this is the user who initiates the request
String authorizedUser = CarbonContext.getThreadLocalCarbonContext().getUsername(); String authorizedUser = CarbonContext.getThreadLocalCarbonContext().getUsername();
@ -263,7 +258,7 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
+ "' user"; + "' user";
log.error(msg); log.error(msg);
return Response.status(Response.Status.UNAUTHORIZED).entity( return Response.status(Response.Status.UNAUTHORIZED).entity(
new ErrorResponse.ErrorResponseBuilder().setCode(401l).setMessage(msg).build()).build(); new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build();
} }
} else { } else {
request.setOwner(authorizedUser); request.setOwner(authorizedUser);
@ -373,7 +368,6 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
} }
@DELETE @DELETE
@Consumes(MediaType.WILDCARD)
@Override @Override
@Path("/type/{device-type}/id/{device-id}") @Path("/type/{device-type}/id/{device-id}")
public Response deleteDevice(@PathParam("device-type") String deviceType, public Response deleteDevice(@PathParam("device-type") String deviceType,
@ -496,8 +490,6 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
@Path("/{deviceType}/{deviceId}/location-history") @Path("/{deviceType}/{deviceId}/location-history")
@GET @GET
@Consumes("application/json")
@Produces("application/json")
public Response getDeviceLocationInfo(@PathParam("deviceType") String deviceType, public Response getDeviceLocationInfo(@PathParam("deviceType") String deviceType,
@PathParam("deviceId") String deviceId, @PathParam("deviceId") String deviceId,
@QueryParam("from") long from, @QueryParam("to") long to) { @QueryParam("from") long from, @QueryParam("to") long to) {
@ -515,12 +507,6 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
deviceIdentifier.setId(deviceId); deviceIdentifier.setId(deviceId);
deviceIdentifier.setType(deviceType); deviceIdentifier.setType(deviceType);
if (deviceAccessAuthorizationService == null) {
errorMessage = "Device access authorization service is failed";
log.error(errorMessage);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()).build();
}
if (!deviceAccessAuthorizationService.isUserAuthorized(deviceIdentifier, authorizedUser)) { if (!deviceAccessAuthorizationService.isUserAuthorized(deviceIdentifier, authorizedUser)) {
String msg = "User '" + authorizedUser + "' is not authorized to retrieve the given device id '" + String msg = "User '" + authorizedUser + "' is not authorized to retrieve the given device id '" +
deviceId + "'"; deviceId + "'";

@ -74,8 +74,22 @@ public class ReportManagementServiceImpl implements ReportManagementService {
request.setOwnership(ownership); request.setOwnership(ownership);
} }
if (status != null && !status.isEmpty()) {
boolean isStatusEmpty = true;
for (String statusString : status){
if (StringUtils.isNotBlank(statusString)){
isStatusEmpty = false;
break;
}
}
if (!isStatusEmpty) {
RequestValidationUtil.validateStatus(status);
request.setStatusList(status);
}
}
result = DeviceMgtAPIUtils.getReportManagementService() result = DeviceMgtAPIUtils.getReportManagementService()
.getDevicesByDuration(request, status, fromDate, toDate); .getDevicesByDuration(request, fromDate, toDate);
if (result.getData().isEmpty()) { if (result.getData().isEmpty()) {
String msg = "No devices have enrolled between " + fromDate + " to " + toDate + String msg = "No devices have enrolled between " + fromDate + " to " + toDate +
" or doesn't match with" + " or doesn't match with" +

@ -19,6 +19,10 @@
package org.wso2.carbon.device.mgt.jaxrs.service.impl.util; package org.wso2.carbon.device.mgt.jaxrs.service.impl.util;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpStatus;
import org.wso2.carbon.device.mgt.core.dao.impl.device.GenericDeviceDAOImpl;
import org.wso2.carbon.device.mgt.jaxrs.beans.Scope; import org.wso2.carbon.device.mgt.jaxrs.beans.Scope;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration; import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration;
@ -30,6 +34,8 @@ import java.util.List;
public class RequestValidationUtil { public class RequestValidationUtil {
private static final Log log = LogFactory.getLog(RequestValidationUtil.class);
/** /**
* Checks if multiple criteria are specified in a conditional request. * Checks if multiple criteria are specified in a conditional request.
* *
@ -95,29 +101,28 @@ public class RequestValidationUtil {
} }
} }
public static void validateStatus(String status) { public static void validateStatus(List<String> statusList) {
if (status == null) { for (String status : statusList) {
throw new InputValidationException( switch (status) {
new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage( case "ACTIVE":
"Enrollment status type cannot be null").build()); case "INACTIVE":
} case "UNCLAIMED":
switch (status) { case "UNREACHABLE":
case "ACTIVE": case "SUSPENDED":
case "INACTIVE": case "DISENROLLMENT_REQUESTED":
case "UNCLAIMED": case "REMOVED":
case "UNREACHABLE": case "BLOCKED":
case "SUSPENDED": case "CREATED":
case "DISENROLLMENT_REQUESTED": break;
case "REMOVED": default:
case "BLOCKED": String msg = "Invalid enrollment status type: " + status + ". \nValid status types are " +
case "CREATED": "ACTIVE | INACTIVE | UNCLAIMED | UNREACHABLE | SUSPENDED | " +
return; "DISENROLLMENT_REQUESTED | REMOVED | BLOCKED | CREATED";
default: log.error(msg);
throw new InputValidationException( throw new InputValidationException(new ErrorResponse.ErrorResponseBuilder()
new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage("Invalid enrollment status type " + .setCode(HttpStatus.SC_BAD_REQUEST)
"received. Valid status types are ACTIVE | INACTIVE | " + .setMessage(msg).build());
"UNCLAIMED | UNREACHABLE | SUSPENDED | DISENROLLMENT_REQUESTED | REMOVED | " + }
"BLOCKED | CREATED").build());
} }
} }

@ -80,7 +80,9 @@ import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import static org.mockito.MockitoAnnotations.initMocks; import static org.mockito.MockitoAnnotations.initMocks;
@ -102,8 +104,7 @@ public class DeviceManagementServiceImplTest {
private static final String TENANT_AWARE_USERNAME = "admin@carbon.super"; private static final String TENANT_AWARE_USERNAME = "admin@carbon.super";
private static final String DEFAULT_ROLE = "admin"; private static final String DEFAULT_ROLE = "admin";
private static final String DEFAULT_OWNERSHIP = "BYOD"; private static final String DEFAULT_OWNERSHIP = "BYOD";
private static final String DEFAULT_STATUS = "ACTIVE"; private static final List<String> DEFAULT_STATUS_LIST = new ArrayList<>();
private static final String DEFAULT_EXCLUDED_STATUS = "REMOVED";
private static final String DEFAULT_DATE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z"; private static final String DEFAULT_DATE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z";
private DeviceManagementService deviceManagementService; private DeviceManagementService deviceManagementService;
private DeviceAccessAuthorizationService deviceAccessAuthorizationService; private DeviceAccessAuthorizationService deviceAccessAuthorizationService;
@ -124,6 +125,8 @@ public class DeviceManagementServiceImplTest {
this.deviceManagementService = new DeviceManagementServiceImpl(); this.deviceManagementService = new DeviceManagementServiceImpl();
this.deviceAccessAuthorizationService = Mockito.mock(DeviceAccessAuthorizationServiceImpl.class); this.deviceAccessAuthorizationService = Mockito.mock(DeviceAccessAuthorizationServiceImpl.class);
demoDevice = DeviceMgtAPITestHelper.generateDummyDevice(TEST_DEVICE_TYPE, TEST_DEVICE_IDENTIFIER); demoDevice = DeviceMgtAPITestHelper.generateDummyDevice(TEST_DEVICE_TYPE, TEST_DEVICE_IDENTIFIER);
DEFAULT_STATUS_LIST.add("ACTIVE");
DEFAULT_STATUS_LIST.add("REMOVED");
} }
@Test(description = "Testing if the device is enrolled when the device is enrolled.") @Test(description = "Testing if the device is enrolled when the device is enrolled.")
@ -172,7 +175,7 @@ public class DeviceManagementServiceImplTest {
.toReturn(this.deviceAccessAuthorizationService); .toReturn(this.deviceAccessAuthorizationService);
Response response = this.deviceManagementService Response response = this.deviceManagementService
.getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 1, null, null, false, 10, 5); DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode());
} }
@ -191,19 +194,19 @@ public class DeviceManagementServiceImplTest {
Response response = this.deviceManagementService Response response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 1, null, null, false, 10, 5); DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
response = this.deviceManagementService response = this.deviceManagementService
.getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, null, DEFAULT_OWNERSHIP, .getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, null, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 1, null, null, false, 10, 5); DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
response = this.deviceManagementService response = this.deviceManagementService
.getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, null, null, null, DEFAULT_OWNERSHIP, .getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, null, null, null, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 1, null, null, false, 10, 5); DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
response = this.deviceManagementService response = this.deviceManagementService
.getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, null, null, null, DEFAULT_OWNERSHIP, .getDevices(TEST_DEVICE_NAME, TEST_DEVICE_TYPE, null, null, null, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 1, null, null, true, 10, 5); DEFAULT_STATUS_LIST, 1, null, null, true, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
} }
@ -280,7 +283,7 @@ public class DeviceManagementServiceImplTest {
Mockito.when(carbonContext.getUsername()).thenReturn(DEFAULT_USERNAME); Mockito.when(carbonContext.getUsername()).thenReturn(DEFAULT_USERNAME);
Mockito.when(deviceAccessAuthorizationService.isDeviceAdminUser()).thenReturn(true); Mockito.when(deviceAccessAuthorizationService.isDeviceAdminUser()).thenReturn(true);
this.deviceManagementService.getDeviceByID(TEST_DEVICE_IDENTIFIER, ifModifiedSince,true); this.deviceManagementService.getDeviceByID(TEST_DEVICE_IDENTIFIER, ifModifiedSince, true);
} }
@ -308,16 +311,16 @@ public class DeviceManagementServiceImplTest {
this.deviceManagementService.getDeviceByID(TEST_DEVICE_IDENTIFIER, ifModifiedSince,true); this.deviceManagementService.getDeviceByID(TEST_DEVICE_IDENTIFIER, ifModifiedSince,true);
} }
@Test(description = "Testing get devices when DeviceAccessAuthorizationService is not available") @Test(description = "Testing get devices when DeviceAccessAuthorizationService is not available",
public void testGetDevicesWithErroneousDeviceAccessAuthorizationService() { expectedExceptions = NoClassDefFoundError.class)
public void testGetDevicesWithErroneousDeviceAccessAuthorizationService()
throws DeviceAccessAuthorizationException {
PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getDeviceManagementService")) PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getDeviceManagementService"))
.toReturn(this.deviceManagementProviderService); .toReturn(this.deviceManagementProviderService);
PowerMockito.stub(PowerMockito.method(DeviceMgtAPIUtils.class, "getDeviceAccessAuthorizationService")) Mockito.when(deviceAccessAuthorizationService.isDeviceAdminUser()).thenReturn(true);
.toReturn(null); deviceManagementService.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null,
Response response = this.deviceManagementService DEFAULT_ROLE, DEFAULT_OWNERSHIP, DEFAULT_STATUS_LIST, 1,
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, null, null, false, 10, 5);
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 1, null, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
} }
@Test(description = "Testing get devices when user is the device admin") @Test(description = "Testing get devices when user is the device admin")
@ -335,12 +338,12 @@ public class DeviceManagementServiceImplTest {
Mockito.when(deviceAccessAuthorizationService.isDeviceAdminUser()).thenReturn(true); Mockito.when(deviceAccessAuthorizationService.isDeviceAdminUser()).thenReturn(true);
Response response = this.deviceManagementService Response response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 1, null, null, false, 10, 5); , DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
response = this.deviceManagementService response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, null, DEFAULT_USERNAME, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, null, DEFAULT_USERNAME, DEFAULT_ROLE, DEFAULT_OWNERSHIP
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 1, null, null, false, 10, 5); , DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
} }
@ -361,8 +364,8 @@ public class DeviceManagementServiceImplTest {
.toReturn(Mockito.mock(RealmService.class, Mockito.RETURNS_MOCKS)); .toReturn(Mockito.mock(RealmService.class, Mockito.RETURNS_MOCKS));
Response response = this.deviceManagementService Response response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, "newuser", null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, DEFAULT_EXCLUDED_STATUS, .getDevices(null, TEST_DEVICE_TYPE, "newuser", null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_STATUS, 0, null, null, false, 10, 5); DEFAULT_STATUS_LIST, 0, null, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.UNAUTHORIZED.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.UNAUTHORIZED.getStatusCode());
Mockito.reset(this.deviceAccessAuthorizationService); Mockito.reset(this.deviceAccessAuthorizationService);
} }
@ -383,15 +386,15 @@ public class DeviceManagementServiceImplTest {
Response response = this.deviceManagementService Response response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 0, null, ifModifiedSince, false, 10, 5); DEFAULT_STATUS_LIST, 0, null, ifModifiedSince, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.NOT_MODIFIED.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.NOT_MODIFIED.getStatusCode());
response = this.deviceManagementService response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 0, null, ifModifiedSince, true, 10, 5); DEFAULT_STATUS_LIST, 0, null, ifModifiedSince, true, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.NOT_MODIFIED.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.NOT_MODIFIED.getStatusCode());
response = this.deviceManagementService response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 0, null, "ErrorModifiedSince", false, 10, 5); DEFAULT_STATUS_LIST, 0, null, "ErrorModifiedSince", false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode());
} }
@ -411,15 +414,15 @@ public class DeviceManagementServiceImplTest {
Response response = this.deviceManagementService Response response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 0, since, null, false, 10, 5); DEFAULT_STATUS_LIST, 0, since, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
response = this.deviceManagementService response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 0, since, null, true, 10, 5); DEFAULT_STATUS_LIST, 0, since, null, true, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
response = this.deviceManagementService response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 0, "ErrorSince", null, false, 10, 5); DEFAULT_STATUS_LIST, 0, "ErrorSince", null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode());
} }
@ -441,7 +444,7 @@ public class DeviceManagementServiceImplTest {
Response response = this.deviceManagementService Response response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 1, null, null, false, 10, 5); DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
Mockito.reset(this.deviceManagementProviderService); Mockito.reset(this.deviceManagementProviderService);
} }
@ -463,7 +466,7 @@ public class DeviceManagementServiceImplTest {
Response response = this.deviceManagementService Response response = this.deviceManagementService
.getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP, .getDevices(null, TEST_DEVICE_TYPE, DEFAULT_USERNAME, null, DEFAULT_ROLE, DEFAULT_OWNERSHIP,
DEFAULT_EXCLUDED_STATUS, DEFAULT_STATUS, 1, null, null, false, 10, 5); DEFAULT_STATUS_LIST, 1, null, null, false, 10, 5);
Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
Mockito.reset(this.deviceAccessAuthorizationService); Mockito.reset(this.deviceAccessAuthorizationService);
} }

@ -20,6 +20,7 @@ package org.wso2.carbon.device.mgt.common;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -32,8 +33,7 @@ public class PaginationRequest {
private int groupId; private int groupId;
private String owner; private String owner;
private String ownerPattern; private String ownerPattern;
private String status; private List<String> statusList;
private String excludeStatus;
private String deviceType; private String deviceType;
private String deviceName; private String deviceName;
private String ownership; private String ownership;
@ -78,20 +78,12 @@ public class PaginationRequest {
this.owner = owner; this.owner = owner;
} }
public String getStatus() { public List<String> getStatusList() {
return status; return statusList;
} }
public void setStatus(String status) { public void setStatusList(List<String> statusList) {
this.status = status; this.statusList = statusList;
}
public String getExcludeStatus() {
return excludeStatus;
}
public void setExcludeStatus(String excludeStatus) {
this.excludeStatus = excludeStatus;
} }
public String getDeviceType() { public String getDeviceType() {
@ -164,7 +156,7 @@ public class PaginationRequest {
public String toString() { public String toString() {
return "Device type '" + this.deviceType + "' Device Name '" + this.deviceName + "' row count: " + this.rowCount return "Device type '" + this.deviceType + "' Device Name '" + this.deviceName + "' row count: " + this.rowCount
+ " Owner role '" + this.ownerRole + "' owner pattern '" + this.ownerPattern + "' ownership " + " Owner role '" + this.ownerRole + "' owner pattern '" + this.ownerPattern + "' ownership "
+ this.ownership + "' Status '" + this.status + "' owner '" + this.owner + "' groupId: " + this.groupId + this.ownership + "' Status '" + this.statusList + "' owner '" + this.owner + "' groupId: " + this.groupId
+ " start index: " + this.startIndex; + " start index: " + this.startIndex;
} }
} }

@ -39,7 +39,7 @@ public interface ReportManagementService {
* @throws {@Link DeviceManagementException} When error occurred while validating device list page size * @throws {@Link DeviceManagementException} When error occurred while validating device list page size
* @throws {@Link ReportManagementException} When failed to retrieve devices. * @throws {@Link ReportManagementException} When failed to retrieve devices.
*/ */
PaginationResult getDevicesByDuration(PaginationRequest request, List<String> statusList, String fromDate, String toDate) PaginationResult getDevicesByDuration(PaginationRequest request, String fromDate, String toDate)
throws ReportManagementException; throws ReportManagementException;
int getDevicesByDurationCount(List<String> statusList, String ownership, String fromDate, String toDate) int getDevicesByDurationCount(List<String> statusList, String ownership, String fromDate, String toDate)

@ -294,7 +294,6 @@ public interface DeviceDAO {
*/ */
List<Device> getDevices(PaginationRequest request, int tenantId) throws DeviceManagementDAOException; List<Device> getDevices(PaginationRequest request, int tenantId) throws DeviceManagementDAOException;
/** /**
* This method is used to search for devices within a specific group. * This method is used to search for devices within a specific group.
* *
@ -553,7 +552,6 @@ public interface DeviceDAO {
* *
*/ */
List<Device> getDevicesByDuration(PaginationRequest request, List<Device> getDevicesByDuration(PaginationRequest request,
List<String> statusList,
int tenantId, int tenantId,
String fromDate, String fromDate,
String toDate) throws DeviceManagementDAOException; String toDate) throws DeviceManagementDAOException;

@ -80,12 +80,11 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
@Override @Override
public int addDevice(int typeId, Device device, int tenantId) throws DeviceManagementDAOException { public int addDevice(int typeId, Device device, int tenantId) throws DeviceManagementDAOException {
Connection conn;
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null; ResultSet rs = null;
int deviceId = -1; int deviceId = -1;
try { try {
conn = this.getConnection(); Connection conn = this.getConnection();
String sql = "INSERT INTO DM_DEVICE(DESCRIPTION, NAME, DEVICE_TYPE_ID, DEVICE_IDENTIFICATION, " + String sql = "INSERT INTO DM_DEVICE(DESCRIPTION, NAME, DEVICE_TYPE_ID, DEVICE_IDENTIFICATION, " +
"LAST_UPDATED_TIMESTAMP, TENANT_ID) " + "LAST_UPDATED_TIMESTAMP, TENANT_ID) " +
"VALUES (?, ?, ?, ?, ?, ?)"; "VALUES (?, ?, ?, ?, ?, ?)";
@ -1008,9 +1007,6 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
@Override @Override
public int getDeviceCount(PaginationRequest request, int tenantId) throws DeviceManagementDAOException { public int getDeviceCount(PaginationRequest request, int tenantId) throws DeviceManagementDAOException {
int deviceCount = 0; int deviceCount = 0;
Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
String deviceType = request.getDeviceType(); String deviceType = request.getDeviceType();
boolean isDeviceTypeProvided = false; boolean isDeviceTypeProvided = false;
String deviceName = request.getDeviceName(); String deviceName = request.getDeviceName();
@ -1021,17 +1017,23 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
boolean isOwnerPatternProvided = false; boolean isOwnerPatternProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
boolean isOwnershipProvided = false; boolean isOwnershipProvided = false;
String status = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false; boolean isStatusProvided = false;
String excludeStatus = request.getExcludeStatus();
boolean isExcludeStatusProvided = false;
Date since = request.getSince(); Date since = request.getSince();
boolean isSinceProvided = false; boolean isSinceProvided = false;
try {
conn = this.getConnection();
String sql = "SELECT COUNT(d1.ID) AS DEVICE_COUNT FROM DM_ENROLMENT e, (SELECT d.ID, d.NAME, d.DEVICE_IDENTIFICATION, " +
"t.NAME AS DEVICE_TYPE FROM DM_DEVICE d, DM_DEVICE_TYPE t";
try {
Connection conn = getConnection();
String sql = "SELECT COUNT(d1.ID) AS DEVICE_COUNT " +
"FROM DM_ENROLMENT e, " +
"(SELECT " +
"d.ID, " +
"d.NAME, " +
"d.DEVICE_IDENTIFICATION, " +
"t.NAME AS DEVICE_TYPE " +
"FROM " +
"DM_DEVICE d, " +
"DM_DEVICE_TYPE t";
//Add query for last updated timestamp //Add query for last updated timestamp
if (since != null) { if (since != null) {
sql = sql + " , DM_DEVICE_DETAIL dt"; sql = sql + " , DM_DEVICE_DETAIL dt";
@ -1046,19 +1048,15 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
sql = sql + " AND t.NAME = ?"; sql = sql + " AND t.NAME = ?";
isDeviceTypeProvided = true; isDeviceTypeProvided = true;
} }
if (deviceName != null && !deviceName.isEmpty()) { if (deviceName != null && !deviceName.isEmpty()) {
sql = sql + " AND d.NAME LIKE ?"; sql = sql + " AND d.NAME LIKE ?";
isDeviceNameProvided = true; isDeviceNameProvided = true;
} }
sql = sql + ") d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ?"; sql = sql + ") d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ?";
if (ownership != null && !ownership.isEmpty()) { if (ownership != null && !ownership.isEmpty()) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
isOwnershipProvided = true; isOwnershipProvided = true;
} }
//Add the query for owner //Add the query for owner
if (owner != null && !owner.isEmpty()) { if (owner != null && !owner.isEmpty()) {
sql = sql + " AND e.OWNER = ?"; sql = sql + " AND e.OWNER = ?";
@ -1067,56 +1065,49 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
sql = sql + " AND e.OWNER LIKE ?"; sql = sql + " AND e.OWNER LIKE ?";
isOwnerPatternProvided = true; isOwnerPatternProvided = true;
} }
if (statusList != null && !statusList.isEmpty()) {
if (status != null && !status.isEmpty()) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?";
isStatusProvided = true; isStatusProvided = true;
} }
if (excludeStatus != null && !excludeStatus.isEmpty()) { try (PreparedStatement stmt = conn.prepareStatement(sql)) {
sql = sql + " AND e.STATUS != ?"; int paramIdx = 1;
isExcludeStatusProvided = true; stmt.setInt(paramIdx++, tenantId);
} if (isSinceProvided) {
stmt.setLong(paramIdx++, since.getTime());
stmt = conn.prepareStatement(sql); }
stmt.setInt(1, tenantId); if (isDeviceTypeProvided) {
int paramIdx = 2; stmt.setString(paramIdx++, request.getDeviceType());
if (isSinceProvided) { }
stmt.setLong(paramIdx++, since.getTime()); if (isDeviceNameProvided) {
} stmt.setString(paramIdx++, request.getDeviceName() + "%");
if (isDeviceTypeProvided) { }
stmt.setString(paramIdx++, request.getDeviceType()); stmt.setInt(paramIdx++, tenantId);
} if (isOwnershipProvided) {
if (isDeviceNameProvided) { stmt.setString(paramIdx++, request.getOwnership());
stmt.setString(paramIdx++, request.getDeviceName() + "%"); }
} if (isOwnerProvided) {
stmt.setString(paramIdx++, owner);
} else if (isOwnerPatternProvided) {
stmt.setString(paramIdx++, ownerPattern + "%");
}
if (isStatusProvided) {
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
}
stmt.setInt(paramIdx++, tenantId); try (ResultSet rs = stmt.executeQuery()) {
if (isOwnershipProvided) { if (rs.next()) {
stmt.setString(paramIdx++, request.getOwnership()); deviceCount = rs.getInt("DEVICE_COUNT");
} }
if (isOwnerProvided) { return deviceCount;
stmt.setString(paramIdx++, owner); }
} else if (isOwnerPatternProvided) {
stmt.setString(paramIdx++, ownerPattern + "%");
}
if (isStatusProvided) {
stmt.setString(paramIdx++, request.getStatus());
}
if (isExcludeStatusProvided) {
stmt.setString(paramIdx++, excludeStatus);
}
rs = stmt.executeQuery();
if (rs.next()) {
deviceCount = rs.getInt("DEVICE_COUNT");
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while retrieving information of all " + throw new DeviceManagementDAOException("Error occurred while retrieving information of all " +
"registered devices", e); "registered devices", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs);
} }
return deviceCount;
} }
@Override @Override
@ -2270,4 +2261,17 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO {
} }
return true; return true;
} }
protected String buildStatusQuery(List<String> statusList)
throws DeviceManagementDAOException {
if (statusList == null || statusList.isEmpty()) {
String msg = "SQL query build for status list failed. Status list cannot be empty or null";
log.error(msg);
throw new DeviceManagementDAOException(msg);
}
StringJoiner joiner = new StringJoiner(",", " AND e.STATUS IN(", ")");
statusList.stream().map(status -> "?").forEach(joiner::add);
return joiner.toString();
}
} }

@ -48,9 +48,6 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
@Override @Override
public List<Device> getDevices(PaginationRequest request, int tenantId) public List<Device> getDevices(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
List<Device> devices; List<Device> devices;
String deviceType = request.getDeviceType(); String deviceType = request.getDeviceType();
boolean isDeviceTypeProvided = false; boolean isDeviceTypeProvided = false;
@ -62,33 +59,42 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
boolean isOwnerPatternProvided = false; boolean isOwnerPatternProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
boolean isOwnershipProvided = false; boolean isOwnershipProvided = false;
String status = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false; boolean isStatusProvided = false;
String excludeStatus = request.getExcludeStatus();
boolean isExcludeStatusProvided = false;
Date since = request.getSince(); Date since = request.getSince();
boolean isSinceProvided = false; boolean isSinceProvided = false;
try {
conn = this.getConnection();
String sql = "SELECT d1.ID AS DEVICE_ID, d1.DESCRIPTION, d1.NAME AS DEVICE_NAME, d1.DEVICE_TYPE, " +
"d1.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, (SELECT d.ID, d.DESCRIPTION, " +
"d.NAME, d.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE " +
"FROM DM_DEVICE d, DM_DEVICE_TYPE t ";
try {
Connection conn = getConnection();
String sql = "SELECT d1.ID AS DEVICE_ID, " +
"d1.DESCRIPTION, " +
"d1.NAME AS DEVICE_NAME, " +
"d1.DEVICE_TYPE, " +
"d1.DEVICE_IDENTIFICATION, " +
"e.OWNER, " +
"e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e, " +
"(SELECT d.ID, " +
"d.DESCRIPTION, " +
"d.NAME, " +
"d.DEVICE_IDENTIFICATION, " +
"t.NAME AS DEVICE_TYPE " +
"FROM DM_DEVICE d, " +
"DM_DEVICE_TYPE t ";
//Add the query to filter active devices on timestamp //Add the query to filter active devices on timestamp
if (since != null) { if (since != null) {
sql = sql + ", DM_DEVICE_DETAIL dt"; sql = sql + ", DM_DEVICE_DETAIL dt";
isSinceProvided = true; isSinceProvided = true;
} }
sql = sql + " WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ?"; sql = sql + " WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ?";
//Add query for last updated timestamp //Add query for last updated timestamp
if (isSinceProvided) { if (isSinceProvided) {
sql = sql + " AND dt.DEVICE_ID = d.ID AND dt.UPDATE_TIMESTAMP > ?"; sql = sql + " AND dt.DEVICE_ID = d.ID AND dt.UPDATE_TIMESTAMP > ?";
} }
//Add the query for device-type //Add the query for device-type
if (deviceType != null && !deviceType.isEmpty()) { if (deviceType != null && !deviceType.isEmpty()) {
sql = sql + " AND t.NAME = ?"; sql = sql + " AND t.NAME = ?";
@ -99,9 +105,7 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND d.NAME LIKE ?"; sql = sql + " AND d.NAME LIKE ?";
isDeviceNameProvided = true; isDeviceNameProvided = true;
} }
sql = sql + ") d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ?"; sql = sql + ") d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ?";
//Add the query for ownership //Add the query for ownership
if (ownership != null && !ownership.isEmpty()) { if (ownership != null && !ownership.isEmpty()) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
@ -115,73 +119,62 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND e.OWNER LIKE ?"; sql = sql + " AND e.OWNER LIKE ?";
isOwnerPatternProvided = true; isOwnerPatternProvided = true;
} }
//Add the query for status if (statusList != null && !statusList.isEmpty()) {
if (status != null && !status.isEmpty()) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?";
isStatusProvided = true; isStatusProvided = true;
} }
//Add the query for exclude status
if (excludeStatus != null && !excludeStatus.isEmpty()) {
sql = sql + " AND e.STATUS != ?";
isExcludeStatusProvided = true;
}
sql = sql + " LIMIT ?,?"; sql = sql + " LIMIT ?,?";
stmt = conn.prepareStatement(sql); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, tenantId); int paramIdx = 1;
int paramIdx = 2; stmt.setInt(paramIdx++, tenantId);
if (isSinceProvided) { if (isSinceProvided) {
stmt.setLong(paramIdx++, since.getTime()); stmt.setLong(paramIdx++, since.getTime());
} }
if (isDeviceTypeProvided) { if (isDeviceTypeProvided) {
stmt.setString(paramIdx++, deviceType); stmt.setString(paramIdx++, deviceType);
} }
if (isDeviceNameProvided) { if (isDeviceNameProvided) {
stmt.setString(paramIdx++, deviceName + "%"); stmt.setString(paramIdx++, deviceName + "%");
} }
stmt.setInt(paramIdx++, tenantId);
if (isOwnershipProvided) {
stmt.setString(paramIdx++, ownership);
}
if (isOwnerProvided) {
stmt.setString(paramIdx++, owner);
} else if (isOwnerPatternProvided) {
stmt.setString(paramIdx++, ownerPattern + "%");
}
if (isStatusProvided) {
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
}
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
stmt.setInt(paramIdx++, tenantId); try (ResultSet rs = stmt.executeQuery()) {
if (isOwnershipProvided) { devices = new ArrayList<>();
stmt.setString(paramIdx++, ownership); while (rs.next()) {
} Device device = DeviceManagementDAOUtil.loadDevice(rs);
if (isOwnerProvided) { devices.add(device);
stmt.setString(paramIdx++, owner); }
} else if (isOwnerPatternProvided) { return devices;
stmt.setString(paramIdx++, ownerPattern + "%"); }
}
if (isStatusProvided) {
stmt.setString(paramIdx++, status);
}
if (isExcludeStatusProvided) {
stmt.setString(paramIdx++, excludeStatus);
}
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
rs = stmt.executeQuery();
devices = new ArrayList<>();
while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device);
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while retrieving information of all " + String msg = "Error occurred while retrieving information of all " +
"registered devices", e); "registered devices";
} finally { log.error(msg, e);
DeviceManagementDAOUtil.cleanupResources(stmt, rs); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override
public List<Device> searchDevicesInGroup(PaginationRequest request, int tenantId) public List<Device> searchDevicesInGroup(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
List<Device> devices = null; List<Device> devices = null;
int groupId = request.getGroupId(); int groupId = request.getGroupId();
String deviceType = request.getDeviceType(); String deviceType = request.getDeviceType();
boolean isDeviceTypeProvided = false; boolean isDeviceTypeProvided = false;
@ -193,52 +186,63 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
boolean isOwnerPatternProvided = false; boolean isOwnerPatternProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
boolean isOwnershipProvided = false; boolean isOwnershipProvided = false;
String status = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false; boolean isStatusProvided = false;
String excludeStatus = request.getExcludeStatus();
boolean isExcludeStatusProvided = false;
Date since = request.getSince(); Date since = request.getSince();
boolean isSinceProvided = false; boolean isSinceProvided = false;
try { try {
conn = this.getConnection(); Connection conn = getConnection();
String sql = "SELECT d1.DEVICE_ID, d1.DESCRIPTION, d1.NAME AS DEVICE_NAME, d1.DEVICE_TYPE, " + String sql = "SELECT d1.DEVICE_ID, " +
"d1.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " + "d1.DESCRIPTION, " +
"e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, " + "d1.NAME AS DEVICE_NAME, " +
"(SELECT gd.DEVICE_ID, gd.DESCRIPTION, gd.NAME, gd.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE " + "d1.DEVICE_TYPE, " +
"FROM (SELECT d.ID AS DEVICE_ID, d.DESCRIPTION, d.NAME, d.DEVICE_IDENTIFICATION, d.DEVICE_TYPE_ID " + "d1.DEVICE_IDENTIFICATION, " +
"FROM DM_DEVICE d, (SELECT dgm.DEVICE_ID FROM DM_DEVICE_GROUP_MAP dgm WHERE dgm.GROUP_ID = ?) dgm1 WHERE" + "e.OWNER, " +
" d.ID = dgm1.DEVICE_ID AND d.TENANT_ID = ?"; "e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e, " +
"(SELECT gd.DEVICE_ID, " +
"gd.DESCRIPTION, " +
"gd.NAME, " +
"gd.DEVICE_IDENTIFICATION, " +
"t.NAME AS DEVICE_TYPE " +
"FROM " +
"(SELECT d.ID AS DEVICE_ID, " +
"d.DESCRIPTION, " +
"d.NAME, " +
"d.DEVICE_IDENTIFICATION, " +
"d.DEVICE_TYPE_ID " +
"FROM DM_DEVICE d, " +
"(SELECT dgm.DEVICE_ID " +
"FROM DM_DEVICE_GROUP_MAP dgm " +
"WHERE dgm.GROUP_ID = ?) dgm1 " +
"WHERE d.ID = dgm1.DEVICE_ID " +
"AND d.TENANT_ID = ?";
//Add the query for device-name //Add the query for device-name
if (deviceName != null && !deviceName.isEmpty()) { if (deviceName != null && !deviceName.isEmpty()) {
sql = sql + " AND d.NAME LIKE ?"; sql = sql + " AND d.NAME LIKE ?";
isDeviceNameProvided = true; isDeviceNameProvided = true;
} }
sql = sql + ") gd, DM_DEVICE_TYPE t"; sql = sql + ") gd, DM_DEVICE_TYPE t";
if (since != null) { if (since != null) {
sql = sql + ", DM_DEVICE_DETAIL dt"; sql = sql + ", DM_DEVICE_DETAIL dt";
isSinceProvided = true; isSinceProvided = true;
} }
sql = sql + " WHERE gd.DEVICE_TYPE_ID = t.ID"; sql = sql + " WHERE gd.DEVICE_TYPE_ID = t.ID";
//Add query for last updated timestamp //Add query for last updated timestamp
if (isSinceProvided) { if (isSinceProvided) {
sql = sql + " AND dt.DEVICE_ID = gd.DEVICE_ID AND dt.UPDATE_TIMESTAMP > ?"; sql = sql + " AND dt.DEVICE_ID = gd.DEVICE_ID AND dt.UPDATE_TIMESTAMP > ?";
} }
//Add the query for device-type //Add the query for device-type
if (deviceType != null && !deviceType.isEmpty()) { if (deviceType != null && !deviceType.isEmpty()) {
sql = sql + " AND t.NAME = ?"; sql = sql + " AND t.NAME = ?";
isDeviceTypeProvided = true; isDeviceTypeProvided = true;
} }
sql = sql + " ) d1 WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? "; sql = sql + " ) d1 WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? ";
//Add the query for ownership //Add the query for ownership
if (ownership != null && !ownership.isEmpty()) { if (ownership != null && !ownership.isEmpty()) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
@ -252,66 +256,57 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND e.OWNER LIKE ?"; sql = sql + " AND e.OWNER LIKE ?";
isOwnerPatternProvided = true; isOwnerPatternProvided = true;
} }
//Add the query for status if (statusList != null && !statusList.isEmpty()) {
if (status != null && !status.isEmpty()) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?";
isStatusProvided = true; isStatusProvided = true;
} }
//Add the query for exclude status
if (excludeStatus != null && !excludeStatus.isEmpty()) {
sql = sql + " AND e.STATUS != ?";
isExcludeStatusProvided = true;
}
sql = sql + " LIMIT ?,?"; sql = sql + " LIMIT ?,?";
stmt = conn.prepareStatement(sql); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
int paramIdx = 1;
stmt.setInt(1, groupId); stmt.setInt(paramIdx++, groupId);
stmt.setInt(2, tenantId); stmt.setInt(paramIdx++, tenantId);
if (isDeviceNameProvided) {
int paramIdx = 3; stmt.setString(paramIdx++, deviceName + "%");
if (isDeviceNameProvided) { }
stmt.setString(paramIdx++, deviceName + "%"); if (isSinceProvided) {
} stmt.setLong(paramIdx++, since.getTime());
if (isSinceProvided) { }
stmt.setLong(paramIdx++, since.getTime()); if (isDeviceTypeProvided) {
} stmt.setString(paramIdx++, deviceType);
if (isDeviceTypeProvided) { }
stmt.setString(paramIdx++, deviceType); stmt.setInt(paramIdx++, tenantId);
} if (isOwnershipProvided) {
stmt.setString(paramIdx++, ownership);
stmt.setInt(paramIdx++, tenantId); }
if (isOwnershipProvided) { if (isOwnerProvided) {
stmt.setString(paramIdx++, ownership); stmt.setString(paramIdx++, owner);
} } else if (isOwnerPatternProvided) {
if (isOwnerProvided) { stmt.setString(paramIdx++, ownerPattern + "%");
stmt.setString(paramIdx++, owner); }
} else if (isOwnerPatternProvided) { if (isStatusProvided) {
stmt.setString(paramIdx++, ownerPattern + "%"); for (String status : statusList) {
} stmt.setString(paramIdx++, status);
if (isStatusProvided) { }
stmt.setString(paramIdx++, status); }
} stmt.setInt(paramIdx++, request.getStartIndex());
if (isExcludeStatusProvided) { stmt.setInt(paramIdx, request.getRowCount());
stmt.setString(paramIdx++, excludeStatus);
}
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
rs = stmt.executeQuery(); try (ResultSet rs = stmt.executeQuery()) {
devices = new ArrayList<>(); devices = new ArrayList<>();
while (rs.next()) { while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device); devices.add(device);
}
return devices;
}
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while retrieving information of" + String msg = "Error occurred while retrieving information of" +
" devices belonging to group : " + groupId, e); " devices belonging to group : " + groupId;
} finally { log.error(msg, e);
DeviceManagementDAOUtil.cleanupResources(stmt, rs); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override
@ -421,46 +416,81 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
@Override @Override
public List<Device> getDevicesByStatus(PaginationRequest request, int tenantId) public List<Device> getDevicesByStatus(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn;
PreparedStatement stmt = null;
List<Device> devices = new ArrayList<>(); List<Device> devices = new ArrayList<>();
List<String> statusList = request.getStatusList();
try { try {
conn = this.getConnection(); Connection conn = getConnection();
String sql = "SELECT d.ID AS DEVICE_ID, d.DESCRIPTION, d.NAME AS DEVICE_NAME, t.NAME AS DEVICE_TYPE, " + String sql = "SELECT d.ID AS DEVICE_ID, " +
"d.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " + "d.DESCRIPTION, " +
"e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM (SELECT e.ID, e.DEVICE_ID, e.OWNER, e.OWNERSHIP, e.STATUS, " + "d.NAME AS DEVICE_NAME, " +
"e.DATE_OF_ENROLMENT, e.DATE_OF_LAST_UPDATE, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e " + "t.NAME AS DEVICE_TYPE, " +
"WHERE TENANT_ID = ? AND STATUS = ?) e, DM_DEVICE d, DM_DEVICE_TYPE t " + "d.DEVICE_IDENTIFICATION, " +
"WHERE DEVICE_ID = e.DEVICE_ID AND d.DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ? LIMIT ?,?"; "e.OWNER, " +
stmt = conn.prepareStatement(sql); "e.OWNERSHIP, " +
stmt.setInt(1, tenantId); "e.STATUS, " +
stmt.setString(2, request.getStatus()); "e.DATE_OF_LAST_UPDATE, " +
stmt.setInt(3, tenantId); "e.DATE_OF_ENROLMENT, " +
stmt.setInt(4, request.getStartIndex()); "e.ID AS ENROLMENT_ID " +
stmt.setInt(5, request.getRowCount()); "FROM " +
ResultSet rs = stmt.executeQuery(); "(SELECT e.ID, " +
"e.DEVICE_ID, " +
"e.OWNER, " +
"e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_ENROLMENT, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e " +
"WHERE TENANT_ID = ?";
if (statusList == null || statusList.isEmpty()) {
String msg = "Error occurred while fetching the list of devices. Status List can't " +
"be null or empty";
log.error(msg);
throw new DeviceManagementDAOException(msg);
}
sql += buildStatusQuery(statusList);
sql += ") e, " +
"DM_DEVICE d, " +
"DM_DEVICE_TYPE t " +
"WHERE DEVICE_ID = e.DEVICE_ID " +
"AND d.DEVICE_TYPE_ID = t.ID " +
"AND d.TENANT_ID = ? " +
"LIMIT ?,?";
while (rs.next()) { try (PreparedStatement stmt = conn.prepareStatement(sql)) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); int paramIdx = 1;
devices.add(device); stmt.setInt(paramIdx++, tenantId);
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
stmt.setInt(paramIdx++, tenantId);
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device);
}
return devices;
}
} }
} catch (SQLException e) { } catch (SQLException e) {
String msg = "Error occurred while fetching the list of devices that matches to status " + String msg = "Error occurred while fetching the list of devices that matches to status " +
"'" + request.getStatus() + "'"; request.getStatusList().toString();
log.error(msg, e); log.error(msg, e);
throw new DeviceManagementDAOException(msg, e); throw new DeviceManagementDAOException(msg, e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
return devices;
} }
@Override @Override
public List<Device> getDevicesByDuration(PaginationRequest request, List<String> statusList, int tenantId, public List<Device> getDevicesByDuration(PaginationRequest request, int tenantId,
String fromDate, String toDate) String fromDate, String toDate)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
List<Device> devices; List<Device> devices;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
List<String> statusList = request.getStatusList();
boolean isStatusProvided = false; boolean isStatusProvided = false;
String sql = "SELECT " + String sql = "SELECT " +
@ -479,20 +509,13 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
"d.DEVICE_TYPE_ID = t.ID AND " + "d.DEVICE_TYPE_ID = t.ID AND " +
"e.TENANT_ID = ? AND " + "e.TENANT_ID = ? AND " +
"e.DATE_OF_ENROLMENT BETWEEN ? AND ?"; "e.DATE_OF_ENROLMENT BETWEEN ? AND ?";
if (statusList != null && !statusList.isEmpty()) {
//Add the query for status sql += buildStatusQuery(statusList);
StringBuilder sqlBuilder = new StringBuilder(sql);
isStatusProvided = buildStatusQuery(statusList, sqlBuilder);
sql = sqlBuilder.toString();
if(statusList != null && !statusList.isEmpty()){
isStatusProvided = true; isStatusProvided = true;
} }
if (ownership != null) { if (ownership != null) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
} }
sql = sql + " LIMIT ?,?"; sql = sql + " LIMIT ?,?";
try (Connection conn = this.getConnection(); try (Connection conn = this.getConnection();
@ -511,70 +534,74 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
} }
stmt.setInt(paramIdx++, request.getStartIndex()); stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount()); stmt.setInt(paramIdx, request.getRowCount());
try (ResultSet rs = stmt.executeQuery()) { try (ResultSet rs = stmt.executeQuery()) {
devices = new ArrayList<>(); devices = new ArrayList<>();
while (rs.next()) { while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device); devices.add(device);
} }
return devices;
} }
} catch (SQLException e) { } catch (SQLException e) {
String msg = "Error occurred while retrieving information of all " + String msg = "Error occurred while retrieving information of all " +
"registered devices under tenant id " + tenantId; "registered devices under tenant id " + tenantId;
log.error(msg, e); log.error(msg, e);
throw new DeviceManagementDAOException(msg, e); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override
public int getDevicesByDurationCount(List<String> statusList, String ownership, String fromDate, String toDate, int tenantId) throws DeviceManagementDAOException { public int getDevicesByDurationCount(
List<String> statusList, String ownership, String fromDate, String toDate, int tenantId)
throws DeviceManagementDAOException {
int deviceCount = 0; int deviceCount = 0;
boolean isStatusProvided; boolean isStatusProvided = false;
String sql = "SELECT " +
"COUNT(d.ID) AS DEVICE_COUNT " +
"FROM DM_DEVICE AS d , DM_ENROLMENT AS e , DM_DEVICE_TYPE AS t " +
"WHERE d.ID = e.DEVICE_ID AND " +
"d.DEVICE_TYPE_ID = t.ID AND " +
"e.TENANT_ID = ? AND " +
"e.DATE_OF_ENROLMENT BETWEEN ? AND ?";
//Add the query for status String sql = "SELECT " +
StringBuilder sqlBuilder = new StringBuilder(sql); "COUNT(d.ID) AS DEVICE_COUNT " +
isStatusProvided = buildStatusQuery(statusList, sqlBuilder); "FROM DM_DEVICE AS d , " +
sql = sqlBuilder.toString(); "DM_ENROLMENT AS e , " +
"DM_DEVICE_TYPE AS t " +
"WHERE d.ID = e.DEVICE_ID " +
"AND d.DEVICE_TYPE_ID = t.ID " +
"AND e.TENANT_ID = ? " +
"AND e.DATE_OF_ENROLMENT BETWEEN ? AND ?";
if (statusList != null && !statusList.isEmpty()) {
sql += buildStatusQuery(statusList);
isStatusProvided = true;
}
if (ownership != null) {
sql = sql + " AND e.OWNERSHIP = ?";
}
try (Connection conn = this.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
int paramIdx = 1;
stmt.setInt(paramIdx++, tenantId);
stmt.setString(paramIdx++, fromDate);
stmt.setString(paramIdx++, toDate);
if (isStatusProvided) {
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
}
if (ownership != null) { if (ownership != null) {
sql = sql + " AND e.OWNERSHIP = ?"; stmt.setString(paramIdx, ownership);
} }
try (Connection conn = this.getConnection(); try (ResultSet rs = stmt.executeQuery()) {
PreparedStatement stmt = conn.prepareStatement(sql)) { if (rs.next()) {
int paramIdx = 1; deviceCount = rs.getInt("DEVICE_COUNT");
stmt.setInt(paramIdx++, tenantId);
stmt.setString(paramIdx++, fromDate);
stmt.setString(paramIdx++, toDate);
if (isStatusProvided) {
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
}
if (ownership != null) {
stmt.setString(paramIdx++, ownership);
}
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
deviceCount = rs.getInt("DEVICE_COUNT");
}
} }
} catch (SQLException e) { return deviceCount;
String msg = "Error occurred while retrieving information of all " +
"registered devices under tenant id " + tenantId;
log.error(msg, e);
throw new DeviceManagementDAOException(msg, e);
} }
return deviceCount; } catch (SQLException e) {
String msg = "Error occurred while retrieving information of all " +
"registered devices under tenant id " + tenantId;
log.error(msg, e);
throw new DeviceManagementDAOException(msg, e);
}
} }
@Override @Override
@ -583,7 +610,7 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
List<Count> countList = new ArrayList<>(); List<Count> countList = new ArrayList<>();
String ownership = request.getOwnership(); String ownership = request.getOwnership();
boolean isStatusProvided; boolean isStatusProvided = false;
String sql = String sql =
"SELECT " + "SELECT " +
@ -597,9 +624,10 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
"BETWEEN ? AND ? "; "BETWEEN ? AND ? ";
//Add the query for status //Add the query for status
StringBuilder sqlBuilder = new StringBuilder(sql); if (statusList != null && !statusList.isEmpty()) {
isStatusProvided = buildStatusQuery(statusList, sqlBuilder); sql += buildStatusQuery(statusList);
sql = sqlBuilder.toString(); isStatusProvided = true;
}
if (ownership != null) { if (ownership != null) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
@ -644,23 +672,6 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
return countList; return countList;
} }
protected boolean buildStatusQuery(List<String> statusList, StringBuilder sqlBuilder) {
if (statusList != null && !statusList.isEmpty() && !statusList.get(0).isEmpty()) {
sqlBuilder.append(" AND e.STATUS IN(");
for (int i = 0; i < statusList.size(); i++) {
sqlBuilder.append("?");
if (i != statusList.size() - 1) {
sqlBuilder.append(",");
}
}
sqlBuilder.append(")");
return true;
}else {
return false;
}
}
/** /**
* Get the list of devices that matches with the given device name and (or) device type. * Get the list of devices that matches with the given device name and (or) device type.
* *

@ -50,8 +50,6 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
public List<Device> getDevices(PaginationRequest request, int tenantId) public List<Device> getDevices(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
List<Device> devices = null; List<Device> devices = null;
String deviceType = request.getDeviceType(); String deviceType = request.getDeviceType();
boolean isDeviceTypeProvided = false; boolean isDeviceTypeProvided = false;
@ -63,33 +61,42 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
boolean isOwnerPatternProvided = false; boolean isOwnerPatternProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
boolean isOwnershipProvided = false; boolean isOwnershipProvided = false;
String status = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false; boolean isStatusProvided = false;
String excludeStatus = request.getExcludeStatus();
boolean isExcludeStatusProvided = false;
Date since = request.getSince(); Date since = request.getSince();
boolean isSinceProvided = false; boolean isSinceProvided = false;
try {
conn = this.getConnection();
String sql = "SELECT d1.ID AS DEVICE_ID, d1.DESCRIPTION, d1.NAME AS DEVICE_NAME, d1.DEVICE_TYPE, "
+ "d1.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, "
+ "e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, (SELECT d.ID, d.DESCRIPTION, "
+ "d.NAME, d.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE " + "FROM DM_DEVICE d, DM_DEVICE_TYPE t ";
try {
conn = getConnection();
String sql = "SELECT d1.ID AS DEVICE_ID, " +
"d1.DESCRIPTION, " +
"d1.NAME AS DEVICE_NAME, " +
"d1.DEVICE_TYPE, " +
"d1.DEVICE_IDENTIFICATION, " +
"e.OWNER, " +
"e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e, " +
"(SELECT d.ID, " +
"d.DESCRIPTION, " +
"d.NAME, " +
"d.DEVICE_IDENTIFICATION, " +
"t.NAME AS DEVICE_TYPE " +
"FROM DM_DEVICE d, " +
"DM_DEVICE_TYPE t ";
//Add the query to filter active devices on timestamp //Add the query to filter active devices on timestamp
if (since != null) { if (since != null) {
sql = sql + ", DM_DEVICE_DETAIL dt"; sql = sql + ", DM_DEVICE_DETAIL dt";
isSinceProvided = true; isSinceProvided = true;
} }
sql = sql + " WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ?"; sql = sql + " WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ?";
//Add query for last updated timestamp //Add query for last updated timestamp
if (isSinceProvided) { if (isSinceProvided) {
sql = sql + " AND dt.DEVICE_ID = d.ID AND dt.UPDATE_TIMESTAMP > ?"; sql = sql + " AND dt.DEVICE_ID = d.ID AND dt.UPDATE_TIMESTAMP > ?";
} }
//Add the query for device-type //Add the query for device-type
if (deviceType != null && !deviceType.isEmpty()) { if (deviceType != null && !deviceType.isEmpty()) {
sql = sql + " AND t.NAME = ?"; sql = sql + " AND t.NAME = ?";
@ -100,9 +107,7 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND d.NAME LIKE ?"; sql = sql + " AND d.NAME LIKE ?";
isDeviceNameProvided = true; isDeviceNameProvided = true;
} }
sql = sql + ") d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ?"; sql = sql + ") d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ?";
//Add the query for ownership //Add the query for ownership
if (ownership != null && !ownership.isEmpty()) { if (ownership != null && !ownership.isEmpty()) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
@ -116,72 +121,63 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND e.OWNER LIKE ?"; sql = sql + " AND e.OWNER LIKE ?";
isOwnerPatternProvided = true; isOwnerPatternProvided = true;
} }
//Add the query for status if (statusList != null && !statusList.isEmpty()) {
if (status != null && !status.isEmpty()) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?";
isStatusProvided = true; isStatusProvided = true;
} }
//Add the query for exclude status
if (excludeStatus != null && !excludeStatus.isEmpty()) {
sql = sql + " AND e.STATUS != ?";
isExcludeStatusProvided = true;
}
sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
stmt = conn.prepareStatement(sql); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, tenantId); int paramIdx = 1;
int paramIdx = 2; stmt.setInt(paramIdx++, tenantId);
if (isSinceProvided) { if (isSinceProvided) {
stmt.setLong(paramIdx++, since.getTime()); stmt.setLong(paramIdx++, since.getTime());
} }
if (isDeviceTypeProvided) { if (isDeviceTypeProvided) {
stmt.setString(paramIdx++, deviceType); stmt.setString(paramIdx++, deviceType);
} }
if (isDeviceNameProvided) { if (isDeviceNameProvided) {
stmt.setString(paramIdx++, deviceName + "%"); stmt.setString(paramIdx++, deviceName + "%");
} }
stmt.setInt(paramIdx++, tenantId);
if (isOwnershipProvided) {
stmt.setString(paramIdx++, ownership);
}
if (isOwnerProvided) {
stmt.setString(paramIdx++, owner);
} else if (isOwnerPatternProvided) {
stmt.setString(paramIdx++, ownerPattern + "%");
}
if (isStatusProvided) {
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
}
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
stmt.setInt(paramIdx++, tenantId); try (ResultSet rs = stmt.executeQuery()) {
if (isOwnershipProvided) { devices = new ArrayList<>();
stmt.setString(paramIdx++, ownership); while (rs.next()) {
} Device device = DeviceManagementDAOUtil.loadDevice(rs);
if (isOwnerProvided) { devices.add(device);
stmt.setString(paramIdx++, owner); }
} else if (isOwnerPatternProvided) { return devices;
stmt.setString(paramIdx++, ownerPattern + "%"); }
}
if (isStatusProvided) {
stmt.setString(paramIdx++, status);
}
if (isExcludeStatusProvided) {
stmt.setString(paramIdx++, excludeStatus);
}
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
rs = stmt.executeQuery();
devices = new ArrayList<>();
while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device);
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while retrieving information of all " + String msg = "Error occurred while retrieving information of all " +
"registered devices", e); "registered devices";
} finally { log.error(msg, e);
DeviceManagementDAOUtil.cleanupResources(stmt, rs); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override
public List<Device> searchDevicesInGroup(PaginationRequest request, int tenantId) public List<Device> searchDevicesInGroup(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
List<Device> devices = null; List<Device> devices = null;
int groupId = request.getGroupId(); int groupId = request.getGroupId();
String deviceType = request.getDeviceType(); String deviceType = request.getDeviceType();
boolean isDeviceTypeProvided = false; boolean isDeviceTypeProvided = false;
@ -193,52 +189,64 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
boolean isOwnerPatternProvided = false; boolean isOwnerPatternProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
boolean isOwnershipProvided = false; boolean isOwnershipProvided = false;
String status = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false; boolean isStatusProvided = false;
String excludeStatus = request.getExcludeStatus();
boolean isExcludeStatusProvided = false;
Date since = request.getSince(); Date since = request.getSince();
boolean isSinceProvided = false; boolean isSinceProvided = false;
try { try {
conn = this.getConnection(); conn = getConnection();
String sql = "SELECT d1.DEVICE_ID, d1.DESCRIPTION, d1.NAME AS DEVICE_NAME, d1.DEVICE_TYPE, " + String sql = "SELECT d1.DEVICE_ID, " +
"d1.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " + "d1.DESCRIPTION, " +
"e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, " + "d1.NAME AS DEVICE_NAME, " +
"(SELECT gd.DEVICE_ID, gd.DESCRIPTION, gd.NAME, gd.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE " + "d1.DEVICE_TYPE, " +
"FROM (SELECT d.ID AS DEVICE_ID, d.DESCRIPTION, d.NAME, d.DEVICE_IDENTIFICATION, d.DEVICE_TYPE_ID " + "d1.DEVICE_IDENTIFICATION, " +
"FROM DM_DEVICE d, (SELECT dgm.DEVICE_ID FROM DM_DEVICE_GROUP_MAP dgm WHERE dgm.GROUP_ID = ?) dgm1 WHERE" + "e.OWNER, " +
" d.ID = dgm1.DEVICE_ID AND d.TENANT_ID = ?"; "e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e, " +
"(SELECT gd.DEVICE_ID, " +
"gd.DESCRIPTION, " +
"gd.NAME, " +
"gd.DEVICE_IDENTIFICATION, " +
"t.NAME AS DEVICE_TYPE " +
"FROM " +
"(SELECT d.ID AS DEVICE_ID, " +
"d.DESCRIPTION, " +
"d.NAME, " +
"d.DEVICE_IDENTIFICATION, " +
"d.DEVICE_TYPE_ID " +
"FROM DM_DEVICE d, " +
"(SELECT dgm.DEVICE_ID " +
"FROM DM_DEVICE_GROUP_MAP dgm " +
"WHERE dgm.GROUP_ID = ?) dgm1 " +
"WHERE " +
"d.ID = dgm1.DEVICE_ID " +
"AND d.TENANT_ID = ?";
//Add the query for device-name //Add the query for device-name
if (deviceName != null && !deviceName.isEmpty()) { if (deviceName != null && !deviceName.isEmpty()) {
sql = sql + " AND d.NAME LIKE ?"; sql = sql + " AND d.NAME LIKE ?";
isDeviceNameProvided = true; isDeviceNameProvided = true;
} }
sql = sql + ") gd, DM_DEVICE_TYPE t"; sql = sql + ") gd, DM_DEVICE_TYPE t";
if (since != null) { if (since != null) {
sql = sql + ", DM_DEVICE_DETAIL dt"; sql = sql + ", DM_DEVICE_DETAIL dt";
isSinceProvided = true; isSinceProvided = true;
} }
sql = sql + " WHERE gd.DEVICE_TYPE_ID = t.ID"; sql = sql + " WHERE gd.DEVICE_TYPE_ID = t.ID";
//Add query for last updated timestamp //Add query for last updated timestamp
if (isSinceProvided) { if (isSinceProvided) {
sql = sql + " AND dt.DEVICE_ID = gd.DEVICE_ID AND dt.UPDATE_TIMESTAMP > ?"; sql = sql + " AND dt.DEVICE_ID = gd.DEVICE_ID AND dt.UPDATE_TIMESTAMP > ?";
} }
//Add the query for device-type //Add the query for device-type
if (deviceType != null && !deviceType.isEmpty()) { if (deviceType != null && !deviceType.isEmpty()) {
sql = sql + " AND t.NAME = ?"; sql = sql + " AND t.NAME = ?";
isDeviceTypeProvided = true; isDeviceTypeProvided = true;
} }
sql = sql + " ) d1 WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? "; sql = sql + " ) d1 WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? ";
//Add the query for ownership //Add the query for ownership
if (ownership != null && !ownership.isEmpty()) { if (ownership != null && !ownership.isEmpty()) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
@ -252,69 +260,59 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND e.OWNER LIKE ?"; sql = sql + " AND e.OWNER LIKE ?";
isOwnerPatternProvided = true; isOwnerPatternProvided = true;
} }
//Add the query for status if (statusList != null && !statusList.isEmpty()) {
if (status != null && !status.isEmpty()) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?";
isStatusProvided = true; isStatusProvided = true;
} }
//Add the query for exclude status
if (excludeStatus != null && !excludeStatus.isEmpty()) {
sql = sql + " AND e.STATUS != ?";
isExcludeStatusProvided = true;
}
sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
stmt = conn.prepareStatement(sql); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
int paramIdx = 1;
stmt.setInt(1, groupId); stmt.setInt(paramIdx++, groupId);
stmt.setInt(2, tenantId); stmt.setInt(paramIdx++, tenantId);
if (isDeviceNameProvided) {
int paramIdx = 3; stmt.setString(paramIdx++, deviceName + "%");
if (isDeviceNameProvided) { }
stmt.setString(paramIdx++, deviceName + "%"); if (isSinceProvided) {
} stmt.setLong(paramIdx++, since.getTime());
if (isSinceProvided) { }
stmt.setLong(paramIdx++, since.getTime()); if (isDeviceTypeProvided) {
} stmt.setString(paramIdx++, deviceType);
if (isDeviceTypeProvided) { }
stmt.setString(paramIdx++, deviceType); stmt.setInt(paramIdx++, tenantId);
} if (isOwnershipProvided) {
stmt.setString(paramIdx++, ownership);
stmt.setInt(paramIdx++, tenantId); }
if (isOwnershipProvided) { if (isOwnerProvided) {
stmt.setString(paramIdx++, ownership); stmt.setString(paramIdx++, owner);
} } else if (isOwnerPatternProvided) {
if (isOwnerProvided) { stmt.setString(paramIdx++, ownerPattern + "%");
stmt.setString(paramIdx++, owner); }
} else if (isOwnerPatternProvided) { if (isStatusProvided) {
stmt.setString(paramIdx++, ownerPattern + "%"); for (String status : statusList) {
} stmt.setString(paramIdx++, status);
if (isStatusProvided) { }
stmt.setString(paramIdx++, status); }
} stmt.setInt(paramIdx++, request.getStartIndex());
if (isExcludeStatusProvided) { stmt.setInt(paramIdx, request.getRowCount());
stmt.setString(paramIdx++, excludeStatus);
}
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
rs = stmt.executeQuery(); try (ResultSet rs = stmt.executeQuery()) {
devices = new ArrayList<>(); devices = new ArrayList<>();
while (rs.next()) { while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device); devices.add(device);
}
return devices;
}
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while retrieving information of" + String msg = "Error occurred while retrieving information of" +
" devices belonging to group : " + groupId, e); " devices belonging to group : " + groupId;
} finally { log.error(msg, e);
DeviceManagementDAOUtil.cleanupResources(stmt, rs); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override
public List<Device> getDevicesOfUser(PaginationRequest request, int tenantId) public List<Device> getDevicesOfUser(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
@ -425,46 +423,80 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
public List<Device> getDevicesByStatus(PaginationRequest request, int tenantId) public List<Device> getDevicesByStatus(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null;
List<Device> devices = new ArrayList<>(); List<Device> devices = new ArrayList<>();
List<String> statusList = request.getStatusList();
try { try {
conn = this.getConnection(); conn = getConnection();
String sql = "SELECT d.ID AS DEVICE_ID, d.DESCRIPTION, d.NAME AS DEVICE_NAME, t.NAME AS DEVICE_TYPE, " String sql = "SELECT d.ID AS DEVICE_ID, " +
+ "d.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " "d.DESCRIPTION, " +
+ "e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM (SELECT e.ID, e.DEVICE_ID, e.OWNER, e.OWNERSHIP, e.STATUS, " "d.NAME AS DEVICE_NAME, " +
+ "e.DATE_OF_ENROLMENT, e.DATE_OF_LAST_UPDATE, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e " "t.NAME AS DEVICE_TYPE, " +
+ "WHERE TENANT_ID = ? AND STATUS = ?) e, DM_DEVICE d, DM_DEVICE_TYPE t " "d.DEVICE_IDENTIFICATION, " +
+ "WHERE DEVICE_ID = e.DEVICE_ID AND d.DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ? ORDER BY ENROLMENT_ID " "e.OWNER, " +
+ "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; "e.OWNERSHIP, " +
stmt = conn.prepareStatement(sql); "e.STATUS, " +
stmt.setInt(1, tenantId); "e.DATE_OF_LAST_UPDATE, " +
stmt.setString(2, request.getStatus()); "e.DATE_OF_ENROLMENT, " +
stmt.setInt(3, tenantId); "e.ID AS ENROLMENT_ID " +
stmt.setInt(4, request.getStartIndex()); "FROM (SELECT e.ID, " +
stmt.setInt(5, request.getRowCount()); "e.DEVICE_ID, " +
ResultSet rs = stmt.executeQuery(); "e.OWNER, " +
"e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_ENROLMENT, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e " +
"WHERE TENANT_ID = ?";
if (statusList == null || statusList.isEmpty()) {
String msg = "Error occurred while fetching the list of devices. Status List can't " +
"be null or empty";
log.error(msg);
throw new DeviceManagementDAOException(msg);
}
sql += buildStatusQuery(statusList);
sql += ") e," +
"DM_DEVICE d," +
"DM_DEVICE_TYPE t" +
"WHERE DEVICE_ID = e.DEVICE_ID" +
"AND d.DEVICE_TYPE_ID = t.ID" +
"AND d.TENANT_ID = ?" +
"LIMIT ?,?";
while (rs.next()) { try (PreparedStatement stmt = conn.prepareStatement(sql)) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); int paramIdx = 1;
devices.add(device); stmt.setInt(paramIdx++, tenantId);
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
stmt.setInt(paramIdx++, tenantId);
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device);
}
return devices;
}
} }
} catch (SQLException e) { } catch (SQLException e) {
String msg = "Error occurred while fetching the list of devices that matches to status " + String msg = "Error occurred while fetching the list of devices that matches to status " +
"'" + request.getStatus() + "'"; request.getStatusList().toString();
log.error(msg, e); log.error(msg, e);
throw new DeviceManagementDAOException(msg, e); throw new DeviceManagementDAOException(msg, e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
return devices;
} }
@Override @Override
public List<Device> getDevicesByDuration(PaginationRequest request, List<String> statusList, int tenantId, public List<Device> getDevicesByDuration(PaginationRequest request, int tenantId,
String fromDate, String toDate) String fromDate, String toDate)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
List<Device> devices; List<Device> devices;
String deviceStatus = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
String sql = "SELECT " + String sql = "SELECT " +
@ -483,14 +515,13 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
"d.DEVICE_TYPE_ID = t.ID AND " + "d.DEVICE_TYPE_ID = t.ID AND " +
"e.TENANT_ID = ? AND " + "e.TENANT_ID = ? AND " +
"e.DATE_OF_ENROLMENT BETWEEN ? AND ?"; "e.DATE_OF_ENROLMENT BETWEEN ? AND ?";
if (statusList != null && !statusList.isEmpty()) {
if (deviceStatus != null) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?"; isStatusProvided = true;
} }
if (ownership != null) { if (ownership != null) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
} }
sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
try (Connection conn = this.getConnection(); try (Connection conn = this.getConnection();
@ -499,20 +530,24 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
stmt.setInt(paramIdx++, tenantId); stmt.setInt(paramIdx++, tenantId);
stmt.setString(paramIdx++, fromDate); stmt.setString(paramIdx++, fromDate);
stmt.setString(paramIdx++, toDate); stmt.setString(paramIdx++, toDate);
if (deviceStatus != null) { if (isStatusProvided) {
stmt.setString(paramIdx++, deviceStatus); for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
} }
if (ownership != null) { if (ownership != null) {
stmt.setString(paramIdx++, ownership); stmt.setString(paramIdx++, ownership);
} }
stmt.setInt(paramIdx++, request.getStartIndex()); stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount()); stmt.setInt(paramIdx, request.getRowCount());
try (ResultSet rs = stmt.executeQuery()) { try (ResultSet rs = stmt.executeQuery()) {
devices = new ArrayList<>(); devices = new ArrayList<>();
while (rs.next()) { while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device); devices.add(device);
} }
return devices;
} }
} catch (SQLException e) { } catch (SQLException e) {
String msg = "Error occurred while retrieving information of all " + String msg = "Error occurred while retrieving information of all " +
@ -520,7 +555,6 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
log.error(msg, e); log.error(msg, e);
throw new DeviceManagementDAOException(msg, e); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override

@ -49,8 +49,6 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
public List<Device> getDevices(PaginationRequest request, int tenantId) public List<Device> getDevices(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
List<Device> devices = null; List<Device> devices = null;
String deviceType = request.getDeviceType(); String deviceType = request.getDeviceType();
boolean isDeviceTypeProvided = false; boolean isDeviceTypeProvided = false;
@ -62,20 +60,34 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
boolean isOwnerPatternProvided = false; boolean isOwnerPatternProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
boolean isOwnershipProvided = false; boolean isOwnershipProvided = false;
String status = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false; boolean isStatusProvided = false;
String excludeStatus = request.getExcludeStatus();
boolean isExcludeStatusProvided = false;
Date since = request.getSince(); Date since = request.getSince();
boolean isSinceProvided = false; boolean isSinceProvided = false;
try {
conn = this.getConnection();
String sql = "SELECT d1.ID AS DEVICE_ID, d1.DESCRIPTION, d1.NAME AS DEVICE_NAME, d1.DEVICE_TYPE, " +
"d1.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, (SELECT d.ID, d.DESCRIPTION, " +
"d.NAME, d.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE FROM DM_DEVICE d, DM_DEVICE_TYPE t " +
"WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ?";
try {
conn = getConnection();
String sql = "SELECT d1.ID AS DEVICE_ID, " +
"d1.DESCRIPTION, " +
"d1.NAME AS DEVICE_NAME, " +
"d1.DEVICE_TYPE, " +
"d1.DEVICE_IDENTIFICATION, " +
"e.OWNER, " +
"e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e, " +
"(SELECT d.ID, " +
"d.DESCRIPTION, " +
"d.NAME, " +
"d.DEVICE_IDENTIFICATION, " +
"t.NAME AS DEVICE_TYPE " +
"FROM DM_DEVICE d, " +
"DM_DEVICE_TYPE t " +
"WHERE DEVICE_TYPE_ID = t.ID " +
"AND d.TENANT_ID = ?";
//Add the query for device-type //Add the query for device-type
if (deviceType != null && !deviceType.isEmpty()) { if (deviceType != null && !deviceType.isEmpty()) {
sql = sql + " AND t.NAME = ?"; sql = sql + " AND t.NAME = ?";
@ -86,9 +98,7 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND d.NAME LIKE ?"; sql = sql + " AND d.NAME LIKE ?";
isDeviceNameProvided = true; isDeviceNameProvided = true;
} }
sql = sql + ") d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ?"; sql = sql + ") d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ?";
//Add the query for ownership //Add the query for ownership
if (ownership != null && !ownership.isEmpty()) { if (ownership != null && !ownership.isEmpty()) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
@ -102,69 +112,60 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND e.OWNER LIKE ?"; sql = sql + " AND e.OWNER LIKE ?";
isOwnerPatternProvided = true; isOwnerPatternProvided = true;
} }
//Add the query for status if (statusList != null && !statusList.isEmpty()) {
if (status != null && !status.isEmpty()) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?";
isStatusProvided = true; isStatusProvided = true;
} }
//Add the query for exclude status
if (excludeStatus != null && !excludeStatus.isEmpty()) {
sql = sql + " AND e.STATUS != ?";
isExcludeStatusProvided = true;
}
sql = sql + " LIMIT ? OFFSET ?"; sql = sql + " LIMIT ? OFFSET ?";
stmt = conn.prepareStatement(sql); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, tenantId); int paramIdx = 1;
int paramIdx = 2; stmt.setInt(paramIdx++, tenantId);
if (isDeviceTypeProvided) { if (isDeviceTypeProvided) {
stmt.setString(paramIdx++, deviceType); stmt.setString(paramIdx++, deviceType);
} }
if (isDeviceNameProvided) { if (isDeviceNameProvided) {
stmt.setString(paramIdx++, deviceName + "%"); stmt.setString(paramIdx++, deviceName + "%");
} }
stmt.setInt(paramIdx++, tenantId);
if (isOwnershipProvided) {
stmt.setString(paramIdx++, ownership);
}
if (isOwnerProvided) {
stmt.setString(paramIdx++, owner);
} else if (isOwnerPatternProvided) {
stmt.setString(paramIdx++, ownerPattern + "%");
}
if (isStatusProvided) {
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
}
stmt.setInt(paramIdx++, request.getRowCount());
stmt.setInt(paramIdx, request.getStartIndex());
stmt.setInt(paramIdx++, tenantId); try (ResultSet rs = stmt.executeQuery()) {
if (isOwnershipProvided) { devices = new ArrayList<>();
stmt.setString(paramIdx++, ownership); while (rs.next()) {
} Device device = DeviceManagementDAOUtil.loadDevice(rs);
if (isOwnerProvided) { devices.add(device);
stmt.setString(paramIdx++, owner); }
} else if (isOwnerPatternProvided) { return devices;
stmt.setString(paramIdx++, ownerPattern + "%"); }
}
if (isStatusProvided) {
stmt.setString(paramIdx++, status);
}
if (isExcludeStatusProvided) {
stmt.setString(paramIdx++, excludeStatus);
}
stmt.setInt(paramIdx++, request.getRowCount());
stmt.setInt(paramIdx, request.getStartIndex());
rs = stmt.executeQuery();
devices = new ArrayList<>();
while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device);
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while retrieving information of all " + String msg = "Error occurred while retrieving information of all " +
"registered devices", e); "registered devices";
} finally { log.error(msg, e);
DeviceManagementDAOUtil.cleanupResources(stmt, rs); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override
public List<Device> searchDevicesInGroup(PaginationRequest request, int tenantId) public List<Device> searchDevicesInGroup(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
List<Device> devices = null; List<Device> devices = null;
int groupId = request.getGroupId(); int groupId = request.getGroupId();
String deviceType = request.getDeviceType(); String deviceType = request.getDeviceType();
boolean isDeviceTypeProvided = false; boolean isDeviceTypeProvided = false;
@ -176,52 +177,63 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
boolean isOwnerPatternProvided = false; boolean isOwnerPatternProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
boolean isOwnershipProvided = false; boolean isOwnershipProvided = false;
String status = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false; boolean isStatusProvided = false;
String excludeStatus = request.getExcludeStatus();
boolean isExcludeStatusProvided = false;
Date since = request.getSince(); Date since = request.getSince();
boolean isSinceProvided = false; boolean isSinceProvided = false;
try { try {
conn = this.getConnection(); conn = getConnection();
String sql = "SELECT d1.DEVICE_ID, d1.DESCRIPTION, d1.NAME AS DEVICE_NAME, d1.DEVICE_TYPE, " + String sql = "SELECT d1.DEVICE_ID, " +
"d1.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " + "d1.DESCRIPTION, " +
"e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, " + "d1.NAME AS DEVICE_NAME, " +
"(SELECT gd.DEVICE_ID, gd.DESCRIPTION, gd.NAME, gd.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE " + "d1.DEVICE_TYPE, " +
"FROM (SELECT d.ID AS DEVICE_ID, d.DESCRIPTION, d.NAME, d.DEVICE_IDENTIFICATION, d.DEVICE_TYPE_ID " + "d1.DEVICE_IDENTIFICATION, " +
"FROM DM_DEVICE d, (SELECT dgm.DEVICE_ID FROM DM_DEVICE_GROUP_MAP dgm WHERE dgm.GROUP_ID = ?) dgm1 WHERE" + "e.OWNER, " +
" d.ID = dgm1.DEVICE_ID AND d.TENANT_ID = ?"; "e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e, " +
"(SELECT gd.DEVICE_ID, " +
"gd.DESCRIPTION, " +
"gd.NAME, " +
"gd.DEVICE_IDENTIFICATION, " +
"t.NAME AS DEVICE_TYPE " +
"FROM " +
"(SELECT d.ID AS DEVICE_ID, " +
"d.DESCRIPTION, " +
"d.NAME, " +
"d.DEVICE_IDENTIFICATION, " +
"d.DEVICE_TYPE_ID " +
"FROM DM_DEVICE d, " +
"(SELECT dgm.DEVICE_ID " +
"FROM DM_DEVICE_GROUP_MAP dgm " +
"WHERE dgm.GROUP_ID = ?) dgm1 " +
"WHERE d.ID = dgm1.DEVICE_ID " +
"AND d.TENANT_ID = ?";
//Add the query for device-name //Add the query for device-name
if (deviceName != null && !deviceName.isEmpty()) { if (deviceName != null && !deviceName.isEmpty()) {
sql = sql + " AND d.NAME LIKE ?"; sql = sql + " AND d.NAME LIKE ?";
isDeviceNameProvided = true; isDeviceNameProvided = true;
} }
sql = sql + ") gd, DM_DEVICE_TYPE t"; sql = sql + ") gd, DM_DEVICE_TYPE t";
if (since != null) { if (since != null) {
sql = sql + ", DM_DEVICE_DETAIL dt"; sql = sql + ", DM_DEVICE_DETAIL dt";
isSinceProvided = true; isSinceProvided = true;
} }
sql = sql + " WHERE gd.DEVICE_TYPE_ID = t.ID"; sql = sql + " WHERE gd.DEVICE_TYPE_ID = t.ID";
//Add query for last updated timestamp //Add query for last updated timestamp
if (isSinceProvided) { if (isSinceProvided) {
sql = sql + " AND dt.DEVICE_ID = gd.DEVICE_ID AND dt.UPDATE_TIMESTAMP > ?"; sql = sql + " AND dt.DEVICE_ID = gd.DEVICE_ID AND dt.UPDATE_TIMESTAMP > ?";
} }
//Add the query for device-type //Add the query for device-type
if (deviceType != null && !deviceType.isEmpty()) { if (deviceType != null && !deviceType.isEmpty()) {
sql = sql + " AND t.NAME = ?"; sql = sql + " AND t.NAME = ?";
isDeviceTypeProvided = true; isDeviceTypeProvided = true;
} }
sql = sql + " ) d1 WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? "; sql = sql + " ) d1 WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? ";
//Add the query for ownership //Add the query for ownership
if (ownership != null && !ownership.isEmpty()) { if (ownership != null && !ownership.isEmpty()) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
@ -235,66 +247,57 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND e.OWNER LIKE ?"; sql = sql + " AND e.OWNER LIKE ?";
isOwnerPatternProvided = true; isOwnerPatternProvided = true;
} }
//Add the query for status if (statusList != null && !statusList.isEmpty()) {
if (status != null && !status.isEmpty()) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?";
isStatusProvided = true; isStatusProvided = true;
} }
//Add the query for exclude status
if (excludeStatus != null && !excludeStatus.isEmpty()) {
sql = sql + " AND e.STATUS != ?";
isExcludeStatusProvided = true;
}
sql = sql + " LIMIT ? OFFSET ?"; sql = sql + " LIMIT ? OFFSET ?";
stmt = conn.prepareStatement(sql); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
int paramIdx = 1;
stmt.setInt(1, groupId); stmt.setInt(paramIdx++, groupId);
stmt.setInt(2, tenantId); stmt.setInt(paramIdx++, tenantId);
if (isDeviceNameProvided) {
int paramIdx = 3; stmt.setString(paramIdx++, deviceName + "%");
if (isDeviceNameProvided) { }
stmt.setString(paramIdx++, deviceName + "%"); if (isSinceProvided) {
} stmt.setLong(paramIdx++, since.getTime());
if (isSinceProvided) { }
stmt.setLong(paramIdx++, since.getTime()); if (isDeviceTypeProvided) {
} stmt.setString(paramIdx++, deviceType);
if (isDeviceTypeProvided) { }
stmt.setString(paramIdx++, deviceType); stmt.setInt(paramIdx++, tenantId);
} if (isOwnershipProvided) {
stmt.setString(paramIdx++, ownership);
stmt.setInt(paramIdx++, tenantId); }
if (isOwnershipProvided) { if (isOwnerProvided) {
stmt.setString(paramIdx++, ownership); stmt.setString(paramIdx++, owner);
} } else if (isOwnerPatternProvided) {
if (isOwnerProvided) { stmt.setString(paramIdx++, ownerPattern + "%");
stmt.setString(paramIdx++, owner); }
} else if (isOwnerPatternProvided) { if (isStatusProvided) {
stmt.setString(paramIdx++, ownerPattern + "%"); for (String status : statusList) {
} stmt.setString(paramIdx++, status);
if (isStatusProvided) { }
stmt.setString(paramIdx++, status); }
} stmt.setInt(paramIdx++, request.getRowCount());
if (isExcludeStatusProvided) { stmt.setInt(paramIdx, request.getStartIndex());
stmt.setString(paramIdx++, excludeStatus);
}
stmt.setInt(paramIdx, request.getRowCount());
stmt.setInt(paramIdx++, request.getStartIndex());
rs = stmt.executeQuery(); try (ResultSet rs = stmt.executeQuery()) {
devices = new ArrayList<>(); devices = new ArrayList<>();
while (rs.next()) { while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device); devices.add(device);
}
return devices;
}
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while retrieving information of" + String msg = "Error occurred while retrieving information of" +
" devices belonging to group : " + groupId, e); " devices belonging to group : " + groupId;
} finally { log.error(msg, e);
DeviceManagementDAOUtil.cleanupResources(stmt, rs); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override
@ -405,45 +408,79 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
public List<Device> getDevicesByStatus(PaginationRequest request, int tenantId) public List<Device> getDevicesByStatus(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null;
List<Device> devices = new ArrayList<>(); List<Device> devices = new ArrayList<>();
List<String> statusList = request.getStatusList();
try { try {
conn = this.getConnection(); conn = getConnection();
String sql = "SELECT d.ID AS DEVICE_ID, d.DESCRIPTION, d.NAME AS DEVICE_NAME, t.NAME AS DEVICE_TYPE, " + String sql = "SELECT d.ID AS DEVICE_ID, " +
"d.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " + "d.DESCRIPTION, " +
"e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM (SELECT e.ID, e.DEVICE_ID, e.OWNER, e.OWNERSHIP, e.STATUS, " + "d.NAME AS DEVICE_NAME, " +
"e.DATE_OF_ENROLMENT, e.DATE_OF_LAST_UPDATE, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e " + "t.NAME AS DEVICE_TYPE, " +
"WHERE TENANT_ID = ? AND STATUS = ?) e, DM_DEVICE d, DM_DEVICE_TYPE t " + "d.DEVICE_IDENTIFICATION, " +
"WHERE DEVICE_ID = e.DEVICE_ID AND d.DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ? LIMIT ? OFFSET ?"; "e.OWNER, " +
stmt = conn.prepareStatement(sql); "e.OWNERSHIP, " +
stmt.setInt(1, tenantId); "e.STATUS, " +
stmt.setString(2, request.getStatus()); "e.DATE_OF_LAST_UPDATE, " +
stmt.setInt(3, tenantId); "e.DATE_OF_ENROLMENT, " +
stmt.setInt(4, request.getRowCount()); "e.ID AS ENROLMENT_ID " +
stmt.setInt(5, request.getStartIndex()); "FROM " +
ResultSet rs = stmt.executeQuery(); "(SELECT e.ID, " +
"e.DEVICE_ID, " +
"e.OWNER, " +
"e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_ENROLMENT, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e " +
"WHERE TENANT_ID = ?";
if (statusList == null || statusList.isEmpty()) {
String msg = "Error occurred while fetching the list of devices. Status List can't " +
"be null or empty";
log.error(msg);
throw new DeviceManagementDAOException(msg);
}
sql += buildStatusQuery(statusList);
sql += ") e, " +
"DM_DEVICE d, DM_DEVICE_TYPE t " +
"WHERE DEVICE_ID = e.DEVICE_ID " +
"AND d.DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ? " +
"LIMIT ? OFFSET ?";
while (rs.next()) { try (PreparedStatement stmt = conn.prepareStatement(sql)) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); int paramIdx = 1;
devices.add(device); stmt.setInt(paramIdx++, tenantId);
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
stmt.setInt(paramIdx++, tenantId);
stmt.setInt(paramIdx++, request.getRowCount());
stmt.setInt(paramIdx, request.getStartIndex());
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device);
}
return devices;
}
} }
} catch (SQLException e) { } catch (SQLException e) {
String msg = "Error occurred while fetching the list of devices that matches to status " + String msg = "Error occurred while fetching the list of devices that matches to status " +
"'" + request.getStatus() + "'"; request.getStatusList().toString();
log.error(msg, e); log.error(msg, e);
throw new DeviceManagementDAOException(msg, e); throw new DeviceManagementDAOException(msg, e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
return devices;
} }
@Override @Override
public List<Device> getDevicesByDuration(PaginationRequest request, List<String> statusList, int tenantId, public List<Device> getDevicesByDuration(PaginationRequest request, int tenantId,
String fromDate, String toDate) String fromDate, String toDate)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
List<Device> devices; List<Device> devices;
String deviceStatus = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
String sql = "SELECT " + String sql = "SELECT " +
@ -462,14 +499,13 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
"d.DEVICE_TYPE_ID = t.ID AND " + "d.DEVICE_TYPE_ID = t.ID AND " +
"e.TENANT_ID = ? AND " + "e.TENANT_ID = ? AND " +
"e.DATE_OF_ENROLMENT BETWEEN ? AND ?"; "e.DATE_OF_ENROLMENT BETWEEN ? AND ?";
if (statusList != null && !statusList.isEmpty()) {
if (deviceStatus != null) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?"; isStatusProvided = true;
} }
if (ownership != null) { if (ownership != null) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
} }
sql = sql + " LIMIT ? OFFSET ?"; sql = sql + " LIMIT ? OFFSET ?";
try (Connection conn = this.getConnection(); try (Connection conn = this.getConnection();
@ -478,20 +514,24 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
stmt.setInt(paramIdx++, tenantId); stmt.setInt(paramIdx++, tenantId);
stmt.setString(paramIdx++, fromDate); stmt.setString(paramIdx++, fromDate);
stmt.setString(paramIdx++, toDate); stmt.setString(paramIdx++, toDate);
if (deviceStatus != null) { if (isStatusProvided) {
stmt.setString(paramIdx++, deviceStatus); for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
} }
if (ownership != null) { if (ownership != null) {
stmt.setString(paramIdx++, ownership); stmt.setString(paramIdx++, ownership);
} }
stmt.setInt(paramIdx++, request.getRowCount()); stmt.setInt(paramIdx++, request.getRowCount());
stmt.setInt(paramIdx, request.getStartIndex()); stmt.setInt(paramIdx, request.getStartIndex());
try (ResultSet rs = stmt.executeQuery()) { try (ResultSet rs = stmt.executeQuery()) {
devices = new ArrayList<>(); devices = new ArrayList<>();
while (rs.next()) { while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device); devices.add(device);
} }
return devices;
} }
} catch (SQLException e) { } catch (SQLException e) {
String msg = "Error occurred while retrieving information of all " + String msg = "Error occurred while retrieving information of all " +
@ -499,7 +539,6 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
log.error(msg, e); log.error(msg, e);
throw new DeviceManagementDAOException(msg, e); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override

@ -51,8 +51,6 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
public List<Device> getDevices(PaginationRequest request, int tenantId) public List<Device> getDevices(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
List<Device> devices = null; List<Device> devices = null;
String deviceType = request.getDeviceType(); String deviceType = request.getDeviceType();
boolean isDeviceTypeProvided = false; boolean isDeviceTypeProvided = false;
@ -64,33 +62,41 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
boolean isOwnerPatternProvided = false; boolean isOwnerPatternProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
boolean isOwnershipProvided = false; boolean isOwnershipProvided = false;
String status = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false; boolean isStatusProvided = false;
String excludeStatus = request.getExcludeStatus();
boolean isExcludeStatusProvided = false;
Date since = request.getSince(); Date since = request.getSince();
boolean isSinceProvided = false; boolean isSinceProvided = false;
try { try {
conn = this.getConnection(); conn = getConnection();
String sql = "SELECT d1.ID AS DEVICE_ID, d1.DESCRIPTION, d1.NAME AS DEVICE_NAME, d1.DEVICE_TYPE, " + String sql = "SELECT d1.ID AS DEVICE_ID, " +
"d1.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " + "d1.DESCRIPTION, " +
"e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, (SELECT d.ID, d.DESCRIPTION, " + "d1.NAME AS DEVICE_NAME, " +
"d.NAME, d.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE " + "d1.DEVICE_TYPE, " +
"d1.DEVICE_IDENTIFICATION, " +
"e.OWNER, " +
"e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e, " +
"(SELECT d.ID, " +
"d.DESCRIPTION, " +
"d.NAME, " +
"d.DEVICE_IDENTIFICATION, " +
"t.NAME AS DEVICE_TYPE " +
"FROM DM_DEVICE d, DM_DEVICE_TYPE t "; "FROM DM_DEVICE d, DM_DEVICE_TYPE t ";
//Add the query to filter active devices on timestamp //Add the query to filter active devices on timestamp
if (since != null) { if (since != null) {
sql = sql + ", DM_DEVICE_DETAIL dt"; sql = sql + ", DM_DEVICE_DETAIL dt";
isSinceProvided = true; isSinceProvided = true;
} }
sql = sql + " WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ?"; sql = sql + " WHERE DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ?";
//Add query for last updated timestamp //Add query for last updated timestamp
if (isSinceProvided) { if (isSinceProvided) {
sql = sql + " AND dt.DEVICE_ID = d.ID AND dt.UPDATE_TIMESTAMP > ?"; sql = sql + " AND dt.DEVICE_ID = d.ID AND dt.UPDATE_TIMESTAMP > ?";
} }
//Add the query for device-type //Add the query for device-type
if (deviceType != null && !deviceType.isEmpty()) { if (deviceType != null && !deviceType.isEmpty()) {
sql = sql + " AND t.NAME = ?"; sql = sql + " AND t.NAME = ?";
@ -101,9 +107,7 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND d.NAME LIKE ?"; sql = sql + " AND d.NAME LIKE ?";
isDeviceNameProvided = true; isDeviceNameProvided = true;
} }
sql = sql + ") d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ?"; sql = sql + ") d1 WHERE d1.ID = e.DEVICE_ID AND TENANT_ID = ?";
//Add the query for ownership //Add the query for ownership
if (ownership != null && !ownership.isEmpty()) { if (ownership != null && !ownership.isEmpty()) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
@ -117,72 +121,63 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND e.OWNER LIKE ?"; sql = sql + " AND e.OWNER LIKE ?";
isOwnerPatternProvided = true; isOwnerPatternProvided = true;
} }
//Add the query for status if (statusList != null && !statusList.isEmpty()) {
if (status != null && !status.isEmpty()) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?";
isStatusProvided = true; isStatusProvided = true;
} }
//Add the query for exclude status
if (excludeStatus != null && !excludeStatus.isEmpty()) {
sql = sql + " AND e.STATUS != ?";
isExcludeStatusProvided = true;
}
sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
stmt = conn.prepareStatement(sql); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, tenantId); int paramIdx = 1;
int paramIdx = 2; stmt.setInt(paramIdx++, tenantId);
if (isSinceProvided) { if (isSinceProvided) {
stmt.setLong(paramIdx++, since.getTime()); stmt.setLong(paramIdx++, since.getTime());
} }
if (isDeviceTypeProvided) { if (isDeviceTypeProvided) {
stmt.setString(paramIdx++, deviceType); stmt.setString(paramIdx++, deviceType);
} }
if (isDeviceNameProvided) { if (isDeviceNameProvided) {
stmt.setString(paramIdx++, deviceName + "%"); stmt.setString(paramIdx++, deviceName + "%");
} }
stmt.setInt(paramIdx++, tenantId);
if (isOwnershipProvided) {
stmt.setString(paramIdx++, ownership);
}
if (isOwnerProvided) {
stmt.setString(paramIdx++, owner);
} else if (isOwnerPatternProvided) {
stmt.setString(paramIdx++, ownerPattern + "%");
}
if (isStatusProvided) {
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
}
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
stmt.setInt(paramIdx++, tenantId); try (ResultSet rs = stmt.executeQuery()) {
if (isOwnershipProvided) { devices = new ArrayList<>();
stmt.setString(paramIdx++, ownership); while (rs.next()) {
} Device device = DeviceManagementDAOUtil.loadDevice(rs);
if (isOwnerProvided) { devices.add(device);
stmt.setString(paramIdx++, owner); }
} else if (isOwnerPatternProvided) { return devices;
stmt.setString(paramIdx++, ownerPattern + "%"); }
}
if (isStatusProvided) {
stmt.setString(paramIdx++, status);
}
if (isExcludeStatusProvided) {
stmt.setString(paramIdx++, excludeStatus);
}
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
rs = stmt.executeQuery();
devices = new ArrayList<>();
while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device);
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while retrieving information of all " + String msg = "Error occurred while retrieving information of all " +
"registered devices", e); "registered devices";
} finally { log.error(msg, e);
DeviceManagementDAOUtil.cleanupResources(stmt, rs); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override
public List<Device> searchDevicesInGroup(PaginationRequest request, int tenantId) public List<Device> searchDevicesInGroup(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
List<Device> devices = null; List<Device> devices = null;
int groupId = request.getGroupId(); int groupId = request.getGroupId();
String deviceType = request.getDeviceType(); String deviceType = request.getDeviceType();
boolean isDeviceTypeProvided = false; boolean isDeviceTypeProvided = false;
@ -194,52 +189,63 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
boolean isOwnerPatternProvided = false; boolean isOwnerPatternProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
boolean isOwnershipProvided = false; boolean isOwnershipProvided = false;
String status = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false; boolean isStatusProvided = false;
String excludeStatus = request.getExcludeStatus();
boolean isExcludeStatusProvided = false;
Date since = request.getSince(); Date since = request.getSince();
boolean isSinceProvided = false; boolean isSinceProvided = false;
try { try {
conn = this.getConnection(); conn = getConnection();
String sql = "SELECT d1.DEVICE_ID, d1.DESCRIPTION, d1.NAME AS DEVICE_NAME, d1.DEVICE_TYPE, " + String sql = "SELECT d1.DEVICE_ID, " +
"d1.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " + "d1.DESCRIPTION, " +
"e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e, " + "d1.NAME AS DEVICE_NAME, " +
"(SELECT gd.DEVICE_ID, gd.DESCRIPTION, gd.NAME, gd.DEVICE_IDENTIFICATION, t.NAME AS DEVICE_TYPE " + "d1.DEVICE_TYPE, " +
"FROM (SELECT d.ID AS DEVICE_ID, d.DESCRIPTION, d.NAME, d.DEVICE_IDENTIFICATION, d.DEVICE_TYPE_ID " + "d1.DEVICE_IDENTIFICATION, " +
"FROM DM_DEVICE d, (SELECT dgm.DEVICE_ID FROM DM_DEVICE_GROUP_MAP dgm WHERE dgm.GROUP_ID = ?) dgm1 WHERE" + "e.OWNER, " +
" d.ID = dgm1.DEVICE_ID AND d.TENANT_ID = ?"; "e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.DATE_OF_ENROLMENT, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e, " +
"(SELECT gd.DEVICE_ID, " +
"gd.DESCRIPTION, " +
"gd.NAME, " +
"gd.DEVICE_IDENTIFICATION, " +
"t.NAME AS DEVICE_TYPE " +
"FROM " +
"(SELECT d.ID AS DEVICE_ID, " +
"d.DESCRIPTION, " +
"d.NAME, " +
"d.DEVICE_IDENTIFICATION, " +
"d.DEVICE_TYPE_ID " +
"FROM DM_DEVICE d, " +
"(SELECT dgm.DEVICE_ID " +
"FROM DM_DEVICE_GROUP_MAP dgm " +
"WHERE dgm.GROUP_ID = ?) dgm1 " +
"WHERE d.ID = dgm1.DEVICE_ID " +
"AND d.TENANT_ID = ?";
//Add the query for device-name //Add the query for device-name
if (deviceName != null && !deviceName.isEmpty()) { if (deviceName != null && !deviceName.isEmpty()) {
sql = sql + " AND d.NAME LIKE ?"; sql = sql + " AND d.NAME LIKE ?";
isDeviceNameProvided = true; isDeviceNameProvided = true;
} }
sql = sql + ") gd, DM_DEVICE_TYPE t"; sql = sql + ") gd, DM_DEVICE_TYPE t";
if (since != null) { if (since != null) {
sql = sql + ", DM_DEVICE_DETAIL dt"; sql = sql + ", DM_DEVICE_DETAIL dt";
isSinceProvided = true; isSinceProvided = true;
} }
sql = sql + " WHERE gd.DEVICE_TYPE_ID = t.ID"; sql = sql + " WHERE gd.DEVICE_TYPE_ID = t.ID";
//Add query for last updated timestamp //Add query for last updated timestamp
if (isSinceProvided) { if (isSinceProvided) {
sql = sql + " AND dt.DEVICE_ID = gd.DEVICE_ID AND dt.UPDATE_TIMESTAMP > ?"; sql = sql + " AND dt.DEVICE_ID = gd.DEVICE_ID AND dt.UPDATE_TIMESTAMP > ?";
} }
//Add the query for device-type //Add the query for device-type
if (deviceType != null && !deviceType.isEmpty()) { if (deviceType != null && !deviceType.isEmpty()) {
sql = sql + " AND t.NAME = ?"; sql = sql + " AND t.NAME = ?";
isDeviceTypeProvided = true; isDeviceTypeProvided = true;
} }
sql = sql + " ) d1 WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? "; sql = sql + " ) d1 WHERE d1.DEVICE_ID = e.DEVICE_ID AND TENANT_ID = ? ";
//Add the query for ownership //Add the query for ownership
if (ownership != null && !ownership.isEmpty()) { if (ownership != null && !ownership.isEmpty()) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
@ -253,66 +259,57 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
sql = sql + " AND e.OWNER LIKE ?"; sql = sql + " AND e.OWNER LIKE ?";
isOwnerPatternProvided = true; isOwnerPatternProvided = true;
} }
//Add the query for status if (statusList != null && !statusList.isEmpty()) {
if (status != null && !status.isEmpty()) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?";
isStatusProvided = true; isStatusProvided = true;
} }
//Add the query for exclude status
if (excludeStatus != null && !excludeStatus.isEmpty()) {
sql = sql + " AND e.STATUS != ?";
isExcludeStatusProvided = true;
}
sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; sql = sql + " ORDER BY ENROLMENT_ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
stmt = conn.prepareStatement(sql); try (PreparedStatement stmt = conn.prepareStatement(sql)) {
int paramIdx = 1;
stmt.setInt(1, groupId); stmt.setInt(paramIdx++, groupId);
stmt.setInt(2, tenantId); stmt.setInt(paramIdx++, tenantId);
if (isDeviceNameProvided) {
int paramIdx = 3; stmt.setString(paramIdx++, deviceName + "%");
if (isDeviceNameProvided) { }
stmt.setString(paramIdx++, deviceName + "%"); if (isSinceProvided) {
} stmt.setLong(paramIdx++, since.getTime());
if (isSinceProvided) { }
stmt.setLong(paramIdx++, since.getTime()); if (isDeviceTypeProvided) {
} stmt.setString(paramIdx++, deviceType);
if (isDeviceTypeProvided) { }
stmt.setString(paramIdx++, deviceType); stmt.setInt(paramIdx++, tenantId);
} if (isOwnershipProvided) {
stmt.setString(paramIdx++, ownership);
stmt.setInt(paramIdx++, tenantId); }
if (isOwnershipProvided) { if (isOwnerProvided) {
stmt.setString(paramIdx++, ownership); stmt.setString(paramIdx++, owner);
} } else if (isOwnerPatternProvided) {
if (isOwnerProvided) { stmt.setString(paramIdx++, ownerPattern + "%");
stmt.setString(paramIdx++, owner); }
} else if (isOwnerPatternProvided) { if (isStatusProvided) {
stmt.setString(paramIdx++, ownerPattern + "%"); for (String status : statusList) {
} stmt.setString(paramIdx++, status);
if (isStatusProvided) { }
stmt.setString(paramIdx++, status); }
} stmt.setInt(paramIdx++, request.getStartIndex());
if (isExcludeStatusProvided) { stmt.setInt(paramIdx, request.getRowCount());
stmt.setString(paramIdx++, excludeStatus);
}
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
rs = stmt.executeQuery(); try (ResultSet rs = stmt.executeQuery()) {
devices = new ArrayList<>(); devices = new ArrayList<>();
while (rs.next()) { while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device); devices.add(device);
}
return devices;
}
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new DeviceManagementDAOException("Error occurred while retrieving information of" + String msg = "Error occurred while retrieving information of" +
" devices belonging to group : " + groupId, e); " devices belonging to group : " + groupId;
} finally { log.error(msg, e);
DeviceManagementDAOUtil.cleanupResources(stmt, rs); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override
@ -425,38 +422,72 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
public List<Device> getDevicesByStatus(PaginationRequest request, int tenantId) public List<Device> getDevicesByStatus(PaginationRequest request, int tenantId)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null;
List<Device> devices = new ArrayList<>(); List<Device> devices = new ArrayList<>();
List<String> statusList = request.getStatusList();
try { try {
conn = this.getConnection(); conn = getConnection();
String sql = "SELECT d.ID AS DEVICE_ID, d.DESCRIPTION, d.NAME AS DEVICE_NAME, t.NAME AS DEVICE_TYPE, " + String sql = "SELECT d.ID AS DEVICE_ID, " +
"d.DEVICE_IDENTIFICATION, e.OWNER, e.OWNERSHIP, e.STATUS, e.DATE_OF_LAST_UPDATE, " + "d.DESCRIPTION, " +
"e.DATE_OF_ENROLMENT, e.ID AS ENROLMENT_ID FROM (SELECT e.ID, e.DEVICE_ID, e.OWNER, e.OWNERSHIP, e.STATUS, " + "d.NAME AS DEVICE_NAME, " +
"e.DATE_OF_ENROLMENT, e.DATE_OF_LAST_UPDATE, e.ID AS ENROLMENT_ID FROM DM_ENROLMENT e " + "t.NAME AS DEVICE_TYPE, " +
"WHERE TENANT_ID = ? AND STATUS = ?) e, DM_DEVICE d, DM_DEVICE_TYPE t " + "d.DEVICE_IDENTIFICATION, " +
"WHERE DEVICE_ID = e.DEVICE_ID AND d.DEVICE_TYPE_ID = t.ID AND d.TENANT_ID = ? ORDER BY ENROLMENT_ID " + "e.OWNER, " +
"OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; "e.OWNERSHIP, " +
stmt = conn.prepareStatement(sql); "e.STATUS, " +
stmt.setInt(1, tenantId); "e.DATE_OF_LAST_UPDATE, " +
stmt.setString(2, request.getStatus()); "e.DATE_OF_ENROLMENT, " +
stmt.setInt(3, tenantId); "e.ID AS ENROLMENT_ID " +
stmt.setInt(4, request.getStartIndex()); "FROM " +
stmt.setInt(5, request.getRowCount()); "(SELECT e.ID, " +
ResultSet rs = stmt.executeQuery(); "e.DEVICE_ID, " +
"e.OWNER, " +
"e.OWNERSHIP, " +
"e.STATUS, " +
"e.DATE_OF_ENROLMENT, " +
"e.DATE_OF_LAST_UPDATE, " +
"e.ID AS ENROLMENT_ID " +
"FROM DM_ENROLMENT e " +
"WHERE TENANT_ID = ?";
if (statusList == null || statusList.isEmpty()) {
String msg = "Error occurred while fetching the list of devices. Status List can't " +
"be null or empty";
log.error(msg);
throw new DeviceManagementDAOException(msg);
}
sql += buildStatusQuery(statusList);
sql += ") e, " +
"DM_DEVICE d, " +
"DM_DEVICE_TYPE t " +
"WHERE DEVICE_ID = e.DEVICE_ID " +
"AND d.DEVICE_TYPE_ID = t.ID " +
"AND d.TENANT_ID = ? ORDER BY ENROLMENT_ID " +
"OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
while (rs.next()) { try (PreparedStatement stmt = conn.prepareStatement(sql)) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); int paramIdx = 1;
devices.add(device); stmt.setInt(paramIdx++, tenantId);
for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
stmt.setInt(paramIdx++, tenantId);
stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount());
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device);
}
return devices;
}
} }
} catch (SQLException e) { } catch (SQLException e) {
String msg = "Error occurred while fetching the list of devices that matches to status " + String msg = "Error occurred while fetching the list of devices that matches to status " +
"'" + request.getStatus() + "'"; request.getStatusList().toString();
log.error(msg, e); log.error(msg, e);
throw new DeviceManagementDAOException(msg, e); throw new DeviceManagementDAOException(msg, e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
} }
return devices;
} }
/** /**
@ -604,11 +635,12 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
} }
@Override @Override
public List<Device> getDevicesByDuration(PaginationRequest request, List<String> statusList, int tenantId, public List<Device> getDevicesByDuration(PaginationRequest request, int tenantId,
String fromDate, String toDate) String fromDate, String toDate)
throws DeviceManagementDAOException { throws DeviceManagementDAOException {
List<Device> devices; List<Device> devices;
String deviceStatus = request.getStatus(); List<String> statusList = request.getStatusList();
boolean isStatusProvided = false;
String ownership = request.getOwnership(); String ownership = request.getOwnership();
String sql = "SELECT " + String sql = "SELECT " +
@ -627,14 +659,13 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
"d.DEVICE_TYPE_ID = t.ID AND " + "d.DEVICE_TYPE_ID = t.ID AND " +
"e.TENANT_ID = ? AND " + "e.TENANT_ID = ? AND " +
"e.DATE_OF_ENROLMENT BETWEEN ? AND ?"; "e.DATE_OF_ENROLMENT BETWEEN ? AND ?";
if (statusList != null && !statusList.isEmpty()) {
if (deviceStatus != null) { sql += buildStatusQuery(statusList);
sql = sql + " AND e.STATUS = ?"; isStatusProvided = true;
} }
if (ownership != null) { if (ownership != null) {
sql = sql + " AND e.OWNERSHIP = ?"; sql = sql + " AND e.OWNERSHIP = ?";
} }
sql = sql + " OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; sql = sql + " OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
try (Connection conn = this.getConnection(); try (Connection conn = this.getConnection();
@ -643,20 +674,24 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
stmt.setInt(paramIdx++, tenantId); stmt.setInt(paramIdx++, tenantId);
stmt.setString(paramIdx++, fromDate); stmt.setString(paramIdx++, fromDate);
stmt.setString(paramIdx++, toDate); stmt.setString(paramIdx++, toDate);
if (deviceStatus != null) { if (isStatusProvided) {
stmt.setString(paramIdx++, deviceStatus); for (String status : statusList) {
stmt.setString(paramIdx++, status);
}
} }
if (ownership != null) { if (ownership != null) {
stmt.setString(paramIdx++, ownership); stmt.setString(paramIdx++, ownership);
} }
stmt.setInt(paramIdx++, request.getStartIndex()); stmt.setInt(paramIdx++, request.getStartIndex());
stmt.setInt(paramIdx, request.getRowCount()); stmt.setInt(paramIdx, request.getRowCount());
try (ResultSet rs = stmt.executeQuery()) { try (ResultSet rs = stmt.executeQuery()) {
devices = new ArrayList<>(); devices = new ArrayList<>();
while (rs.next()) { while (rs.next()) {
Device device = DeviceManagementDAOUtil.loadDevice(rs); Device device = DeviceManagementDAOUtil.loadDevice(rs);
devices.add(device); devices.add(device);
} }
return devices;
} }
} catch (SQLException e) { } catch (SQLException e) {
String msg = "Error occurred while retrieving information of all " + String msg = "Error occurred while retrieving information of all " +
@ -664,7 +699,6 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
log.error(msg, e); log.error(msg, e);
throw new DeviceManagementDAOException(msg, e); throw new DeviceManagementDAOException(msg, e);
} }
return devices;
} }
@Override @Override

@ -57,7 +57,7 @@ public class ReportManagementServiceImpl implements ReportManagementService {
} }
@Override @Override
public PaginationResult getDevicesByDuration(PaginationRequest request, List<String> statusList, String fromDate, public PaginationResult getDevicesByDuration(PaginationRequest request, String fromDate,
String toDate) String toDate)
throws ReportManagementException { throws ReportManagementException {
PaginationResult paginationResult = new PaginationResult(); PaginationResult paginationResult = new PaginationResult();
@ -72,7 +72,6 @@ public class ReportManagementServiceImpl implements ReportManagementService {
DeviceManagementDAOFactory.openConnection(); DeviceManagementDAOFactory.openConnection();
List<Device> devices = deviceDAO.getDevicesByDuration( List<Device> devices = deviceDAO.getDevicesByDuration(
request, request,
statusList,
DeviceManagementDAOUtil.getTenantId(), DeviceManagementDAOUtil.getTenantId(),
fromDate, fromDate,
toDate toDate

@ -2528,10 +2528,31 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
log.debug("Get devices by status " + request.toString() + " and requiredDeviceInfo: " log.debug("Get devices by status " + request.toString() + " and requiredDeviceInfo: "
+ requireDeviceInfo); + requireDeviceInfo);
} }
List<String> statusList = request.getStatusList();
if (statusList == null || statusList.isEmpty()) {
String msg = "Invalid enrollment status type received. Status can't be null or empty" +
"Valid status types are ACTIVE | INACTIVE | UNCLAIMED | UNREACHABLE " +
"| SUSPENDED | DISENROLLMENT_REQUESTED | REMOVED | BLOCKED | CREATED";
log.error(msg);
throw new DeviceManagementException(msg);
}
if (statusList.size() > 1) {
String msg = "Invalid enrollment status received. Devices can only be filtered by one " +
"type of status, more than one are not allowed";
log.error(msg);
throw new DeviceManagementException(msg);
}
String status = statusList.get(0);
if (StringUtils.isBlank(status)){
String msg = "Invalid enrollment status type received. Status can't be null or empty" +
"Valid status types are ACTIVE | INACTIVE | UNCLAIMED | UNREACHABLE " +
"| SUSPENDED | DISENROLLMENT_REQUESTED | REMOVED | BLOCKED | CREATED";
log.error(msg);
throw new DeviceManagementException(msg);
}
PaginationResult result = new PaginationResult(); PaginationResult result = new PaginationResult();
List<Device> allDevices; List<Device> allDevices;
int tenantId = this.getTenantId(); int tenantId = this.getTenantId();
String status = request.getStatus();
request = DeviceManagerUtil.validateDeviceListPageSize(request); request = DeviceManagerUtil.validateDeviceListPageSize(request);
try { try {
DeviceManagementDAOFactory.openConnection(); DeviceManagementDAOFactory.openConnection();
@ -2540,7 +2561,8 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
result.setRecordsTotal(deviceCount); result.setRecordsTotal(deviceCount);
result.setRecordsFiltered(deviceCount); result.setRecordsFiltered(deviceCount);
} catch (DeviceManagementDAOException e) { } catch (DeviceManagementDAOException e) {
String msg = "Error occurred while fetching the list of devices that matches to status: '" + status + "'"; String msg = "Error occurred while fetching the list of devices that matches to status: " +
status;
log.error(msg, e); log.error(msg, e);
throw new DeviceManagementException(msg, e); throw new DeviceManagementException(msg, e);
} catch (SQLException e) { } catch (SQLException e) {

@ -78,7 +78,9 @@ import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
import java.io.InputStream; import java.io.InputStream;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -676,7 +678,8 @@ public class DeviceManagementProviderServiceTest extends BaseDeviceManagementTes
public void testGetAllDevicesByStatus() throws DeviceManagementException, NoSuchFieldException, public void testGetAllDevicesByStatus() throws DeviceManagementException, NoSuchFieldException,
IllegalAccessException { IllegalAccessException {
PaginationRequest request = new PaginationRequest(0, 100); PaginationRequest request = new PaginationRequest(0, 100);
request.setStatus(EnrolmentInfo.Status.ACTIVE.toString()); List<String> statusList = new ArrayList<>(Collections.singletonList("ACTIVE"));
request.setStatusList(statusList);
MockDataSource dataSource = setDatasourceForGetDevice(); MockDataSource dataSource = setDatasourceForGetDevice();
if (dataSource != null) { if (dataSource != null) {
setMockDeviceCount(dataSource.getConnection(0)); setMockDeviceCount(dataSource.getConnection(0));
@ -842,7 +845,8 @@ public class DeviceManagementProviderServiceTest extends BaseDeviceManagementTes
public void testGetDeviesByStatus() throws DeviceManagementException, NoSuchFieldException, public void testGetDeviesByStatus() throws DeviceManagementException, NoSuchFieldException,
IllegalAccessException { IllegalAccessException {
PaginationRequest request = new PaginationRequest(0, 100); PaginationRequest request = new PaginationRequest(0, 100);
request.setStatus("ACTIVE"); List<String> statusList = new ArrayList<>(Collections.singletonList("ACTIVE"));
request.setStatusList(statusList);
MockDataSource dataSource = setDatasourceForGetDevice(); MockDataSource dataSource = setDatasourceForGetDevice();
if (dataSource != null) { if (dataSource != null) {
setMockDeviceCount(dataSource.getConnection(0)); setMockDeviceCount(dataSource.getConnection(0));

Loading…
Cancel
Save