Improving Android JAX-RS API definitions

revert-dabc3590
prabathabey 9 years ago
parent 03a21752e2
commit fd1d62454a

@ -46,7 +46,7 @@
<version>2.2</version> <version>2.2</version>
<configuration> <configuration>
<packagingExcludes>WEB-INF/lib/*cxf*.jar</packagingExcludes> <packagingExcludes>WEB-INF/lib/*cxf*.jar</packagingExcludes>
<warName>${project.artifactId}</warName> <warName>api#device-mgt#android#v2.1</warName>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>

@ -30,6 +30,7 @@ import java.util.List;
@ApiModel(value = "DeviceLockBeanWrapper", @ApiModel(value = "DeviceLockBeanWrapper",
description = "DeviceLock related Information.") description = "DeviceLock related Information.")
public class DeviceLockBeanWrapper { public class DeviceLockBeanWrapper {
@ApiModelProperty(name = "deviceIDs", value = "Device id list of the operation to be executed.", required = true) @ApiModelProperty(name = "deviceIDs", value = "Device id list of the operation to be executed.", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
@ApiModelProperty(name = "operation", value = "Information of the Device lock operation.", required = true) @ApiModelProperty(name = "operation", value = "Information of the Device lock operation.", required = true)
@ -50,4 +51,5 @@ public class DeviceLockBeanWrapper {
public void setOperation(DeviceLock operation) { public void setOperation(DeviceLock operation) {
this.operation = operation; this.operation = operation;
} }
} }

@ -46,4 +46,5 @@ public class DisenrollmentBeanWrapper {
public void setDeviceIDs(List<String> deviceIDs) { public void setDeviceIDs(List<String> deviceIDs) {
this.deviceIDs = deviceIDs; this.deviceIDs = deviceIDs;
} }
} }

@ -27,6 +27,7 @@ import io.swagger.annotations.ApiModelProperty;
@ApiModel(value = "EventBeanWrapper", @ApiModel(value = "EventBeanWrapper",
description = "Android agent's event related Information.") description = "Android agent's event related Information.")
public class EventBeanWrapper { public class EventBeanWrapper {
@ApiModelProperty(name = "deviceIdentifier", value = "DeviceIdentifier to be need to retrieve/publish Event.", required = true) @ApiModelProperty(name = "deviceIdentifier", value = "DeviceIdentifier to be need to retrieve/publish Event.", required = true)
private String deviceIdentifier; private String deviceIdentifier;
@ApiModelProperty(name = "payload", value = "Event payload.", required = true) @ApiModelProperty(name = "payload", value = "Event payload.", required = true)

@ -51,4 +51,5 @@ public class NotificationBeanWrapper {
public void setOperation(Notification operation) { public void setOperation(Notification operation) {
this.operation = operation; this.operation = operation;
} }
} }

@ -33,4 +33,9 @@ public class BadRequestException extends WebApplicationException {
super(Response.status(Response.Status.BAD_REQUEST).entity(message). super(Response.status(Response.Status.BAD_REQUEST).entity(message).
type(mediaType).build()); type(mediaType).build());
} }
public BadRequestException(Message message) {
super(Response.status(Response.Status.BAD_REQUEST).entity(message).build());
}
} }

@ -0,0 +1,451 @@
/*
* 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.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
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("/devices")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface DeviceManagementAdminService {
@POST
@Path("/lock-devices")
@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 = 200, message = "Lock operation has successfully been scheduled"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
Response configureDeviceLock(
@ApiParam(name = "cameraBeanWrapper",
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 = String.class)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
Response configureDeviceUnlock(
@ApiParam(name = "deviceIDs", value = "DeviceIds to be enable device unlock operation")
List<String> deviceIDs);
@POST
@Path("/get-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 = "deviceIDs", value = "DeviceIDs to be requested to get device location")
List<String> 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 = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
Response removePassword(
@ApiParam(name = "deviceIDs",
value = "DeviceIds to be requested to remove password") List<String> 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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in creating a new camera instance")
})
Response configureCamera(
@ApiParam(name = "cameraBeanWrapper", value = "Camera enable/disable configurations with device IDs")
CameraBeanWrapper cameraBeanWrapper);
@POST
@Path("/get-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 = "deviceIds", value = "Device IDs to be requested to get device information")
List<String> 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 = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance"
)})
Response wipeDevice(@ApiParam(name = "deviceIDs", value = "Device IDs to be requested to done enterprise-wipe")
List<String> deviceIDs);
@POST
@Path("/wipe-devices")
@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 = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")})
Response wipeData(
@ApiParam(name = "wipeDataBeanWrapper", value = "Configurations and DeviceIds to be need to done wipe-data")
WipeDataBeanWrapper wipeDataBeanWrapper);
@POST
@Path("/get-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"
)
@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 = "deviceIDs", value = "Device Ids to be need to get applications which already installed")
List<String> deviceIDs);
@POST
@Path("/ring-devices")
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
httpMethod = "POST",
value = "Ringing Android Devices",
notes = "Ring Android devices"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
Response ringDevice(
@ApiParam(name = "deviceIDs", value = "Device Ids needs to be ring") List<String> deviceIDs);
@POST
@Path("/reboot-devices")
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
httpMethod = "POST",
value = "Rebooting Android Devices",
notes = "Reboot Android devices"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
Response rebootDevice(
@ApiParam(name = "deviceIDs", value = "Device Ids needs to be rebooted") List<String> deviceIDs);
@POST
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
httpMethod = "POST",
value = "Muting Android Devices",
notes = "Mute Android devices"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
@Path("/mute-devices")
Response muteDevice(
@ApiParam(name = "deviceIDs", value = "DeviceIDs need to be muted") List<String> 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 = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "created"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 202, message = "Accepted"),
@ApiResponse(code = 500, message = "Issue in retrieving device management service instance")
})
Response setWebClip(
@ApiParam(name = "webClipBeanWrapper",
value = "Configurations to need set web clip on device and device Ids")
WebClipBeanWrapper webClipBeanWrapper);
}

@ -0,0 +1,131 @@
/*
* 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.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
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;
@Path("/devices")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface DeviceManagementService {
@PUT
@Path("/{id}/applications")
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
httpMethod = "PUT",
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<Application> applications);
@GET
@Path("/{id}/pending-operations")
@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 = "id", value = "DeviceIdentifier") @PathParam("id") String id,
@ApiParam(name = "resultOperations", value = "Device Operation Status")
List<? extends Operation> resultOperations);
@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 = 200, message = "Device enrollment succeeded"),
@ApiResponse(code = 500, message = "Device enrollment failed"),
})
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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Device has already enrolled"),
@ApiResponse(code = 404, message = "Device not found")
})
Response isEnrolled(@ApiParam(name = "id", value = "DeviceIdentifier") @PathParam("id") String id);
@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"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Device enrollment has updated successfully"),
@ApiResponse(code = 404, message = "Device not found for enrollment")
})
Response modifyEnrollment(@ApiParam(name = "id", value = "DeviceIdentifier") @PathParam("id") String id,
@ApiParam(name = "device", value = "Device information to be modify") Device device);
@DELETE
@Path("/{id}")
@ApiOperation(
httpMethod = "DELETE",
value = "Un-registering an Android Device",
notes = "Use this REST API to unregister a specific Android device"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Device has removed successfully"),
@ApiResponse(code = 404, message = "Device not found")
})
Response disEnrollDevice(@ApiParam(name = "id", value = "DeviceIdentifier") @PathParam("id") String id);
}

@ -14,25 +14,25 @@
* KIND, either express or implied. See the License for the * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*
*/ */
package org.wso2.carbon.mdm.services.android.services;
package org.wso2.carbon.mdm.services.android.services.configuration; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.*; import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration; import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration;
import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException;
import javax.ws.rs.*; import javax.ws.rs.*;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
/** @Path("/configuration")
* Android Platform Configuration REST-API implementation. @Produces(MediaType.APPLICATION_JSON)
* All end points supports JSON, XMl with content negotiation. @Consumes(MediaType.APPLICATION_JSON)
*/ public interface DeviceTypeConfigurationService {
@Api(value = "ConfigurationMgtService")
@Produces({"application/json", "application/xml"})
@Consumes({"application/json", "application/xml"})
public interface ConfigurationMgtService {
@POST @POST
@ApiOperation( @ApiOperation(
@ -42,10 +42,10 @@ public interface ConfigurationMgtService {
notes = "Configure the Android platform settings using this REST API" notes = "Configure the Android platform settings using this REST API"
) )
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 201, message = "Android platform configuration saved successfully"), @ApiResponse(code = 200, message = "Android platform configuration saved successfully"),
@ApiResponse(code = 500, message = "Internal Server Error") @ApiResponse(code = 500, message = "Internal Server Error")
}) })
Response configureSettings(@ApiParam(name = "configuration", value = "AndroidPlatformConfiguration") Response addConfiguration(@ApiParam(name = "configuration", value = "AndroidPlatformConfiguration")
TenantConfiguration configuration) throws AndroidAgentException; TenantConfiguration configuration) throws AndroidAgentException;
@GET @GET
@ -70,10 +70,11 @@ public interface ConfigurationMgtService {
notes = "Update the Android platform configurations using this REST API" notes = "Update the Android platform configurations using this REST API"
) )
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 201, message = "Created"), @ApiResponse(code = 200, message = "Created"),
@ApiResponse(code = 500, message = "Error occurred while modifying configuration settings of " + @ApiResponse(code = 500, message = "Error occurred while modifying configuration settings of " +
"Android platform") "Android platform")
}) })
Response updateConfiguration(@ApiParam(name = "configuration", value = "AndroidPlatformConfiguration") Response updateConfiguration(@ApiParam(name = "configuration", value = "AndroidPlatformConfiguration")
TenantConfiguration configuration) throws AndroidAgentException; TenantConfiguration configuration) throws AndroidAgentException;
} }

