forked from community/device-mgt-core
Merge branch 'master' of https://github.com/wso2/carbon-device-mgt into entgra-master
# Conflicts: # components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java # components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java # components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.javarevert-70aa11f8
commit
2cac0053ab
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.mgt.core.archival.beans;
|
||||||
|
|
||||||
|
public class ArchiveCommandOperation {
|
||||||
|
|
||||||
|
|
||||||
|
private int operationId;
|
||||||
|
private int enabled;
|
||||||
|
|
||||||
|
public int getOperationId() {
|
||||||
|
return operationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOperationId(int operationId) {
|
||||||
|
this.operationId = operationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnabled(int enabled) {
|
||||||
|
this.enabled = enabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.mgt.core.archival.beans;
|
||||||
|
|
||||||
|
public class ArchiveEnrolmentOperationMap {
|
||||||
|
|
||||||
|
|
||||||
|
private int id;
|
||||||
|
private int enrolmentId;
|
||||||
|
private int operationId;
|
||||||
|
private String status;
|
||||||
|
private int createdTimestamp;
|
||||||
|
private int updatedTimestamp;
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getEnrolmentId() {
|
||||||
|
return enrolmentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnrolmentId(int enrolmentId) {
|
||||||
|
this.enrolmentId = enrolmentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getOperationId() {
|
||||||
|
return operationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOperationId(int operationId) {
|
||||||
|
this.operationId = operationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCreatedTimestamp() {
|
||||||
|
return createdTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreatedTimestamp(int createdTimestamp) {
|
||||||
|
this.createdTimestamp = createdTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getUpdatedTimestamp() {
|
||||||
|
return updatedTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdatedTimestamp(int updatedTimestamp) {
|
||||||
|
this.updatedTimestamp = updatedTimestamp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.mgt.core.archival.beans;
|
||||||
|
|
||||||
|
public class ArchiveNotification {
|
||||||
|
|
||||||
|
|
||||||
|
private int notificationId;
|
||||||
|
private int deviceId;
|
||||||
|
private int operationId;
|
||||||
|
private int tenantId;
|
||||||
|
private String status;
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
public int getNotificationId() {
|
||||||
|
return notificationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNotificationId(int notificationId) {
|
||||||
|
this.notificationId = notificationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDeviceId() {
|
||||||
|
return deviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeviceId(int deviceId) {
|
||||||
|
this.deviceId = deviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getOperationId() {
|
||||||
|
return operationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOperationId(int operationId) {
|
||||||
|
this.operationId = operationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTenantId() {
|
||||||
|
return tenantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTenantId(int tenantId) {
|
||||||
|
this.tenantId = tenantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.mgt.core.archival.beans;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
|
||||||
|
public class ArchiveOperation {
|
||||||
|
|
||||||
|
private int id;
|
||||||
|
private String type;
|
||||||
|
private Timestamp createdTimeStamp;
|
||||||
|
private Timestamp recievedTimeStamp;
|
||||||
|
private String operationCode;
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Timestamp getCreatedTimeStamp() {
|
||||||
|
return createdTimeStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreatedTimeStamp(Timestamp createdTimeStamp) {
|
||||||
|
this.createdTimeStamp = createdTimeStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Timestamp getRecievedTimeStamp() {
|
||||||
|
return recievedTimeStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRecievedTimeStamp(Timestamp recievedTimeStamp) {
|
||||||
|
this.recievedTimeStamp = recievedTimeStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOperationCode() {
|
||||||
|
return operationCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOperationCode(String operationCode) {
|
||||||
|
this.operationCode = operationCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.mgt.core.archival.beans;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
|
||||||
|
public class ArchiveOperationResponse {
|
||||||
|
|
||||||
|
|
||||||
|
private int id;
|
||||||
|
private int enrolmentId;
|
||||||
|
private int operationId;
|
||||||
|
private int enOpMapId;
|
||||||
|
private Object operationResponse;
|
||||||
|
private Timestamp receivedTimeStamp;
|
||||||
|
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getEnrolmentId() {
|
||||||
|
return enrolmentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnrolmentId(int enrolmentId) {
|
||||||
|
this.enrolmentId = enrolmentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getOperationId() {
|
||||||
|
return operationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOperationId(int operationId) {
|
||||||
|
this.operationId = operationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getEnOpMapId() {
|
||||||
|
return enOpMapId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnOpMapId(int enOpMapId) {
|
||||||
|
this.enOpMapId = enOpMapId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getOperationResponse() {
|
||||||
|
return operationResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOperationResponse(Object operationResponse) {
|
||||||
|
this.operationResponse = operationResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Timestamp getReceivedTimeStamp() {
|
||||||
|
return receivedTimeStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReceivedTimeStamp(Timestamp receivedTimeStamp) {
|
||||||
|
this.receivedTimeStamp = receivedTimeStamp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.mgt.core.archival.beans;
|
||||||
|
|
||||||
|
public class ArchiveProfileOperation {
|
||||||
|
|
||||||
|
|
||||||
|
private int operationId;
|
||||||
|
private int enabled;
|
||||||
|
private Object operationDetails;
|
||||||
|
|
||||||
|
public int getOperationId() {
|
||||||
|
return operationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOperationId(int operationId) {
|
||||||
|
this.operationId = operationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnabled(int enabled) {
|
||||||
|
this.enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getOperationDetails() {
|
||||||
|
return operationDetails;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOperationDetails(Object operationDetails) {
|
||||||
|
this.operationDetails = operationDetails;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,550 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
|
||||||
*
|
|
||||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
|
||||||
* Version 2.0 (the "License"); you may not use this file except
|
|
||||||
* in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.wso2.carbon.device.mgt.jaxrs.service.api;
|
|
||||||
|
|
||||||
import io.swagger.annotations.Api;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import io.swagger.annotations.ApiParam;
|
|
||||||
import io.swagger.annotations.ApiResponse;
|
|
||||||
import io.swagger.annotations.ApiResponses;
|
|
||||||
import io.swagger.annotations.Extension;
|
|
||||||
import io.swagger.annotations.ExtensionProperty;
|
|
||||||
import io.swagger.annotations.Info;
|
|
||||||
import io.swagger.annotations.ResponseHeader;
|
|
||||||
import io.swagger.annotations.SwaggerDefinition;
|
|
||||||
import io.swagger.annotations.Tag;
|
|
||||||
import org.wso2.carbon.apimgt.annotations.api.Scope;
|
|
||||||
import org.wso2.carbon.apimgt.annotations.api.Scopes;
|
|
||||||
import org.wso2.carbon.device.mgt.common.geo.service.Alert;
|
|
||||||
import org.wso2.carbon.device.mgt.jaxrs.util.Constants;
|
|
||||||
|
|
||||||
import javax.validation.Valid;
|
|
||||||
import javax.validation.constraints.Size;
|
|
||||||
import javax.ws.rs.Consumes;
|
|
||||||
import javax.ws.rs.DELETE;
|
|
||||||
import javax.ws.rs.GET;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.PUT;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
import javax.ws.rs.PathParam;
|
|
||||||
import javax.ws.rs.Produces;
|
|
||||||
import javax.ws.rs.QueryParam;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
|
|
||||||
@SwaggerDefinition(
|
|
||||||
info = @Info(
|
|
||||||
version = "0.9.0",
|
|
||||||
title = "",
|
|
||||||
extensions = {
|
|
||||||
@Extension(properties = {
|
|
||||||
@ExtensionProperty(name = "name", value = "geo_services"),
|
|
||||||
@ExtensionProperty(name = "context", value = "/api/device-mgt/v0.9/geo-services"),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
),
|
|
||||||
tags = {
|
|
||||||
@Tag(name = "device_management", description = "")
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@Scopes(
|
|
||||||
scopes = {
|
|
||||||
@Scope(
|
|
||||||
name = "View Analytics",
|
|
||||||
description = "",
|
|
||||||
key = "perm:geo-service:analytics-view",
|
|
||||||
permissions = {"/device-mgt/devices/owning-device/view-analytics"}
|
|
||||||
),
|
|
||||||
@Scope(
|
|
||||||
name = "Manage Alerts",
|
|
||||||
description = "",
|
|
||||||
key = "perm:geo-service:alerts-manage",
|
|
||||||
permissions = {"/device-mgt/devices/owning-device/manage-alerts"}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@Path("/geo-services")
|
|
||||||
@Api(value = "Geo Service",
|
|
||||||
description = "This carries all the resources related to the geo service functionalities.")
|
|
||||||
public interface GeoLocationBasedService {
|
|
||||||
/**
|
|
||||||
* Retrieve Analytics for the device type
|
|
||||||
*/
|
|
||||||
@GET
|
|
||||||
@Path("stats/{deviceType}/{deviceId}")
|
|
||||||
@ApiOperation(
|
|
||||||
consumes = "application/json",
|
|
||||||
produces = "application/json",
|
|
||||||
httpMethod = "GET",
|
|
||||||
value = "Retrieve Analytics for the device type",
|
|
||||||
notes = "",
|
|
||||||
response = Response.class,
|
|
||||||
tags = "Geo Service Management",
|
|
||||||
extensions = {
|
|
||||||
@Extension(properties = {
|
|
||||||
@ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:analytics-view")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@ApiResponses(value = {
|
|
||||||
@ApiResponse(
|
|
||||||
code = 200,
|
|
||||||
message = "OK.",
|
|
||||||
response = Response.class,
|
|
||||||
responseHeaders = {
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Content-Type",
|
|
||||||
description = "The content type of the body"),
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Last-Modified",
|
|
||||||
description = "Date and time the resource was last modified.\n" +
|
|
||||||
"Used by caches, or in conditional requests."),
|
|
||||||
}),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 400,
|
|
||||||
message = "Bad Request. \n Invalid Device Identifiers found.",
|
|
||||||
response = Response.class),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 401,
|
|
||||||
message = "Unauthorized. \n Unauthorized request."),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 500,
|
|
||||||
message = "Internal Server Error. \n Error on retrieving stats",
|
|
||||||
response = Response.class)
|
|
||||||
})
|
|
||||||
Response getGeoDeviceStats(
|
|
||||||
@ApiParam(
|
|
||||||
name = "deviceId",
|
|
||||||
value = "The registered device Id.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceId") String deviceId,
|
|
||||||
@ApiParam(
|
|
||||||
name = "device-type",
|
|
||||||
value = "The device type, such as ios, android or windows.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceType")
|
|
||||||
@Size(max = 45)
|
|
||||||
String deviceType,
|
|
||||||
@ApiParam(
|
|
||||||
name = "from",
|
|
||||||
value = "Get stats from what time",
|
|
||||||
required = true)
|
|
||||||
@QueryParam("from") long from,
|
|
||||||
@ApiParam(
|
|
||||||
name = "to",
|
|
||||||
value = "Get stats up to what time",
|
|
||||||
required = true)
|
|
||||||
@QueryParam("to") long to);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get data to show device locations in a map
|
|
||||||
*/
|
|
||||||
@GET
|
|
||||||
@Path("stats/device-locations")
|
|
||||||
@ApiOperation(
|
|
||||||
consumes = "application/json",
|
|
||||||
produces = "application/json",
|
|
||||||
httpMethod = "GET",
|
|
||||||
value = "Retrieve locations of devices",
|
|
||||||
notes = "",
|
|
||||||
response = Response.class,
|
|
||||||
tags = "Geo Service Management",
|
|
||||||
extensions = {
|
|
||||||
@Extension(properties = {
|
|
||||||
@ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:analytics-view")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@ApiResponses(value = {
|
|
||||||
@ApiResponse(
|
|
||||||
code = 200,
|
|
||||||
message = "OK.",
|
|
||||||
response = Response.class,
|
|
||||||
responseHeaders = {
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Content-Type",
|
|
||||||
description = "The content type of the body"),
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Last-Modified",
|
|
||||||
description = "Date and time the resource was last modified.\n" +
|
|
||||||
"Used by caches, or in conditional requests."),
|
|
||||||
}),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 400,
|
|
||||||
message = "Bad Request. \n Invalid parameters found.",
|
|
||||||
response = Response.class),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 401,
|
|
||||||
message = "Unauthorized. \n Unauthorized request."),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 500,
|
|
||||||
message = "Internal Server Error. \n Error on retrieving stats",
|
|
||||||
response = Response.class)
|
|
||||||
})
|
|
||||||
Response getGeoDeviceLocations(
|
|
||||||
@ApiParam(
|
|
||||||
name = "minLat",
|
|
||||||
value = "minimum latitude",
|
|
||||||
required = true)
|
|
||||||
@QueryParam("minLat") double minLat,
|
|
||||||
@ApiParam(
|
|
||||||
name = "maxLat",
|
|
||||||
value = "maxmimum latitude",
|
|
||||||
required = true)
|
|
||||||
@QueryParam("maxLat") double maxLat,
|
|
||||||
@ApiParam(
|
|
||||||
name = "minLong",
|
|
||||||
value = "minimum longitude",
|
|
||||||
required = true)
|
|
||||||
@QueryParam("minLong") double minLong,
|
|
||||||
@ApiParam(
|
|
||||||
name = "maxLong",
|
|
||||||
value = "maximum longitudeude",
|
|
||||||
required = true)
|
|
||||||
@QueryParam("maxLong") double maxLong,
|
|
||||||
@ApiParam(
|
|
||||||
name = "zoom",
|
|
||||||
value = "zoom level",
|
|
||||||
required = true)
|
|
||||||
@QueryParam("zoom") int zoom);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Geo alerts
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("alerts/{alertType}/{deviceType}/{deviceId}")
|
|
||||||
@ApiOperation(
|
|
||||||
consumes = "application/json",
|
|
||||||
produces = "application/json",
|
|
||||||
httpMethod = "GET",
|
|
||||||
value = "Create Geo alerts for the device",
|
|
||||||
notes = "",
|
|
||||||
response = Response.class,
|
|
||||||
tags = "Geo Service Management",
|
|
||||||
extensions = {
|
|
||||||
@Extension(properties = {
|
|
||||||
@ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@ApiResponses(value = {
|
|
||||||
@ApiResponse(
|
|
||||||
code = 200,
|
|
||||||
message = "OK.",
|
|
||||||
response = Response.class,
|
|
||||||
responseHeaders = {
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Content-Type",
|
|
||||||
description = "The content type of the body")
|
|
||||||
}),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 400,
|
|
||||||
message = "Bad Request. \n Invalid Device Identifiers found.",
|
|
||||||
response = Response.class),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 401,
|
|
||||||
message = "Unauthorized. \n Unauthorized request."),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 500,
|
|
||||||
message = "Internal Server Error. \n Error on retrieving stats",
|
|
||||||
response = Response.class)
|
|
||||||
})
|
|
||||||
Response createGeoAlerts(
|
|
||||||
@ApiParam(
|
|
||||||
name = "alert",
|
|
||||||
value = "The alert object",
|
|
||||||
required = true)
|
|
||||||
@Valid Alert alert,
|
|
||||||
@ApiParam(
|
|
||||||
name = "deviceId",
|
|
||||||
value = "The registered device Id.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceId") String deviceId,
|
|
||||||
@ApiParam(
|
|
||||||
name = "device-type",
|
|
||||||
value = "The device type, such as ios, android or windows.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceType")
|
|
||||||
@Size(max = 45)
|
|
||||||
String deviceType,
|
|
||||||
@ApiParam(
|
|
||||||
name = "alertType",
|
|
||||||
value = "The alert type, such as Within, Speed, Stationary",
|
|
||||||
required = true)
|
|
||||||
@PathParam("alertType") String alertType);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update Geo alerts
|
|
||||||
*/
|
|
||||||
@PUT
|
|
||||||
@Path("alerts/{alertType}/{deviceType}/{deviceId}")
|
|
||||||
@ApiOperation(
|
|
||||||
consumes = "application/json",
|
|
||||||
produces = "application/json",
|
|
||||||
httpMethod = "GET",
|
|
||||||
value = "Update Geo alerts for the device",
|
|
||||||
notes = "",
|
|
||||||
response = Response.class,
|
|
||||||
tags = "Geo Service Management",
|
|
||||||
extensions = {
|
|
||||||
@Extension(properties = {
|
|
||||||
@ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@ApiResponses(value = {
|
|
||||||
@ApiResponse(
|
|
||||||
code = 200,
|
|
||||||
message = "OK.",
|
|
||||||
response = Response.class,
|
|
||||||
responseHeaders = {
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Content-Type",
|
|
||||||
description = "The content type of the body")
|
|
||||||
}),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 400,
|
|
||||||
message = "Bad Request. \n Invalid Device Identifiers found.",
|
|
||||||
response = Response.class),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 401,
|
|
||||||
message = "Unauthorized. \n Unauthorized request."),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 500,
|
|
||||||
message = "Internal Server Error. \n Error on retrieving stats",
|
|
||||||
response = Response.class)
|
|
||||||
})
|
|
||||||
Response updateGeoAlerts(
|
|
||||||
@ApiParam(
|
|
||||||
name = "alert",
|
|
||||||
value = "The alert object",
|
|
||||||
required = true)
|
|
||||||
@Valid Alert alert,
|
|
||||||
@ApiParam(
|
|
||||||
name = "deviceId",
|
|
||||||
value = "The registered device Id.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceId") String deviceId,
|
|
||||||
@ApiParam(
|
|
||||||
name = "device-type",
|
|
||||||
value = "The device type, such as ios, android or windows.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceType")
|
|
||||||
@Size(max = 45)
|
|
||||||
String deviceType,
|
|
||||||
@ApiParam(
|
|
||||||
name = "alertType",
|
|
||||||
value = "The alert type, such as Within, Speed, Stationary",
|
|
||||||
required = true)
|
|
||||||
@PathParam("alertType") String alertType);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve Geo alerts
|
|
||||||
*/
|
|
||||||
@GET
|
|
||||||
@Path("alerts/{alertType}/{deviceType}/{deviceId}")
|
|
||||||
@ApiOperation(
|
|
||||||
consumes = "application/json",
|
|
||||||
produces = "application/json",
|
|
||||||
httpMethod = "GET",
|
|
||||||
value = "Retrieve Geo alerts for the device",
|
|
||||||
notes = "",
|
|
||||||
response = Response.class,
|
|
||||||
tags = "Geo Service Management",
|
|
||||||
extensions = {
|
|
||||||
@Extension(properties = {
|
|
||||||
@ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@ApiResponses(value = {
|
|
||||||
@ApiResponse(
|
|
||||||
code = 200,
|
|
||||||
message = "OK.",
|
|
||||||
response = Response.class,
|
|
||||||
responseHeaders = {
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Content-Type",
|
|
||||||
description = "The content type of the body"),
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Last-Modified",
|
|
||||||
description = "Date and time the resource was last modified.\n" +
|
|
||||||
"Used by caches, or in conditional requests.")
|
|
||||||
}),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 400,
|
|
||||||
message = "Bad Request. \n Invalid Device Identifiers found.",
|
|
||||||
response = Response.class),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 401,
|
|
||||||
message = "Unauthorized. \n Unauthorized request."),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 500,
|
|
||||||
message = "Internal Server Error. \n Error on retrieving stats",
|
|
||||||
response = Response.class)
|
|
||||||
})
|
|
||||||
Response getGeoAlerts(
|
|
||||||
@ApiParam(
|
|
||||||
name = "deviceId",
|
|
||||||
value = "The registered device Id.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceId") String deviceId,
|
|
||||||
@ApiParam(
|
|
||||||
name = "device-type",
|
|
||||||
value = "The device type, such as ios, android or windows.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceType")
|
|
||||||
@Size(max = 45)
|
|
||||||
String deviceType,
|
|
||||||
@ApiParam(
|
|
||||||
name = "alertType",
|
|
||||||
value = "The alert type, such as Within, Speed, Stationary",
|
|
||||||
required = true)
|
|
||||||
@PathParam("alertType") String alertType);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve Geo alerts history
|
|
||||||
*/
|
|
||||||
@GET
|
|
||||||
@Path("alerts/history/{deviceType}/{deviceId}")
|
|
||||||
@ApiOperation(
|
|
||||||
consumes = "application/json",
|
|
||||||
produces = "application/json",
|
|
||||||
httpMethod = "GET",
|
|
||||||
value = "Retrieve Geo alerts history for the device",
|
|
||||||
notes = "",
|
|
||||||
response = Response.class,
|
|
||||||
tags = "Geo Service Management",
|
|
||||||
extensions = {
|
|
||||||
@Extension(properties = {
|
|
||||||
@ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@ApiResponses(value = {
|
|
||||||
@ApiResponse(
|
|
||||||
code = 200,
|
|
||||||
message = "OK.",
|
|
||||||
response = Response.class,
|
|
||||||
responseHeaders = {
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Content-Type",
|
|
||||||
description = "The content type of the body"),
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Last-Modified",
|
|
||||||
description = "Date and time the resource was last modified.\n" +
|
|
||||||
"Used by caches, or in conditional requests.")
|
|
||||||
}),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 400,
|
|
||||||
message = "Bad Request. \n Invalid Device Identifiers found.",
|
|
||||||
response = Response.class),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 401,
|
|
||||||
message = "Unauthorized. \n Unauthorized request."),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 500,
|
|
||||||
message = "Internal Server Error. \n Error on retrieving stats",
|
|
||||||
response = Response.class)
|
|
||||||
})
|
|
||||||
Response getGeoAlertsHistory(
|
|
||||||
@ApiParam(
|
|
||||||
name = "deviceId",
|
|
||||||
value = "The registered device Id.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceId") String deviceId,
|
|
||||||
@ApiParam(
|
|
||||||
name = "device-type",
|
|
||||||
value = "The device type, such as ios, android or windows.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceType")
|
|
||||||
@Size(max = 45)
|
|
||||||
String deviceType,
|
|
||||||
@ApiParam(
|
|
||||||
name = "from",
|
|
||||||
value = "Get stats from what time",
|
|
||||||
required = true)
|
|
||||||
@QueryParam("from") long from,
|
|
||||||
@ApiParam(
|
|
||||||
name = "to",
|
|
||||||
value = "Get stats up to what time",
|
|
||||||
required = true)
|
|
||||||
@QueryParam("to") long to);
|
|
||||||
|
|
||||||
@DELETE
|
|
||||||
@Path("alerts/{alertType}/{deviceType}/{deviceId}")
|
|
||||||
@ApiOperation(
|
|
||||||
consumes = "application/json",
|
|
||||||
produces = "application/json",
|
|
||||||
httpMethod = "DELETE",
|
|
||||||
value = "Deletes Geo alerts for the device",
|
|
||||||
notes = "",
|
|
||||||
response = Response.class,
|
|
||||||
tags = "Geo Service Management",
|
|
||||||
extensions = {
|
|
||||||
@Extension(properties = {
|
|
||||||
@ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
@ApiResponses(value = {
|
|
||||||
@ApiResponse(
|
|
||||||
code = 200,
|
|
||||||
message = "OK.",
|
|
||||||
response = Response.class,
|
|
||||||
responseHeaders = {
|
|
||||||
@ResponseHeader(
|
|
||||||
name = "Content-Type",
|
|
||||||
description = "The content type of the body")
|
|
||||||
}),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 400,
|
|
||||||
message = "Bad Request. \n Invalid Device Identifiers found.",
|
|
||||||
response = Response.class),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 401,
|
|
||||||
message = "Unauthorized. \n Unauthorized request."),
|
|
||||||
@ApiResponse(
|
|
||||||
code = 500,
|
|
||||||
message = "Internal Server Error. \n Error on retrieving stats",
|
|
||||||
response = Response.class)
|
|
||||||
})
|
|
||||||
Response removeGeoAlerts(
|
|
||||||
@ApiParam(
|
|
||||||
name = "deviceId",
|
|
||||||
value = "The registered device Id.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceId") String deviceId,
|
|
||||||
@ApiParam(
|
|
||||||
name = "deviceType",
|
|
||||||
value = "The device type, such as ios, android or windows.",
|
|
||||||
required = true)
|
|
||||||
@PathParam("deviceType") String deviceType,
|
|
||||||
@ApiParam(
|
|
||||||
name = "alertType",
|
|
||||||
value = "The alert type, such as Within, Speed, Stationary",
|
|
||||||
required = true)
|
|
||||||
@PathParam("alertType") String alertType,
|
|
||||||
@ApiParam(
|
|
||||||
name = "queryName",
|
|
||||||
value = "The query name.",
|
|
||||||
required = true)
|
|
||||||
@QueryParam("queryName") String queryName);
|
|
||||||
}
|
|
||||||
|
|
@ -1,565 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
|
||||||
*
|
|
||||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
|
||||||
* Version 2.0 (the "License"); you may not use this file except
|
|
||||||
* in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.wso2.carbon.device.mgt.jaxrs.service.impl;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.wso2.carbon.analytics.api.AnalyticsDataAPI;
|
|
||||||
import org.wso2.carbon.analytics.api.AnalyticsDataAPIUtil;
|
|
||||||
import org.wso2.carbon.analytics.dataservice.commons.AnalyticsDataResponse;
|
|
||||||
import org.wso2.carbon.analytics.dataservice.commons.SearchResultEntry;
|
|
||||||
import org.wso2.carbon.analytics.dataservice.commons.SortByField;
|
|
||||||
import org.wso2.carbon.analytics.dataservice.commons.SortType;
|
|
||||||
import org.wso2.carbon.analytics.datasource.commons.Record;
|
|
||||||
import org.wso2.carbon.analytics.datasource.commons.exception.AnalyticsException;
|
|
||||||
import org.wso2.carbon.context.CarbonContext;
|
|
||||||
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
|
|
||||||
import org.wso2.carbon.device.mgt.common.DeviceManagementConstants.GeoServices;
|
|
||||||
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
|
|
||||||
import org.wso2.carbon.device.mgt.common.authorization.DeviceAccessAuthorizationException;
|
|
||||||
import org.wso2.carbon.device.mgt.common.geo.service.*;
|
|
||||||
import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroupConstants;
|
|
||||||
import org.wso2.carbon.device.mgt.core.geo.GeoCluster;
|
|
||||||
import org.wso2.carbon.device.mgt.core.geo.geoHash.GeoCoordinate;
|
|
||||||
import org.wso2.carbon.device.mgt.core.geo.geoHash.geoHashStrategy.GeoHashLengthStrategy;
|
|
||||||
import org.wso2.carbon.device.mgt.core.geo.geoHash.geoHashStrategy.ZoomGeoHashLengthStrategy;
|
|
||||||
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
|
|
||||||
import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil;
|
|
||||||
import org.wso2.carbon.device.mgt.jaxrs.service.api.GeoLocationBasedService;
|
|
||||||
import org.wso2.carbon.device.mgt.jaxrs.util.Constants;
|
|
||||||
import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils;
|
|
||||||
import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtUtil;
|
|
||||||
import org.wso2.carbon.user.api.UserStoreException;
|
|
||||||
import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
|
|
||||||
|
|
||||||
import javax.ws.rs.*;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The api for
|
|
||||||
*/
|
|
||||||
public class GeoLocationBasedServiceImpl implements GeoLocationBasedService {
|
|
||||||
|
|
||||||
private static Log log = LogFactory.getLog(GeoLocationBasedServiceImpl.class);
|
|
||||||
|
|
||||||
@Path("stats/{deviceType}/{deviceId}")
|
|
||||||
@GET
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response getGeoDeviceStats(@PathParam("deviceId") String deviceId,
|
|
||||||
@PathParam("deviceType") String deviceType,
|
|
||||||
@QueryParam("from") long from, @QueryParam("to") long to) {
|
|
||||||
try {
|
|
||||||
if (!DeviceManagerUtil.isPublishLocationResponseEnabled()) {
|
|
||||||
return Response.status(Response.Status.BAD_REQUEST.getStatusCode())
|
|
||||||
.entity("Unable to retrive Geo Device stats. Geo Data publishing does not enabled.").build();
|
|
||||||
}
|
|
||||||
} catch (DeviceManagementException e) {
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).entity(e.getMessage()).build();
|
|
||||||
}
|
|
||||||
String tableName = "IOT_PER_DEVICE_STREAM_GEO_FUSEDSPATIALEVENT";
|
|
||||||
String fromDate = String.valueOf(from);
|
|
||||||
String toDate = String.valueOf(to);
|
|
||||||
String query = "id:" + deviceId + " AND type:" + deviceType;
|
|
||||||
if (from != 0 || to != 0) {
|
|
||||||
query += " AND timeStamp : [" + fromDate + " TO " + toDate + "]";
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized(
|
|
||||||
new DeviceIdentifier(deviceId, deviceType),
|
|
||||||
DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) {
|
|
||||||
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
|
|
||||||
}
|
|
||||||
List<SortByField> sortByFields = new ArrayList<>();
|
|
||||||
SortByField sortByField = new SortByField("timeStamp", SortType.ASC);
|
|
||||||
sortByFields.add(sortByField);
|
|
||||||
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername());
|
|
||||||
|
|
||||||
try {
|
|
||||||
String tenantDomain = MultitenantUtils.getTenantDomain(authorizedUser);
|
|
||||||
int tenantId = DeviceMgtAPIUtils.getRealmService().getTenantManager().getTenantId(tenantDomain);
|
|
||||||
AnalyticsDataAPI analyticsDataAPI = DeviceMgtAPIUtils.getAnalyticsDataAPI();
|
|
||||||
List<SearchResultEntry> searchResults = analyticsDataAPI.search(tenantId, tableName, query,
|
|
||||||
0,
|
|
||||||
100,
|
|
||||||
sortByFields);
|
|
||||||
List<Event> events = getEventBeans(analyticsDataAPI, tenantId, tableName, new ArrayList<String>(),
|
|
||||||
searchResults);
|
|
||||||
return Response.ok().entity(events).build();
|
|
||||||
} catch (AnalyticsException | UserStoreException e) {
|
|
||||||
log.error("Failed to perform search on table: " + tableName + " : " + e.getMessage(), e);
|
|
||||||
throw DeviceMgtUtil.buildBadRequestException(
|
|
||||||
Constants.ErrorMessages.STATUS_BAD_REQUEST_MESSAGE_DEFAULT);
|
|
||||||
}
|
|
||||||
} catch (DeviceAccessAuthorizationException e) {
|
|
||||||
log.error(e.getErrorMessage());
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("stats/device-locations")
|
|
||||||
@GET
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response getGeoDeviceLocations(
|
|
||||||
@QueryParam("minLat") double minLat,
|
|
||||||
@QueryParam("maxLat") double maxLat,
|
|
||||||
@QueryParam("minLong") double minLong,
|
|
||||||
@QueryParam("maxLong") double maxLong,
|
|
||||||
@QueryParam("zoom") int zoom) {
|
|
||||||
|
|
||||||
GeoHashLengthStrategy geoHashLengthStrategy = new ZoomGeoHashLengthStrategy();
|
|
||||||
GeoCoordinate southWest = new GeoCoordinate(minLat, minLong);
|
|
||||||
GeoCoordinate northEast = new GeoCoordinate(maxLat, maxLong);
|
|
||||||
int geohashLength = geoHashLengthStrategy.getGeohashLength(southWest, northEast, zoom);
|
|
||||||
DeviceManagementProviderService deviceManagementService = DeviceMgtAPIUtils.getDeviceManagementService();
|
|
||||||
List<GeoCluster> geoClusters;
|
|
||||||
try {
|
|
||||||
geoClusters = deviceManagementService.findGeoClusters(null, southWest, northEast, geohashLength);
|
|
||||||
} catch (DeviceManagementException e) {
|
|
||||||
String msg = "Error occurred while retrieving geo clusters ";
|
|
||||||
log.error(msg, e);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build();
|
|
||||||
}
|
|
||||||
return Response.ok().entity(geoClusters).build();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("alerts/{alertType}/{deviceType}/{deviceId}")
|
|
||||||
@POST
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response createGeoAlerts(Alert alert, @PathParam("deviceId") String deviceId,
|
|
||||||
@PathParam("deviceType") String deviceType,
|
|
||||||
@PathParam("alertType") String alertType) {
|
|
||||||
try {
|
|
||||||
if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized(
|
|
||||||
new DeviceIdentifier(deviceId, deviceType),
|
|
||||||
DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) {
|
|
||||||
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername()
|
|
||||||
);
|
|
||||||
|
|
||||||
DeviceIdentifier identifier = new DeviceIdentifier();
|
|
||||||
identifier.setId(deviceId);
|
|
||||||
identifier.setType(deviceType);
|
|
||||||
|
|
||||||
GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService();
|
|
||||||
geoService.createGeoAlert(alert, identifier, alertType);
|
|
||||||
return Response.ok().build();
|
|
||||||
} catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) {
|
|
||||||
String error = "Error occurred while creating the geo alert for " + deviceType + " with id: " + deviceId;
|
|
||||||
log.error(error, e);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build();
|
|
||||||
} catch (AlertAlreadyExistException e) {
|
|
||||||
String error = "A geo alert with this name already exists.";
|
|
||||||
log.error(error,e);
|
|
||||||
return Response.status(Response.Status.BAD_REQUEST).entity(error).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Path("alerts/{alertType}")
|
|
||||||
@POST
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response createGeoAlertsForGeoClusters(Alert alert, @PathParam("alertType") String alertType) {
|
|
||||||
try {
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername()
|
|
||||||
);
|
|
||||||
|
|
||||||
GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService();
|
|
||||||
geoService.createGeoAlert(alert, alertType);
|
|
||||||
return Response.ok().build();
|
|
||||||
} catch (GeoLocationBasedServiceException e) {
|
|
||||||
String error = "Error occurred while creating " + alertType + " alert";
|
|
||||||
log.error(error, e);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build();
|
|
||||||
} catch (AlertAlreadyExistException e) {
|
|
||||||
String error = "A geo alert with this name already exists.";
|
|
||||||
log.error(error,e);
|
|
||||||
return Response.status(Response.Status.BAD_REQUEST).entity(error).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Path("alerts/{alertType}/{deviceType}/{deviceId}")
|
|
||||||
@PUT
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response updateGeoAlerts(Alert alert, @PathParam("deviceId") String deviceId,
|
|
||||||
@PathParam("deviceType") String deviceType,
|
|
||||||
@PathParam("alertType") String alertType) {
|
|
||||||
try {
|
|
||||||
if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized(
|
|
||||||
new DeviceIdentifier(deviceId, deviceType),
|
|
||||||
DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) {
|
|
||||||
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername()
|
|
||||||
);
|
|
||||||
|
|
||||||
DeviceIdentifier identifier = new DeviceIdentifier();
|
|
||||||
identifier.setId(deviceId);
|
|
||||||
identifier.setType(deviceType);
|
|
||||||
|
|
||||||
GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService();
|
|
||||||
geoService.updateGeoAlert(alert, identifier, alertType);
|
|
||||||
return Response.ok().build();
|
|
||||||
} catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) {
|
|
||||||
String error = "Error occurred while creating the geo alert for " + deviceType + " with id: " + deviceId;
|
|
||||||
log.error(error, e);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build();
|
|
||||||
} catch (AlertAlreadyExistException e) {
|
|
||||||
String error = "A geo alert with this name already exists.";
|
|
||||||
log.error(error,e);
|
|
||||||
return Response.status(Response.Status.BAD_REQUEST).entity(error).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("alerts/{alertType}")
|
|
||||||
@PUT
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response updateGeoAlertsForGeoClusters(Alert alert, @PathParam("alertType") String alertType) {
|
|
||||||
try {
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername()
|
|
||||||
);
|
|
||||||
|
|
||||||
GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService();
|
|
||||||
geoService.updateGeoAlert(alert, alertType);
|
|
||||||
return Response.ok().build();
|
|
||||||
} catch (GeoLocationBasedServiceException e) {
|
|
||||||
String error = "Error occurred while updating the geo alert for geo clusters";
|
|
||||||
log.error(error, e);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build();
|
|
||||||
} catch (AlertAlreadyExistException e) {
|
|
||||||
String error = "A geo alert with this name already exists.";
|
|
||||||
log.error(error,e);
|
|
||||||
return Response.status(Response.Status.BAD_REQUEST).entity(error).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("alerts/{alertType}/{deviceType}/{deviceId}")
|
|
||||||
@DELETE
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response removeGeoAlerts(@PathParam("deviceId") String deviceId,
|
|
||||||
@PathParam("deviceType") String deviceType,
|
|
||||||
@PathParam("alertType") String alertType,
|
|
||||||
@QueryParam("queryName") String queryName) {
|
|
||||||
try {
|
|
||||||
if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized(
|
|
||||||
new DeviceIdentifier(deviceId, deviceType),
|
|
||||||
DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) {
|
|
||||||
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername()
|
|
||||||
);
|
|
||||||
|
|
||||||
DeviceIdentifier identifier = new DeviceIdentifier();
|
|
||||||
identifier.setId(deviceId);
|
|
||||||
identifier.setType(deviceType);
|
|
||||||
|
|
||||||
GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService();
|
|
||||||
geoService.removeGeoAlert(alertType, identifier, queryName);
|
|
||||||
return Response.ok().build();
|
|
||||||
} catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) {
|
|
||||||
String error = "Error occurred while removing the geo alert for " + deviceType + " with id: " + deviceId;
|
|
||||||
log.error(error, e);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("alerts/{alertType}")
|
|
||||||
@DELETE
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response removeGeoAlertsForGeoClusters(@PathParam("alertType") String alertType, @QueryParam("queryName") String queryName) {
|
|
||||||
try {
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername()
|
|
||||||
);
|
|
||||||
|
|
||||||
GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService();
|
|
||||||
geoService.removeGeoAlert(alertType, queryName);
|
|
||||||
return Response.ok().build();
|
|
||||||
} catch (GeoLocationBasedServiceException e) {
|
|
||||||
String error = "Error occurred while removing the geo alert for geo clusters";
|
|
||||||
log.error(error, e);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("alerts/{alertType}/{deviceType}/{deviceId}")
|
|
||||||
@GET
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response getGeoAlerts(@PathParam("deviceId") String deviceId,
|
|
||||||
@PathParam("deviceType") String deviceType,
|
|
||||||
@PathParam("alertType") String alertType) {
|
|
||||||
try {
|
|
||||||
if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized(
|
|
||||||
new DeviceIdentifier(deviceId, deviceType),
|
|
||||||
DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) {
|
|
||||||
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername()
|
|
||||||
);
|
|
||||||
|
|
||||||
DeviceIdentifier identifier = new DeviceIdentifier();
|
|
||||||
identifier.setId(deviceId);
|
|
||||||
identifier.setType(deviceType);
|
|
||||||
|
|
||||||
GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService();
|
|
||||||
|
|
||||||
if (GeoServices.ALERT_TYPE_WITHIN.equals(alertType)) {
|
|
||||||
List<GeoFence> alerts = geoService.getWithinAlerts(identifier);
|
|
||||||
return Response.ok().entity(alerts).build();
|
|
||||||
} else if (GeoServices.ALERT_TYPE_EXIT.equals(alertType)) {
|
|
||||||
List<GeoFence> alerts = geoService.getExitAlerts(identifier);
|
|
||||||
return Response.ok().entity(alerts).build();
|
|
||||||
} else if (GeoServices.ALERT_TYPE_SPEED.equals(alertType)) {
|
|
||||||
String result = geoService.getSpeedAlerts(identifier);
|
|
||||||
return Response.ok().entity(result).build();
|
|
||||||
} else if (GeoServices.ALERT_TYPE_PROXIMITY.equals(alertType)) {
|
|
||||||
String result = geoService.getProximityAlerts(identifier);
|
|
||||||
return Response.ok().entity(result).build();
|
|
||||||
} else if (GeoServices.ALERT_TYPE_STATIONARY.equals(alertType)) {
|
|
||||||
List<GeoFence> alerts = geoService.getStationaryAlerts(identifier);
|
|
||||||
return Response.ok().entity(alerts).build();
|
|
||||||
} else if (GeoServices.ALERT_TYPE_TRAFFIC.equals(alertType)) {
|
|
||||||
List<GeoFence> alerts = geoService.getTrafficAlerts(identifier);
|
|
||||||
return Response.ok().entity(alerts).build();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
} catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) {
|
|
||||||
String error = "Error occurred while getting the geo alerts for " + deviceType + " with id: " + deviceId;
|
|
||||||
log.error(error, e);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("alerts/{alertType}")
|
|
||||||
@GET
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response getGeoAlertsForGeoClusters(@PathParam("alertType") String alertType) {
|
|
||||||
try {
|
|
||||||
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername()
|
|
||||||
);
|
|
||||||
|
|
||||||
GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService();
|
|
||||||
|
|
||||||
if (GeoServices.ALERT_TYPE_WITHIN.equals(alertType)) {
|
|
||||||
List<GeoFence> alerts = geoService.getWithinAlerts();
|
|
||||||
return Response.ok().entity(alerts).build();
|
|
||||||
} else if (GeoServices.ALERT_TYPE_EXIT.equals(alertType)) {
|
|
||||||
List<GeoFence> alerts = geoService.getExitAlerts();
|
|
||||||
return Response.ok().entity(alerts).build();
|
|
||||||
} else if (GeoServices.ALERT_TYPE_SPEED.equals(alertType)) {
|
|
||||||
String result = geoService.getSpeedAlerts();
|
|
||||||
return Response.ok().entity(result).build();
|
|
||||||
} else if (GeoServices.ALERT_TYPE_PROXIMITY.equals(alertType)) {
|
|
||||||
String result = geoService.getProximityAlerts();
|
|
||||||
return Response.ok().entity(result).build();
|
|
||||||
} else if (GeoServices.ALERT_TYPE_STATIONARY.equals(alertType)) {
|
|
||||||
List<GeoFence> alerts = geoService.getStationaryAlerts();
|
|
||||||
return Response.ok().entity(alerts).build();
|
|
||||||
} else if (GeoServices.ALERT_TYPE_TRAFFIC.equals(alertType)) {
|
|
||||||
List<GeoFence> alerts = geoService.getTrafficAlerts();
|
|
||||||
return Response.ok().entity(alerts).build();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
} catch (GeoLocationBasedServiceException e) {
|
|
||||||
String error = "Error occurred while getting the geo alerts for " + alertType + " alert";
|
|
||||||
log.error(error, e);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("alerts/history/{deviceType}/{deviceId}")
|
|
||||||
@GET
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response getGeoAlertsHistory(@PathParam("deviceId") String deviceId,
|
|
||||||
@PathParam("deviceType") String deviceType,
|
|
||||||
@QueryParam("from") long from, @QueryParam("to") long to) {
|
|
||||||
String tableName = "IOT_PER_DEVICE_STREAM_GEO_ALERTNOTIFICATIONS";
|
|
||||||
String fromDate = String.valueOf(from);
|
|
||||||
String toDate = String.valueOf(to);
|
|
||||||
String query = "id:" + deviceId + " AND type:" + deviceType;
|
|
||||||
if (from != 0 || to != 0) {
|
|
||||||
query += " AND timeStamp : [" + fromDate + " TO " + toDate + "]";
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized(
|
|
||||||
new DeviceIdentifier(deviceId, deviceType),
|
|
||||||
DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) {
|
|
||||||
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
|
|
||||||
}
|
|
||||||
List<SortByField> sortByFields = new ArrayList<>();
|
|
||||||
SortByField sortByField = new SortByField("timeStamp", SortType.ASC);
|
|
||||||
sortByFields.add(sortByField);
|
|
||||||
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername());
|
|
||||||
|
|
||||||
try {
|
|
||||||
String tenantDomain = MultitenantUtils.getTenantDomain(authorizedUser);
|
|
||||||
int tenantId = DeviceMgtAPIUtils.getRealmService().getTenantManager().getTenantId(tenantDomain);
|
|
||||||
AnalyticsDataAPI analyticsDataAPI = DeviceMgtAPIUtils.getAnalyticsDataAPI();
|
|
||||||
List<SearchResultEntry> searchResults = analyticsDataAPI.search(tenantId, tableName, query,
|
|
||||||
0,
|
|
||||||
100,
|
|
||||||
sortByFields);
|
|
||||||
List<Event> events = getEventBeans(analyticsDataAPI, tenantId, tableName, new ArrayList<String>(),
|
|
||||||
searchResults);
|
|
||||||
return Response.ok().entity(events).build();
|
|
||||||
} catch (AnalyticsException | UserStoreException e) {
|
|
||||||
log.error("Failed to perform search on table: " + tableName + " : " + e.getMessage(), e);
|
|
||||||
throw DeviceMgtUtil.buildBadRequestException(
|
|
||||||
Constants.ErrorMessages.STATUS_BAD_REQUEST_MESSAGE_DEFAULT);
|
|
||||||
}
|
|
||||||
} catch (DeviceAccessAuthorizationException e) {
|
|
||||||
log.error(e.getErrorMessage());
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("alerts/history")
|
|
||||||
@GET
|
|
||||||
@Consumes("application/json")
|
|
||||||
@Produces("application/json")
|
|
||||||
public Response getGeoAlertsHistoryForGeoClusters(@QueryParam("from") long from, @QueryParam("to") long to) {
|
|
||||||
String tableName = "IOT_PER_DEVICE_STREAM_GEO_ALERTNOTIFICATIONS";
|
|
||||||
String fromDate = String.valueOf(from);
|
|
||||||
String toDate = String.valueOf(to);
|
|
||||||
String query = "";
|
|
||||||
if (from != 0 || to != 0) {
|
|
||||||
query = "timeStamp : [" + fromDate + " TO " + toDate + "]";
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
List<SortByField> sortByFields = new ArrayList<>();
|
|
||||||
SortByField sortByField = new SortByField("timeStamp", SortType.ASC);
|
|
||||||
sortByFields.add(sortByField);
|
|
||||||
|
|
||||||
// this is the user who initiates the request
|
|
||||||
String authorizedUser = MultitenantUtils.getTenantAwareUsername(
|
|
||||||
CarbonContext.getThreadLocalCarbonContext().getUsername());
|
|
||||||
|
|
||||||
try {
|
|
||||||
String tenantDomain = MultitenantUtils.getTenantDomain(authorizedUser);
|
|
||||||
int tenantId = DeviceMgtAPIUtils.getRealmService().getTenantManager().getTenantId(tenantDomain);
|
|
||||||
AnalyticsDataAPI analyticsDataAPI = DeviceMgtAPIUtils.getAnalyticsDataAPI();
|
|
||||||
List<SearchResultEntry> searchResults = analyticsDataAPI.search(tenantId, tableName, query,
|
|
||||||
0,
|
|
||||||
100,
|
|
||||||
sortByFields);
|
|
||||||
List<Event> events = getEventBeans(analyticsDataAPI, tenantId, tableName, new ArrayList<String>(),
|
|
||||||
searchResults);
|
|
||||||
return Response.ok().entity(events).build();
|
|
||||||
} catch (AnalyticsException | UserStoreException e) {
|
|
||||||
log.error("Failed to perform search on table: " + tableName + " : " + e.getMessage(), e);
|
|
||||||
throw DeviceMgtUtil.buildBadRequestException(
|
|
||||||
Constants.ErrorMessages.STATUS_BAD_REQUEST_MESSAGE_DEFAULT);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error(e.getMessage());
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Event> getEventBeans(AnalyticsDataAPI analyticsDataAPI, int tenantId, String tableName,
|
|
||||||
List<String> columns,
|
|
||||||
List<SearchResultEntry> searchResults) throws AnalyticsException {
|
|
||||||
List<String> ids = getIds(searchResults);
|
|
||||||
List<String> requiredColumns = (columns == null || columns.isEmpty()) ? null : columns;
|
|
||||||
AnalyticsDataResponse response = analyticsDataAPI.get(tenantId, tableName, 1, requiredColumns, ids);
|
|
||||||
List<Record> records = AnalyticsDataAPIUtil.listRecords(analyticsDataAPI, response);
|
|
||||||
Map<String, Event> eventBeanMap = getEventBeanKeyedWithIds(records);
|
|
||||||
return getSortedEventBeans(eventBeanMap, searchResults);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Event> getSortedEventBeans(Map<String, Event> eventBeanMap,
|
|
||||||
List<SearchResultEntry> searchResults) {
|
|
||||||
List<Event> sortedRecords = new ArrayList<>();
|
|
||||||
for (SearchResultEntry entry : searchResults) {
|
|
||||||
sortedRecords.add(eventBeanMap.get(entry.getId()));
|
|
||||||
}
|
|
||||||
return sortedRecords;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Map<String, Event> getEventBeanKeyedWithIds(List<Record> records) {
|
|
||||||
Map<String, Event> eventBeanMap = new HashMap<>();
|
|
||||||
for (Record record : records) {
|
|
||||||
Event event = getEventBean(record);
|
|
||||||
eventBeanMap.put(event.getId(), event);
|
|
||||||
}
|
|
||||||
return eventBeanMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> getIds(List<SearchResultEntry> searchResults) {
|
|
||||||
List<String> ids = new ArrayList<>();
|
|
||||||
if (searchResults != null) {
|
|
||||||
for (SearchResultEntry resultEntry : searchResults) {
|
|
||||||
ids.add(resultEntry.getId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ids;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Event getEventBean(Record record) {
|
|
||||||
Event eventBean = new Event();
|
|
||||||
eventBean.setId(record.getId());
|
|
||||||
eventBean.setTableName(record.getTableName());
|
|
||||||
eventBean.setTimestamp(record.getTimestamp());
|
|
||||||
eventBean.setValues(record.getValues());
|
|
||||||
return eventBean;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,78 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
|
||||||
*
|
|
||||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
|
||||||
* Version 2.0 (the "License"); you may not use this file except
|
|
||||||
* in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.wso2.carbon.device.mgt.jaxrs.service.impl;
|
|
||||||
|
|
||||||
import org.mockito.Mockito;
|
|
||||||
import org.testng.Assert;
|
|
||||||
import org.testng.annotations.BeforeClass;
|
|
||||||
import org.testng.annotations.Test;
|
|
||||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
|
||||||
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
|
|
||||||
import org.wso2.carbon.device.mgt.core.geo.GeoCluster;
|
|
||||||
import org.wso2.carbon.device.mgt.core.geo.geoHash.GeoCoordinate;
|
|
||||||
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
|
|
||||||
import org.wso2.carbon.device.mgt.jaxrs.service.api.GeoLocationBasedService;
|
|
||||||
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class GeoLocationBasedServiceImplTest {
|
|
||||||
private DeviceManagementProviderService deviceManagementProviderService;
|
|
||||||
private PrivilegedCarbonContext context;
|
|
||||||
private GeoLocationBasedService geoLocationBasedService;
|
|
||||||
|
|
||||||
@BeforeClass
|
|
||||||
public void init() {
|
|
||||||
deviceManagementProviderService = Mockito.mock(DeviceManagementProviderService.class);
|
|
||||||
geoLocationBasedService = new GeoLocationBasedServiceImpl();
|
|
||||||
context = Mockito.mock(PrivilegedCarbonContext.class);
|
|
||||||
Mockito.doReturn("admin").when(context).getUsername();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(description = "This method tests the behaviour of getGeoDeviceLocations when there are no devices" +
|
|
||||||
"in the given map boundaries")
|
|
||||||
public void testGetGeoDeviceLocations1() throws DeviceManagementException {
|
|
||||||
Mockito.doReturn(new ArrayList<GeoCluster>()).when(deviceManagementProviderService)
|
|
||||||
.findGeoClusters(null, Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt());
|
|
||||||
Response response = geoLocationBasedService.getGeoDeviceLocations(0.4, 15, 75.6,
|
|
||||||
90.1, 6);
|
|
||||||
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(),
|
|
||||||
"getGeoDeviceLocations request failed with valid parameters");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(description = "This method tests the behaviour of getGeoDeviceLocations when there are devices" +
|
|
||||||
"in the given map boundaries")
|
|
||||||
public void testGetGeoDeviceLocations2() throws DeviceManagementException {
|
|
||||||
List<GeoCluster> geoClusters = new ArrayList<>();
|
|
||||||
geoClusters.add(new GeoCluster(new GeoCoordinate(1.5, 80.7),
|
|
||||||
new GeoCoordinate(1.1, 79.5), new GeoCoordinate(1.9, 82.1), 3,
|
|
||||||
"tb32", "aegtew234", "android", "1234"));
|
|
||||||
geoClusters.add(new GeoCluster(new GeoCoordinate(10.2, 86.1),
|
|
||||||
new GeoCoordinate(9.8, 84.7), new GeoCoordinate(11.1, 88.1), 4,
|
|
||||||
"t1gd", "swerty12s", "android", "1234"));
|
|
||||||
Mockito.doReturn(geoClusters).when(deviceManagementProviderService)
|
|
||||||
.findGeoClusters(null,Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt());
|
|
||||||
Response response = geoLocationBasedService.getGeoDeviceLocations(0.4, 15, 75.6,
|
|
||||||
90.1, 6);
|
|
||||||
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(),
|
|
||||||
"getGeoDeviceLocations request failed with valid parameters");
|
|
||||||
}
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue