diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.api/src/main/java/org/wso2/carbon/device/mgt/iot/androidsense/service/impl/AndroidSenseServiceImpl.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.api/src/main/java/org/wso2/carbon/device/mgt/iot/androidsense/service/impl/AndroidSenseServiceImpl.java index 2aee82319..d0ee58c0a 100644 --- a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.api/src/main/java/org/wso2/carbon/device/mgt/iot/androidsense/service/impl/AndroidSenseServiceImpl.java +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.api/src/main/java/org/wso2/carbon/device/mgt/iot/androidsense/service/impl/AndroidSenseServiceImpl.java @@ -295,10 +295,10 @@ public class AndroidSenseServiceImpl implements AndroidSenseService { return Response.status(Response.Status.NOT_ACCEPTABLE.getStatusCode()).entity(false).build(); } } catch (DeviceManagementException e) { - log.error(e.getErrorMessage(), e); + log.error(e.getMessage(), e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).entity(false).build(); } catch (ConfigurationManagementException e) { - log.error(e.getErrorMessage(), e); + log.error(e.getMessage(), e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).entity(false).build(); } } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml index d08016c5d..1258094d9 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml @@ -46,7 +46,7 @@ 2.2 WEB-INF/lib/*cxf*.jar - mdm-android-agent + api#device-mgt#android#v1.0 @@ -72,7 +72,7 @@ - + @@ -168,12 +168,6 @@ commons-httpclient provided - - io.swagger - swagger-annotations - provided - - com.google.code.gson gson @@ -188,5 +182,28 @@ org.wso2.carbon.analytics.api provided + + io.swagger + swagger-annotations + + + io.swagger + swagger-core + + + org.slf4j + slf4j-api + + + + + io.swagger + swagger-jaxrs + + + javax.servlet + servlet-api + provided + diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/DeviceLock.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/DeviceLock.java index 5dc8b7904..e76ff6f1a 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/DeviceLock.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/DeviceLock.java @@ -26,7 +26,7 @@ import java.io.Serializable; description = "This class carries all information related to device lock operation.") public class DeviceLock extends AndroidOperation implements Serializable { - @ApiModelProperty(name = "message", value = "Pop up message of the lock operation.", required = true) + @ApiModelProperty(name = "message", value = "Pop up message of the lock operation.", required = false) private String message; @ApiModelProperty(name = "isHardLockEnabled", value = "Hard lock enable status of the Device", required = true) private boolean isHardLockEnabled; diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/ErrorListItem.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/ErrorListItem.java new file mode 100644 index 000000000..1e48b0183 --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/ErrorListItem.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.bean; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotNull; + +@ApiModel(description = "") +public class ErrorListItem { + + @NotNull + private String code = null; + @NotNull + private String message = null; + + @ApiModelProperty(required = true, value = "") + @JsonProperty("code") + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + + public ErrorListItem() {} + + public ErrorListItem(String code, String msg) { + this.code = code; + this.message = msg; + } + + + /** + * Description about individual errors occurred + **/ + @ApiModelProperty(required = true, value = "Description about individual errors occurred") + @JsonProperty("message") + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("errorItem {\n"); + + sb.append(" code: ").append(code).append("\n"); + sb.append(" message: ").append(message).append("\n"); + sb.append("}\n"); + return sb.toString(); + } + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/ErrorResponse.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/ErrorResponse.java new file mode 100644 index 000000000..7680e3664 --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/ErrorResponse.java @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.bean; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.ArrayList; +import java.util.List; + +@ApiModel(description = "") +public class ErrorResponse { + + private Long code = null; + private String message = null; + private String description = null; + private String moreInfo = null; + private List errorItems = new ArrayList<>(); + + private ErrorResponse() { + } + + @JsonProperty(value = "code") + @ApiModelProperty(required = true, value = "") + public Long getCode() { + return code; + } + + public void setCode(Long code) { + this.code = code; + } + + @JsonProperty(value = "message") + @ApiModelProperty(required = true, value = "ErrorResponse message.") + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @JsonProperty(value = "description") + @ApiModelProperty(value = "A detail description about the error message.") + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @JsonProperty(value = "moreInfo") + @ApiModelProperty(value = "Preferably an url with more details about the error.") + public String getMoreInfo() { + return moreInfo; + } + + public void setMoreInfo(String moreInfo) { + this.moreInfo = moreInfo; + } + + public void addErrorListItem(ErrorListItem item) { + this.errorItems.add(item); + } + + /** + * If there are more than one error list them out. \nFor example, list out validation errors by each field. + */ + @JsonProperty(value = "errorItems") + @ApiModelProperty(value = "If there are more than one error list them out. \n" + + "For example, list out validation errors by each field.") + public List getErrorItems() { + return errorItems; + } + + public void setErrorItems(List error) { + this.errorItems = error; + } + + @Override + public String toString() { +// StringBuilder sb = new StringBuilder(); +// sb.append("{"); +// boolean cont = false; +// if (code != null) { +// cont = true; +// sb.append(" \"code\": ").append(code); +// } +// if (message != null) { +// if (cont) { +// sb.append(","); +// } +// cont = true; +// sb.append(" \"message\": \"").append(message).append("\""); +// } +// if (description != null) { +// if (cont) { +// sb.append(","); +// } +// cont = true; +// sb.append(" \"description\": ").append(description).append("\""); +// } +// if (moreInfo != null) { +// if (cont) { +// sb.append(","); +// } +// cont = true; +// sb.append(" \"moreInfo\": \"").append(moreInfo).append("\""); +// } +// if (error != null && error.size() > 0) { +// if (cont) { +// sb.append(","); +// } +// sb.append(" \"errorItems\": ").append(error); +// } +// sb.append("}"); +// return sb.toString(); + return null; + } + + public static class ErrorResponseBuilder { + + private Long code = null; + private String message = null; + private String description = null; + private String moreInfo = null; + private List error; + + + public ErrorResponseBuilder() { + this.error = new ArrayList<>(); + } + + public ErrorResponseBuilder setCode(long code) { + this.code = code; + return this; + } + + public ErrorResponseBuilder setMessage(String message) { + this.message = message; + return this; + } + + public ErrorResponseBuilder setDescription(String description) { + this.description = description; + return this; + } + + public ErrorResponseBuilder setMoreInfo(String moreInfo) { + this.moreInfo = moreInfo; + return this; + } + + public ErrorResponseBuilder addErrorItem(String code, String msg) { + ErrorListItem item = new ErrorListItem(); + item.setCode(code); + item.setMessage(msg); + this.error.add(item); + return this; + } + + public ErrorResponse build() { + ErrorResponse errorResponse = new ErrorResponse(); + errorResponse.setCode(code); + errorResponse.setMessage(message); + errorResponse.setErrorItems(error); + errorResponse.setDescription(description); + errorResponse.setMoreInfo(moreInfo); + return errorResponse; + } + } + +} + + diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/Notification.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/Notification.java index e7cdb5788..7cc4d4627 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/Notification.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/Notification.java @@ -30,14 +30,25 @@ import java.io.Serializable; description = "Details related to notifications passed to device.") public class Notification extends AndroidOperation implements Serializable { - @ApiModelProperty(name = "message", value = "The message to be sent to the device.", required = true) - private String message; + @ApiModelProperty(name = "messageText", value = "The message text to be sent to the device.", required = true) + private String messageText; - public String getMessage() { - return message; + @ApiModelProperty(name = "messageTitle", value = "The message title to be sent to the device.", required = true) + private String messageTitle; + + public String getMessageText() { + return messageText; + } + + public void setMessageText(String messageText) { + this.messageText = messageText; + } + + public String getMessageTitle() { + return messageTitle; } - public void setMessage(String message) { - this.message = message; + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; } } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/UpgradeFirmware.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/UpgradeFirmware.java index fc3b5e08d..1b2152325 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/UpgradeFirmware.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/UpgradeFirmware.java @@ -29,24 +29,29 @@ import java.io.Serializable; @ApiModel(value = "UpgradeFirmware", description = "This class carries all information related to UpgradeFirmware.") public class UpgradeFirmware extends AndroidOperation implements Serializable { - @ApiModelProperty(name = "schedule", value = "Schedule of the UpgradeFirmware.") + + @ApiModelProperty(name = "schedule", value = "Schedule of the UpgradeFirmware.", required = true) private String schedule; @ApiModelProperty(name = "server", value = "Firmware package server.") private String server; + @SuppressWarnings("unused") public String getSchedule() { return schedule; } + @SuppressWarnings("unused") public void setSchedule(String schedule) { this.schedule = schedule; } + @SuppressWarnings("unused") public String getServer() { return server; } + @SuppressWarnings("unused") public void setServer(String server) { this.server = server; } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DeviceLockBeanWrapper.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DeviceLockBeanWrapper.java index 5811c3102..bd668faba 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DeviceLockBeanWrapper.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DeviceLockBeanWrapper.java @@ -30,6 +30,7 @@ import java.util.List; @ApiModel(value = "DeviceLockBeanWrapper", description = "DeviceLock related Information.") public class DeviceLockBeanWrapper { + @ApiModelProperty(name = "deviceIDs", value = "Device id list of the operation to be executed.", required = true) private List deviceIDs; @ApiModelProperty(name = "operation", value = "Information of the Device lock operation.", required = true) @@ -50,4 +51,5 @@ public class DeviceLockBeanWrapper { public void setOperation(DeviceLock operation) { this.operation = operation; } + } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DisenrollmentBeanWrapper.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DisenrollmentBeanWrapper.java index 86e7fb3af..fdcab0120 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DisenrollmentBeanWrapper.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/DisenrollmentBeanWrapper.java @@ -46,4 +46,5 @@ public class DisenrollmentBeanWrapper { public void setDeviceIDs(List deviceIDs) { this.deviceIDs = deviceIDs; } + } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/EventBeanWrapper.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/EventBeanWrapper.java index d8e21c8d4..d05cb58f8 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/EventBeanWrapper.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/EventBeanWrapper.java @@ -27,6 +27,7 @@ import io.swagger.annotations.ApiModelProperty; @ApiModel(value = "EventBeanWrapper", description = "Android agent's event related Information.") public class EventBeanWrapper { + @ApiModelProperty(name = "deviceIdentifier", value = "DeviceIdentifier to be need to retrieve/publish Event.", required = true) private String deviceIdentifier; @ApiModelProperty(name = "payload", value = "Event payload.", required = true) diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/NotificationBeanWrapper.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/NotificationBeanWrapper.java index 573e2affc..eb82e49ee 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/NotificationBeanWrapper.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/bean/wrapper/NotificationBeanWrapper.java @@ -51,4 +51,5 @@ public class NotificationBeanWrapper { public void setOperation(Notification operation) { this.operation = operation; } + } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/exception/BadRequestException.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/exception/BadRequestException.java index 894bcc402..741f24b31 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/exception/BadRequestException.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/exception/BadRequestException.java @@ -18,6 +18,7 @@ package org.wso2.carbon.mdm.services.android.exception; +import org.wso2.carbon.mdm.services.android.bean.ErrorResponse; import org.wso2.carbon.mdm.services.android.util.Message; import javax.ws.rs.WebApplicationException; @@ -29,8 +30,8 @@ import javax.ws.rs.core.Response; */ public class BadRequestException extends WebApplicationException { - public BadRequestException(Message message, MediaType mediaType) { - super(Response.status(Response.Status.BAD_REQUEST).entity(message). - type(mediaType).build()); + public BadRequestException(ErrorResponse error) { + super(Response.status(Response.Status.BAD_REQUEST).entity(error).build()); } + } \ No newline at end of file diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/exception/NotFoundException.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/exception/NotFoundException.java new file mode 100644 index 000000000..bda2219bf --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/exception/NotFoundException.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.exception; + +import org.wso2.carbon.mdm.services.android.bean.ErrorResponse; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; + +public class NotFoundException extends WebApplicationException { + + private static final long serialVersionUID = 147943572342342340L; + + public NotFoundException(ErrorResponse error) { + super(Response.status(Response.Status.NOT_FOUND).entity(error).build()); + } + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/exception/UnexpectedServerErrorException.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/exception/UnexpectedServerErrorException.java new file mode 100644 index 000000000..6db5b0e69 --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/exception/UnexpectedServerErrorException.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.exception; + + +import org.wso2.carbon.mdm.services.android.bean.ErrorResponse; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; + +public class UnexpectedServerErrorException extends WebApplicationException { + + private static final long serialVersionUID = 147943579458906890L; + + public UnexpectedServerErrorException(ErrorResponse error) { + super(Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build()); + } + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java new file mode 100644 index 000000000..3e504e52c --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java @@ -0,0 +1,1312 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.services; + +import io.swagger.annotations.*; +import org.wso2.carbon.device.mgt.common.operation.mgt.Activity; +import org.wso2.carbon.mdm.services.android.bean.wrapper.*; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.List; + +@Path("/admin/devices") +@Api(value = "Android Device Management Administrative Service", description = "Device management related admin APIs.") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public interface DeviceManagementAdminService { + + @POST + @Path("/lock-devices") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Adds a Device Lock on Android Devices", + notes = "Using this API you have the option of hard locking an Android device, where the Administrator " + + "permanently locks the device or screen locking an Android device", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Device lock operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new lock operation.") + }) + Response configureDeviceLock( + @ApiParam(name = "deviceLockBeanWrapper", + value = "Device lock configurations with device IDs") DeviceLockBeanWrapper deviceLockBeanWrapper); + + @POST + @Path("/unlock-devices") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Adding a Device Unlock on Android Devices", + responseContainer = "List", + notes = "Using this API you have the option of unlocking an Android device, where the Administrator " + + "unlocks the device", + response = Activity.class, + tags = "Android Device Management Administrative Service") + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Device un-lock operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new un-lock operation.") + }) + Response configureDeviceUnlock( + @ApiParam(name = "deviceIDs", value = "DeviceIds to be enable device unlock operation") + List deviceIDs); + + + @POST + @Path("/location") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Requesting Location Coordinates of Android Devices", + responseContainer = "List", + notes = "Request location coordinates of Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service") + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Get-location operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new get-location operation.")}) + Response getDeviceLocation( + @ApiParam(name = "deviceIDs", value = "DeviceIDs to be requested to get device location") + List deviceIDs); + + @POST + @Path("/clear-password") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Clearing the Password on Android Devices", + notes = "Clear the password on Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Clear password operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new clear password operation.") + }) + Response removePassword( + @ApiParam(name = "deviceIDs", + value = "DeviceIds to be requested to remove password") List deviceIDs); + + @POST + @Path("/control-camera") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Enabling or Disabling the Camera on Android Devices", + notes = "Enable or disable the camera on Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Control camera operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new control camera operation.") + }) + Response configureCamera( + @ApiParam(name = "cameraBeanWrapper", value = "Camera enable/disable configurations with device IDs") + CameraBeanWrapper cameraBeanWrapper); + + @POST + @Path("/info") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Requesting Information from Android Devices", + notes = "Using this REST API you are able to request for Android device details. Once this REST API is" + + " executed it will be in the Android operation queue until the device calls the server to retrieve " + + "the list of operations that needs to be executed on the device", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Device info operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new device info operation.") + }) + Response getDeviceInformation( + @ApiParam(name = "deviceIds", value = "Device IDs to be requested to get device information") + List deviceIDs); + + @POST + @Path("/enterprise-wipe") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Enterprise Wiping Android Devices", + notes = "Enterprise wipe is the process of deleting enterprise related data on a device while keeping the " + + "personal data intact. You are able to enterprise wipe Android devices using this REST API", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Enterprise wipe operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a enterprise wipe operation.")}) + Response wipeDevice(@ApiParam(name = "deviceIDs", value = "Device IDs to be requested to do enterprise-wipe") + List deviceIDs); + + @POST + @Path("/wipe") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Factory Resetting an Android Device", + notes = "Factory rest or erases all the data stored in the Android devices " + + "to restore them back to the original system", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Device wipe operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a device wipe operation.")}) + Response wipeData( + @ApiParam(name = "wipeDataBeanWrapper", value = "Configurations and DeviceIds needed to do wipe-data") + WipeDataBeanWrapper wipeDataBeanWrapper); + + @POST + @Path("/applications") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Requesting the List of Installed Applications on Android Devices", + notes = "Using this REST API the server requests for the list of applications that are installed on" + + " the Android devices. Once this REST API is executed it will be in the Android operation queue " + + "until the device calls the server to retrieve the list of operations that needs to be executed " + + "on the device", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Get-applications operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new get-applications operation.") + }) + Response getApplications( + @ApiParam(name = "deviceIDs", value = "Device Ids needed to get applications that are already installed") + List deviceIDs); + + @POST + @Path("/ring") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Ringing Android Devices", + notes = "Ring Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Device ring operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new device ring operation.") + }) + Response ringDevice( + @ApiParam(name = "deviceIDs", value = "Device Ids needed for ring") List deviceIDs); + + @POST + @Path("/reboot") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Rebooting Android Devices", + notes = "Reboot Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Device reboot operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new device reboot operation.") + }) + Response rebootDevice( + @ApiParam(name = "deviceIDs", value = "Device Ids needed for reboot.") List deviceIDs); + + @POST + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Muting Android Devices", + notes = "Mute Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Device mute operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new device mute operation.") + }) + @Path("/mute") + Response muteDevice( + @ApiParam(name = "deviceIDs", value = "DeviceIDs need to be muted") List deviceIDs); + + @POST + @Path("/install-application") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Installing an Application on Android Devices", + notes = "Install an application on an Android device. If the device you are installing the application" + + " on has the WSO2 system service installed, the application installation will happen in silent " + + "mode, else the device user's consent will be required", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Install application operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new install-application operation.") + }) + Response installApplication( + @ApiParam(name = "applicationInstallationBeanWrapper", value = "Properties of installed apps and device IDs") + ApplicationInstallationBeanWrapper applicationInstallationBeanWrapper); + + @POST + @Path("/update-application") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Updating an Application on Android Devices", + notes = "Update an application on an Android device. If the device you are updating the application" + + " has the WSO2 system service installed, the application update will happen in silent " + + "mode, else the device user's consent will be required", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Update-application operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new update-application operation.") + }) + Response updateApplication( + @ApiParam(name = "applicationUpdateBeanWrapper", value = "Properties of updated apps and device IDs") + ApplicationUpdateBeanWrapper applicationUpdateBeanWrapper); + + @POST + @Path("/uninstall-application") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Uninstalling an Application from Android Devices", + notes = "Uninstall an application from Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Uninstall-application operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new uninstall-application operation.") + }) + Response uninstallApplication( + @ApiParam(name = "applicationUninstallationBeanWrapper", + value = "applicationUninstallationConfigs and Device Ids") + ApplicationUninstallationBeanWrapper applicationUninstallationBeanWrapper); + + @POST + @Path("/blacklist-applications") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Get BlackListed Applications", + notes = "Getting BlackListed Applications", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Blacklist-applications operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new blacklist-applications operation.") + }) + Response blacklistApplications( + @ApiParam(name = "blacklistApplicationsBeanWrapper", value = "BlacklistApplications " + + "Configuration and DeviceIds") + BlacklistApplicationsBeanWrapper blacklistApplicationsBeanWrapper); + + @POST + @Path("/upgrade-firmware") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Upgrading device firmware", + notes = "Device firmware upgrade", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Upgrade firmware operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new upgrade firmware operation.") + }) + Response upgradeFirmware( + @ApiParam(name = "upgradeFirmwareBeanWrapper", + value = "Firmware upgrade configuration and DeviceIds") + UpgradeFirmwareBeanWrapper upgradeFirmwareBeanWrapper); + + @POST + @Path("/configure-vpn") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Configuring VPN on Android devices", + notes = "Configure VPN on Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Configure VPN operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new configure VPN operation.") + }) + Response configureVPN( + @ApiParam(name = "vpnBeanWrapper", + value = "VPN configuration and DeviceIds") + VpnBeanWrapper vpnBeanWrapper); + + @POST + @Path("/send-notification") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Sending a Notification to Android Devices", + notes = "Send a notification to Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Send notification operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new send notification operation.") + }) + Response sendNotification( + @ApiParam(name = "notificationBeanWrapper", + value = "Notification Configurations and device Ids") + NotificationBeanWrapper notificationBeanWrapper); + + @POST + @Path("/configure-wifi") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Configuring Wi-Fi on Android Devices", + notes = "Configure Wi-Fi on Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Configure wifi operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new configure wifi operation.") + }) + Response configureWifi( + @ApiParam(name = "wifiBeanWrapper", + value = "WifiConfigurations and Device Ids") WifiBeanWrapper wifiBeanWrapper); + + @POST + @Path("/encrypt-storage") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Encrypting Storage on Android Devices", + notes = "Encrypt the data stored on Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Encrypt storage operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new encrypt storage operation.") + }) + Response encryptStorage( + @ApiParam(name = "encryptionBeanWrapper", + value = "Configurations and deviceIds need to be done data encryption") + EncryptionBeanWrapper encryptionBeanWrapper); + + @POST + @Path("/change-lock-code") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Changing the Lock Code on Android Devices", + notes = "Change the lock code on Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Change lock code operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new change lock code operation.") + }) + Response changeLockCode( + @ApiParam(name = "lockCodeBeanWrapper", + value = "Configurations and device Ids need to be done change lock code") + LockCodeBeanWrapper lockCodeBeanWrapper); + + @POST + @Path("/set-password-policy") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Setting a Passcode Policy on Android Devices", + notes = "Set a password policy on Android devices", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Set password policy operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new set password policy operation.") + }) + Response setPasswordPolicy( + @ApiParam(name = "passwordPolicyBeanWrapper", + value = "Password Policy Configurations and Device Ids") + PasswordPolicyBeanWrapper passwordPolicyBeanWrapper); + + @POST + @Path("set-webclip") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Setting a Web Clip on Android Devices", + notes = "Set a web clip on Android devices. A web clip is used to add a bookmark to a web application", + response = Activity.class, + tags = "Android Device Management Administrative Service" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Set webclip operation has successfully been scheduled", + response = Activity.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the activity instance that refers to the scheduled operation."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new set webclip operation.") + }) + Response setWebClip( + @ApiParam(name = "webClipBeanWrapper", + value = "Configurations to need set web clip on device and device Ids") + WebClipBeanWrapper webClipBeanWrapper); + + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementService.java new file mode 100644 index 000000000..4464d6c73 --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementService.java @@ -0,0 +1,319 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.services; + +import io.swagger.annotations.*; +import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.app.mgt.Application; +import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.List; + +@Api(value = "Android Device Management", + description = "This carries all the resources related to Android device management functionalities") +@Path("/devices") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public interface DeviceManagementService { + + @PUT + @Path("/{id}/applications") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + consumes = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Update the application list of a device", + tags = "Android Device Management" + ) + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK. \n Application list has been updated successfully", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The URL of the updated application list."), + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 404, + message = "Not Found. \n Resource to be deleted does not exist."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while updating the application list.") + }) + Response updateApplicationList( + @ApiParam( + name = "id", + value = "Device Identifier") + @PathParam("id") String id, + @ApiParam( + name = "applications", + value = "List of applications that need to be persisted against the device") + List applications); + + @PUT + @Path("/{id}/pending-operations") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Get the operation list pending for the device", + responseContainer = "List", + notes = "The Android agent communicates with the server to get the operations that are queued up " + + "at the server end for a given device using via this particular resource", + response = Operation.class, + tags = "Android Device Management") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched the pending application list of the Android device.", + response = Operation.class, + responseContainer = "List", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.") + }), + @ApiResponse( + code = 304, + message = "Not Modified. \n Empty body because the client has already the latest version of the requested resource."), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching policies.") + }) + Response getPendingOperations( + @ApiParam( + name = "id", + value = "Device Identifier") + @PathParam("id") String id, + @ApiParam( + name = "If-Modified-Since", + value = "Validates if the requested variant has not been modified since the time specified", + required = false) + @HeaderParam("If-Modified-Since") String ifModifiedSince, + @ApiParam( + name = "resultOperations", + value = "Device Operation Status") + List resultOperations); + + @POST + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Register an Android Device", + notes = "When carrying out device registration via an Android device, you need to initially install" + + " an Android Agent on the device, before being able to register the device with WSO2 EMM. Instead," + + " you can use this REST API to register an Android device with WSO2 EMM, without having to install" + + " an Android Agent on the respective device", + tags = "Android Device Management" + ) + @ApiResponses(value = { + @ApiResponse( + code = 201, + message = "Created. \n Device enrollment has successfully been created", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the added device enrollment."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while adding a new policy.") + }) + Response enrollDevice(@ApiParam(name = "device", value = "Device Information to be enroll") Device device); + + @GET + @Path("/{id}/status") + @ApiOperation( + httpMethod = "GET", + value = "Getting the Registration Status of an Android Device", + notes = "Use this REST API to retrieve the registration status of an Android device", + tags = "Android Device Management" + ) + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched the status of the Android device enrollment.", + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests."), + }), + @ApiResponse( + code = 304, + message = "Not Modified. \n Empty body because the client has already the latest version of the requested resource."), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching the enrollment status of the Android device.") + }) + Response isEnrolled( + @ApiParam( + name = "id", + value = "Device Identifier") + @PathParam("id") String id, + @ApiParam( + name = "If-Modified-Since", + value = "Validates if the requested variant has not been modified since the time specified", + required = false) + @HeaderParam("If-Modified-Since") String ifModifiedSince); + + @PUT + @Path("/{id}") + @ApiOperation( + httpMethod = "PUT", + value = "Updating the Registration Details of an Android Device", + notes = "Use this REST API to update the registration details of an Android device", + tags = "Android Device Management" + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Device enrollment has been updated successfully", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the updated device enrollment."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 404, + message = "Not Found. \n Resource to be deleted does not exist."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while updating the device enrollment.") + }) + Response modifyEnrollment( + @ApiParam( + name = "id", + value = "Device Identifier") + @PathParam("id") String id, + @ApiParam( + name = "device", + value = "Device information to be modify") Device device); + + @DELETE + @Path("/{id}") + @ApiOperation( + httpMethod = "DELETE", + value = "Un-register an Android Device", + notes = "Use this REST API to un-register a specific Android device", + tags = "Android Device Management" + ) + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK. \n Device has successfully been dis-enrolled"), + @ApiResponse( + code = 404, + message = "Not Found. \n Resource to be deleted does not exist."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while dis-enrolling the device.") + }) + Response disEnrollDevice( + @ApiParam( + name = "id", + value = "Device Identifier") + @PathParam("id") String id); + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceTypeConfigurationService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceTypeConfigurationService.java new file mode 100644 index 000000000..7d74b700d --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceTypeConfigurationService.java @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.services; + +import io.swagger.annotations.*; +import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration; +import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +@Api(value = "Android Configuration Management", description = "This API carries all resource associated with " + + "manipulating the general configurations of Android platform") +@Path("/configuration") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public interface DeviceTypeConfigurationService { + + @GET + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting Android Platform Configurations", + notes = "Get the Android platform configuration details using this REST API", + response = PlatformConfiguration.class, + tags = "Android Configuration Management" + ) + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched Android platform configuration.", + response = PlatformConfiguration.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests."), + }), + @ApiResponse( + code = 304, + message = "Not Modified. \n Empty body because the client has already the latest version of the requested resource."), + @ApiResponse( + code = 404, + message = "Not Found. \n Resource to be deleted does not exist."), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching Android platform configuration.") + }) + Response getConfiguration( + @ApiParam( + name = "If-Modified-Since", + value = "Validates if the requested variant has not been modified since the time specified", + required = false) + @HeaderParam("If-Modified-Since") String ifModifiedSince); + + @PUT + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Updating Android Platform Configuration.", + notes = "Update the Android platform configurations using this REST API.", + tags = "Android Configuration Management" + ) + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK. \n Android platform configuration has been updated successfully", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "URL of the updated Android platform configuration."), + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 404, + message = "Not Found. \n Resource to be deleted does not exist."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while modifying Android platform configuration.") + }) + Response updateConfiguration( + @ApiParam(name = "configuration", + value = "AndroidPlatformConfiguration") + PlatformConfiguration configuration); + + @GET + @Path("license") + @Produces(MediaType.TEXT_PLAIN) + @ApiOperation( + produces = MediaType.TEXT_PLAIN, + httpMethod = "GET", + value = "Getting the License Agreement for Android Device Registration", + notes = "Use this REST API to retrieve the license agreement that is used for the Android device " + + "registration process", + response = String.class, + tags = "Android Configuration Management") + @ApiResponses(value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully fetched Android license configuration.", + response = PlatformConfiguration.class, + responseHeaders = { + @ResponseHeader( + name = "Content-Type", + description = "Content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests."), + }), + @ApiResponse( + code = 304, + message = "Not Modified. \n Empty body because the client has already the latest version of the requested resource."), + @ApiResponse( + code = 404, + message = "Not Found. \n Resource to be deleted does not exist."), + @ApiResponse( + code = 406, + message = "Not Acceptable.\n The requested media type is not supported"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Server error occurred while fetching Android license configuration.") + }) + Response getLicense( + @ApiParam( + name = "If-Modified-Since", + value = "Validates if the requested variant has not been modified since the time specified", + required = false) + @HeaderParam("If-Modified-Since") String ifModifiedSince) throws AndroidAgentException; + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/EventReceiverService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/EventReceiverService.java new file mode 100644 index 000000000..c48844090 --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/EventReceiverService.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.services; + +import io.swagger.annotations.*; +import org.wso2.carbon.mdm.services.android.bean.DeviceState; +import org.wso2.carbon.mdm.services.android.bean.wrapper.EventBeanWrapper; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +@Api(value = "Event Receiver", description = "Event publishing/retrieving related APIs.To enable Eventing need to" + + " configure as ref-https://docs.wso2.com/display/EMM210/Managing+Event+Publishing+with+WSO2+Data+Analytics+Server, " + + "https://docs.wso2.com/display/EMM210/Creating+a+New+Event+Stream+and+Receiver") +@Path("/events") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public interface EventReceiverService { + + @POST + @Path("/publish") + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + consumes = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Event publishing via REST API.", + notes = "Publish events received by the EMM Android client to WSO2 DAS using this API.", + tags = "Event Receiver" + ) + @ApiResponses( + value = { + @ApiResponse(code = 201, message = "Created. \n Event is published successfully. Location header " + + "contains URL of newly enrolled device", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The URL of the added policy."), + @ResponseHeader( + name = "Content-Type", + description = "The content type of the body"), + @ResponseHeader( + name = "ETag", + description = "Entity Tag of the response resource.\n" + + "Used by caches, or in conditional requests."), + @ResponseHeader( + name = "Last-Modified", + description = "Date and time the resource has been modified the last time.\n" + + "Used by caches, or in conditional requests.") + }), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at the Location header.", + responseHeaders = { + @ResponseHeader( + name = "Content-Location", + description = "The Source URL of the document.")}), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error."), + @ApiResponse( + code = 415, + message = "Unsupported media type. \n The entity of the request was in a not supported format."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n " + + "Server error occurred while publishing events.") + }) + Response publishEvents( + @ApiParam( + name = "eventBeanWrapper", + value = "Information of the agent event to be published on DAS.") + EventBeanWrapper eventBeanWrapper); + + @GET + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting event details for a given time period.", + notes = "Get the event details of a device for a given time duration using this API.Request must contain " + + "the device identifier. Optionally, both, date from and date to value should be present to get " + + "alerts between times. Based on device type and the device identifier also filtering can be done" + + "(This cannot be combined with to and from parameters).", + response = DeviceState.class, + responseContainer = "List", + tags = "Event Receiver" + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Event details of a device for a given time duration have been successfully fetched", + response = DeviceState.class, responseContainer = "List"), + @ApiResponse( + code = 303, + message = "See Other. \n Source can be retrieved from the URL specified at" + + " the Location header.", + responseHeaders = { + @ResponseHeader(name = "Content-Location", description = "Source URL of the document.") + }), + @ApiResponse( + code = 304, + message = "Not Modified. \n " + + "Empty body because the client already has the latest version of the requested resource."), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request or validation error. You must provide" + + " the device identifier. Additionally, the device identifier can be combined with either the type" + + " OR date from and to."), + @ApiResponse( + code = 404, + message = "Not Found. \n Resource requested does not exist."), + @ApiResponse( + code = 500, + message = "Error occurred while getting published events for specific device.") + }) + Response retrieveAlerts( + @ApiParam( + name = "id", + value = "Device Identifier to be need to retrieve events.", + required = true) + @QueryParam("id") String deviceId, + @ApiParam( + name = "from", + value = "From Date.") + @QueryParam("from") long from, + @ApiParam( + name = "to", + value = "To Date.") + @QueryParam("to") long to, + @ApiParam( + name = "type", + value = "Type of the Alert to be need to retrieve events.") + @QueryParam("type") String type, + @ApiParam( + name = "If-Modified-Since", + value = "Validates if the requested variant has not been modified since the time specified", + required = false) + @HeaderParam("If-Modified-Since") String ifModifiedSince); + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/configuration/ConfigurationMgtService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/configuration/ConfigurationMgtService.java deleted file mode 100644 index c05579aaf..000000000 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/configuration/ConfigurationMgtService.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.carbon.mdm.services.android.services.configuration; - -import io.swagger.annotations.*; -import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration; -import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -/** - * Android Platform Configuration REST-API implementation. - * All end points supports JSON, XMl with content negotiation. - */ -@Api(value = "ConfigurationMgtService") -@Produces({"application/json", "application/xml"}) -@Consumes({"application/json", "application/xml"}) -public interface ConfigurationMgtService { - - @POST - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Configuring Android Platform Settings", - notes = "Configure the Android platform settings using this REST API" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Android platform configuration saved successfully"), - @ApiResponse(code = 500, message = "Internal Server Error") - }) - Response configureSettings(@ApiParam(name = "configuration", value = "AndroidPlatformConfiguration") - PlatformConfiguration configuration) throws AndroidAgentException; - - @GET - @ApiOperation( - httpMethod = "GET", - value = "Getting Android Platform Configurations", - notes = "Get the Android platform configuration details using this REST API", - response = PlatformConfiguration.class - ) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Get Android Configurations"), - @ApiResponse(code = 500, message = "Server Error") - }) - Response getConfiguration() throws AndroidAgentException; - - @PUT - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "PUT", - value = "Updating Android Platform Configurations", - notes = "Update the Android platform configurations using this REST API" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Error occurred while modifying configuration settings of " + - "Android platform") - }) - Response updateConfiguration(@ApiParam(name = "configuration", value = "AndroidPlatformConfiguration") - PlatformConfiguration configuration) throws AndroidAgentException; -} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/devicemgt/DeviceManagementService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/devicemgt/DeviceManagementService.java deleted file mode 100644 index fc95711a7..000000000 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/devicemgt/DeviceManagementService.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.carbon.mdm.services.android.services.devicemgt; - -import io.swagger.annotations.*; -import org.wso2.carbon.device.mgt.common.Device; -import org.wso2.carbon.device.mgt.common.app.mgt.Application; -import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.util.List; - -/** - * Android Device Management REST-API implementation. - * All end points supports JSON, XMl with content negotiation. - */ - -@Api(value = "DeviceManagementService", description = "Android Device Management REST-API implementation.") -@Produces({"application/json", "application/xml"}) -@Consumes({"application/json", "application/xml"}) -public interface DeviceManagementService { - - - /** - * Get all devices.Returns list of Android devices registered in MDM. - * - * @return Device List - * @throws org.wso2.carbon.mdm.services.android.exception.AndroidAgentException - */ - @GET - @ApiOperation( - produces = MediaType.APPLICATION_JSON, - httpMethod = "GET", - value = "Getting Details of All Android Devices", - notes = "Use this REST API to retrieve the details " + - "(e.g., the Android device type, serial number, International Mobile Station Equipment Identity " + - "(IMEI), owner, version, model etc.) of all Android devices that are registered with WSO2 EMM.", - response = Device.class, - responseContainer = "List" - ) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "List of Devices"), - @ApiResponse(code = 500, message = "Error occurred while fetching the device list") - }) - Response getAllDevices() throws AndroidAgentException; - - /** - * Fetch Android device details of a given device Id. - * - * @param id Device Id - * @return Device - * @throws org.wso2.carbon.mdm.services.android.exception.AndroidAgentException - */ - @GET - @Path("{id}") - @ApiOperation( - produces = MediaType.APPLICATION_JSON, - httpMethod = "GET", - value = "Getting Details of an Android Device", - notes = "Use this REST API to retrieve the details " + - "(e.g., the Android device type, serial number, International Mobile Station Equipment Identity " + - "(IMEI), owner, version, model etc.) of a specific Android device that is registered with WSO2 EMM", - response = Device.class - ) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Information of the given device"), - @ApiResponse(code = 500, message = "Error occurred while fetching the device information") - }) - Response getDevice(@ApiParam(name = "id", value = "deviceIdentifier") - @PathParam("id") String id) throws AndroidAgentException; - - /** - * Update Android device details of given device id. - * - * @param id Device Id - * @param device Device Details - * @return Message - * @throws AndroidAgentException - */ - @PUT - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "PUT", - value = "Updating the Details of an Android Device", - notes = "Use this REST API to update the details of an Android device" - ) - @ApiResponses(value = { - @ApiResponse(code = 202, message = "The device enrollment details has been updated successfully"), - @ApiResponse(code = 500, message = "Error occurred while modifying the device information"), - @ApiResponse(code = 304, message = "Device not found for the update") - }) - @Path("{id}") - Response updateDevice(@ApiParam(name = "id", value = "deviceIdentifier") - @PathParam("id") String id, @ApiParam(name = "device", value = "deviceIdentifier") - Device device) throws AndroidAgentException; - - @POST - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Updating an ApplicationList", - notes = "Update application list in server side." - ) - @ApiResponses(value = { - @ApiResponse(code = 202, message = "Device information has modified successfully"), - @ApiResponse(code = 500, message = "Error occurred while modifying the application list") - }) - Response updateApplicationList(@ApiParam(name = "id", value = "deviceIdentifier") @PathParam("id") String id, - @ApiParam(name = "applications", value = "updatable applications") - List applications) throws AndroidAgentException; - - @GET - @Path("license") - @Produces("text/html") - @ApiOperation( - produces = MediaType.APPLICATION_JSON, - httpMethod = "GET", - value = "Getting the License Agreement for Android Device Registration", - notes = "Use this REST API to retrieve the license agreement that is used for the Android device " + - "registration process", - response = String.class) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Licence agreement"), - @ApiResponse(code = 500, message = "Error occurred while retrieving the license configured for Android " + - "device enrolment") - }) - Response getLicense() throws AndroidAgentException; -} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/devicemgt/impl/DeviceManagementServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/devicemgt/impl/DeviceManagementServiceImpl.java deleted file mode 100644 index 06ccdf3e9..000000000 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/devicemgt/impl/DeviceManagementServiceImpl.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.carbon.mdm.services.android.services.devicemgt.impl; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.mgt.common.Device; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; -import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.common.app.mgt.Application; -import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; -import org.wso2.carbon.device.mgt.common.license.mgt.License; -import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; -import org.wso2.carbon.mdm.services.android.services.devicemgt.DeviceManagementService; -import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils; -import org.wso2.carbon.mdm.services.android.util.Message; -import javax.ws.rs.*; -import javax.ws.rs.core.Response; -import java.util.List; - -/** - * Android Device Management REST-API implementation. - * All end points supports JSON, XMl with content negotiation. - */ -@Produces({"application/json", "application/xml"}) -@Consumes({"application/json", "application/xml"}) -public class DeviceManagementServiceImpl implements DeviceManagementService { - - private static Log log = LogFactory.getLog(DeviceManagementServiceImpl.class); - - /** - * Get all devices.Returns list of Android devices registered in MDM. - * - * @return Device List - * @throws AndroidAgentException - */ - @GET - public Response getAllDevices() - throws AndroidAgentException { - String msg; - List devices; - - try { - devices = AndroidAPIUtils.getDeviceManagementService(). - getAllDevices(DeviceManagementConstants.MobileDeviceTypes. - MOBILE_DEVICE_TYPE_ANDROID); - } catch (DeviceManagementException e) { - msg = "Error occurred while fetching the device list."; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - return Response.status(Response.Status.OK).entity(devices).build(); - } - - /** - * Fetch Android device details of a given device Id. - * - * @param id Device Id - * @return Device - * @throws AndroidAgentException - */ - @GET - @Path("{id}") - public Response getDevice(@PathParam("id") String id) - throws AndroidAgentException { - - String msg; - Device device; - - try { - DeviceIdentifier deviceIdentifier = AndroidAPIUtils.convertToDeviceIdentifierObject(id); - device = AndroidAPIUtils.getDeviceManagementService().getDevice(deviceIdentifier); - if (device == null) { - return Response.status(Response.Status.NOT_FOUND).build(); - } - } catch (DeviceManagementException deviceMgtEx) { - msg = "Error occurred while fetching the device information."; - log.error(msg, deviceMgtEx); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - return Response.status(Response.Status.OK).entity(device).build(); - } - - /** - * Update Android device details of given device id. - * - * @param id Device Id - * @param device Device Details - * @return Message - * @throws AndroidAgentException - */ - @PUT - @Path("{id}") - public Response updateDevice(@PathParam("id") String id, Device device) - throws AndroidAgentException { - String msg; - Message responseMessage = new Message(); - DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); - deviceIdentifier.setId(id); - deviceIdentifier - .setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); - boolean result; - try { - device.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); - result = AndroidAPIUtils.getDeviceManagementService() - .updateDeviceInfo(deviceIdentifier, device); - if (result) { - responseMessage.setResponseMessage("Device information has modified successfully."); - return Response.status(Response.Status.ACCEPTED).entity(responseMessage).build(); - } else { - responseMessage.setResponseMessage("Device not found for the update."); - return Response.status(Response.Status.NOT_MODIFIED).entity(responseMessage).build(); - } - } catch (DeviceManagementException e) { - msg = "Error occurred while modifying the device information."; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - } - - @POST - @Path("appList/{id}") - public Response updateApplicationList(@PathParam("id") String id, List applications) - throws - AndroidAgentException { - - Message responseMessage = new Message(); - DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); - deviceIdentifier.setId(id); - deviceIdentifier.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); - try { - AndroidAPIUtils.getApplicationManagerService(). - updateApplicationListInstalledInDevice(deviceIdentifier, applications); - responseMessage.setResponseMessage("Device information has modified successfully."); - return Response.status(Response.Status.ACCEPTED).entity(responseMessage).build(); - } catch (ApplicationManagementException e) { - String msg = "Error occurred while modifying the application list."; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - } - - @GET - @Path("license") - @Produces("text/html") - public Response getLicense() throws AndroidAgentException { - License license = null; - - try { - license = - AndroidAPIUtils.getDeviceManagementService().getLicense( - DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, - DeviceManagementConstants.LanguageCodes.LANGUAGE_CODE_ENGLISH_US); - } catch (DeviceManagementException e) { - String msg = "Error occurred while retrieving the license configured for Android device enrolment"; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - return Response.status(Response.Status.OK).entity((license == null) ? null : license.getText()).build(); - } - -} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/enrollment/EnrollmentService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/enrollment/EnrollmentService.java deleted file mode 100644 index b150fd19d..000000000 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/enrollment/EnrollmentService.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.carbon.mdm.services.android.services.enrollment; - -import io.swagger.annotations.*; -import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -/** - * Android Device Enrollment REST-API implementation. - * All end points supports JSON, XMl with content negotiation. - */ - -@Api(value = "EnrollmentService", description = "Android Device Enrollment REST-API implementation.") -@Produces({"application/json", "application/xml"}) -@Consumes({"application/json", "application/xml"}) -public interface EnrollmentService { - - @POST - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Registering an Android Device", - notes = "When carrying out device registration via an Android device, you need to initially install" + - " an Android Agent on the device, before being able to register the device with WSO2 EMM. Instead," + - " you can use this REST API to register an Android device with WSO2 EMM, without having to install" + - " an Android Agent on the respective device" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Device enrollment succeeded"), - @ApiResponse(code = 500, message = "Device enrollment failed"), - }) - Response enrollDevice(@ApiParam(name = "device", value = "Device Information to be enroll") - org.wso2.carbon.device.mgt.common.Device device) throws AndroidAgentException; - - @GET - @Path("{deviceId}") - @ApiOperation( - httpMethod = "GET", - value = "Getting the Registration Status of an Android Device", - notes = "Use this REST API to retrieve the registration status of an Android device" - ) - @ApiResponses(value = { - @ApiResponse(code = 202, message = "Device has already enrolled"), - @ApiResponse(code = 404, message = "Device not found") - }) - Response isEnrolled(@ApiParam(name = "deviceId", value = "DeviceIdentifier") @PathParam("deviceId") String id) - throws AndroidAgentException; - - @PUT - @Path("{deviceId}") - @ApiOperation( - httpMethod = "PUT", - value = "Updating the Registration Details of an Android Device", - notes = "Use this REST API to update the registration details of an Android device" - ) - @ApiResponses(value = { - @ApiResponse(code = 202, message = "Device enrollment has updated successfully"), - @ApiResponse(code = 404, message = "Device not found for enrollment") - }) - Response modifyEnrollment(@ApiParam(name = "deviceId", value = "DeviceIdentifier") @PathParam("deviceId") String id, - @ApiParam(name = "device", value = "Device information to be modify") - org.wso2.carbon.device.mgt.common.Device device) - throws AndroidAgentException; - - @DELETE - @ApiOperation( - httpMethod = "DELETE", - value = "Un-registering an Android Device", - notes = "Use this REST API to unregister a specific Android device" - ) - @ApiResponses(value = { - @ApiResponse(code = 202, message = "Device has removed successfully"), - @ApiResponse(code = 404, message = "Device not found") - }) - @Path("{deviceId}") - Response disEnrollDevice(@ApiParam(name = "deviceId", value = "DeviceIdentifier") @PathParam("deviceId") String id) - throws AndroidAgentException; -} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/enrollment/impl/EnrollmentServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/enrollment/impl/EnrollmentServiceImpl.java deleted file mode 100644 index cf8d295c0..000000000 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/enrollment/impl/EnrollmentServiceImpl.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.carbon.mdm.services.android.services.enrollment.impl; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; -import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; -import org.wso2.carbon.mdm.services.android.services.enrollment.EnrollmentService; -import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils; -import org.wso2.carbon.mdm.services.android.util.Message; -import javax.ws.rs.*; -import javax.ws.rs.core.Response; - -/** - * Android Device Enrollment REST-API implementation. - * All end points supports JSON, XMl with content negotiation. - */ -@Produces({"application/json", "application/xml"}) -@Consumes({"application/json", "application/xml"}) -public class EnrollmentServiceImpl implements EnrollmentService { - - private static Log log = LogFactory.getLog(EnrollmentService.class); - - @POST - public Response enrollDevice(org.wso2.carbon.device.mgt.common.Device device) - throws AndroidAgentException { - - Message responseMsg = new Message(); - String msg; - try { - device.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); - device.getEnrolmentInfo().setOwner(AndroidAPIUtils.getAuthenticatedUser()); - boolean status = AndroidAPIUtils.getDeviceManagementService().enrollDevice(device); - if (status) { - Response.status(Response.Status.CREATED); - responseMsg.setResponseMessage("Device enrollment succeeded."); - return Response.status(Response.Status.CREATED).entity(responseMsg).build(); - } else { - Response.status(Response.Status.INTERNAL_SERVER_ERROR); - responseMsg.setResponseMessage("Device enrollment failed."); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(responseMsg).build(); - } - } catch (DeviceManagementException e) { - msg = "Error occurred while enrolling the device"; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - } - - @GET - @Path("{deviceId}") - public Response isEnrolled(@PathParam("deviceId") String id) throws AndroidAgentException { - String msg; - boolean result; - Message responseMsg = new Message(); - DeviceIdentifier deviceIdentifier = AndroidAPIUtils.convertToDeviceIdentifierObject(id); - - try { - result = AndroidAPIUtils.getDeviceManagementService().isEnrolled(deviceIdentifier); - if (result) { - responseMsg.setResponseMessage("Device has already enrolled"); - responseMsg.setResponseCode(Response.Status.ACCEPTED.toString()); - return Response.status(Response.Status.ACCEPTED).entity(responseMsg).build(); - } else { - responseMsg.setResponseMessage("Device not found"); - responseMsg.setResponseCode(Response.Status.NOT_FOUND.toString()); - return Response.status(Response.Status.NOT_FOUND).entity(responseMsg).build(); - } - } catch (DeviceManagementException e) { - msg = "Error occurred while checking enrollment status of the device."; - responseMsg.setResponseMessage(msg); - responseMsg.setResponseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()); - Response.status(Response.Status.INTERNAL_SERVER_ERROR); - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - } - - @PUT - @Path("{deviceId}") - public Response modifyEnrollment(@PathParam("deviceId") String id, - org.wso2.carbon.device.mgt.common.Device device) - throws AndroidAgentException { - String msg; - boolean result; - Message responseMsg = new Message(); - try { - device.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); - result = AndroidAPIUtils.getDeviceManagementService().modifyEnrollment(device); - if (result) { - responseMsg.setResponseMessage("Device enrollment has updated successfully"); - responseMsg.setResponseCode(Response.Status.ACCEPTED.toString()); - return Response.status(Response.Status.ACCEPTED).entity(responseMsg).build(); - } else { - responseMsg.setResponseMessage("Device not found for enrollment"); - responseMsg.setResponseCode(Response.Status.NOT_MODIFIED.toString()); - return Response.status(Response.Status.NOT_MODIFIED).entity(responseMsg).build(); - } - } catch (DeviceManagementException e) { - msg = "Error occurred while modifying enrollment of the device"; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - } - - @DELETE - @Path("{deviceId}") - public Response disEnrollDevice(@PathParam("deviceId") String id) throws AndroidAgentException { - Message responseMsg = new Message(); - boolean result; - String msg; - DeviceIdentifier deviceIdentifier = AndroidAPIUtils.convertToDeviceIdentifierObject(id); - - try { - result = AndroidAPIUtils.getDeviceManagementService().disenrollDevice(deviceIdentifier); - if (result) { - responseMsg.setResponseMessage("Device has removed successfully"); - responseMsg.setResponseCode(Response.Status.ACCEPTED.toString()); - return Response.status(Response.Status.ACCEPTED).entity(responseMsg).build(); - } else { - responseMsg.setResponseMessage("Device not found"); - responseMsg.setResponseCode(Response.Status.NOT_FOUND.toString()); - return Response.status(Response.Status.NOT_FOUND).entity(responseMsg).build(); - } - } catch (DeviceManagementException e) { - msg = "Error occurred while dis enrolling the device"; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - } - -} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementAdminServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementAdminServiceImpl.java new file mode 100644 index 000000000..468882aa9 --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementAdminServiceImpl.java @@ -0,0 +1,822 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.services.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; +import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException; +import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation; +import org.wso2.carbon.device.mgt.core.operation.mgt.ProfileOperation; +import org.wso2.carbon.mdm.services.android.bean.*; +import org.wso2.carbon.mdm.services.android.bean.wrapper.*; +import org.wso2.carbon.mdm.services.android.exception.BadRequestException; +import org.wso2.carbon.mdm.services.android.exception.UnexpectedServerErrorException; +import org.wso2.carbon.mdm.services.android.services.DeviceManagementAdminService; +import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils; +import org.wso2.carbon.mdm.services.android.util.AndroidConstants; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.List; + +@Path("/admin/devices") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class DeviceManagementAdminServiceImpl implements DeviceManagementAdminService { + + private static final Log log = LogFactory.getLog(DeviceManagementAdminServiceImpl.class); + + @POST + @Path("/lock-devices") + @Override + public Response configureDeviceLock(DeviceLockBeanWrapper deviceLockBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android device lock operation"); + } + + try { + if (deviceLockBeanWrapper == null || deviceLockBeanWrapper.getOperation() == null) { + String errorMessage = "Lock bean is empty."; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + DeviceLock lock = deviceLockBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.DEVICE_LOCK); + operation.setType(Operation.Type.PROFILE); + operation.setEnabled(true); + operation.setPayLoad(lock.toJSON()); + return AndroidAPIUtils.getOperationResponse(deviceLockBeanWrapper.getDeviceIDs(), operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/unlock-devices") + @Override + public Response configureDeviceUnlock(List deviceIDs) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android device unlock operation."); + } + + try { + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.DEVICE_UNLOCK); + operation.setType(Operation.Type.COMMAND); + operation.setEnabled(true); + return AndroidAPIUtils.getOperationResponse(deviceIDs, operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/location") + @Override + public Response getDeviceLocation(List deviceIDs) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android device location operation."); + } + + try { + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.DEVICE_LOCATION); + operation.setType(Operation.Type.COMMAND); + return AndroidAPIUtils.getOperationResponse(deviceIDs, operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/clear-password") + @Override + public Response removePassword(List deviceIDs) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android clear password operation."); + } + + try { + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.CLEAR_PASSWORD); + operation.setType(Operation.Type.COMMAND); + return AndroidAPIUtils.getOperationResponse(deviceIDs, operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance."; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/control-camera") + @Override + public Response configureCamera(CameraBeanWrapper cameraBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android Camera operation"); + } + + try { + if (cameraBeanWrapper == null || cameraBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the configure camera operation is incorrect."; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + Camera camera = cameraBeanWrapper.getOperation(); + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.CAMERA); + operation.setType(Operation.Type.COMMAND); + operation.setEnabled(camera.isEnabled()); + return AndroidAPIUtils.getOperationResponse(cameraBeanWrapper.getDeviceIDs(), operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/info") + @Override + public Response getDeviceInformation(List deviceIDs) { + if (log.isDebugEnabled()) { + log.debug("Invoking get Android device information operation"); + } + + try { + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.DEVICE_INFO); + operation.setType(Operation.Type.COMMAND); + return AndroidAPIUtils.getOperationResponse(deviceIDs, operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build(); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/enterprise-wipe") + @Override + public Response wipeDevice(List deviceIDs) { + if (log.isDebugEnabled()) { + log.debug("Invoking enterprise-wipe device operation"); + } + + try { + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.ENTERPRISE_WIPE); + operation.setType(Operation.Type.COMMAND); + return AndroidAPIUtils.getOperationResponse(deviceIDs, operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/wipe") + @Override + public Response wipeData(WipeDataBeanWrapper wipeDataBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android wipe-data device operation"); + } + + try { + if (wipeDataBeanWrapper == null || wipeDataBeanWrapper.getOperation() == null) { + String errorMessage = "WipeData bean is empty."; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + WipeData wipeData = wipeDataBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.WIPE_DATA); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(wipeData.toJSON()); + return AndroidAPIUtils.getOperationResponse(wipeDataBeanWrapper.getDeviceIDs(), operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/applications") + @Override + public Response getApplications(List deviceIDs) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android getApplicationList device operation"); + } + + try { + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.APPLICATION_LIST); + operation.setType(Operation.Type.COMMAND); + return AndroidAPIUtils.getOperationResponse(deviceIDs, operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/ring") + @Override + public Response ringDevice(List deviceIDs) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android ring-device device operation"); + } + + try { + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.DEVICE_RING); + operation.setType(Operation.Type.COMMAND); + return AndroidAPIUtils.getOperationResponse(deviceIDs, operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/reboot") + @Override + public Response rebootDevice(List deviceIDs) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android reboot-device device operation"); + } + + try { + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.DEVICE_REBOOT); + operation.setType(Operation.Type.COMMAND); + return AndroidAPIUtils.getOperationResponse(deviceIDs, operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/mute") + @Override + public Response muteDevice(List deviceIDs) { + if (log.isDebugEnabled()) { + log.debug("Invoking mute device operation"); + } + + try { + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.DEVICE_MUTE); + operation.setType(Operation.Type.COMMAND); + operation.setEnabled(true); + return AndroidAPIUtils.getOperationResponse(deviceIDs, operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/install-application") + @Override + public Response installApplication(ApplicationInstallationBeanWrapper applicationInstallationBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'InstallApplication' operation"); + } + + try { + if (applicationInstallationBeanWrapper == null || applicationInstallationBeanWrapper.getOperation() == + null) { + String errorMessage = "The payload of the application installing operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + ApplicationInstallation applicationInstallation = applicationInstallationBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.INSTALL_APPLICATION); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(applicationInstallation.toJSON()); + return AndroidAPIUtils.getOperationResponse(applicationInstallationBeanWrapper.getDeviceIDs(), + operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/update-application") + @Override + public Response updateApplication(ApplicationUpdateBeanWrapper applicationUpdateBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'UpdateApplication' operation"); + } + + try { + if (applicationUpdateBeanWrapper == null || applicationUpdateBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the application update operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + ApplicationUpdate applicationUpdate = applicationUpdateBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.UPDATE_APPLICATION); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(applicationUpdate.toJSON()); + + return AndroidAPIUtils.getOperationResponse(applicationUpdateBeanWrapper.getDeviceIDs(), + operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/uninstall-application") + @Override + public Response uninstallApplication(ApplicationUninstallationBeanWrapper applicationUninstallationBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'UninstallApplication' operation"); + } + + try { + if (applicationUninstallationBeanWrapper == null || + applicationUninstallationBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the application uninstalling operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + ApplicationUninstallation applicationUninstallation = applicationUninstallationBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.UNINSTALL_APPLICATION); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(applicationUninstallation.toJSON()); + + return AndroidAPIUtils.getOperationResponse(applicationUninstallationBeanWrapper.getDeviceIDs(), + operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/blacklist-applications") + @Override + public Response blacklistApplications(BlacklistApplicationsBeanWrapper blacklistApplicationsBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'Blacklist-Applications' operation"); + } + + try { + if (blacklistApplicationsBeanWrapper == null || blacklistApplicationsBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the blacklisting apps operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + BlacklistApplications blacklistApplications = blacklistApplicationsBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.BLACKLIST_APPLICATIONS); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(blacklistApplications.toJSON()); + return AndroidAPIUtils.getOperationResponse(blacklistApplicationsBeanWrapper.getDeviceIDs(), + operation); + + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/upgrade-firmware") + @Override + public Response upgradeFirmware(UpgradeFirmwareBeanWrapper upgradeFirmwareBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android upgrade-firmware device operation"); + } + + try { + if (upgradeFirmwareBeanWrapper == null || upgradeFirmwareBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the upgrade firmware operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + UpgradeFirmware upgradeFirmware = upgradeFirmwareBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.UPGRADE_FIRMWARE); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(upgradeFirmware.toJSON()); + return AndroidAPIUtils.getOperationResponse(upgradeFirmwareBeanWrapper.getDeviceIDs(), operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/configure-vpn") + @Override + public Response configureVPN(VpnBeanWrapper vpnBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android VPN device operation"); + } + + try { + if (vpnBeanWrapper == null || vpnBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the VPN operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + Vpn vpn = vpnBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.VPN); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(vpn.toJSON()); + return AndroidAPIUtils.getOperationResponse(vpnBeanWrapper.getDeviceIDs(), + operation); + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/send-notification") + @Override + public Response sendNotification(NotificationBeanWrapper notificationBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'notification' operation"); + } + + try { + if (notificationBeanWrapper == null || notificationBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the notification operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + Notification notification = notificationBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.NOTIFICATION); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(notification.toJSON()); + return AndroidAPIUtils.getOperationResponse(notificationBeanWrapper.getDeviceIDs(), + operation); + + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/configure-wifi") + @Override + public Response configureWifi(WifiBeanWrapper wifiBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'configure wifi' operation"); + } + + try { + if (wifiBeanWrapper == null || wifiBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the wifi operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + Wifi wifi = wifiBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.WIFI); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(wifi.toJSON()); + + return AndroidAPIUtils.getOperationResponse(wifiBeanWrapper.getDeviceIDs(), + operation); + + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/encrypt-storage") + @Override + public Response encryptStorage(EncryptionBeanWrapper encryptionBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'encrypt' operation"); + } + + try { + if (encryptionBeanWrapper == null || encryptionBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the device encryption operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + DeviceEncryption deviceEncryption = encryptionBeanWrapper.getOperation(); + CommandOperation operation = new CommandOperation(); + operation.setCode(AndroidConstants.OperationCodes.ENCRYPT_STORAGE); + operation.setType(Operation.Type.COMMAND); + operation.setEnabled(deviceEncryption.isEncrypted()); + return AndroidAPIUtils.getOperationResponse(encryptionBeanWrapper.getDeviceIDs(), + operation); + + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/change-lock-code") + @Override + public Response changeLockCode(LockCodeBeanWrapper lockCodeBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'change lock code' operation"); + } + + try { + if (lockCodeBeanWrapper == null || lockCodeBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the change lock code operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + LockCode lockCode = lockCodeBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.CHANGE_LOCK_CODE); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(lockCode.toJSON()); + return AndroidAPIUtils.getOperationResponse(lockCodeBeanWrapper.getDeviceIDs(), + operation); + + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("/set-password-policy") + @Override + public Response setPasswordPolicy(PasswordPolicyBeanWrapper passwordPolicyBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'password policy' operation"); + } + + try { + if (passwordPolicyBeanWrapper == null || passwordPolicyBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the change password policy operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + PasscodePolicy passcodePolicy = passwordPolicyBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.PASSCODE_POLICY); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(passcodePolicy.toJSON()); + + return AndroidAPIUtils.getOperationResponse(passwordPolicyBeanWrapper.getDeviceIDs(), + operation); + + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + + @POST + @Path("set-webclip") + @Override + public Response setWebClip(WebClipBeanWrapper webClipBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking 'webclip' operation"); + } + + try { + + + if (webClipBeanWrapper == null || webClipBeanWrapper.getOperation() == null) { + String errorMessage = "The payload of the add webclip operation is incorrect"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } + WebClip webClip = webClipBeanWrapper.getOperation(); + ProfileOperation operation = new ProfileOperation(); + operation.setCode(AndroidConstants.OperationCodes.WEBCLIP); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(webClip.toJSON()); + return AndroidAPIUtils.getOperationResponse(webClipBeanWrapper.getDeviceIDs(), operation); + + } catch (OperationManagementException e) { + String errorMessage = "Issue in retrieving operation management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } catch (DeviceManagementException e) { + String errorMessage = "Issue in retrieving device management service instance"; + log.error(errorMessage, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(errorMessage).build()); + } + } + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementServiceImpl.java new file mode 100644 index 000000000..f8c0980d7 --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementServiceImpl.java @@ -0,0 +1,269 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.services.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.app.mgt.Application; +import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; +import org.wso2.carbon.device.mgt.common.notification.mgt.NotificationManagementException; +import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; +import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException; +import org.wso2.carbon.mdm.services.android.bean.ErrorResponse; +import org.wso2.carbon.mdm.services.android.exception.UnexpectedServerErrorException; +import org.wso2.carbon.mdm.services.android.services.DeviceManagementService; +import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils; +import org.wso2.carbon.mdm.services.android.util.AndroidConstants; +import org.wso2.carbon.mdm.services.android.util.AndroidDeviceUtils; +import org.wso2.carbon.mdm.services.android.util.Message; +import org.wso2.carbon.policy.mgt.common.PolicyManagementException; +import org.wso2.carbon.policy.mgt.common.monitor.PolicyComplianceException; +import org.wso2.carbon.policy.mgt.core.PolicyManagerService; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.List; + +@Path("/devices") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class DeviceManagementServiceImpl implements DeviceManagementService { + + private static final String OPERATION_ERROR_STATUS = "ERROR"; + private static final Log log = LogFactory.getLog(DeviceManagementServiceImpl.class); + + @PUT + @Path("/{id}/applications") + @Override + public Response updateApplicationList(@PathParam("id") String id, List applications) { + Message responseMessage = new Message(); + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(id); + deviceIdentifier.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); + try { + AndroidAPIUtils.getApplicationManagerService(). + updateApplicationListInstalledInDevice(deviceIdentifier, applications); + responseMessage.setResponseMessage("Device information has modified successfully."); + return Response.status(Response.Status.ACCEPTED).entity(responseMessage).build(); + } catch (ApplicationManagementException e) { + String msg = "Error occurred while modifying the application list."; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + } + + @PUT + @Path("/{id}/pending-operations") + @Override + public Response getPendingOperations(@PathParam("id") String id, + @HeaderParam("If-Modified-Since") String ifModifiedSince, + List resultOperations) { + if (id == null || id.isEmpty()) { + String msg = "Device identifier is null or empty, hence returning device not found"; + log.error(msg); + return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + } + DeviceIdentifier deviceIdentifier = AndroidAPIUtils.convertToDeviceIdentifierObject(id); + try { + if (!AndroidDeviceUtils.isValidDeviceIdentifier(deviceIdentifier)) { + String msg = "Device not found for identifier '" + id + "'"; + log.error(msg); + return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); + } + if (log.isDebugEnabled()) { + log.debug("Invoking Android pending operations:" + id); + } + if (resultOperations != null && !resultOperations.isEmpty()) { + updateOperations(id, resultOperations); + } + } catch (OperationManagementException e) { + String msg = "Issue in retrieving operation management service instance"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } catch (PolicyComplianceException e) { + String msg = "Issue in updating Monitoring operation"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } catch (DeviceManagementException e) { + String msg = "Issue in retrieving device management service instance"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } catch (ApplicationManagementException e) { + String msg = "Issue in retrieving application management service instance"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } catch (NotificationManagementException e) { + String msg = "Issue in retrieving Notification management service instance"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + + List pendingOperations; + try { + pendingOperations = AndroidAPIUtils.getPendingOperations(deviceIdentifier); + } catch (OperationManagementException e) { + String msg = "Issue in retrieving operation management service instance"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + return Response.status(Response.Status.CREATED).entity(pendingOperations).build(); + } + + private void updateOperations(String deviceId, List operations) + throws OperationManagementException, PolicyComplianceException, + ApplicationManagementException, NotificationManagementException, DeviceManagementException { + for (org.wso2.carbon.device.mgt.common.operation.mgt.Operation operation : operations) { + AndroidAPIUtils.updateOperation(deviceId, operation); + if (OPERATION_ERROR_STATUS.equals(operation.getStatus().toString())) { + org.wso2.carbon.device.mgt.common.notification.mgt.Notification notification = new + org.wso2.carbon.device.mgt.common.notification.mgt.Notification(); + DeviceIdentifier id = new DeviceIdentifier(); + id.setId(deviceId); + id.setType(AndroidConstants.DEVICE_TYPE_ANDROID); + String deviceName = AndroidAPIUtils.getDeviceManagementService().getDevice(id).getName(); + notification.setOperationId(operation.getId()); + notification.setStatus(org.wso2.carbon.device.mgt.common.notification.mgt.Notification. + Status.NEW.toString()); + notification.setDescription("Operation " + operation.getCode() + " failed to execute on device " + + deviceName + ". Device ID : " + deviceId); + AndroidAPIUtils.getNotificationManagementService().addNotification(id, notification); + } + if (log.isDebugEnabled()) { + log.debug("Updating operation '" + operation.toString() + "'"); + } + } + } + + @POST + @Override + public Response enrollDevice(Device device) { + try { + device.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); + device.getEnrolmentInfo().setOwner(AndroidAPIUtils.getAuthenticatedUser()); + boolean status = AndroidAPIUtils.getDeviceManagementService().enrollDevice(device); + + PolicyManagerService policyManagerService = AndroidAPIUtils.getPolicyManagerService(); + policyManagerService.getEffectivePolicy(new DeviceIdentifier(device.getDeviceIdentifier(), device.getType())); + if (status) { + return Response.status(Response.Status.OK).entity("Android device, which carries the id '" + + device.getDeviceIdentifier() + "' has successfully been enrolled").build(); + } else { + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Failed to enroll '" + + device.getType() + "' device, which carries the id '" + + device.getDeviceIdentifier() + "'").build(); + } + } catch (DeviceManagementException e) { + String msg = "Error occurred while enrolling the '" + device.getType() + "', which carries the id '" + + device.getDeviceIdentifier() + "'"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } catch (PolicyManagementException e) { + String msg = "Error occurred while enforcing default enrollment policy upon '" + device.getType() + + "', which carries the id '" + + device.getDeviceIdentifier() + "'"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + } + + @GET + @Path("/{id}/status") + @Override + public Response isEnrolled(@PathParam("id") String id, @HeaderParam("If-Modified-Since") String ifModifiedSince) { + boolean result; + DeviceIdentifier deviceIdentifier = AndroidAPIUtils.convertToDeviceIdentifierObject(id); + try { + result = AndroidAPIUtils.getDeviceManagementService().isEnrolled(deviceIdentifier); + if (result) { + return Response.status(Response.Status.OK).entity("Android device that carries the id '" + + id + "' is enrolled").build(); + } else { + return Response.status(Response.Status.NOT_FOUND).entity("No Android device is found upon the id '" + + id + "'").build(); + } + } catch (DeviceManagementException e) { + String msg = "Error occurred while checking enrollment status of the device."; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + } + + @PUT + @Path("/{id}") + @Override + public Response modifyEnrollment(@PathParam("id") String id, Device device) { + boolean result; + try { + device.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); + result = AndroidAPIUtils.getDeviceManagementService().modifyEnrollment(device); + if (result) { + return Response.status(Response.Status.ACCEPTED).entity("Enrollment of Android device that " + + "carries the id '" + id + "' has successfully updated").build(); + } else { + return Response.status(Response.Status.NOT_MODIFIED).entity("Enrollment of Android device that " + + "carries the id '" + id + "' has not been updated").build(); + } + } catch (DeviceManagementException e) { + String msg = "Error occurred while modifying enrollment of the Android device that carries the id '" + + id + "'"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + } + + @DELETE + @Path("/{id}") + @Override + public Response disEnrollDevice(@PathParam("id") String id) { + boolean result; + DeviceIdentifier deviceIdentifier = AndroidAPIUtils.convertToDeviceIdentifierObject(id); + try { + result = AndroidAPIUtils.getDeviceManagementService().disenrollDevice(deviceIdentifier); + if (result) { + return Response.status(Response.Status.OK).entity("Android device that carries id '" + id + + "' has successfully dis-enrolled").build(); + } else { + return Response.status(Response.Status.NOT_FOUND).entity("Android device that carries id '" + id + + "' has not been dis-enrolled").build(); + } + } catch (DeviceManagementException e) { + String msg = "Error occurred while dis-enrolling the Android device that carries the id '" + id + "'"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + } + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/configuration/impl/ConfigurationMgtServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceTypeConfigurationServiceImpl.java similarity index 54% rename from components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/configuration/impl/ConfigurationMgtServiceImpl.java rename to components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceTypeConfigurationServiceImpl.java index 57f5d7693..6ec2c470b 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/configuration/impl/ConfigurationMgtServiceImpl.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceTypeConfigurationServiceImpl.java @@ -1,22 +1,22 @@ /* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at + * 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 + * 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. * - * 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.mdm.services.android.services.configuration.impl; +package org.wso2.carbon.mdm.services.android.services.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -25,69 +25,32 @@ import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationEntry; import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration; import org.wso2.carbon.device.mgt.common.license.mgt.License; -import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; -import org.wso2.carbon.mdm.services.android.services.configuration.ConfigurationMgtService; +import org.wso2.carbon.mdm.services.android.bean.ErrorResponse; +import org.wso2.carbon.mdm.services.android.exception.UnexpectedServerErrorException; +import org.wso2.carbon.mdm.services.android.services.DeviceTypeConfigurationService; import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils; import org.wso2.carbon.mdm.services.android.util.AndroidConstants; import org.wso2.carbon.mdm.services.android.util.Message; + import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.ArrayList; import java.util.List; -/** - * Android Platform Configuration REST-API implementation. - * All end points supports JSON, XMl with content negotiation. - */ -@Produces({"application/json", "application/xml"}) -@Consumes({"application/json", "application/xml"}) -public class ConfigurationMgtServiceImpl implements ConfigurationMgtService { - private static Log log = LogFactory.getLog(ConfigurationMgtServiceImpl.class); +@Path("/configuration") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class DeviceTypeConfigurationServiceImpl implements DeviceTypeConfigurationService { - @POST - public Response configureSettings(PlatformConfiguration configuration) - throws AndroidAgentException { - - Message responseMsg = new Message(); - String msg; - ConfigurationEntry licenseEntry = null; - try { - configuration.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); - List configs = configuration.getConfiguration(); - for (ConfigurationEntry entry : configs) { - if (AndroidConstants.TenantConfigProperties.LICENSE_KEY.equals(entry.getName())) { - License license = new License(); - license.setName(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); - license.setLanguage(AndroidConstants.TenantConfigProperties.LANGUAGE_US); - license.setVersion("1.0.0"); - license.setText(entry.getValue().toString()); - AndroidAPIUtils.getDeviceManagementService().addLicense(DeviceManagementConstants. - MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, license); - licenseEntry = entry; - break; - } - } - - if (licenseEntry != null) { - configs.remove(licenseEntry); - } - configuration.setConfiguration(configs); - AndroidAPIUtils.getDeviceManagementService().saveConfiguration(configuration); - Response.status(Response.Status.CREATED); - responseMsg.setResponseMessage("Android platform configuration saved successfully."); - responseMsg.setResponseCode(Response.Status.CREATED.toString()); - } catch (DeviceManagementException e) { - msg = "Error occurred while configuring the android platform"; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - return Response.status(Response.Status.CREATED).entity(responseMsg).build(); - } + private static final Log log = LogFactory.getLog(DeviceTypeConfigurationServiceImpl.class); @GET - public Response getConfiguration() throws AndroidAgentException { + @Override + public Response getConfiguration( + @HeaderParam("If-Modified-Since") String ifModifiedSince) { String msg; - PlatformConfiguration PlatformConfiguration = null; + PlatformConfiguration PlatformConfiguration; List configs; try { PlatformConfiguration = AndroidAPIUtils.getDeviceManagementService(). @@ -98,11 +61,10 @@ public class ConfigurationMgtServiceImpl implements ConfigurationMgtService { PlatformConfiguration = new PlatformConfiguration(); configs = new ArrayList<>(); } - ConfigurationEntry entry = new ConfigurationEntry(); License license = AndroidAPIUtils.getDeviceManagementService().getLicense( DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, AndroidConstants. - TenantConfigProperties.LANGUAGE_US); + TenantConfigProperties.LANGUAGE_US); if (license != null && configs != null) { entry.setContentType(AndroidConstants.TenantConfigProperties.CONTENT_TYPE_TEXT); @@ -114,13 +76,15 @@ public class ConfigurationMgtServiceImpl implements ConfigurationMgtService { } catch (DeviceManagementException e) { msg = "Error occurred while retrieving the Android tenant configuration"; log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); } return Response.status(Response.Status.OK).entity(PlatformConfiguration).build(); } @PUT - public Response updateConfiguration(PlatformConfiguration configuration) throws AndroidAgentException { + @Override + public Response updateConfiguration(PlatformConfiguration configuration) { String msg; Message responseMsg = new Message(); ConfigurationEntry licenseEntry = null; @@ -147,14 +111,36 @@ public class ConfigurationMgtServiceImpl implements ConfigurationMgtService { AndroidAPIUtils.getDeviceManagementService().saveConfiguration(configuration); //AndroidAPIUtils.getGCMService().resetTenantConfigCache(); Response.status(Response.Status.ACCEPTED); - responseMsg.setResponseMessage("Android platform configuration has updated successfully."); + responseMsg.setResponseMessage("Android platform configuration has been updated successfully."); responseMsg.setResponseCode(Response.Status.ACCEPTED.toString()); } catch (DeviceManagementException e) { msg = "Error occurred while modifying configuration settings of Android platform"; log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); } return Response.status(Response.Status.CREATED).entity(responseMsg).build(); } + + @GET + @Path("/license") + @Produces(MediaType.TEXT_PLAIN) + public Response getLicense( + @HeaderParam("If-Modified-Since") String ifModifiedSince) { + License license; + try { + license = + AndroidAPIUtils.getDeviceManagementService().getLicense( + DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, + DeviceManagementConstants.LanguageCodes.LANGUAGE_CODE_ENGLISH_US); + } catch (DeviceManagementException e) { + String msg = "Error occurred while retrieving the license configured for Android device enrolment"; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + return Response.status(Response.Status.OK).entity((license == null) ? null : license.getText()).build(); + } + } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/EventReceiverServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/EventReceiverServiceImpl.java new file mode 100644 index 000000000..cdbcab310 --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/EventReceiverServiceImpl.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.services.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.analytics.datasource.commons.exception.AnalyticsException; +import org.wso2.carbon.device.mgt.analytics.data.publisher.exception.DataPublisherConfigurationException; +import org.wso2.carbon.mdm.services.android.bean.DeviceState; +import org.wso2.carbon.mdm.services.android.bean.ErrorResponse; +import org.wso2.carbon.mdm.services.android.bean.wrapper.EventBeanWrapper; +import org.wso2.carbon.mdm.services.android.exception.BadRequestException; +import org.wso2.carbon.mdm.services.android.exception.NotFoundException; +import org.wso2.carbon.mdm.services.android.exception.UnexpectedServerErrorException; +import org.wso2.carbon.mdm.services.android.services.EventReceiverService; +import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils; +import org.wso2.carbon.mdm.services.android.util.Message; + +import javax.ws.rs.*; +import javax.ws.rs.core.Response; +import java.util.List; + +@Path("/events") +public class EventReceiverServiceImpl implements EventReceiverService { + + private static final String EVENT_STREAM_DEFINITION = "android_agent"; + private static final Log log = LogFactory.getLog(EventReceiverServiceImpl.class); + + @POST + @Path("/publish") + @Override + public Response publishEvents(EventBeanWrapper eventBeanWrapper) { + if (log.isDebugEnabled()) { + log.debug("Invoking Android device even logging."); + } + Message message = new Message(); + + Object payload[] = {eventBeanWrapper.getDeviceIdentifier(), eventBeanWrapper.getPayload(), + eventBeanWrapper.getType()}; + try { + if (AndroidAPIUtils.getEventPublisherService().publishEvent( + EVENT_STREAM_DEFINITION, "1.0.0", new Object[0], new Object[0], payload)) { + message.setResponseCode("Event is published successfully."); + return Response.status(Response.Status.CREATED).entity(message).build(); + } else { + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage("Error occurred while " + + "publishing the event.").build()); + } + } catch (DataPublisherConfigurationException e) { + String msg = "Error occurred while getting the Data publisher Service instance."; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + } + + @GET + @Override + public Response retrieveAlerts(@QueryParam("id") String deviceId, @QueryParam("from") long from, + @QueryParam("to") long to, @QueryParam("type") String type, + @HeaderParam("If-Modified-Since") String ifModifiedSince) { + + if (from != 0l && to != 0l && deviceId != null) { + return retrieveAlertFromDate(deviceId, from, to); + } else if (deviceId != null && type != null) { + return retrieveAlertByType(deviceId, type); + } else if (deviceId != null) { + return retrieveAlert(deviceId); + } else { + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage("Request must contain " + + "the device identifier. Optionally, both from and to value should be present to get " + + "alerts between times.").build()); + } + } + + private Response retrieveAlert(String deviceId) { + if (log.isDebugEnabled()) { + log.debug("Retrieving events for given device Identifier."); + } + String query = "deviceIdentifier:" + deviceId; + List deviceStates; + try { + deviceStates = AndroidAPIUtils.getAllEventsForDevice(EVENT_STREAM_DEFINITION, query); + if (deviceStates == null) { + throw new NotFoundException( + new ErrorResponse.ErrorResponseBuilder().setCode(404l).setMessage("No any alerts are " + + "published for Device: " + deviceId + ".").build()); + } else { + return Response.status(Response.Status.OK).entity(deviceStates).build(); + } + } catch (AnalyticsException e) { + String msg = "Error occurred while getting published events for specific device: " + deviceId + "."; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + } + + private Response retrieveAlertFromDate(String deviceId, long from, long to) { + String fromDate = String.valueOf(from); + String toDate = String.valueOf(to); + if (log.isDebugEnabled()) { + log.debug("Retrieving events for given device Identifier and time period."); + } + + String query = "deviceIdentifier:" + deviceId + " AND _timestamp: [" + fromDate + " TO " + toDate + "]"; + List deviceStates; + try { + deviceStates = AndroidAPIUtils.getAllEventsForDevice(EVENT_STREAM_DEFINITION, query); + if (deviceStates == null) { + throw new NotFoundException( + new ErrorResponse.ErrorResponseBuilder().setCode(404l).setMessage("No any alerts are " + + "published on given date for given Device: " + deviceId + ".").build()); + + } else { + return Response.status(Response.Status.OK).entity(deviceStates).build(); + } + } catch (AnalyticsException e) { + String msg = "Error occurred while getting published events for specific " + + "Device: " + deviceId + " on given Date."; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + } + + private Response retrieveAlertByType(String deviceId, String type) { + if (log.isDebugEnabled()) { + log.debug("Retrieving events for given device identifier and type."); + } + String query = "deviceIdentifier:" + deviceId + " AND type:" + type; + List deviceStates; + try { + deviceStates = AndroidAPIUtils.getAllEventsForDevice(EVENT_STREAM_DEFINITION, query); + if (deviceStates == null) { + throw new NotFoundException( + new ErrorResponse.ErrorResponseBuilder().setCode(404l).setMessage("No any alerts are " + + "published for given Device: '" + deviceId + "' and given specific Type.").build()); + + } else { + return Response.status(Response.Status.OK).entity(deviceStates).build(); + } + } catch (AnalyticsException e) { + String msg = "Error occurred while getting published events for specific " + + "Device: " + deviceId + "and given specific Type."; + log.error(msg, e); + throw new UnexpectedServerErrorException( + new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build()); + } + } + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/operationmgt/OperationMgtService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/operationmgt/OperationMgtService.java deleted file mode 100644 index 0eec30f25..000000000 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/operationmgt/OperationMgtService.java +++ /dev/null @@ -1,506 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.carbon.mdm.services.android.services.operationmgt; - -import io.swagger.annotations.*; -import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; -import org.wso2.carbon.mdm.services.android.bean.wrapper.*; - -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.util.List; - -/** - * Android Device Operation REST-API implementation. - */ - -@Api(value = "OperationMgtService", description = "Android Device Operation REST-API implementation.") -public interface OperationMgtService { - String ACCEPT = "Accept"; - - @PUT - @Path("{id}") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "PUT", - value = "Getting Pending Android Device Operations", - responseContainer = "List", - notes = "The Android agent communicates with the server to get the operations that are queued up " + - "at the server end for a given device using this REST API", - response = Operation.class) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "List of pending operations"), - @ApiResponse(code = 500, message = "Issue in retrieving operation management service instance") - }) - Response getPendingOperations( - @ApiParam(name = "acceptHeader", value = "Accept Header") @HeaderParam(ACCEPT) String acceptHeader, - @ApiParam(name = "id", value = "DeviceIdentifier") @PathParam("id") String id, - @ApiParam(name = "resultOperations", value = "Device Operation Status") - List resultOperations); - - @POST - @Path("lock") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Adding a Device Lock on Android Devices", - notes = "Using this API you have the option of hard locking an Android device, where the Administrator " + - "permanently locks the device or screen locking an Android device" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response configureDeviceLock(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "cameraBeanWrapper", - value = "Device lock configurations with device IDs") DeviceLockBeanWrapper deviceLockBeanWrapper); - - @POST - @Path("unlock") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Adding a Device Unlock on Android Devices", - responseContainer = "List", - notes = "Using this API you have the option of unlocking an Android device, where the Administrator " + - "unlocks the device", - response = String.class) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response configureDeviceUnlock(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "deviceIDs", value = - "DeviceIds to be enable device unlock operation") - List deviceIDs); - - - @POST - @Path("location") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Requesting Location Coordinates of Android Devices", - responseContainer = "List", - notes = "Request location coordinates of Android devices", - response = String.class) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Requested Device Coordinates"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance")}) - Response getDeviceLocation(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "deviceIDs", - value = "DeviceIDs to be requested to get device location") - List deviceIDs); - - @POST - @Path("clear-password") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Clearing the Password on Android Devices", - notes = "Clear the password on Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response removePassword(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "deviceIDs", - value = "DeviceIds to be requested to remove password") - List deviceIDs); - - @POST - @Path("camera") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Enabling or Disabling the Camera on Android Devices", - notes = "Enable or disable the camera on Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in creating a new camera instance") - }) - Response configureCamera(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "cameraBeanWrapper", - value = "Camera enable/disable configurations with device IDs") CameraBeanWrapper cameraBeanWrapper); - - @POST - @Path("device-info") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Requesting Information from Android Devices", - notes = "Using this REST API you are able to request for Android device details. Once this REST API is" + - " executed it will be in the Android operation queue until the device calls the server to retrieve " + - "the list of operations that needs to be executed on the device" - ) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Device Information"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response getDeviceInformation(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "deviceIds", - value = "Device IDs to be requested to get device information") - List deviceIDs); - - @POST - @Path("enterprise-wipe") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Enterprise Wiping Android Devices", - notes = "Enterprise wipe is the process of deleting enterprise related data on a device while keeping the " + - "personal data intact. You are able to enterprise wipe Android devices using this REST API" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance" - )}) - Response wipeDevice(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "deviceIDs", - value = "Device IDs to be requested to done enterprise-wipe") - List deviceIDs); - - @POST - @Path("wipe-data") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Factory Resetting an Android Device", - notes = "Factory rest or erases all the data stored in the Android devices " + - "to restore them back to the original system" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance")}) - Response wipeData(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "wipeDataBeanWrapper", - value = "Configurations and DeviceIds to be need to done wipe-data") - WipeDataBeanWrapper wipeDataBeanWrapper); - - @POST - @Path("application-list") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Requesting the List of Installed Applications on Android Devices", - notes = "Using this REST API the server requests for the list of applications that are installed on" + - " the Android devices. Once this REST API is executed it will be in the Android operation queue " + - "until the device calls the server to retrieve the list of operations that needs to be executed " + - "on the device" - ) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "List of applications for specific deviceIdentifier"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response getApplications(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "deviceIDs", - value = "Device Ids to be need to get applications which already installed") - List deviceIDs); - - @POST - @Path("ring-device") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Ringing Android Devices", - notes = "Ring Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response ringDevice(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "deviceIDs", - value = "Device Ids needs to be ring") List deviceIDs); - - @POST - @Path("reboot-device") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Rebooting Android Devices", - notes = "Reboot Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response rebootDevice(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "deviceIDs", - value = "Device Ids needs to be rebooted") List deviceIDs); - - @POST - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Muting Android Devices", - notes = "Mute Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - @Path("mute") - Response muteDevice(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, - @ApiParam(name = "deviceIDs", value = "DeviceIDs need to be muted") List deviceIDs); - - @POST - @Path("install-application") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Installing an Application on Android Devices", - notes = "Install an application on an Android device. If the device you are installing the application" + - " on has the WSO2 system service installed, the application installation will happen in silent " + - "mode, else the device user's consent will be required" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response installApplication(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, - @ApiParam(name = "applicationInstallationBeanWrapper", - value = "Properties of installed apps and device IDs") - ApplicationInstallationBeanWrapper applicationInstallationBeanWrapper); - - @POST - @Path("update-application") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Updating an Application on Android Devices", - notes = "Update an application on an Android device. If the device you are updating the application" + - " has the WSO2 system service installed, the application update will happen in silent " + - "mode, else the device user's consent will be required" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response updateApplication(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, - @ApiParam(name = "applicationUpdateBeanWrapper", - value = "Properties of updated apps and device IDs") - ApplicationUpdateBeanWrapper applicationUpdateBeanWrapper); - - @POST - @Path("uninstall-application") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Uninstalling an Application from Android Devices", - notes = "Uninstall an application from Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response uninstallApplication(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, - @ApiParam(name = "applicationUninstallationBeanWrapper", - value = "applicationUninstallationConfigs and Device Ids") - ApplicationUninstallationBeanWrapper applicationUninstallationBeanWrapper); - - @POST - @Path("blacklist-applications") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Get BlackListed Applications", - notes = "Getting BlackListed Applications" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response blacklistApplications(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, - @ApiParam(name = "blacklistApplicationsBeanWrapper", - value = "BlacklistApplications Configuration and DeviceIds") - BlacklistApplicationsBeanWrapper blacklistApplicationsBeanWrapper); - - @POST - @Path("upgrade-firmware") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Upgrading device firmware", - notes = "Device firmware upgrade" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response upgradeFirmware(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, - @ApiParam(name = "upgradeFirmwareBeanWrapper", - value = "Firmware upgrade configuration and DeviceIds") - UpgradeFirmwareBeanWrapper upgradeFirmwareBeanWrapper); - - @POST - @Path("vpn") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Configuring VPN on Android devices", - notes = "Configure VPN on Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response configureVPN(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, - @ApiParam(name = "vpnBeanWrapper", - value = "VPN configuration and DeviceIds") - VpnBeanWrapper vpnBeanWrapper); - - @POST - @Path("notification") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Sending a Notification to Android Devices", - notes = "Send a notification to Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response sendNotification(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, - @ApiParam(name = "notificationBeanWrapper", - value = "Notification Configurations and device Ids") - NotificationBeanWrapper notificationBeanWrapper); - - @POST - @Path("wifi") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Configuring Wi-Fi on Android Devices", - notes = "Configure Wi-Fi on Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response configureWifi(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "wifiBeanWrapper", - value = "WifiConfigurations and Device Ids") WifiBeanWrapper wifiBeanWrapper); - - @POST - @Path("encrypt") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Encrypting Storage on Android Devices", - notes = "Encrypt the data stored on Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response encryptStorage(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "encryptionBeanWrapper", - value = "Configurations and deviceIds need to be done data encryption") - EncryptionBeanWrapper encryptionBeanWrapper); - - @POST - @Path("change-lock-code") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Changing the Lock Code on Android Devices", - notes = "Change the lock code on Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response changeLockCode(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "lockCodeBeanWrapper", - value = "Configurations and device Ids need to be done change lock code") - LockCodeBeanWrapper lockCodeBeanWrapper); - - @POST - @Path("password-policy") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Setting a Passcode Policy on Android Devices", - notes = "Set a password policy on Android devices" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "created"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response setPasswordPolicy(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "passwordPolicyBeanWrapper", - value = "Password Policy Configurations and Device Ids") - PasswordPolicyBeanWrapper passwordPolicyBeanWrapper); - - @POST - @Path("webclip") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Setting a Web Clip on Android Devices", - notes = "Set a web clip on Android devices. A web clip is used to add a bookmark to a web application" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Accepted"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response setWebClip(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, @ApiParam(name = "webClipBeanWrapper", - value = "Configurations to need set web clip on device and device Ids") - WebClipBeanWrapper webClipBeanWrapper); - - @POST - @Path("disenroll") - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - httpMethod = "POST", - value = "Un-Register The Device from the EMM server", - notes = "unregister the given device" - ) - @ApiResponses(value = { - @ApiResponse(code = 201, message = "Accepted"), - @ApiResponse(code = 500, message = "Issue in retrieving device management service instance") - }) - Response setDisenrollment(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam(ACCEPT) String acceptHeader, - @ApiParam(name = "disenrollmentBeanWrapper", value = "Dis-enrollment configurations") - DisenrollmentBeanWrapper disenrollmentBeanWrapper); -} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/operationmgt/impl/OperationMgtServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/operationmgt/impl/OperationMgtServiceImpl.java deleted file mode 100644 index 030f96384..000000000 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/operationmgt/impl/OperationMgtServiceImpl.java +++ /dev/null @@ -1,1272 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.carbon.mdm.services.android.services.operationmgt.impl; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; -import org.wso2.carbon.device.mgt.common.notification.mgt.NotificationManagementException; -import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; -import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException; -import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation; -import org.wso2.carbon.device.mgt.core.operation.mgt.ProfileOperation; -import org.wso2.carbon.mdm.services.android.bean.*; -import org.wso2.carbon.mdm.services.android.bean.Notification; -import org.wso2.carbon.mdm.services.android.bean.wrapper.*; -import org.wso2.carbon.mdm.services.android.services.operationmgt.OperationMgtService; -import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils; -import org.wso2.carbon.mdm.services.android.util.AndroidConstants; -import org.wso2.carbon.mdm.services.android.util.AndroidDeviceUtils; -import org.wso2.carbon.mdm.services.android.util.Message; -import org.wso2.carbon.policy.mgt.common.monitor.PolicyComplianceException; - -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.util.List; - -public class OperationMgtServiceImpl implements OperationMgtService { - - private static Log log = LogFactory.getLog(OperationMgtService.class); - private static final String ACCEPT = "Accept"; - private static final String OPERATION_ERROR_STATUS = "ERROR"; - private static final String DEVICE_TYPE_ANDROID = "android"; - - @PUT - @Path("{id}") - public Response getPendingOperations - (@HeaderParam(ACCEPT) String acceptHeader, @PathParam("id") String id, - List resultOperations) { - Message message; - String errorMessage; - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - - if (id == null || id.isEmpty()) { - errorMessage = "Device identifier is null or empty, hence returning device not found"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.BAD_REQUEST.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - DeviceIdentifier deviceIdentifier = AndroidAPIUtils.convertToDeviceIdentifierObject(id); - try { - if (!AndroidDeviceUtils.isValidDeviceIdentifier(deviceIdentifier)) { - errorMessage = "Device not found for identifier '" + id + "'"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.BAD_REQUEST.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - if (log.isDebugEnabled()) { - log.debug("Invoking Android pending operations:" + id); - } - if (resultOperations != null && !resultOperations.isEmpty()) { - updateOperations(id, resultOperations); - } - } catch (OperationManagementException e) { - errorMessage = "Issue in retrieving operation management service instance"; - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).type( - responseMediaType).build(); - } catch (PolicyComplianceException e) { - errorMessage = "Issue in updating Monitoring operation"; - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - errorMessage = "Issue in retrieving device management service instance"; - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).type( - responseMediaType).build(); - } catch (ApplicationManagementException e) { - errorMessage = "Issue in retrieving application management service instance"; - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).type( - responseMediaType).build(); - } catch (NotificationManagementException e) { - errorMessage = "Issue in retrieving Notification management service instance"; - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).type( - responseMediaType).build(); - } - - List pendingOperations; - try { - pendingOperations = AndroidAPIUtils.getPendingOperations(deviceIdentifier); - } catch (OperationManagementException e) { - errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - return Response.status(Response.Status.CREATED).entity(pendingOperations).type( - responseMediaType).build(); - } - - @POST - @Path("lock") - public Response configureDeviceLock(@HeaderParam(ACCEPT) String acceptHeader, - DeviceLockBeanWrapper deviceLockBeanWrapper) { - - if (log.isDebugEnabled()) { - log.debug("Invoking Android device lock operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - Response response; - - try { - DeviceLock lock = deviceLockBeanWrapper.getOperation(); - - if (lock == null) { - String errorMessage = "Lock bean is empty"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.DEVICE_LOCK); - operation.setType(Operation.Type.PROFILE); - operation.setEnabled(true); - operation.setPayLoad(lock.toJSON()); - response = AndroidAPIUtils.getOperationResponse(deviceLockBeanWrapper.getDeviceIDs(), operation, - message, responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - return response; - } - - @POST - @Path("unlock") - public Response configureDeviceUnlock(@HeaderParam(ACCEPT) String acceptHeader, List deviceIDs) { - - if (log.isDebugEnabled()) { - log.debug("Invoking Android device unlock operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - Response response; - - try { - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.DEVICE_UNLOCK); - operation.setType(Operation.Type.COMMAND); - operation.setEnabled(true); - response = AndroidAPIUtils.getOperationResponse(deviceIDs, operation, message, responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - return response; - } - - @POST - @Path("location") - public Response getDeviceLocation(@HeaderParam(ACCEPT) String acceptHeader, - List deviceIDs) { - if (log.isDebugEnabled()) { - log.debug("Invoking Android device location operation"); - } - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.DEVICE_LOCATION); - operation.setType(Operation.Type.COMMAND); - return AndroidAPIUtils.getOperationResponse(deviceIDs, operation, - message, responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("clear-password") - public Response removePassword(@HeaderParam(ACCEPT) String acceptHeader, - List deviceIDs) { - if (log.isDebugEnabled()) { - log.debug("Invoking Android clear password operation"); - } - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.CLEAR_PASSWORD); - operation.setType(Operation.Type.COMMAND); - - return AndroidAPIUtils.getOperationResponse(deviceIDs, operation, - message, responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("camera") - public Response configureCamera(@HeaderParam(ACCEPT) String acceptHeader, - CameraBeanWrapper cameraBeanWrapper) { - - if (log.isDebugEnabled()) { - log.debug("Invoking Android Camera operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - Camera camera = cameraBeanWrapper.getOperation(); - - if (camera == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the configure camera operation is incorrect"); - } - throw new OperationManagementException("Issue in creating a new camera instance"); - } - - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.CAMERA); - operation.setType(Operation.Type.COMMAND); - operation.setEnabled(camera.isEnabled()); - - return AndroidAPIUtils.getOperationResponse(cameraBeanWrapper.getDeviceIDs(), operation, message, - responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("device-info") - public Response getDeviceInformation(@HeaderParam(ACCEPT) String acceptHeader, - List deviceIDs) { - - if (log.isDebugEnabled()) { - log.debug("Invoking get Android device information operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.DEVICE_INFO); - operation.setType(Operation.Type.COMMAND); - return AndroidAPIUtils.getOperationResponse(deviceIDs, operation, message, - responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("enterprise-wipe") - public Response wipeDevice(@HeaderParam(ACCEPT) String acceptHeader, - List deviceIDs) { - - if (log.isDebugEnabled()) { - log.debug("Invoking enterprise-wipe device operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.ENTERPRISE_WIPE); - operation.setType(Operation.Type.COMMAND); - - return AndroidAPIUtils.getOperationResponse(deviceIDs, operation, message, - responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("wipe-data") - public Response wipeData(@HeaderParam(ACCEPT) String acceptHeader, - WipeDataBeanWrapper wipeDataBeanWrapper) { - - if (log.isDebugEnabled()) { - log.debug("Invoking Android wipe-data device operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - WipeData wipeData = wipeDataBeanWrapper.getOperation(); - - if (wipeData == null) { - throw new OperationManagementException("WipeData bean is empty"); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.WIPE_DATA); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(wipeData.toJSON()); - - return AndroidAPIUtils.getOperationResponse(wipeDataBeanWrapper.getDeviceIDs(), operation, message, - responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("application-list") - public Response getApplications(@HeaderParam(ACCEPT) String acceptHeader, - List deviceIDs) { - - if (log.isDebugEnabled()) { - log.debug("Invoking Android getApplicationList device operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.APPLICATION_LIST); - operation.setType(Operation.Type.COMMAND); - - return AndroidAPIUtils.getOperationResponse(deviceIDs, operation, message, - responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("ring-device") - public Response ringDevice(@HeaderParam(ACCEPT) String acceptHeader, - List deviceIDs) { - - if (log.isDebugEnabled()) { - log.debug("Invoking Android ring-device device operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.DEVICE_RING); - operation.setType(Operation.Type.COMMAND); - return AndroidAPIUtils.getOperationResponse(deviceIDs, operation, message, - responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("reboot-device") - public Response rebootDevice(@HeaderParam(ACCEPT) String acceptHeader, - List deviceIDs) { - - if (log.isDebugEnabled()) { - log.debug("Invoking Android reboot-device device operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.DEVICE_REBOOT); - operation.setType(Operation.Type.COMMAND); - return AndroidAPIUtils.getOperationResponse(deviceIDs, operation, message, - responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("mute") - public Response muteDevice(@HeaderParam(ACCEPT) String acceptHeader, - List deviceIDs) { - - if (log.isDebugEnabled()) { - log.debug("Invoking mute device operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.DEVICE_MUTE); - operation.setType(Operation.Type.COMMAND); - operation.setEnabled(true); - return AndroidAPIUtils.getOperationResponse(deviceIDs, operation, message, - responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("install-application") - public Response installApplication(@HeaderParam(ACCEPT) String acceptHeader, - ApplicationInstallationBeanWrapper applicationInstallationBeanWrapper) { - - if (log.isDebugEnabled()) { - log.debug("Invoking 'InstallApplication' operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - ApplicationInstallation applicationInstallation = applicationInstallationBeanWrapper.getOperation(); - - if (applicationInstallation == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the application installing operation is incorrect"); - } - String errorMessage = "Issue in creating a new application installation instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.INSTALL_APPLICATION); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(applicationInstallation.toJSON()); - - return AndroidAPIUtils.getOperationResponse(applicationInstallationBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("update-application") - public Response updateApplication(@HeaderParam(ACCEPT) String acceptHeader, - ApplicationUpdateBeanWrapper applicationUpdateBeanWrapper) { - - if (log.isDebugEnabled()) { - log.debug("Invoking 'UpdateApplication' operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - ApplicationUpdate applicationUpdate = applicationUpdateBeanWrapper.getOperation(); - - if (applicationUpdate == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the application update operation is incorrect"); - } - String errorMessage = "Issue in creating a new application update instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.UPDATE_APPLICATION); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(applicationUpdate.toJSON()); - - return AndroidAPIUtils.getOperationResponse(applicationUpdateBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("uninstall-application") - public Response uninstallApplication(@HeaderParam(ACCEPT) String acceptHeader, - ApplicationUninstallationBeanWrapper applicationUninstallationBeanWrapper) { - if (log.isDebugEnabled()) { - log.debug("Invoking 'UninstallApplication' operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - ApplicationUninstallation applicationUninstallation = applicationUninstallationBeanWrapper.getOperation(); - - if (applicationUninstallation == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the application uninstalling operation is incorrect"); - } - String errorMessage = "Issue in creating a new application uninstallation instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.UNINSTALL_APPLICATION); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(applicationUninstallation.toJSON()); - - return AndroidAPIUtils.getOperationResponse(applicationUninstallationBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("blacklist-applications") - public Response blacklistApplications(@HeaderParam(ACCEPT) String acceptHeader, - BlacklistApplicationsBeanWrapper blacklistApplicationsBeanWrapper) { - if (log.isDebugEnabled()) { - log.debug("Invoking 'Blacklist-Applications' operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - BlacklistApplications blacklistApplications = blacklistApplicationsBeanWrapper.getOperation(); - - if (blacklistApplications == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the blacklisting apps operation is incorrect"); - } - String errorMessage = "Issue in creating a new blacklist applications instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.BLACKLIST_APPLICATIONS); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(blacklistApplications.toJSON()); - - return AndroidAPIUtils.getOperationResponse(blacklistApplicationsBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("upgrade-firmware") - public Response upgradeFirmware(@HeaderParam(ACCEPT) String acceptHeader, - UpgradeFirmwareBeanWrapper upgradeFirmwareBeanWrapper) { - - if (log.isDebugEnabled()) { - log.debug("Invoking Android upgrade-firmware device operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - UpgradeFirmware upgradeFirmware = upgradeFirmwareBeanWrapper.getOperation(); - - if (upgradeFirmware == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the upgrade firmware operation is incorrect"); - } - String errorMessage = "Issue in creating a new upgrade firmware instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.UPGRADE_FIRMWARE); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(upgradeFirmware.toJSON()); - return AndroidAPIUtils.getOperationResponse(upgradeFirmwareBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("vpn") - public Response configureVPN(@HeaderParam(ACCEPT) String acceptHeader, - VpnBeanWrapper vpnBeanWrapper) { - - if (log.isDebugEnabled()) { - log.debug("Invoking Android VPN device operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - Vpn vpn = vpnBeanWrapper.getOperation(); - - if (vpn == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the VPN operation is incorrect"); - } - String errorMessage = "Issue in creating a new VPN instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.VPN); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(vpn.toJSON()); - return AndroidAPIUtils.getOperationResponse(vpnBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("notification") - public Response sendNotification(@HeaderParam(ACCEPT) String acceptHeader, - NotificationBeanWrapper notificationBeanWrapper) { - if (log.isDebugEnabled()) { - log.debug("Invoking 'notification' operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - Notification notification = notificationBeanWrapper.getOperation(); - - if (notification == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the notification operation is incorrect"); - } - String errorMessage = "Issue in creating a new notification instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.NOTIFICATION); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(notification.toJSON()); - - return AndroidAPIUtils.getOperationResponse(notificationBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("wifi") - public Response configureWifi(@HeaderParam(ACCEPT) String acceptHeader, - WifiBeanWrapper wifiBeanWrapper) { - if (log.isDebugEnabled()) { - log.debug("Invoking 'configure wifi' operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - Wifi wifi = wifiBeanWrapper.getOperation(); - - if (wifi == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the wifi operation is incorrect"); - } - String errorMessage = "Issue in creating a new Wifi instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.WIFI); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(wifi.toJSON()); - - return AndroidAPIUtils.getOperationResponse(wifiBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("encrypt") - public Response encryptStorage(@HeaderParam(ACCEPT) String acceptHeader, - EncryptionBeanWrapper encryptionBeanWrapper) { - if (log.isDebugEnabled()) { - log.debug("Invoking 'encrypt' operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - DeviceEncryption deviceEncryption = encryptionBeanWrapper.getOperation(); - - if (deviceEncryption == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the device encryption operation is incorrect"); - } - String errorMessage = "Issue in creating a new encryption instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.ENCRYPT_STORAGE); - operation.setType(Operation.Type.COMMAND); - operation.setEnabled(deviceEncryption.isEncrypted()); - - return AndroidAPIUtils.getOperationResponse(encryptionBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("change-lock-code") - public Response changeLockCode(@HeaderParam(ACCEPT) String acceptHeader, - LockCodeBeanWrapper lockCodeBeanWrapper) { - if (log.isDebugEnabled()) { - log.debug("Invoking 'change lock code' operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - LockCode lockCode = lockCodeBeanWrapper.getOperation(); - - if (lockCode == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the change lock code operation is incorrect"); - } - String errorMessage = "Issue in retrieving a new lock-code instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.CHANGE_LOCK_CODE); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(lockCode.toJSON()); - - return AndroidAPIUtils.getOperationResponse(lockCodeBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("password-policy") - public Response setPasswordPolicy(@HeaderParam(ACCEPT) String acceptHeader, - PasswordPolicyBeanWrapper passwordPolicyBeanWrapper) { - if (log.isDebugEnabled()) { - log.debug("Invoking 'password policy' operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - PasscodePolicy passcodePolicy = passwordPolicyBeanWrapper.getOperation(); - - if (passcodePolicy == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the change password policy operation is incorrect"); - } - String errorMessage = "Issue in creating a new Password policy instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.PASSCODE_POLICY); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(passcodePolicy.toJSON()); - - return AndroidAPIUtils.getOperationResponse(passwordPolicyBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("webclip") - public Response setWebClip(@HeaderParam(ACCEPT) String acceptHeader, - WebClipBeanWrapper webClipBeanWrapper) { - if (log.isDebugEnabled()) { - log.debug("Invoking 'webclip' operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - WebClip webClip = webClipBeanWrapper.getOperation(); - - if (webClip == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the add webclip operation is incorrect"); - } - String errorMessage = "Issue in creating a new web clip instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - ProfileOperation operation = new ProfileOperation(); - operation.setCode(AndroidConstants.OperationCodes.WEBCLIP); - operation.setType(Operation.Type.PROFILE); - operation.setPayLoad(webClip.toJSON()); - - return AndroidAPIUtils.getOperationResponse(webClipBeanWrapper.getDeviceIDs(), - operation, message, responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - @POST - @Path("disenroll") - public Response setDisenrollment(@HeaderParam(ACCEPT) String acceptHeader, - DisenrollmentBeanWrapper disenrollmentBeanWrapper) { - - if (log.isDebugEnabled()) { - log.debug("Invoking Android device disenrollment operation"); - } - - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message message = new Message(); - - try { - Disenrollment disenrollment = disenrollmentBeanWrapper.getOperation(); - - if (disenrollment == null) { - if (log.isDebugEnabled()) { - log.debug("The payload of the device disenrollment operation is incorrect"); - } - String errorMessage = "Issue in creating a new disenrollment instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - - CommandOperation operation = new CommandOperation(); - operation.setCode(AndroidConstants.OperationCodes.DISENROLL); - operation.setType(Operation.Type.COMMAND); - operation.setEnabled(disenrollment.isEnabled()); - - return AndroidAPIUtils.getOperationResponse(disenrollmentBeanWrapper.getDeviceIDs(), operation, - message, responseMediaType); - - } catch (OperationManagementException e) { - String errorMessage = "Issue in retrieving operation management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } catch (DeviceManagementException e) { - String errorMessage = "Issue in retrieving device management service instance"; - message = Message.responseMessage(errorMessage). - responseCode(Response.Status.INTERNAL_SERVER_ERROR.toString()).build(); - log.error(errorMessage, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type( - responseMediaType).build(); - } - } - - private void updateOperations(String deviceId, List operations) - throws OperationManagementException, PolicyComplianceException, - ApplicationManagementException, NotificationManagementException, DeviceManagementException { - for (org.wso2.carbon.device.mgt.common.operation.mgt.Operation operation : operations) { - AndroidAPIUtils.updateOperation(deviceId, operation); - if (operation.getStatus().equals(OPERATION_ERROR_STATUS)) { - org.wso2.carbon.device.mgt.common.notification.mgt.Notification notification = new - org.wso2.carbon.device.mgt.common.notification.mgt.Notification(); - DeviceIdentifier id = new DeviceIdentifier(); - id.setId(deviceId); - id.setType(DEVICE_TYPE_ANDROID); - String deviceName = AndroidAPIUtils.getDeviceManagementService().getDevice(id).getName(); - notification.setOperationId(operation.getId()); - notification.setStatus(org.wso2.carbon.device.mgt.common.notification.mgt.Notification. - Status.NEW.toString()); - notification.setDeviceIdentifier(id); - notification.setDescription("Operation " + operation.getCode() + " failed to execute on device " + - deviceName + ". Device ID : " + deviceId); - AndroidAPIUtils.getNotificationManagementService().addNotification(notification); - } - if (log.isDebugEnabled()) { - log.debug("Updating operation '" + operation.toString() + "'"); - } - } - } -} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/policymgt/PolicyMgtService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/policymgt/PolicyMgtService.java deleted file mode 100644 index adcb2228f..000000000 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/policymgt/PolicyMgtService.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.carbon.mdm.services.android.services.policymgt; - -import io.swagger.annotations.*; -import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; -import org.wso2.carbon.mdm.services.android.util.Message; -import org.wso2.carbon.policy.mgt.common.ProfileFeature; - -import javax.jws.WebService; -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.util.List; - -@Api(value = "PolicyMgtService", description = "Policy management related REST-API implementation.") -@WebService -@Produces({"application/json", "application/xml"}) -@Consumes({"application/json", "application/xml"}) -public interface PolicyMgtService { - - @GET - @Path("{deviceId}") - @ApiOperation( - httpMethod = "GET", - value = "Identifying whether a Policy is Enforced on an Android Device", - notes = "When a device registers with WSO2 EMM, a policy is enforced on the device based on the policy " + - "enforcement criteria. Using this API you are able to identify if a specific device has a policy " + - "enforced or if no policy is enforced on the device." - ) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Effective policy added to operation"), - @ApiResponse(code = 204, message = "No effective policy found") - }) - Response getEffectivePolicy(@ApiParam(name = "acceptHeader", value = "Accept Header") @HeaderParam("Accept") - String acceptHeader, - @ApiParam(name = "deviceId", value = "DeviceIdentifier") @PathParam("deviceId") - String id) throws AndroidAgentException; - - @GET - @Path("/features/{deviceId}") - @ApiOperation( - produces = MediaType.APPLICATION_JSON, - httpMethod = "GET", - value = "Get Effective Features", - responseContainer = "List", - notes = "Get already applied features for given device Identifier", - response = ProfileFeature.class) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Effective Feature List"), - @ApiResponse(code = 404, message = "Not Found"), - @ApiResponse(code = 500, message = "Error occurred while getting the features") - }) - Response getEffectiveFeatures(@ApiParam(name = "acceptHeader", value = "Accept Header") - @HeaderParam("Accept") String acceptHeader, - @ApiParam(name = "deviceId", value = "DeviceIdentifier") - @PathParam("deviceId") String id) throws AndroidAgentException; -} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/policymgt/impl/PolicyMgtServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/policymgt/impl/PolicyMgtServiceImpl.java deleted file mode 100644 index 33d9c1603..000000000 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/policymgt/impl/PolicyMgtServiceImpl.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.carbon.mdm.services.android.services.policymgt.impl; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; -import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; -import org.wso2.carbon.mdm.services.android.services.policymgt.PolicyMgtService; -import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils; -import org.wso2.carbon.mdm.services.android.util.Message; -import org.wso2.carbon.policy.mgt.common.FeatureManagementException; -import org.wso2.carbon.policy.mgt.common.Policy; -import org.wso2.carbon.policy.mgt.common.PolicyManagementException; -import org.wso2.carbon.policy.mgt.common.ProfileFeature; -import org.wso2.carbon.policy.mgt.core.PolicyManagerService; - -import javax.ws.rs.GET; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.util.List; - -public class PolicyMgtServiceImpl implements PolicyMgtService { - private static Log log = LogFactory.getLog(PolicyMgtService.class); - - @GET - @Path("{deviceId}") - public Response getEffectivePolicy(@HeaderParam("Accept") String acceptHeader, - @PathParam("deviceId") String id) throws AndroidAgentException { - - DeviceIdentifier deviceIdentifier = AndroidAPIUtils.convertToDeviceIdentifierObject(id); - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - Message responseMessage = new Message(); - Policy policy; - try { - PolicyManagerService policyManagerService = AndroidAPIUtils.getPolicyManagerService(); - policy = policyManagerService.getEffectivePolicy(deviceIdentifier); - if (policy == null) { - responseMessage = Message.responseMessage("No effective policy found"). - responseCode(Response.Status.NO_CONTENT.toString()).build(); - return Response.status(Response.Status.NO_CONTENT).entity(responseMessage).type( - responseMediaType).build(); - } else { - responseMessage = Message.responseMessage("Effective policy added to operation"). - responseCode(Response.Status.OK.toString()).build(); - return Response.status(Response.Status.OK).entity(responseMessage).type( - responseMediaType).build(); - } - } catch (PolicyManagementException e) { - String msg = "Error occurred while getting the policy."; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).type( - responseMediaType).build(); - } - } - - @GET - @Path("/features/{deviceId}") - public Response getEffectiveFeatures(@HeaderParam("Accept") String acceptHeader, - @PathParam("deviceId") String id) throws AndroidAgentException { - List profileFeatures; - DeviceIdentifier deviceIdentifier = AndroidAPIUtils.convertToDeviceIdentifierObject(id); - MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader); - try { - PolicyManagerService policyManagerService = AndroidAPIUtils.getPolicyManagerService(); - profileFeatures = policyManagerService.getEffectiveFeatures(deviceIdentifier); - if (profileFeatures == null) { - Response.status(Response.Status.NOT_FOUND); - return Response.status(Response.Status.NOT_FOUND).type( - responseMediaType).build(); - } - } catch (FeatureManagementException e) { - String msg = "Error occurred while getting the features."; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).type( - responseMediaType).build(); - } - return Response.status(Response.Status.OK).entity(profileFeatures).type( - responseMediaType).build(); - } -} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidAPIUtils.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidAPIUtils.java index acb487d68..c83b18a89 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidAPIUtils.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidAPIUtils.java @@ -36,6 +36,7 @@ import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.common.app.mgt.Application; import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; +import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo; import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation; import org.wso2.carbon.device.mgt.common.notification.mgt.NotificationManagementService; import org.wso2.carbon.device.mgt.common.operation.mgt.Activity; @@ -47,6 +48,8 @@ import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInformationManag import org.wso2.carbon.device.mgt.core.search.mgt.impl.Utils; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.mdm.services.android.bean.DeviceState; +import org.wso2.carbon.mdm.services.android.bean.ErrorResponse; +import org.wso2.carbon.mdm.services.android.exception.BadRequestException; import org.wso2.carbon.policy.mgt.common.monitor.PolicyComplianceException; import org.wso2.carbon.policy.mgt.core.PolicyManagerService; @@ -114,13 +117,16 @@ public class AndroidAPIUtils { return responseMediaType; } - public static Response getOperationResponse(List deviceIDs, Operation operation, - Message message, MediaType responseMediaType) + public static Response getOperationResponse(List deviceIDs, Operation operation) throws DeviceManagementException, OperationManagementException { - + if (deviceIDs == null || deviceIDs.size() == 0) { + String errorMessage = "Device identifier list is empty"; + log.error(errorMessage); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(errorMessage).build()); + } AndroidDeviceUtils deviceUtils = new AndroidDeviceUtils(); - DeviceIDHolder deviceIDHolder = deviceUtils.validateDeviceIdentifiers(deviceIDs, - message, responseMediaType); + DeviceIDHolder deviceIDHolder = deviceUtils.validateDeviceIdentifiers(deviceIDs); List validDeviceIds = deviceIDHolder.getValidDeviceIDList(); Activity activity = getDeviceManagementService().addOperation( @@ -137,13 +143,11 @@ public class AndroidAPIUtils { // } // } if (!deviceIDHolder.getErrorDeviceIdList().isEmpty()) { - return javax.ws.rs.core.Response.status(AndroidConstants.StatusCodes. - MULTI_STATUS_HTTP_CODE).type( - responseMediaType).entity(deviceUtils. - convertErrorMapIntoErrorMessage(deviceIDHolder.getErrorDeviceIdList())).build(); + throw new BadRequestException( + new ErrorResponse.ErrorResponseBuilder().setCode(400l).setMessage(deviceUtils. + convertErrorMapIntoErrorMessage(deviceIDHolder.getErrorDeviceIdList())).build()); } - return javax.ws.rs.core.Response.status(javax.ws.rs.core.Response.Status.CREATED).entity(activity). - type(responseMediaType).build(); + return Response.status(Response.Status.CREATED).entity(activity).build(); } @@ -262,33 +266,39 @@ public class AndroidAPIUtils { deviceIdentifier.setId(deviceId); deviceIdentifier.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); - if (AndroidConstants.OperationCodes.MONITOR.equals(operation.getCode())) { + if (!Operation.Status.ERROR.equals(operation.getStatus()) && + AndroidConstants.OperationCodes.MONITOR.equals(operation.getCode())) { if (log.isDebugEnabled()) { log.info("Received compliance status from MONITOR operation ID: " + operation.getId()); } getPolicyManagerService().checkPolicyCompliance(deviceIdentifier, operation.getPayLoad()); - } else if (AndroidConstants.OperationCodes.APPLICATION_LIST.equals(operation.getCode())) { + } else if (!Operation.Status.ERROR.equals(operation.getStatus()) && AndroidConstants. + OperationCodes.APPLICATION_LIST.equals(operation.getCode())) { if (log.isDebugEnabled()) { log.info("Received applications list from device '" + deviceId + "'"); } updateApplicationList(operation, deviceIdentifier); - } else if (AndroidConstants.OperationCodes.DEVICE_INFO.equals(operation.getCode())) { + } else if (!Operation.Status.ERROR.equals(operation.getStatus()) && AndroidConstants. + OperationCodes.DEVICE_INFO.equals(operation.getCode())) { try { Device device = new Gson().fromJson(operation.getOperationResponse(), Device.class); org.wso2.carbon.device.mgt.common.device.details.DeviceInfo deviceInfo = convertDeviceToInfo(device); - deviceInfo.setDeviceIdentifier(deviceIdentifier); - updateDeviceInfo(deviceInfo); + updateDeviceInfo(deviceIdentifier, deviceInfo); } catch (DeviceDetailsMgtException e) { throw new OperationManagementException("Error occurred while updating the device information.", e); } - } else if (AndroidConstants.OperationCodes.DEVICE_LOCATION.equals(operation.getCode())) { + } else if (!Operation.Status.ERROR.equals(operation.getStatus()) && + AndroidConstants.OperationCodes.DEVICE_LOCATION.equals(operation.getCode())) { try { DeviceLocation location = new Gson().fromJson(operation.getOperationResponse(), DeviceLocation.class); - if (location != null) { + // reason for checking "location.getLatitude() != null" because when device fails to provide + // device location and send status instead, above Gson converter create new location object + // with null attributes + if (location != null && location.getLatitude() != null) { location.setDeviceIdentifier(deviceIdentifier); updateDeviceLocation(location); } @@ -296,7 +306,6 @@ public class AndroidAPIUtils { throw new OperationManagementException("Error occurred while updating the device location.", e); } } - getDeviceManagementService().updateOperation(deviceIdentifier, operation); } @@ -311,31 +320,35 @@ public class AndroidAPIUtils { private static void updateApplicationList(Operation operation, DeviceIdentifier deviceIdentifier) throws ApplicationManagementException { // Parsing json string to get applications list. - JsonElement jsonElement = new JsonParser().parse(operation.getOperationResponse()); - JsonArray jsonArray = jsonElement.getAsJsonArray(); - Application app; - List applications = new ArrayList(jsonArray.size()); - for (JsonElement element : jsonArray) { - app = new Application(); - app.setName(element.getAsJsonObject(). - get(AndroidConstants.ApplicationProperties.NAME).getAsString()); - app.setApplicationIdentifier(element.getAsJsonObject(). - get(AndroidConstants.ApplicationProperties.IDENTIFIER).getAsString()); - app.setPlatform(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); - if (element.getAsJsonObject().get(AndroidConstants.ApplicationProperties.USS) != null) { - app.setMemoryUsage(element.getAsJsonObject().get(AndroidConstants.ApplicationProperties.USS).getAsInt()); - } - if (element.getAsJsonObject().get(AndroidConstants.ApplicationProperties.VERSION) != null) { - app.setVersion(element.getAsJsonObject().get(AndroidConstants.ApplicationProperties.VERSION).getAsString()); + if (operation.getOperationResponse() != null) { + JsonElement jsonElement = new JsonParser().parse(operation.getOperationResponse()); + JsonArray jsonArray = jsonElement.getAsJsonArray(); + Application app; + List applications = new ArrayList(jsonArray.size()); + for (JsonElement element : jsonArray) { + app = new Application(); + app.setName(element.getAsJsonObject(). + get(AndroidConstants.ApplicationProperties.NAME).getAsString()); + app.setApplicationIdentifier(element.getAsJsonObject(). + get(AndroidConstants.ApplicationProperties.IDENTIFIER).getAsString()); + app.setPlatform(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); + if (element.getAsJsonObject().get(AndroidConstants.ApplicationProperties.USS) != null) { + app.setMemoryUsage(element.getAsJsonObject().get(AndroidConstants.ApplicationProperties.USS).getAsInt()); + } + if (element.getAsJsonObject().get(AndroidConstants.ApplicationProperties.VERSION) != null) { + app.setVersion(element.getAsJsonObject().get(AndroidConstants.ApplicationProperties.VERSION).getAsString()); + } + applications.add(app); } - applications.add(app); + getApplicationManagerService().updateApplicationListInstalledInDevice(deviceIdentifier, applications); + } else { + log.error("Operation Response is null."); } - getApplicationManagerService().updateApplicationListInstalledInDevice(deviceIdentifier, applications); + } private static void updateDeviceLocation(DeviceLocation deviceLocation) throws DeviceDetailsMgtException { - PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); DeviceInformationManager informationManager = (DeviceInformationManager) ctx.getOSGiService(DeviceInformationManager.class, null); @@ -344,14 +357,14 @@ public class AndroidAPIUtils { } - private static void updateDeviceInfo(org.wso2.carbon.device.mgt.common.device.details.DeviceInfo deviceInfo) + private static void updateDeviceInfo(DeviceIdentifier deviceId, DeviceInfo deviceInfo) throws DeviceDetailsMgtException { PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); DeviceInformationManager informationManager = (DeviceInformationManager) ctx.getOSGiService(DeviceInformationManager.class, null); - informationManager.addDeviceInfo(deviceInfo); + informationManager.addDeviceInfo(deviceId, deviceInfo); } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java index 8ba454da3..7aad2f7b1 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidConstants.java @@ -23,101 +23,111 @@ package org.wso2.carbon.mdm.services.android.util; */ public final class AndroidConstants { - public final class DeviceProperties{ - private DeviceProperties() { - throw new AssertionError(); - } - public static final String PROPERTY_USER_KEY = "username"; - public static final String PROPERTY_DEVICE_KEY = "device"; - } - - public final class DeviceFeatures{ - private DeviceFeatures() { - throw new AssertionError(); - } - } - - public final class DeviceConstants{ - private DeviceConstants() { - throw new AssertionError(); - } - public static final String DEVICE_MAC_KEY = "mac"; - public static final String DEVICE_DESCRIPTION_KEY = "description"; - public static final String DEVICE_OWNERSHIP_KEY = "ownership"; - public static final String DEVICE_PROPERTIES_KEY = "properties"; - public static final String DEVICE_FEATURES_KEY = "features"; - public static final String DEVICE_DATA = "data"; - public static final String DEVICE_ID_NOT_FOUND = "Device Id not found for device found at %s"; - public static final String DEVICE_ID_SERVICE_NOT_FOUND = - "Issue in retrieving device management service instance for device found at %s"; - } - - public final class Messages{ - private Messages(){ - throw new AssertionError(); - } - public static final String DEVICE_MANAGER_SERVICE_NOT_AVAILABLE = - "Device Manager service not available"; - } - - public final class OperationCodes{ - private OperationCodes(){ - throw new AssertionError(); - } - public static final String DEVICE_LOCK = "DEVICE_LOCK"; - public static final String DEVICE_UNLOCK = "DEVICE_UNLOCK"; - public static final String DEVICE_LOCATION = "DEVICE_LOCATION"; - public static final String WIFI = "WIFI"; - public static final String CAMERA = "CAMERA"; - public static final String DEVICE_MUTE = "DEVICE_MUTE"; - public static final String PASSCODE_POLICY = "PASSCODE_POLICY"; - public static final String DEVICE_INFO = "DEVICE_INFO"; - public static final String ENTERPRISE_WIPE = "ENTERPRISE_WIPE"; - public static final String CLEAR_PASSWORD = "CLEAR_PASSWORD"; - public static final String WIPE_DATA = "WIPE_DATA"; - public static final String APPLICATION_LIST = "APPLICATION_LIST"; - public static final String CHANGE_LOCK_CODE = "CHANGE_LOCK_CODE"; - public static final String INSTALL_APPLICATION = "INSTALL_APPLICATION"; - public static final String UPDATE_APPLICATION = "UPDATE_APPLICATION"; - public static final String UNINSTALL_APPLICATION = "UNINSTALL_APPLICATION"; - public static final String BLACKLIST_APPLICATIONS = "BLACKLIST_APPLICATIONS"; - public static final String ENCRYPT_STORAGE = "ENCRYPT_STORAGE"; - public static final String DEVICE_RING = "DEVICE_RING"; - public static final String DEVICE_REBOOT = "REBOOT"; - public static final String UPGRADE_FIRMWARE = "UPGRADE_FIRMWARE"; - public static final String NOTIFICATION = "NOTIFICATION"; - public static final String WEBCLIP = "WEBCLIP"; - public static final String DISENROLL = "DISENROLL"; - public static final String MONITOR = "MONITOR"; - public static final String VPN = "VPN"; - public static final String APP_RESTRICTION = "APP-RESTRICTION"; - public static final String WORK_PROFILE = "WORK_PROFILE"; + public static final String DEVICE_TYPE_ANDROID = "android"; + + public final class DeviceProperties { + private DeviceProperties() { + throw new AssertionError(); + } + + public static final String PROPERTY_USER_KEY = "username"; + public static final String PROPERTY_DEVICE_KEY = "device"; + } + + public final class DeviceFeatures { + private DeviceFeatures() { + throw new AssertionError(); + } + } + + public final class DeviceConstants { + private DeviceConstants() { + throw new AssertionError(); + } + + public static final String DEVICE_MAC_KEY = "mac"; + public static final String DEVICE_DESCRIPTION_KEY = "description"; + public static final String DEVICE_OWNERSHIP_KEY = "ownership"; + public static final String DEVICE_PROPERTIES_KEY = "properties"; + public static final String DEVICE_FEATURES_KEY = "features"; + public static final String DEVICE_DATA = "data"; + public static final String DEVICE_ID_NOT_FOUND = "Device not found for device id: %s"; + public static final String DEVICE_ID_SERVICE_NOT_FOUND = + "Issue in retrieving device management service instance for device found at %s"; + } + + public final class Messages { + private Messages() { + throw new AssertionError(); + } + + public static final String DEVICE_MANAGER_SERVICE_NOT_AVAILABLE = + "Device Manager service not available"; } - public final class StatusCodes{ - private StatusCodes(){ - throw new AssertionError(); - } - public static final int MULTI_STATUS_HTTP_CODE = 207; - } - - public final class TenantConfigProperties{ - private TenantConfigProperties(){ - throw new AssertionError(); - } - public static final String LICENSE_KEY = "androidEula"; - public static final String LANGUAGE_US = "en_US"; - public static final String CONTENT_TYPE_TEXT = "text"; - } + public final class OperationCodes { + private OperationCodes() { + throw new AssertionError(); + } + + public static final String DEVICE_LOCK = "DEVICE_LOCK"; + public static final String DEVICE_UNLOCK = "DEVICE_UNLOCK"; + public static final String DEVICE_LOCATION = "DEVICE_LOCATION"; + public static final String WIFI = "WIFI"; + public static final String CAMERA = "CAMERA"; + public static final String DEVICE_MUTE = "DEVICE_MUTE"; + public static final String PASSCODE_POLICY = "PASSCODE_POLICY"; + public static final String DEVICE_INFO = "DEVICE_INFO"; + public static final String ENTERPRISE_WIPE = "ENTERPRISE_WIPE"; + public static final String CLEAR_PASSWORD = "CLEAR_PASSWORD"; + public static final String WIPE_DATA = "WIPE_DATA"; + public static final String APPLICATION_LIST = "APPLICATION_LIST"; + public static final String CHANGE_LOCK_CODE = "CHANGE_LOCK_CODE"; + public static final String INSTALL_APPLICATION = "INSTALL_APPLICATION"; + public static final String UPDATE_APPLICATION = "UPDATE_APPLICATION"; + public static final String UNINSTALL_APPLICATION = "UNINSTALL_APPLICATION"; + public static final String BLACKLIST_APPLICATIONS = "BLACKLIST_APPLICATIONS"; + public static final String ENCRYPT_STORAGE = "ENCRYPT_STORAGE"; + public static final String DEVICE_RING = "DEVICE_RING"; + public static final String DEVICE_REBOOT = "REBOOT"; + public static final String UPGRADE_FIRMWARE = "UPGRADE_FIRMWARE"; + public static final String NOTIFICATION = "NOTIFICATION"; + public static final String WEBCLIP = "WEBCLIP"; + public static final String DISENROLL = "DISENROLL"; + public static final String MONITOR = "MONITOR"; + public static final String VPN = "VPN"; + public static final String APP_RESTRICTION = "APP-RESTRICTION"; + public static final String WORK_PROFILE = "WORK_PROFILE"; + } + + public final class StatusCodes { + private StatusCodes() { + throw new AssertionError(); + } + + public static final int MULTI_STATUS_HTTP_CODE = 207; + } + + public final class TenantConfigProperties { + private TenantConfigProperties() { + throw new AssertionError(); + } + + public static final String LICENSE_KEY = "androidEula"; + public static final String LANGUAGE_US = "en_US"; + public static final String CONTENT_TYPE_TEXT = "text"; + } public final class ApplicationProperties { - private ApplicationProperties(){ + private ApplicationProperties() { throw new AssertionError(); } + public static final String NAME = "name"; public static final String IDENTIFIER = "package"; public static final String USS = "USS"; public static final String VERSION = "version"; public static final String ICON = "icon"; } + } diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidDeviceUtils.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidDeviceUtils.java index f8733cf10..9c4c660a7 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidDeviceUtils.java +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidDeviceUtils.java @@ -20,9 +20,6 @@ package org.wso2.carbon.mdm.services.android.util; import org.apache.commons.lang.StringUtils; import org.wso2.carbon.device.mgt.common.*; -import org.wso2.carbon.mdm.services.android.exception.BadRequestException; - -import javax.ws.rs.core.MediaType; import java.util.ArrayList; import java.util.List; @@ -33,13 +30,7 @@ public class AndroidDeviceUtils { private static final String COMMA_SEPARATION_PATTERN = ", "; - public DeviceIDHolder validateDeviceIdentifiers(List deviceIDs, - Message message, MediaType responseMediaType) { - - if (deviceIDs == null || deviceIDs.isEmpty()) { - message.setResponseMessage("Device identifier list is empty"); - throw new BadRequestException(message, responseMediaType); - } + public DeviceIDHolder validateDeviceIdentifiers(List deviceIDs) { List errorDeviceIdList = new ArrayList(); List validDeviceIDList = new ArrayList(); @@ -64,8 +55,8 @@ public class AndroidDeviceUtils { if (isValidDeviceIdentifier(deviceIdentifier)) { validDeviceIDList.add(deviceIdentifier); } else { - errorDeviceIdList.add(String.format(AndroidConstants.DeviceConstants.DEVICE_ID_NOT_FOUND, - deviceIDCounter)); + errorDeviceIdList.add(String.format(AndroidConstants.DeviceConstants. + DEVICE_ID_NOT_FOUND, deviceID)); } } catch (DeviceManagementException e) { errorDeviceIdList.add(String.format(AndroidConstants.DeviceConstants.DEVICE_ID_SERVICE_NOT_FOUND, diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/ApiOriginFilter.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/ApiOriginFilter.java new file mode 100644 index 000000000..455d582bb --- /dev/null +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/ApiOriginFilter.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.mdm.services.android.util; + +import javax.servlet.*; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class ApiOriginFilter implements Filter { + + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + HttpServletResponse res = (HttpServletResponse) response; + res.addHeader("Access-Control-Allow-Origin", "*"); + res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); + res.addHeader("Access-Control-Allow-Headers", "Content-Type"); + chain.doFilter(request, response); + } + + public void destroy() { + //do nothing + } + + public void init(FilterConfig filterConfig) throws ServletException { + //do nothing + } + +} diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/META-INF/permissions.xml b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/META-INF/permissions.xml index 1fd0c7c66..89527545a 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/META-INF/permissions.xml +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/META-INF/permissions.xml @@ -30,121 +30,116 @@ - - Get Pending Operation - /device-mgt/android/operations/poll - /operation/* - PUT - emm_android_agent - + Lock - /device-mgt/android/operations/lock - /operation/lock + /device-mgt/admin/operations/android/lock + /admin/devices/lock-devices POST emm_admin,emm_user Unlock - /device-mgt/android/operations/unlock - /operation/unlock + /device-mgt/admin/operations/android/unlock + /admin/devices/unlock-devices POST emm_admin,emm_user Mute - /device-mgt/android/operations/mute - /operation/mute + /device-mgt/admin/operations/android/mute + /admin/devices/mute POST emm_admin,emm_user Location - /device-mgt/android/operations/location - /operation/location + /device-mgt/admin/operations/android/location + /admin/devices/location POST emm_admin,emm_user Clear Passcode - /operation/clear-password/ + /device-mgt/admin/operations/android/clear-password + /admin/devices/clear-password POST emm_admin Camera - /device-mgt/android/operations/camera - /operation/camera + /device-mgt/admin/operations/android/camera + /admin/devices/control-camera POST emm_admin,emm_user Device Info - /device-mgt/android/operations/device-info - /operation/device-info + /device-mgt/admin/operations/android/device-info + /admin/devices/info POST emm_admin,emm_user Enterprise Wipe - /device-mgt/android/operations/enterprise-wipe - /operation/enterprise-wipe + /device-mgt/admin/operations/android/enterprise-wipe + /admin/devices/enterprise-wipe POST emm_admin Wipe Data - /device-mgt/android/operations/wipe-data - /operation/wipe-data + /device-mgt/admin/operations/android/wipe-data + /admin/devices/wipe POST emm_admin Application List - /device-mgt/android/operations/application-list - /operation/application-list + /device-mgt/admin/operations/android/application-list + /admin/devices/applications POST emm_admin,emm_user Ring - /device-mgt/android/operations/ring-device - /operation/ring-device + /device-mgt/admin/operations/android/ring-device + /admin/devices/ring POST emm_admin,emm_user Reboot - /device-mgt/android/operations/reboot-device - /operation/reboot-device + /device-mgt/admin/operations/android/reboot-device + /admin/devices/reboot POST emm_admin,emm_user Upgrade Firmware - /device-mgt/android/operations/upgrade-firmware - /operation/upgrade-firmware + /device-mgt/admin/operations/android/upgrade-firmware + /admin/devices/upgrade-firmware POST - emm_admin,emm_user + emm_admin Configure VPN - /device-mgt/android/operations/vpn - /operation/vpn + /device-mgt/admin/operations/android/vpn + /admin/devices/configure-vpn POST emm_admin,emm_user @@ -152,86 +147,86 @@ Install Application /device-mgt/android/operations/install-application - /operation/install-application + /admin/devices/install-application POST emm_admin,emm_user Update Application - /device-mgt/android/operations/update-application - /operation/update-application + /device-mgt/admin/operations/android/install-application + /admin/devices/update-application POST emm_admin,emm_user Uninstall Application - /device-mgt/android/operations/uninstall-application - /operation/uninstall-application + /device-mgt/admin/operations/android/uninstall-application + /admin/devices/uninstall-application POST emm_admin,emm_user Blacklist Applications - /device-mgt/android/operations/blacklist-applications - /operation/blacklist-applications + /device-mgt/admin/operations/android/blacklist-applications + /admin/devices/blacklist-applications POST emm_admin Notification - /device-mgt/android/operations/notification - /operation/notification + /device-mgt/admin/operations/android/notification + /admin/devices/send-notification POST emm_admin,emm_user Wifi - /device-mgt/android/operations/wifi - /operation/wifi + /device-mgt/admin/operations/android/wifi + /admin/devices/configure-wifi POST emm_admin Encryption - /device-mgt/android/operations/encrypt - /operation/encrypt + /device-mgt/admin/operations/android/encrypt + /admin/devices/encrypt-storage POST emm_admin Change lock code - /device-mgt/android/operations/change-lock-code - /operation/change-lock-code + /device-mgt/admin/operations/android/change-lock-code + /admin/devices/change-lock-code POST emm_admin Password Policy - /device-mgt/android/operations/password-policy - /operation/password-policy + /device-mgt/admin/operations/android/password-policy + /admin/devices/set-password-policy POST emm_admin Webclip - /device-mgt/android/operations/webclip - /operation/webclip + /device-mgt/admin/operations/android/webclip + /admin/devices/set-webclip POST emm_admin Disenroll - /device-mgt/android/operations/disenroll + /device-mgt/admin/operations/android/disenroll /operation/disenroll POST emm_android_agent @@ -240,7 +235,7 @@ View devices - /device-mgt/android/devices/list + /device-mgt/admin/devices/view /device GET emm_admin @@ -248,7 +243,7 @@ View device - /device-mgt/android/devices/view + /device-mgt/admin/devices/view /device/* GET emm_admin,emm_user @@ -256,7 +251,7 @@ Update device - /device-mgt/android/devices/update + /device-mgt/admin/devices/update /device/* PUT emm_admin,emm_user @@ -264,7 +259,7 @@ Update application list - /device-mgt/android/devices/update-app + /device-mgt/admin/operations/android/update-applist /device/appList/* POST emm_admin @@ -272,8 +267,8 @@ View license - /device-mgt/android/license/view - /device/license + /device-mgt/user/enroll/android + /configuration/license GET emm_android_agent @@ -281,20 +276,52 @@ Enroll device - /device-mgt/android/devices/enroll - /enrollment + /device-mgt/user/enroll/android + /devices POST emm_android_agent - Get Enrollment Status - /device-mgt/android/devices/enroll - /enrollment/* + Devices related Operations + /device-mgt/user/enroll/android + /devices/* GET emm_android_agent + + Device is enrolled + /device-mgt/user/enroll/android + /devices/*/status + GET + emm_android_agent + + + + Devices related Operations + /device-mgt/user/enroll/android + /devices/*/pending-operations + PUT + emm_android_agent + + + + Modify devices + /device-mgt/user/enroll/android + /devices/* + PUT + emm_android_agent + + + + Delete devices + /device-mgt/user/enroll/android + /devices/* + DELETE + emm_android_agent + + Update Enrollment /device-mgt/android/devices/enroll @@ -314,7 +341,7 @@ View Policies - /device-mgt/android/policies/view + /device-mgt/user/enroll/android /policy/* GET emm_admin @@ -322,7 +349,7 @@ View Policy Features - /device-mgt/android/policies/view + /device-mgt/user/enroll/android /policy/features/* GET emm_admin @@ -331,7 +358,7 @@ View Tenant configuration - /device-mgt/android/tenant/configuration + /device-mgt/admin/platform-configs/view /configuration GET emm_admin @@ -339,7 +366,7 @@ Add Tenant configuration - /device-mgt/android/tenant/configuration + /device-mgt/admin/platform-configs/add /configuration POST emm_admin @@ -347,7 +374,7 @@ Update Tenant configuration - /device-mgt/android/tenant/configuration + /device-mgt/admin/platform-configs/modify /configuration PUT emm_admin @@ -355,28 +382,14 @@ Event Addition /device-mgt/android/events/add - /events + /events/publish POST emm_user,emm_admin Event Retrieve /device-mgt/android/events/view - /events/* - GET - emm_admin - - - Event Retrieve - /device-mgt/android/events/date - /events/*/date - GET - emm_admin - - - Event Retrieve - /device-mgt/android/events/type - /events/*/type/* + /events GET emm_admin diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/cxf-servlet.xml b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/cxf-servlet.xml index 89e199a7b..cc020be21 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/cxf-servlet.xml +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/cxf-servlet.xml @@ -23,67 +23,41 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/web.xml b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/web.xml index ad42bfafd..48eeb393e 100644 --- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/web.xml +++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/web.xml @@ -28,6 +28,11 @@ org.apache.cxf.transport.servlet.CXFServlet + + + swagger.security.filter + ApiAuthorizationFilterImpl + 1 @@ -74,4 +79,13 @@ + + ApiOriginFilter + org.wso2.carbon.mdm.services.android.util.ApiOriginFilter + + + ApiOriginFilter + /* + + diff --git a/components/mobile-plugins/windows-plugin/org.wso2.carbon.device.mgt.mobile.windows.api/src/main/java/org/wso2/carbon/mdm/mobileservices/windows/operations/util/OperationUtils.java b/components/mobile-plugins/windows-plugin/org.wso2.carbon.device.mgt.mobile.windows.api/src/main/java/org/wso2/carbon/mdm/mobileservices/windows/operations/util/OperationUtils.java index f9140826e..4ff0475af 100644 --- a/components/mobile-plugins/windows-plugin/org.wso2.carbon.device.mgt.mobile.windows.api/src/main/java/org/wso2/carbon/mdm/mobileservices/windows/operations/util/OperationUtils.java +++ b/components/mobile-plugins/windows-plugin/org.wso2.carbon.device.mgt.mobile.windows.api/src/main/java/org/wso2/carbon/mdm/mobileservices/windows/operations/util/OperationUtils.java @@ -87,10 +87,9 @@ public class OperationUtils { Notification lockResetNotification = new Notification(); lockResetNotification.setOperationId(status.getCommandReference()); lockResetNotification.setStatus(String.valueOf(Notification.Status.NEW)); - lockResetNotification.setDeviceIdentifier(deviceIdentifier); lockResetNotification.setDescription( Constants.SyncMLResponseCodes.LOCKRESET_NOTIFICATION); - nmService.addNotification(lockResetNotification); + nmService.addNotification(deviceIdentifier, lockResetNotification); } catch (NotificationManagementException e) { throw new WindowsOperationException("Failure occurred in getting notification service", e); } @@ -156,10 +155,9 @@ public class OperationUtils { Notification lockResetNotification = new Notification(); lockResetNotification.setOperationId(status.getCommandReference()); lockResetNotification.setStatus(String.valueOf(Notification.Status.NEW)); - lockResetNotification.setDeviceIdentifier(deviceIdentifier); lockResetNotification.setDescription(Constants.SyncMLResponseCodes.LOCKRESET_NOTIFICATION); - nmService.addNotification(lockResetNotification); + nmService.addNotification(deviceIdentifier, lockResetNotification); } catch (NotificationManagementException e) { String msg = "Failure occurred in getting notification service"; log.error(msg, e); @@ -404,10 +402,9 @@ public class OperationUtils { Notification notification = new Notification(); notification.setDescription("Auto generated DevicePin : " + pinValue); notification.setOperationId(result.getCommandReference()); - notification.setDeviceIdentifier(deviceIdentifier); notification.setStatus(String.valueOf(Notification.Status.NEW)); try { - nmService.addNotification(notification); + nmService.addNotification(deviceIdentifier, notification); } catch (NotificationManagementException e) { String msg = "Failure Occurred in getting notification service."; log.error(msg, e); diff --git a/features/mobile-plugins-feature/android-plugin-feature/org.wso2.carbon.device.mgt.mobile.android.feature/pom.xml b/features/mobile-plugins-feature/android-plugin-feature/org.wso2.carbon.device.mgt.mobile.android.feature/pom.xml index 6efb424d3..581ca9d10 100644 --- a/features/mobile-plugins-feature/android-plugin-feature/org.wso2.carbon.device.mgt.mobile.android.feature/pom.xml +++ b/features/mobile-plugins-feature/android-plugin-feature/org.wso2.carbon.device.mgt.mobile.android.feature/pom.xml @@ -118,7 +118,7 @@ true ${project.build.directory}/maven-shared-archive-resources/webapps/ - mdm-android-agent.war + api#device-mgt#android#v1.0.war diff --git a/features/mobile-plugins-feature/android-plugin-feature/org.wso2.carbon.device.mgt.mobile.android.feature/src/main/resources/p2.inf b/features/mobile-plugins-feature/android-plugin-feature/org.wso2.carbon.device.mgt.mobile.android.feature/src/main/resources/p2.inf index 349c09785..3b9d91aec 100644 --- a/features/mobile-plugins-feature/android-plugin-feature/org.wso2.carbon.device.mgt.mobile.android.feature/src/main/resources/p2.inf +++ b/features/mobile-plugins-feature/android-plugin-feature/org.wso2.carbon.device.mgt.mobile.android.feature/src/main/resources/p2.inf @@ -1,5 +1,5 @@ instructions.configure = \ -org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/webapps/mdm-android-agent.war,target:${installFolder}/../../deployment/server/webapps/mdm-android-agent.war,overwrite:true);\ +org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/webapps/api#device-mgt#android#v1.0.war,target:${installFolder}/../../deployment/server/webapps/api#device-mgt#android#v1.0.war,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/conf/mobile-config.xml,target:${installFolder}/../../conf/mobile-config.xml,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/dbscripts/plugins/,target:${installFolder}/../../../dbscripts/cdm/plugins/android,overwrite:true);\ diff --git a/pom.xml b/pom.xml index 458950867..df3853bec 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,28 @@ swagger-annotations ${swagger.version} + + io.swagger + swagger-core + ${swagger.version} + + + org.slf4j + slf4j-api + + + + + io.swagger + swagger-jaxrs + ${swagger.version} + + + javax.servlet + servlet-api + ${servlet-api.version} + provided + @@ -1180,6 +1202,8 @@ github-scm + + 2.5