@ -0,0 +1,115 @@
/*
* 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.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
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;
@Path("/events")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface EventReceiverService {
@POST
@Path("/publish-event")
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
httpMethod = "POST",
value = "Event Publishing via REST API.",
notes = "Publish events received by the WSO2 EMM Android client to WSO2 DAS using this API."
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Event is published successfully."),
@ApiResponse(code = 500, message = "Error occurred while publishing the events from Android agent.")
})
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 of a Device.",
notes = "Get the event details received by an Android device using this API.",
response = DeviceState.class,
responseContainer = "List"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "List of Device statuses."),
@ApiResponse(code = 500,
message = "Error occurred while getting published events for specific given device.")
})
Response retrieveAlert(
@ApiParam(name = "deviceId", value = "DeviceId which need to retrieve published events.")
@QueryParam("id") String deviceId);
@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.",
response = DeviceState.class,
responseContainer = "List"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "event details of a device for a given time duration"),
@ApiResponse(code = 500, message = "Error occurred while getting published events for" +
" specific device on given Date.")
})
Response retrieveAlertFromDate(
@ApiParam(name = "id",
value = "Device Identifier to be need to retrieve events.")
@QueryParam("id") String deviceId,
@ApiParam(name = "from", value = "From Date.")
@QueryParam("from") long from,
@ApiParam(name = "to", value = "To Date.")
@QueryParam("to") long to);
@GET
@ApiOperation(
produces = MediaType.APPLICATION_JSON,
httpMethod = "GET",
value = "Retrieves event details by type",
notes = "Get the event details of a device for a given time duration using this API.",
response = DeviceState.class,
responseContainer = "List"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "event details of a device for a given time duration"),
@ApiResponse(code = 500, message = "Error occurred while getting published events for" +
" specific device on given Date.")
})
Response retrieveAlertByType(
@ApiParam(name = "id", value = "Device Identifier to be need to retrieve events.")
@QueryParam("id") String deviceId,
@ApiParam(name = "type", value = "Type of the Alert to be need to retrieve events.")
@QueryParam("type") String type);
}

@ -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<Application> 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;
}

@ -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<Device> 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<Application> 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();
}
}

@ -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;
}

@ -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();
}
}
}

@ -1,124 +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.event;
import io.swagger.annotations.*;
import org.wso2.carbon.mdm.services.android.bean.DeviceState;
import org.wso2.carbon.mdm.services.android.bean.wrapper.EventBeanWrapper;
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;
/**
* APIs related to events published from Android agent are implemented here.
*/
@Api(value = "EventService", description = "Android Device Management REST-API implementation.")
public interface EventService {
String ACCEPT = "Accept";
@POST
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
httpMethod = "POST",
value = "Event Publishing via REST API.",
notes = "Publish events received by the WSO2 EMM Android client to WSO2 DAS using this API."
)
@ApiResponses(value = {
@ApiResponse(code = 201, message = "Event is published successfully."),
@ApiResponse(code = 500, message = "Error occurred while publishing the events from Android agent.")
})
Response publishEvents(@ApiParam(name = "acceptHeader", value = "Accept Header.")
@HeaderParam(ACCEPT) String acceptHeader,
@ApiParam(name = "eventBeanWrapper",
value = "Information of the agent event to be published on DAS.")
EventBeanWrapper eventBeanWrapper) throws AndroidAgentException;
@GET
@Path("{deviceId}")
@Produces("application/json")
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON,
httpMethod = "GET",
value = "Getting Event Details of a Device.",
notes = "Get the event details received by an Android device using this API.",
response = DeviceState.class,
responseContainer = "List"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "List of Device statuses."),
@ApiResponse(code = 500,
message = "Error occurred while getting published events for specific given device.")
})
Response retrieveAlert(@ApiParam(name = "acceptHeader", value = "Accept Header.")
@HeaderParam(ACCEPT) String acceptHeader,
@ApiParam(name = "deviceId", value = "DeviceId which need to retrieve published events.")
@PathParam("deviceId") String deviceId) throws AndroidAgentException;
@GET
@Path("{deviceId}/date")
@Produces("application/json")
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
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.",
response = DeviceState.class,
responseContainer = "List"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "event details of a device for a given time duration"),
@ApiResponse(code = 500, message = "Error occurred while getting published events for" +
" specific device on given Date.")
})
Response retrieveAlertFromDate(@ApiParam(name = "acceptHeader", value = "Accept Header.")
@HeaderParam(ACCEPT) String acceptHeader,
@ApiParam(name = "deviceId",
value = "Device Identifier to be need to retrieve events.")
@PathParam("deviceId") String deviceId,
@ApiParam(name = "from", value = "From Date.")
@QueryParam("from") long from,
@ApiParam(name = "to", value = "To Date.")
@QueryParam("to") long to) throws AndroidAgentException;
@GET
@Path("{deviceId}/type/{type}")
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
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.",
response = DeviceState.class,
responseContainer = "List"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "event details of a device for a given time duration"),
@ApiResponse(code = 500, message = "Error occurred while getting published events for" +
" specific device on given Date.")
})
Response retrieveAlertType(@ApiParam(name = "acceptHeader", value = "Accept Header.")
@HeaderParam(ACCEPT) String acceptHeader,
@ApiParam(name = "deviceId", value = "Device Identifier to be need to retrieve events.")
@PathParam("deviceId") String deviceId,
@ApiParam(name = "type", value = "Type of the Alert to be need to retrieve events.")
@PathParam("type") String type) throws AndroidAgentException;
}

@ -0,0 +1,254 @@
/*
* 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.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<Application> 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);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}
@GET
@Path("/{id}/pending-operations")
@Override
public Response getPendingOperations(@PathParam("id") String id, List<? extends Operation> 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.INTERNAL_SERVER_ERROR).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.INTERNAL_SERVER_ERROR).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);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (PolicyComplianceException e) {
String msg = "Issue in updating Monitoring operation";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (DeviceManagementException e) {
String msg = "Issue in retrieving device management service instance";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (ApplicationManagementException e) {
String msg = "Issue in retrieving application management service instance";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (NotificationManagementException e) {
String msg = "Issue in retrieving Notification management service instance";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
List<? extends Operation> pendingOperations;
try {
pendingOperations = AndroidAPIUtils.getPendingOperations(deviceIdentifier);
} catch (OperationManagementException e) {
String msg = "Issue in retrieving operation management service instance";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
return Response.status(Response.Status.CREATED).entity(pendingOperations).build();
}
private void updateOperations(String deviceId, List<? extends Operation> 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.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() + "'");
}
}
}
@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);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(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);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}
@GET
@Path("/{id}/status")
@Override
public Response isEnrolled(@PathParam("id") String id) {
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);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(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);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(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);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}
}

@ -14,9 +14,9 @@
* KIND, either express or implied. See the License for the * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*
*/ */
package org.wso2.carbon.mdm.services.android.services.impl;
package org.wso2.carbon.mdm.services.android.services.configuration.impl;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -26,28 +26,27 @@ import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationEntry;
import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration; import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration;
import org.wso2.carbon.device.mgt.common.license.mgt.License; 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.exception.AndroidAgentException;
import org.wso2.carbon.mdm.services.android.services.configuration.ConfigurationMgtService; 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.AndroidAPIUtils;
import org.wso2.carbon.mdm.services.android.util.AndroidConstants; import org.wso2.carbon.mdm.services.android.util.AndroidConstants;
import org.wso2.carbon.mdm.services.android.util.Message; import org.wso2.carbon.mdm.services.android.util.Message;
import javax.ws.rs.*; import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** @Path("/configuration")
* Android Platform Configuration REST-API implementation. @Produces(MediaType.APPLICATION_JSON)
* All end points supports JSON, XMl with content negotiation. @Consumes(MediaType.APPLICATION_JSON)
*/ public class DeviceTypeConfigurationServiceImpl implements DeviceTypeConfigurationService {
@Produces({"application/json", "application/xml"})
@Consumes({"application/json", "application/xml"})
public class ConfigurationMgtServiceImpl implements ConfigurationMgtService {
private static Log log = LogFactory.getLog(ConfigurationMgtServiceImpl.class);
@POST private static final Log log = LogFactory.getLog(DeviceTypeConfigurationServiceImpl.class);
public Response configureSettings(TenantConfiguration configuration)
throws AndroidAgentException {
@POST
@Override
public Response addConfiguration(TenantConfiguration configuration) throws AndroidAgentException {
Message responseMsg = new Message(); Message responseMsg = new Message();
String msg; String msg;
ConfigurationEntry licenseEntry = null; ConfigurationEntry licenseEntry = null;
@ -85,6 +84,7 @@ public class ConfigurationMgtServiceImpl implements ConfigurationMgtService {
} }
@GET @GET
@Override
public Response getConfiguration() throws AndroidAgentException { public Response getConfiguration() throws AndroidAgentException {
String msg; String msg;
TenantConfiguration tenantConfiguration = null; TenantConfiguration tenantConfiguration = null;
@ -120,6 +120,7 @@ public class ConfigurationMgtServiceImpl implements ConfigurationMgtService {
} }
@PUT @PUT
@Override
public Response updateConfiguration(TenantConfiguration configuration) throws AndroidAgentException { public Response updateConfiguration(TenantConfiguration configuration) throws AndroidAgentException {
String msg; String msg;
Message responseMsg = new Message(); Message responseMsg = new Message();
@ -145,7 +146,7 @@ public class ConfigurationMgtServiceImpl implements ConfigurationMgtService {
} }
configuration.setConfiguration(configs); configuration.setConfiguration(configs);
AndroidAPIUtils.getDeviceManagementService().saveConfiguration(configuration); AndroidAPIUtils.getDeviceManagementService().saveConfiguration(configuration);
AndroidAPIUtils.getGCMService().resetTenantConfigCache(); //AndroidAPIUtils.getGCMService().resetTenantConfigCache();
Response.status(Response.Status.ACCEPTED); Response.status(Response.Status.ACCEPTED);
responseMsg.setResponseMessage("Android platform configuration has updated successfully."); responseMsg.setResponseMessage("Android platform configuration has updated successfully.");
responseMsg.setResponseCode(Response.Status.ACCEPTED.toString()); responseMsg.setResponseCode(Response.Status.ACCEPTED.toString());

@ -14,9 +14,9 @@
* KIND, either express or implied. See the License for the * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*
*/ */
package org.wso2.carbon.mdm.services.android.services.impl;
package org.wso2.carbon.mdm.services.android.services.event.impl;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -24,8 +24,7 @@ import org.wso2.carbon.analytics.datasource.commons.exception.AnalyticsException
import org.wso2.carbon.device.mgt.analytics.data.publisher.exception.DataPublisherConfigurationException; 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.DeviceState;
import org.wso2.carbon.mdm.services.android.bean.wrapper.EventBeanWrapper; import org.wso2.carbon.mdm.services.android.bean.wrapper.EventBeanWrapper;
import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException; import org.wso2.carbon.mdm.services.android.services.EventReceiverService;
import org.wso2.carbon.mdm.services.android.services.event.EventService;
import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils; import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils;
import org.wso2.carbon.mdm.services.android.util.Message; import org.wso2.carbon.mdm.services.android.util.Message;
@ -34,21 +33,22 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.List; import java.util.List;
public class EventServiceImpl implements EventService { @Path("/events")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class EventReceiverServiceImpl implements EventReceiverService {
private static final String ACCEPT = "Accept";
private static Log log = LogFactory.getLog(EventService.class);
private static final String EVENT_STREAM_DEFINITION = "android_agent"; private static final String EVENT_STREAM_DEFINITION = "android_agent";
private static final Log log = LogFactory.getLog(EventReceiverServiceImpl.class);
@POST @POST
public Response publishEvents(@HeaderParam(ACCEPT) String acceptHeader, @Path("/publish-event")
EventBeanWrapper eventBeanWrapper) throws AndroidAgentException { @Override
public Response publishEvents(EventBeanWrapper eventBeanWrapper) {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Invoking Android device even logging."); log.debug("Invoking Android device even logging.");
} }
Message message = new Message(); Message message = new Message();
MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader);
Object payload[] = {eventBeanWrapper.getDeviceIdentifier(), eventBeanWrapper.getPayload(), Object payload[] = {eventBeanWrapper.getDeviceIdentifier(), eventBeanWrapper.getPayload(),
eventBeanWrapper.getType()}; eventBeanWrapper.getType()};
@ -56,37 +56,33 @@ public class EventServiceImpl implements EventService {
if (AndroidAPIUtils.getEventPublisherService().publishEvent( if (AndroidAPIUtils.getEventPublisherService().publishEvent(
EVENT_STREAM_DEFINITION, "1.0.0", new Object[0], new Object[0], payload)) { EVENT_STREAM_DEFINITION, "1.0.0", new Object[0], new Object[0], payload)) {
message.setResponseCode("Event is published successfully."); message.setResponseCode("Event is published successfully.");
return Response.status(Response.Status.CREATED).entity(message).type(responseMediaType).build(); return Response.status(Response.Status.CREATED).entity(message).build();
} else { } else {
message.setResponseCode("Error occurred while publishing the event."); message.setResponseCode("Error occurred while publishing the event.");
return Response.status(Response.Status.INTERNAL_SERVER_ERROR). return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
entity(message).type(responseMediaType).build(); entity(message).build();
} }
} catch (DataPublisherConfigurationException e) { } catch (DataPublisherConfigurationException e) {
String msg = "Error occurred while publishing the events from Android agent."; String msg = "Error occurred while publishing the events from Android agent.";
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).type(responseMediaType).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} }
} }
@Path("{deviceId}")
@Produces("application/json")
@GET @GET
public Response retrieveAlert(@HeaderParam(ACCEPT) String acceptHeader, @Override
@PathParam("deviceId") String deviceId) throws AndroidAgentException { public Response retrieveAlert(@QueryParam("id") String deviceId) {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Retrieving events for given device Identifier."); log.debug("Retrieving events for given device Identifier.");
} }
Message message = new Message(); Message message = new Message();
MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader);
String query = "deviceIdentifier:" + deviceId; String query = "deviceIdentifier:" + deviceId;
List<DeviceState> deviceStates; List<DeviceState> deviceStates;
try { try {
deviceStates = AndroidAPIUtils.getAllEventsForDevice(EVENT_STREAM_DEFINITION, query); deviceStates = AndroidAPIUtils.getAllEventsForDevice(EVENT_STREAM_DEFINITION, query);
if (deviceStates == null) { if (deviceStates == null) {
message.setResponseCode("No any alerts are published for Device: " + deviceId + "."); message.setResponseCode("No any alerts are published for Device: " + deviceId + ".");
return Response.status(Response.Status.OK).entity(message).type(responseMediaType).build(); return Response.status(Response.Status.OK).entity(message).build();
} else { } else {
return Response.status(Response.Status.OK).entity(deviceStates).build(); return Response.status(Response.Status.OK).entity(deviceStates).build();
@ -95,23 +91,20 @@ public class EventServiceImpl implements EventService {
String msg = "Error occurred while getting published events for specific " + String msg = "Error occurred while getting published events for specific " +
"Device: " + deviceId + "."; "Device: " + deviceId + ".";
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).type(responseMediaType).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} }
} }
@Path("{deviceId}/date")
@Produces("application/json")
@GET @GET
public Response retrieveAlertFromDate(@HeaderParam(ACCEPT) String acceptHeader, @Override
@PathParam("deviceId") String deviceId, @QueryParam("from") long from, public Response retrieveAlertFromDate(@QueryParam("id") String deviceId, @QueryParam("from") long from,
@QueryParam("to") long to) throws AndroidAgentException { @QueryParam("to") long to) {
String fromDate = String.valueOf(from); String fromDate = String.valueOf(from);
String toDate = String.valueOf(to); String toDate = String.valueOf(to);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Retrieving events for given device Identifier and time period."); log.debug("Retrieving events for given device Identifier and time period.");
} }
Message message = new Message(); Message message = new Message();
MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader);
String query = "deviceIdentifier:" + deviceId + " AND _timestamp: [" + fromDate + " TO " + toDate + "]"; String query = "deviceIdentifier:" + deviceId + " AND _timestamp: [" + fromDate + " TO " + toDate + "]";
List<DeviceState> deviceStates; List<DeviceState> deviceStates;
@ -123,27 +116,23 @@ public class EventServiceImpl implements EventService {
return Response.status(Response.Status.OK).entity(message).build(); return Response.status(Response.Status.OK).entity(message).build();
} else { } else {
return Response.status(Response.Status.OK).entity(deviceStates).type(responseMediaType).build(); return Response.status(Response.Status.OK).entity(deviceStates).build();
} }
} catch (AnalyticsException e) { } catch (AnalyticsException e) {
String msg = "Error occurred while getting published events for specific " + String msg = "Error occurred while getting published events for specific " +
"Device: " + deviceId + " on given Date."; "Device: " + deviceId + " on given Date.";
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).type(responseMediaType).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} }
} }
@Path("{deviceId}/type/{type}")
@GET @GET
public Response retrieveAlertType(@HeaderParam(ACCEPT) String acceptHeader, @Override
@PathParam("deviceId") String deviceId, @PathParam("type") String type) public Response retrieveAlertByType(@QueryParam("id") String deviceId, @QueryParam("type") String type) {
throws AndroidAgentException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Retrieving events for given device identifier and type."); log.debug("Retrieving events for given device identifier and type.");
} }
Message message = new Message(); Message message = new Message();
MediaType responseMediaType = AndroidAPIUtils.getResponseMediaType(acceptHeader);
String query = "deviceIdentifier:" + deviceId + " AND type:" + type; String query = "deviceIdentifier:" + deviceId + " AND type:" + type;
List<DeviceState> deviceStates; List<DeviceState> deviceStates;
try { try {
@ -154,14 +143,14 @@ public class EventServiceImpl implements EventService {
return Response.status(Response.Status.OK).entity(message).build(); return Response.status(Response.Status.OK).entity(message).build();
} else { } else {
return Response.status(Response.Status.OK).entity(deviceStates).type(responseMediaType).build(); return Response.status(Response.Status.OK).entity(deviceStates).build();
} }
} catch (AnalyticsException e) { } catch (AnalyticsException e) {
String msg = "Error occurred while getting published events for specific " + String msg = "Error occurred while getting published events for specific " +
"Device: " + deviceId + "and given device Type."; "Device: " + deviceId + "and given device Type.";
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).type(responseMediaType).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} }
} }
} }

@ -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<? extends Operation> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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);
}

@ -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;
}

@ -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<ProfileFeature> 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();
}
}

@ -46,7 +46,6 @@ import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceDetailsMgtExcept
import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInformationManager; import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInformationManager;
import org.wso2.carbon.device.mgt.core.search.mgt.impl.Utils; import org.wso2.carbon.device.mgt.core.search.mgt.impl.Utils;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.device.mgt.mobile.impl.android.gcm.GCMService;
import org.wso2.carbon.mdm.services.android.bean.DeviceState; import org.wso2.carbon.mdm.services.android.bean.DeviceState;
import org.wso2.carbon.policy.mgt.common.monitor.PolicyComplianceException; import org.wso2.carbon.policy.mgt.common.monitor.PolicyComplianceException;
import org.wso2.carbon.policy.mgt.core.PolicyManagerService; import org.wso2.carbon.policy.mgt.core.PolicyManagerService;
@ -94,17 +93,6 @@ public class AndroidAPIUtils {
return deviceManagementProviderService; return deviceManagementProviderService;
} }
public static GCMService getGCMService() {
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
GCMService gcmService = (GCMService) ctx.getOSGiService(GCMService.class, null);
if (gcmService == null) {
String msg = "GCM service has not initialized.";
log.error(msg);
throw new IllegalStateException(msg);
}
return gcmService;
}
public static MediaType getResponseMediaType(String acceptHeader) { public static MediaType getResponseMediaType(String acceptHeader) {
MediaType responseMediaType; MediaType responseMediaType;
if (MediaType.WILDCARD.equals(acceptHeader)) { if (MediaType.WILDCARD.equals(acceptHeader)) {
@ -116,35 +104,21 @@ public class AndroidAPIUtils {
} }
public static Response getOperationResponse(List<String> deviceIDs, Operation operation, public static Response getOperationResponse(List<String> deviceIDs, Operation operation,
Message message, MediaType responseMediaType) Message message)
throws DeviceManagementException, OperationManagementException { throws DeviceManagementException, OperationManagementException {
AndroidDeviceUtils deviceUtils = new AndroidDeviceUtils(); AndroidDeviceUtils deviceUtils = new AndroidDeviceUtils();
DeviceIDHolder deviceIDHolder = deviceUtils.validateDeviceIdentifiers(deviceIDs, DeviceIDHolder deviceIDHolder = deviceUtils.validateDeviceIdentifiers(deviceIDs, message);
message, responseMediaType);
List<DeviceIdentifier> validDeviceIds = deviceIDHolder.getValidDeviceIDList(); List<DeviceIdentifier> validDeviceIds = deviceIDHolder.getValidDeviceIDList();
Activity activity = getDeviceManagementService().addOperation( Activity activity = getDeviceManagementService().addOperation(
DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, operation, validDeviceIds); DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, operation, validDeviceIds);
if (activity != null) {
GCMService gcmService = getGCMService();
if (gcmService.isGCMEnabled()) {
List<DeviceIdentifier> deviceIDList = deviceIDHolder.getValidDeviceIDList();
List<Device> devices = new ArrayList<Device>(deviceIDList.size());
for (DeviceIdentifier deviceIdentifier : deviceIDList) {
devices.add(getDeviceManagementService().getDevice(deviceIdentifier));
}
getGCMService().sendNotification(operation.getCode(), devices);
}
}
if (!deviceIDHolder.getErrorDeviceIdList().isEmpty()) { if (!deviceIDHolder.getErrorDeviceIdList().isEmpty()) {
return javax.ws.rs.core.Response.status(AndroidConstants.StatusCodes. return javax.ws.rs.core.Response.status(AndroidConstants.StatusCodes.
MULTI_STATUS_HTTP_CODE).type( MULTI_STATUS_HTTP_CODE).entity(deviceUtils.
responseMediaType).entity(deviceUtils.
convertErrorMapIntoErrorMessage(deviceIDHolder.getErrorDeviceIdList())).build(); convertErrorMapIntoErrorMessage(deviceIDHolder.getErrorDeviceIdList())).build();
} }
return javax.ws.rs.core.Response.status(javax.ws.rs.core.Response.Status.CREATED).entity(activity). return Response.status(Response.Status.CREATED).entity(activity).build();
type(responseMediaType).build();
} }
@ -336,7 +310,6 @@ public class AndroidAPIUtils {
private static void updateDeviceLocation(DeviceLocation deviceLocation) throws DeviceDetailsMgtException { private static void updateDeviceLocation(DeviceLocation deviceLocation) throws DeviceDetailsMgtException {
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
DeviceInformationManager informationManager = DeviceInformationManager informationManager =
(DeviceInformationManager) ctx.getOSGiService(DeviceInformationManager.class, null); (DeviceInformationManager) ctx.getOSGiService(DeviceInformationManager.class, null);

@ -23,24 +23,28 @@ package org.wso2.carbon.mdm.services.android.util;
*/ */
public final class AndroidConstants { public final class AndroidConstants {
public final class DeviceProperties{ public static final String DEVICE_TYPE_ANDROID = "android";
public final class DeviceProperties {
private DeviceProperties() { private DeviceProperties() {
throw new AssertionError(); throw new AssertionError();
} }
public static final String PROPERTY_USER_KEY = "username"; public static final String PROPERTY_USER_KEY = "username";
public static final String PROPERTY_DEVICE_KEY = "device"; public static final String PROPERTY_DEVICE_KEY = "device";
} }
public final class DeviceFeatures{ public final class DeviceFeatures {
private DeviceFeatures() { private DeviceFeatures() {
throw new AssertionError(); throw new AssertionError();
} }
} }
public final class DeviceConstants{ public final class DeviceConstants {
private DeviceConstants() { private DeviceConstants() {
throw new AssertionError(); throw new AssertionError();
} }
public static final String DEVICE_MAC_KEY = "mac"; public static final String DEVICE_MAC_KEY = "mac";
public static final String DEVICE_DESCRIPTION_KEY = "description"; public static final String DEVICE_DESCRIPTION_KEY = "description";
public static final String DEVICE_OWNERSHIP_KEY = "ownership"; public static final String DEVICE_OWNERSHIP_KEY = "ownership";
@ -52,18 +56,20 @@ public final class AndroidConstants {
"Issue in retrieving device management service instance for device found at %s"; "Issue in retrieving device management service instance for device found at %s";
} }
public final class Messages{ public final class Messages {
private Messages(){ private Messages() {
throw new AssertionError(); throw new AssertionError();
} }
public static final String DEVICE_MANAGER_SERVICE_NOT_AVAILABLE = public static final String DEVICE_MANAGER_SERVICE_NOT_AVAILABLE =
"Device Manager service not available"; "Device Manager service not available";
} }
public final class OperationCodes{ public final class OperationCodes {
private OperationCodes(){ private OperationCodes() {
throw new AssertionError(); throw new AssertionError();
} }
public static final String DEVICE_LOCK = "DEVICE_LOCK"; public static final String DEVICE_LOCK = "DEVICE_LOCK";
public static final String DEVICE_UNLOCK = "DEVICE_UNLOCK"; public static final String DEVICE_UNLOCK = "DEVICE_UNLOCK";
public static final String DEVICE_LOCATION = "DEVICE_LOCATION"; public static final String DEVICE_LOCATION = "DEVICE_LOCATION";
@ -94,30 +100,34 @@ public final class AndroidConstants {
public static final String WORK_PROFILE = "WORK_PROFILE"; public static final String WORK_PROFILE = "WORK_PROFILE";
} }
public final class StatusCodes{ public final class StatusCodes {
private StatusCodes(){ private StatusCodes() {
throw new AssertionError(); throw new AssertionError();
} }
public static final int MULTI_STATUS_HTTP_CODE = 207; public static final int MULTI_STATUS_HTTP_CODE = 207;
} }
public final class TenantConfigProperties{ public final class TenantConfigProperties {
private TenantConfigProperties(){ private TenantConfigProperties() {
throw new AssertionError(); throw new AssertionError();
} }
public static final String LICENSE_KEY = "androidEula"; public static final String LICENSE_KEY = "androidEula";
public static final String LANGUAGE_US = "en_US"; public static final String LANGUAGE_US = "en_US";
public static final String CONTENT_TYPE_TEXT = "text"; public static final String CONTENT_TYPE_TEXT = "text";
} }
public final class ApplicationProperties { public final class ApplicationProperties {
private ApplicationProperties(){ private ApplicationProperties() {
throw new AssertionError(); throw new AssertionError();
} }
public static final String NAME = "name"; public static final String NAME = "name";
public static final String IDENTIFIER = "package"; public static final String IDENTIFIER = "package";
public static final String USS = "USS"; public static final String USS = "USS";
public static final String VERSION = "version"; public static final String VERSION = "version";
public static final String ICON = "icon"; public static final String ICON = "icon";
} }
} }

@ -34,11 +34,11 @@ public class AndroidDeviceUtils {
private static final String COMMA_SEPARATION_PATTERN = ", "; private static final String COMMA_SEPARATION_PATTERN = ", ";
public DeviceIDHolder validateDeviceIdentifiers(List<String> deviceIDs, public DeviceIDHolder validateDeviceIdentifiers(List<String> deviceIDs,
Message message, MediaType responseMediaType) { Message message) {
if (deviceIDs == null || deviceIDs.isEmpty()) { if (deviceIDs == null || deviceIDs.isEmpty()) {
message.setResponseMessage("Device identifier list is empty"); message.setResponseMessage("Device identifier list is empty");
throw new BadRequestException(message, responseMediaType); throw new BadRequestException(message);
} }
List<String> errorDeviceIdList = new ArrayList<String>(); List<String> errorDeviceIdList = new ArrayList<String>();

@ -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
}
}

@ -23,67 +23,40 @@
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 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"> http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<jaxrs:server id="operationService" address="/operation"> <jaxrs:server id="services" address="/">
<jaxrs:serviceBeans> <jaxrs:serviceBeans>
<ref bean="operationServiceBean"/> <ref bean="deviceManagementService"/>
</jaxrs:serviceBeans> <ref bean="deviceManagementAdminService"/>
<jaxrs:providers> <ref bean="eventReceiverService"/>
<ref bean="jsonProvider"/> <ref bean="deviceTypeConfigurationService"/>
<ref bean="errorHandler"/> <ref bean="swaggerResource"/>
</jaxrs:providers>
</jaxrs:server>
<jaxrs:server id="deviceManagementService" address="/device">
<jaxrs:serviceBeans>
<ref bean="deviceMgtServiceBean"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider"/>
<ref bean="errorHandler"/>
</jaxrs:providers>
</jaxrs:server>
<jaxrs:server id="enrollmentService" address="/enrollment">
<jaxrs:serviceBeans>
<ref bean="enrollmentServiceBean"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider"/>
<ref bean="errorHandler"/>
</jaxrs:providers>
</jaxrs:server>
<jaxrs:server id="policyService" address="/policy">
<jaxrs:serviceBeans>
<ref bean="policyServiceBean"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider"/>
<ref bean="errorHandler"/>
</jaxrs:providers>
</jaxrs:server>
<jaxrs:server id="configurationService" address="/configuration">
<jaxrs:serviceBeans>
<ref bean="configurationServiceBean"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider"/>
<ref bean="errorHandler"/>
</jaxrs:providers>
</jaxrs:server>
<jaxrs:server id="eventService" address="/events">
<jaxrs:serviceBeans>
<ref bean="eventServiceBean"/>
</jaxrs:serviceBeans> </jaxrs:serviceBeans>
<jaxrs:providers> <jaxrs:providers>
<ref bean="jsonProvider"/> <ref bean="jsonProvider"/>
<ref bean="errorHandler"/> <ref bean="errorHandler"/>
<ref bean="swaggerWriter"/>
</jaxrs:providers> </jaxrs:providers>
</jaxrs:server> </jaxrs:server>
<bean id="deviceMgtServiceBean" class="org.wso2.carbon.mdm.services.android.services.devicemgt.impl.DeviceManagementServiceImpl"/> <bean id="swaggerWriter" class="io.swagger.jaxrs.listing.SwaggerSerializers" />
<bean id="enrollmentServiceBean" class="org.wso2.carbon.mdm.services.android.services.enrollment.impl.EnrollmentServiceImpl"/> <bean id="swaggerResource" class="io.swagger.jaxrs.listing.ApiListingResource" />
<bean id="operationServiceBean" class="org.wso2.carbon.mdm.services.android.services.operationmgt.impl.OperationMgtServiceImpl"/>
<bean id="policyServiceBean" class="org.wso2.carbon.mdm.services.android.services.policymgt.impl.PolicyMgtServiceImpl"/> <bean id="swaggerConfig" class="io.swagger.jaxrs.config.BeanConfig">
<bean id="configurationServiceBean" class="org.wso2.carbon.mdm.services.android.services.configuration.impl.ConfigurationMgtServiceImpl"/> <property name="resourcePackage" value="org.wso2.carbon.mdm.services.android.services"/>
<bean id="eventServiceBean" class="org.wso2.carbon.mdm.services.android.services.event.impl.EventServiceImpl"/> <property name="version" value="2.1"/>
<property name="host" value="localhost:9443"/>
<property name="basePath" value="/device-mgt/android/v2.1"/>
<property name="title" value="Android Device Management API Definitions"/>
<property name="contact" value="dev@wso2.org"/>
<property name="license" value="Apache 2.0"/>
<property name="licenseUrl" value="http://www.apache.org/licenses/LICENSE-2.0.html"/>
<property name="scan" value="true"/>
</bean>
<bean id="deviceManagementService" class="org.wso2.carbon.mdm.services.android.services.impl.DeviceManagementServiceImpl"/>
<bean id="deviceManagementAdminService" class="org.wso2.carbon.mdm.services.android.services.impl.DeviceManagementAdminServiceImpl"/>
<bean id="eventReceiverService" class="org.wso2.carbon.mdm.services.android.services.impl.EventReceiverServiceImpl"/>
<bean id="deviceTypeConfigurationService" class="org.wso2.carbon.mdm.services.android.services.impl.DeviceTypeConfigurationServiceImpl"/>
<bean id="jsonProvider" class="org.wso2.carbon.mdm.services.android.common.GsonMessageBodyHandler"/> <bean id="jsonProvider" class="org.wso2.carbon.mdm.services.android.common.GsonMessageBodyHandler"/>
<bean id="errorHandler" class="org.wso2.carbon.mdm.services.android.common.ErrorHandler"/> <bean id="errorHandler" class="org.wso2.carbon.mdm.services.android.common.ErrorHandler"/>
</beans> </beans>

@ -28,6 +28,11 @@
<servlet-class> <servlet-class>
org.apache.cxf.transport.servlet.CXFServlet org.apache.cxf.transport.servlet.CXFServlet
</servlet-class> </servlet-class>
<!-- configure a security filter -->
<init-param>
<param-name>swagger.security.filter</param-name>
<param-value>ApiAuthorizationFilterImpl</param-value>
</init-param>
<load-on-startup>1</load-on-startup> <load-on-startup>1</load-on-startup>
</servlet> </servlet>
<servlet-mapping> <servlet-mapping>
@ -74,4 +79,13 @@
</user-data-constraint> </user-data-constraint>
</security-constraint--> </security-constraint-->
<filter>
<filter-name>ApiOriginFilter</filter-name>
<filter-class>org.wso2.carbon.mdm.services.android.util.ApiOriginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ApiOriginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app> </web-app>

Loading…
Cancel
Save