revert-dabc3590
ayyoob 9 years ago
commit e7ba11f709

@ -0,0 +1,7 @@
{
"deviceType": {
"label": "Virtual Firealarm",
"category": "virtual",
"downloadAgentUri": "virtual_firealarm/enrollment/devices/download"
}
}

@ -172,6 +172,12 @@
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId> <artifactId>gson</artifactId>

@ -1,161 +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;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.DeviceManagementConstants;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationEntry;
import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration;
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.util.AndroidAPIUtils;
import org.wso2.carbon.mdm.services.android.util.AndroidConstants;
import org.wso2.carbon.mdm.services.android.util.Message;
import javax.jws.WebService;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;
/**
* Android Platform Configuration REST-API implementation.
* All end points supports JSON, XMl with content negotiation.
*/
@WebService
@Produces({ "application/json", "application/xml" })
@Consumes({ "application/json", "application/xml" })
public class ConfigurationMgtService {
private static Log log = LogFactory.getLog(ConfigurationMgtService.class);
@POST
public Message configureSettings(TenantConfiguration configuration)
throws AndroidAgentException {
Message responseMsg = new Message();
String msg;
ConfigurationEntry licenseEntry = null;
try {
configuration.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
List<ConfigurationEntry> configs = configuration.getConfiguration();
for(ConfigurationEntry entry : configs){
if(AndroidConstants.TenantConfigProperties.LICENSE_KEY.equals(entry.getName())){
License license = new License();
license.setName(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
license.setLanguage(AndroidConstants.TenantConfigProperties.LANGUAGE_US);
license.setVersion("1.0.0");
license.setText(entry.getValue().toString());
AndroidAPIUtils.getDeviceManagementService().addLicense(DeviceManagementConstants.
MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, license);
licenseEntry = entry;
break;
}
}
if(licenseEntry != null) {
configs.remove(licenseEntry);
}
configuration.setConfiguration(configs);
AndroidAPIUtils.getDeviceManagementService().saveConfiguration(configuration);
Response.status(Response.Status.CREATED);
responseMsg.setResponseMessage("Android platform configuration saved successfully.");
responseMsg.setResponseCode(Response.Status.CREATED.toString());
} catch (DeviceManagementException e) {
msg = "Error occurred while configuring the android platform";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
@GET
public TenantConfiguration getConfiguration() throws AndroidAgentException {
String msg;
TenantConfiguration tenantConfiguration;
List<ConfigurationEntry> configs;
try {
tenantConfiguration = AndroidAPIUtils.getDeviceManagementService().
getConfiguration(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
if(tenantConfiguration != null) {
configs = tenantConfiguration.getConfiguration();
} else {
tenantConfiguration = new TenantConfiguration();
configs = new ArrayList<ConfigurationEntry>();
}
ConfigurationEntry entry = new ConfigurationEntry();
License license = AndroidAPIUtils.getDeviceManagementService().getLicense(
DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, AndroidConstants.
TenantConfigProperties.LANGUAGE_US);
if(license != null && configs != null) {
entry.setContentType(AndroidConstants.TenantConfigProperties.CONTENT_TYPE_TEXT);
entry.setName(AndroidConstants.TenantConfigProperties.LICENSE_KEY);
entry.setValue(license.getText());
configs.add(entry);
tenantConfiguration.setConfiguration(configs);
}
} catch (DeviceManagementException e) {
msg = "Error occurred while retrieving the Android tenant configuration";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return tenantConfiguration;
}
@PUT
public Message updateConfiguration(TenantConfiguration configuration) throws AndroidAgentException {
String msg;
Message responseMsg = new Message();
ConfigurationEntry licenseEntry = null;
try {
configuration.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
List<ConfigurationEntry> configs = configuration.getConfiguration();
for(ConfigurationEntry entry : configs){
if(AndroidConstants.TenantConfigProperties.LICENSE_KEY.equals(entry.getName())){
License license = new License();
license.setName(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
license.setLanguage(AndroidConstants.TenantConfigProperties.LANGUAGE_US);
license.setVersion("1.0.0");
license.setText(entry.getValue().toString());
AndroidAPIUtils.getDeviceManagementService().addLicense(DeviceManagementConstants.
MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, license);
licenseEntry = entry;
}
}
if(licenseEntry != null) {
configs.remove(licenseEntry);
}
configuration.setConfiguration(configs);
AndroidAPIUtils.getDeviceManagementService().saveConfiguration(configuration);
Response.status(Response.Status.ACCEPTED);
responseMsg.setResponseMessage("Android platform configuration has updated successfully.");
responseMsg.setResponseCode(Response.Status.ACCEPTED.toString());
} catch (DeviceManagementException e) {
msg = "Error occurred while modifying configuration settings of Android platform";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
}

@ -1,183 +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;
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.util.AndroidAPIUtils;
import org.wso2.carbon.mdm.services.android.util.Message;
import javax.jws.WebService;
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.
*/
@WebService
@Produces({ "application/json", "application/xml" })
@Consumes({ "application/json", "application/xml" })
public class DeviceManagementService {
private static Log log = LogFactory.getLog(DeviceManagementService.class);
/**
* Get all devices.Returns list of Android devices registered in MDM.
*
* @return Device List
* @throws org.wso2.carbon.mdm.services.android.exception.AndroidAgentException
*/
@GET
public List<org.wso2.carbon.device.mgt.common.Device> getAllDevices()
throws AndroidAgentException {
String msg;
List<org.wso2.carbon.device.mgt.common.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);
throw new AndroidAgentException(msg, e);
}
return devices;
}
/**
* 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}")
public org.wso2.carbon.device.mgt.common.Device getDevice(@PathParam("id") String id)
throws AndroidAgentException {
String msg;
org.wso2.carbon.device.mgt.common.Device device;
try {
DeviceIdentifier deviceIdentifier = AndroidAPIUtils.convertToDeviceIdentifierObject(id);
device = AndroidAPIUtils.getDeviceManagementService().getDevice(deviceIdentifier);
if (device == null) {
Response.status(Response.Status.NOT_FOUND);
}
} catch (DeviceManagementException deviceMgtEx) {
msg = "Error occurred while fetching the device information.";
log.error(msg, deviceMgtEx);
throw new AndroidAgentException(msg, deviceMgtEx);
}
return device;
}
/**
* Update Android device details of given device id.
*
* @param id Device Id
* @param device Device Details
* @return Message
* @throws AndroidAgentException
*/
@PUT
@Path("{id}")
public Message 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) {
Response.status(Response.Status.ACCEPTED);
responseMessage.setResponseMessage("Device information has modified successfully.");
} else {
Response.status(Response.Status.NOT_MODIFIED);
responseMessage.setResponseMessage("Device not found for the update.");
}
} catch (DeviceManagementException e) {
msg = "Error occurred while modifying the device information.";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMessage;
}
@POST
@Path("appList/{id}")
public Message 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);
Response.status(Response.Status.ACCEPTED);
responseMessage.setResponseMessage("Device information has modified successfully.");
} catch (ApplicationManagementException e) {
String msg = "Error occurred while modifying the application list.";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMessage;
}
@GET
@Path("license")
@Produces("text/html")
public String getLicense() throws AndroidAgentException {
License license;
try {
license =
AndroidAPIUtils.getDeviceManagementService().getLicense(
DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID,
DeviceManagementConstants.LanguageCodes.LANGUAGE_CODE_ENGLISH_US);
} catch (DeviceManagementException e) {
String msg = "Error occurred while retrieving the license configured for Android device enrolment";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return (license == null) ? null : license.getText();
}
}

@ -1,153 +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;
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.util.AndroidAPIUtils;
import org.wso2.carbon.mdm.services.android.util.Message;
import javax.jws.WebService;
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.
*/
@WebService
@Produces({ "application/json", "application/xml" })
@Consumes({ "application/json", "application/xml" })
public class EnrollmentService {
private static Log log = LogFactory.getLog(EnrollmentService.class);
@POST
public Message 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.");
responseMsg.setResponseCode(Response.Status.CREATED.toString());
} else {
Response.status(Response.Status.INTERNAL_SERVER_ERROR);
responseMsg.setResponseMessage("Device enrollment failed.");
responseMsg.setResponseCode(Response.Status.INTERNAL_SERVER_ERROR.toString());
}
} catch (DeviceManagementException e) {
msg = "Error occurred while enrolling the device";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
@GET
@Path("{deviceId}")
public Message 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());
Response.status(Response.Status.ACCEPTED);
} else {
responseMsg.setResponseMessage("Device not found");
responseMsg.setResponseCode(Response.Status.NOT_FOUND.toString());
Response.status(Response.Status.NOT_FOUND);
}
} catch (DeviceManagementException e) {
msg = "Error occurred while enrollment of the device.";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
@PUT
@Path("{deviceId}")
public Message 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());
Response.status(Response.Status.ACCEPTED);
} else {
responseMsg.setResponseMessage("Device not found for enrollment");
responseMsg.setResponseCode(Response.Status.NOT_MODIFIED.toString());
Response.status(Response.Status.NOT_MODIFIED);
}
} catch (DeviceManagementException e) {
msg = "Error occurred while modifying enrollment of the device";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
@DELETE
@Path("{deviceId}")
public Message 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());
Response.status(Response.Status.ACCEPTED);
} else {
responseMsg.setResponseMessage("Device not found");
responseMsg.setResponseCode(Response.Status.NOT_FOUND.toString());
Response.status(Response.Status.NOT_FOUND);
}
} catch (DeviceManagementException e) {
msg = "Error occurred while dis enrolling the device";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
}

@ -18,15 +18,25 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
/** /**
* This class represents the information of install application operation. * This class represents the information of install application operation.
*/ */
@ApiModel(value = "ApplicationInstallation",
description = "This class carries all information related to install application")
public class ApplicationInstallation extends AndroidOperation implements Serializable { public class ApplicationInstallation extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "appIdentifier", value = "Application Identifier", required = true)
private String appIdentifier; private String appIdentifier;
@ApiModelProperty(name = "type", value = "Application type(Enterprise/Web/public)", required = true)
private String type; private String type;
@ApiModelProperty(name = "url", value = "Application URL", required = true)
private String url; private String url;
public String getAppIdentifier() { public String getAppIdentifier() {

@ -18,16 +18,29 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
/** /**
* This class represents the information of uninstall application operation. * This class represents the information of uninstall application operation.
*/ */
@ApiModel(value = "ApplicationUninstallation",
description = "This class carries all information related to application uninstallation.")
public class ApplicationUninstallation extends AndroidOperation implements Serializable { public class ApplicationUninstallation extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "appIdentifier", value = "The package name of the application to be uninstalled.", required = true)
private String appIdentifier; private String appIdentifier;
@ApiModelProperty(name = "type", value = "The type of the application. The following types of applications " +
"are supported: enterprise, public and webapp.", required = true)
private String type; private String type;
@ApiModelProperty(name = "url", value = "The URL of the application.", required = true)
private String url; private String url;
@ApiModelProperty(name = "name", value = "The name of the application.", required = true)
private String name; private String name;
public String getAppIdentifier() { public String getAppIdentifier() {

@ -18,14 +18,21 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* This class represents the blacklist applications information. * This class represents the blacklist applications information.
*/ */
@ApiModel(value = "BlacklistApplications",
description = "This class represents the blacklist applications information.")
public class BlacklistApplications extends AndroidOperation implements Serializable { public class BlacklistApplications extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "appIdentifiers", value = "A list of application package names to be blacklisted.",
required = true)
private List<String> appIdentifiers; private List<String> appIdentifiers;
public List<String> getAppIdentifier() { public List<String> getAppIdentifier() {

@ -18,13 +18,20 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
/** /**
* This class represents the information of camera operation. * This class represents the information of camera operation.
*/ */
@ApiModel(value = "Camera",
description = "This class represents the information of camera operation.")
public class Camera extends AndroidOperation implements Serializable { public class Camera extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "enabled", value = "Disable the camera on the device by assigning false as the value or " +
"enable the camera on the device to function by defining true as the value.", required = true)
private boolean enabled; private boolean enabled;
public boolean isEnabled() { public boolean isEnabled() {

@ -18,13 +18,20 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
/** /**
* This class represents the information of encrypt operation. * This class represents the information of encrypt operation.
*/ */
@ApiModel(value = "DeviceEncryption",
description = "Details related device encryption.")
public class DeviceEncryption extends AndroidOperation implements Serializable { public class DeviceEncryption extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "encrypted", value = "Whether to enable encryption or not.", required = true)
private boolean encrypted; private boolean encrypted;
public boolean isEncrypted() { public boolean isEncrypted() {

@ -18,11 +18,16 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; import org.wso2.carbon.device.mgt.common.operation.mgt.Operation;
import java.io.Serializable; import java.io.Serializable;
@ApiModel(value = "Disenrollment",
description = "Details related to disenrolling a device.")
public class Disenrollment extends AndroidOperation implements Serializable { public class Disenrollment extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "enabled", value = "Whether to enable disenrollment or not.", required = true)
private boolean enabled; private boolean enabled;
public boolean isEnabled() { public boolean isEnabled() {

@ -18,13 +18,19 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
/** /**
* This class represents the information of changing lock code operation. * This class represents the information of changing lock code operation.
*/ */
@ApiModel(value = "LockCode",
description = "Details related to lock code sent on device.")
public class LockCode extends AndroidOperation implements Serializable { public class LockCode extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "lockCode", value = "The lock code to be sent to the device.", required = true)
private String lockCode; private String lockCode;
public String getLockCode() { public String getLockCode() {

@ -18,13 +18,19 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
/** /**
* This class represents the information of sending notification operation. * This class represents the information of sending notification operation.
*/ */
@ApiModel(value = "Notification",
description = "Details related to notifications passed to device.")
public class Notification extends AndroidOperation implements Serializable { public class Notification extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "message", value = "The message to be sent to the device.", required = true)
private String message; private String message;
public String getMessage() { public String getMessage() {

@ -18,19 +18,42 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
/** /**
* This class represents the information of setting up password policy. * This class represents the information of setting up password policy.
*/ */
@ApiModel(value = "PasscodePolicy", description = "This class represents the information of setting up "
+ "password policy")
public class PasscodePolicy extends AndroidOperation implements Serializable { public class PasscodePolicy extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "maxFailedAttempts", value = "The maximum number of times the end-user can enter"
+ " his/her device passcode incorrectly. EMM will take different courses of action based on the"
+ " OS when the failed attempts exceed the maximum failed attempts. Android devices will be "
+ "automatically reset to the original factory settings", required = true)
private int maxFailedAttempts; private int maxFailedAttempts;
@ApiModelProperty(name = "minLength", value = "The minimum number of alphanumerical values that the "
+ "end-user can enter as his/her passcode", required = true)
private int minLength; private int minLength;
@ApiModelProperty(name = "pinHistory", value = "The end-user will not be allowed to reuse a passcode that"
+ " he/she previously entered until he/she exceeds the set pin history length", required = true)
private int pinHistory; private int pinHistory;
@ApiModelProperty(name = "minComplexChars", value = "The minimum number of special characters that the "
+ "end-user will have to enter in his/her passcode", required = true)
private int minComplexChars; private int minComplexChars;
@ApiModelProperty(name = "maxPINAgeInDays", value = "The number of days after which the device owner has"
+ " to change his/her passcode", required = true)
private int maxPINAgeInDays; private int maxPINAgeInDays;
@ApiModelProperty(name = "requireAlphanumeric", value = "Whether or not it is mandatory for the end-user"
+ " to have a mix of digits and characters in his/her passcode", required = true)
private boolean requireAlphanumeric; private boolean requireAlphanumeric;
@ApiModelProperty(name = "allowSimple", value = "If this field is set to 'true', the device owner will be"
+ " able to have a simple passcode and the following criteria in the passcode policy will not be"
+ " applicable:\n"
+ "Minimum length\n" + "Minimum complex characters", required = true)
private boolean allowSimple; private boolean allowSimple;
public int getMaxFailedAttempts() { public int getMaxFailedAttempts() {

@ -18,15 +18,24 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
/** /**
* This class represents the information of setting up webclip. * This class represents the information of setting up webclip.
*/ */
@ApiModel(value = "WebClip", description = "This class represents the information of setting up webclip")
public class WebClip extends AndroidOperation implements Serializable { public class WebClip extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "identity", value = "The URL of the application", required = true)
private String identity; private String identity;
@ApiModelProperty(name = "title", value = "The name of the web application", required = true)
private String title; private String title;
@ApiModelProperty(name = "type", value = "The type of the operation. Following are the possible operation"
+ " types: install and uninstall. If the operation type is install, the web clip is added, and "
+ "if the operation type is uninstall, the existing web clip is removed", required = true)
private String type; private String type;
public String getIdentity() { public String getIdentity() {

@ -18,14 +18,22 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
/** /**
* This class represents the information of configuring wifi operation. * This class represents the information of configuring wifi operation.
*/ */
@ApiModel(value = "Wifi", description = "This class represents the information of configuring wifi operation")
public class Wifi extends AndroidOperation implements Serializable { public class Wifi extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "ssid", value = "The name of the Wifi network that you wish to configure",
required = true)
private String ssid; private String ssid;
@ApiModelProperty(name = "password", value = "The password to connect to the specified Wifi network",
required = true)
private String password; private String password;
public String getSsid() { public String getSsid() {

@ -18,13 +18,18 @@
package org.wso2.carbon.mdm.services.android.bean; package org.wso2.carbon.mdm.services.android.bean;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
/** /**
* This class represents the information of wipedata operation. * This class represents the information of wipedata operation.
*/ */
@ApiModel(value = "WipeData", description = "This class represents the information of wipedata operation")
public class WipeData extends AndroidOperation implements Serializable { public class WipeData extends AndroidOperation implements Serializable {
@ApiModelProperty(name = "pin", value = "PIN number to proceed with the data wipe", required = true)
private String pin; private String pin;
public String getPin() { public String getPin() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.ApplicationInstallation; import org.wso2.carbon.mdm.services.android.bean.ApplicationInstallation;
import java.util.List; import java.util.List;
@ -24,9 +26,15 @@ import java.util.List;
/** /**
* This class is used to wrap the InstallApplication bean with devices. * This class is used to wrap the InstallApplication bean with devices.
*/ */
@ApiModel(value = "ApplicationInstallationBeanWrapper",
description = "This class carries all information related to a InstallApplication")
public class ApplicationInstallationBeanWrapper { public class ApplicationInstallationBeanWrapper {
@ApiModelProperty(name = "deviceIDs", value = "List of Devices", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
@ApiModelProperty(name = "operation", value = "App Installation property", required = true)
private ApplicationInstallation operation; private ApplicationInstallation operation;
public List<String> getDeviceIDs() { public List<String> getDeviceIDs() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.ApplicationUninstallation; import org.wso2.carbon.mdm.services.android.bean.ApplicationUninstallation;
import java.util.List; import java.util.List;
@ -24,9 +26,14 @@ import java.util.List;
/** /**
* This class is used to wrap the UninstallApplication bean with devices. * This class is used to wrap the UninstallApplication bean with devices.
*/ */
@ApiModel(value = "ApplicationUninstallationBeanWrapper",
description = "This class carries all information related to Uninstall Application")
public class ApplicationUninstallationBeanWrapper { public class ApplicationUninstallationBeanWrapper {
@ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
@ApiModelProperty(name = "operation", value = "Name of the device", required = true)
private ApplicationUninstallation operation; private ApplicationUninstallation operation;
public List<String> getDeviceIDs() { public List<String> getDeviceIDs() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.BlacklistApplications; import org.wso2.carbon.mdm.services.android.bean.BlacklistApplications;
import java.util.List; import java.util.List;
@ -24,9 +26,13 @@ import java.util.List;
/** /**
* This class is used to wrap the BlacklistApplications bean with devices. * This class is used to wrap the BlacklistApplications bean with devices.
*/ */
@ApiModel(value = "BlacklistApplicationsBeanWrapper",
description = "Mapping between blacklist application and the device ids.")
public class BlacklistApplicationsBeanWrapper { public class BlacklistApplicationsBeanWrapper {
@ApiModelProperty(name = "operation", value = "Blacklist applications information", required = true)
private BlacklistApplications operation; private BlacklistApplications operation;
@ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
public BlacklistApplications getOperation() { public BlacklistApplications getOperation() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.Camera; import org.wso2.carbon.mdm.services.android.bean.Camera;
import java.util.List; import java.util.List;
@ -24,9 +26,14 @@ import java.util.List;
/** /**
* This class is used to wrap the Camera bean with devices. * This class is used to wrap the Camera bean with devices.
*/ */
@ApiModel(value = "CameraBeanWrapper",
description = "Mapping between camera operation and device list to be applied.")
public class CameraBeanWrapper { public class CameraBeanWrapper {
@ApiModelProperty(name = "operation", value = "Information of camera operation", required = true)
private Camera operation; private Camera operation;
@ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
public Camera getOperation() { public Camera getOperation() {

@ -17,13 +17,18 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.Disenrollment; import org.wso2.carbon.mdm.services.android.bean.Disenrollment;
import java.util.List; import java.util.List;
@ApiModel(value = "DisenrollmentBeanWrapper", description = "Disenrollment details are mapped to devices list.")
public class DisenrollmentBeanWrapper { public class DisenrollmentBeanWrapper {
@ApiModelProperty(name = "operation", value = "Disenrollment operation.", required = true)
private Disenrollment operation; private Disenrollment operation;
@ApiModelProperty(name = "deviceIDs", value = "Device id list of the operation to be executed.", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
public Disenrollment getOperation() { public Disenrollment getOperation() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.DeviceEncryption; import org.wso2.carbon.mdm.services.android.bean.DeviceEncryption;
import java.util.List; import java.util.List;
@ -24,9 +26,13 @@ import java.util.List;
/** /**
* This class is used to wrap the Encrypt bean with devices. * This class is used to wrap the Encrypt bean with devices.
*/ */
@ApiModel(value = "EncryptionBeanWrapper",
description = "Mapping between encryption operation and device list to be applied.")
public class EncryptionBeanWrapper { public class EncryptionBeanWrapper {
@ApiModelProperty(name = "operation", value = "The information of encrypt operation", required = true)
private DeviceEncryption operation; private DeviceEncryption operation;
@ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
public DeviceEncryption getOperation() { public DeviceEncryption getOperation() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.LockCode; import org.wso2.carbon.mdm.services.android.bean.LockCode;
import java.util.List; import java.util.List;
@ -24,9 +26,14 @@ import java.util.List;
/** /**
* This class is used to wrap the LockCode bean with devices. * This class is used to wrap the LockCode bean with devices.
*/ */
@ApiModel(value = "LockCodeBeanWrapper",
description = "Mapping between lock operation and device list to be applied.")
public class LockCodeBeanWrapper { public class LockCodeBeanWrapper {
@ApiModelProperty(name = "operation", value = "The information of device lock operation", required = true)
private LockCode operation; private LockCode operation;
@ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
public LockCode getOperation() { public LockCode getOperation() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.Notification; import org.wso2.carbon.mdm.services.android.bean.Notification;
import java.util.List; import java.util.List;
@ -24,9 +26,14 @@ import java.util.List;
/** /**
* This class is used to wrap the Notification bean with devices. * This class is used to wrap the Notification bean with devices.
*/ */
@ApiModel(value = "NotificationBeanWrapper",
description = "Mapping between notification operation and device list to be applied.")
public class NotificationBeanWrapper { public class NotificationBeanWrapper {
@ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
@ApiModelProperty(name = "operation", value = "The information of notification operation", required = true)
private Notification operation; private Notification operation;
public List<String> getDeviceIDs() { public List<String> getDeviceIDs() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.PasscodePolicy; import org.wso2.carbon.mdm.services.android.bean.PasscodePolicy;
import java.util.List; import java.util.List;
@ -24,9 +26,14 @@ import java.util.List;
/** /**
* This class is used to wrap the PasswordPolicy bean with devices. * This class is used to wrap the PasswordPolicy bean with devices.
*/ */
@ApiModel(value = "PasswordPolicyBeanWrapper",
description = "Mapping between passcode policy and device list to be applied.")
public class PasswordPolicyBeanWrapper { public class PasswordPolicyBeanWrapper {
@ApiModelProperty(name = "operation", value = "The information of setting up password policy", required = true)
private PasscodePolicy operation; private PasscodePolicy operation;
@ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
public PasscodePolicy getOperation() { public PasscodePolicy getOperation() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.WebClip; import org.wso2.carbon.mdm.services.android.bean.WebClip;
import java.util.List; import java.util.List;
@ -24,9 +26,14 @@ import java.util.List;
/** /**
* This class is used to wrap the WebClip bean with devices. * This class is used to wrap the WebClip bean with devices.
*/ */
@ApiModel(value = "WebClipBeanWrapper",
description = "Mapping between web clip operation and device list to be applied.")
public class WebClipBeanWrapper { public class WebClipBeanWrapper {
@ApiModelProperty(name = "operation", value = "the information of setting up webclip", required = true)
private WebClip operation; private WebClip operation;
@ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
public WebClip getOperation() { public WebClip getOperation() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.Wifi; import org.wso2.carbon.mdm.services.android.bean.Wifi;
import java.util.List; import java.util.List;
@ -24,9 +26,13 @@ import java.util.List;
/** /**
* This class is used to wrap the Wifi bean with devices. * This class is used to wrap the Wifi bean with devices.
*/ */
@ApiModel(value = "WifiBeanWrapper",
description = "Mapping between wifi operation and device list to be applied.")
public class WifiBeanWrapper { public class WifiBeanWrapper {
@ApiModelProperty(name = "operation", value = "Information of configuring wifi operation", required = true)
private Wifi operation; private Wifi operation;
@ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
public Wifi getOperation() { public Wifi getOperation() {

@ -17,6 +17,8 @@
*/ */
package org.wso2.carbon.mdm.services.android.bean.wrapper; package org.wso2.carbon.mdm.services.android.bean.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.mdm.services.android.bean.WipeData; import org.wso2.carbon.mdm.services.android.bean.WipeData;
import java.util.List; import java.util.List;
@ -24,9 +26,13 @@ import java.util.List;
/** /**
* This class is used to wrap the WipeData bean with devices. * This class is used to wrap the WipeData bean with devices.
*/ */
@ApiModel(value = "WipeDataBeanWrapper",
description = "Mapping between wipe operation and device list to be applied.")
public class WipeDataBeanWrapper { public class WipeDataBeanWrapper {
@ApiModelProperty(name = "operation", value = "The information of wipedata operation", required = true)
private WipeData operation; private WipeData operation;
@ApiModelProperty(name = "deviceIDs", value = "List of device Ids", required = true)
private List<String> deviceIDs; private List<String> deviceIDs;
public WipeData getOperation() { public WipeData getOperation() {

@ -0,0 +1,82 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.mdm.services.android.services.configuration;
import io.swagger.annotations.*;
import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration;
import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException;
import org.wso2.carbon.mdm.services.android.util.Message;
import javax.jws.WebService;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
/**
* Android Platform Configuration REST-API implementation.
* All end points supports JSON, XMl with content negotiation.
*/
@Api(value = "ConfigurationMgtService")
@WebService
@Produces({"application/json", "application/xml"})
@Consumes({"application/json", "application/xml"})
public interface ConfigurationMgtService {
@POST
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
httpMethod = "POST",
value = "Configuring Android Platform Settings",
notes = "Configure the Android platform settings using this REST API"
)
@ApiResponses(value = {
@ApiResponse(code = 201, message = "Android platform configuration saved successfully"),
@ApiResponse(code = 500, message = "Internal Server Error")
})
Message configureSettings(@ApiParam(name = "configuration", value = "AndroidPlatformConfiguration")
TenantConfiguration configuration) throws AndroidAgentException;
@GET
@ApiOperation(
httpMethod = "GET",
value = "Getting Android Platform Configurations",
notes = "Get the Android platform configuration details using this REST API",
response = TenantConfiguration.class
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Get Android Configurations"),
@ApiResponse(code = 500, message = "Server Error")
})
TenantConfiguration getConfiguration() throws AndroidAgentException;
@PUT
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON,
httpMethod = "PUT",
value = "Updating Android Platform Configurations",
notes = "Update the Android platform configurations using this REST API"
)
@ApiResponses(value = {
@ApiResponse(code = 201, message = "Created"),
@ApiResponse(code = 500, message = "Error occurred while modifying configuration settings of " +
"Android platform")
})
Message updateConfiguration(@ApiParam(name = "configuration", value = "AndroidPlatformConfiguration")
TenantConfiguration configuration) throws AndroidAgentException;
}

@ -0,0 +1,162 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.mdm.services.android.services.configuration.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.DeviceManagementConstants;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationEntry;
import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration;
import org.wso2.carbon.device.mgt.common.license.mgt.License;
import org.wso2.carbon.mdm.services.android.services.configuration.ConfigurationMgtService;
import org.wso2.carbon.mdm.services.android.exception.AndroidAgentException;
import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils;
import org.wso2.carbon.mdm.services.android.util.AndroidConstants;
import org.wso2.carbon.mdm.services.android.util.Message;
import javax.jws.WebService;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;
/**
* Android Platform Configuration REST-API implementation.
* All end points supports JSON, XMl with content negotiation.
*/
@WebService
@Produces({"application/json", "application/xml"})
@Consumes({"application/json", "application/xml"})
public class ConfigurationMgtServiceImpl implements ConfigurationMgtService {
private static Log log = LogFactory.getLog(ConfigurationMgtServiceImpl.class);
@POST
public Message configureSettings(TenantConfiguration configuration)
throws AndroidAgentException {
Message responseMsg = new Message();
String msg;
ConfigurationEntry licenseEntry = null;
try {
configuration.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
List<ConfigurationEntry> configs = configuration.getConfiguration();
for (ConfigurationEntry entry : configs) {
if (AndroidConstants.TenantConfigProperties.LICENSE_KEY.equals(entry.getName())) {
License license = new License();
license.setName(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
license.setLanguage(AndroidConstants.TenantConfigProperties.LANGUAGE_US);
license.setVersion("1.0.0");
license.setText(entry.getValue().toString());
AndroidAPIUtils.getDeviceManagementService().addLicense(DeviceManagementConstants.
MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, license);
licenseEntry = entry;
break;
}
}
if (licenseEntry != null) {
configs.remove(licenseEntry);
}
configuration.setConfiguration(configs);
AndroidAPIUtils.getDeviceManagementService().saveConfiguration(configuration);
Response.status(Response.Status.CREATED);
responseMsg.setResponseMessage("Android platform configuration saved successfully.");
responseMsg.setResponseCode(Response.Status.CREATED.toString());
} catch (DeviceManagementException e) {
msg = "Error occurred while configuring the android platform";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
@GET
public TenantConfiguration getConfiguration() throws AndroidAgentException {
String msg;
TenantConfiguration tenantConfiguration;
List<ConfigurationEntry> configs;
try {
tenantConfiguration = AndroidAPIUtils.getDeviceManagementService().
getConfiguration(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
if (tenantConfiguration != null) {
configs = tenantConfiguration.getConfiguration();
} else {
tenantConfiguration = new TenantConfiguration();
configs = new ArrayList<ConfigurationEntry>();
}
ConfigurationEntry entry = new ConfigurationEntry();
License license = AndroidAPIUtils.getDeviceManagementService().getLicense(
DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, AndroidConstants.
TenantConfigProperties.LANGUAGE_US);
if (license != null && configs != null) {
entry.setContentType(AndroidConstants.TenantConfigProperties.CONTENT_TYPE_TEXT);
entry.setName(AndroidConstants.TenantConfigProperties.LICENSE_KEY);
entry.setValue(license.getText());
configs.add(entry);
tenantConfiguration.setConfiguration(configs);
}
} catch (DeviceManagementException e) {
msg = "Error occurred while retrieving the Android tenant configuration";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return tenantConfiguration;
}
@PUT
public Message updateConfiguration(TenantConfiguration configuration) throws AndroidAgentException {
String msg;
Message responseMsg = new Message();
ConfigurationEntry licenseEntry = null;
try {
configuration.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
List<ConfigurationEntry> configs = configuration.getConfiguration();
for (ConfigurationEntry entry : configs) {
if (AndroidConstants.TenantConfigProperties.LICENSE_KEY.equals(entry.getName())) {
License license = new License();
license.setName(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID);
license.setLanguage(AndroidConstants.TenantConfigProperties.LANGUAGE_US);
license.setVersion("1.0.0");
license.setText(entry.getValue().toString());
AndroidAPIUtils.getDeviceManagementService().addLicense(DeviceManagementConstants.
MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, license);
licenseEntry = entry;
}
}
if (licenseEntry != null) {
configs.remove(licenseEntry);
}
configuration.setConfiguration(configs);
AndroidAPIUtils.getDeviceManagementService().saveConfiguration(configuration);
Response.status(Response.Status.ACCEPTED);
responseMsg.setResponseMessage("Android platform configuration has updated successfully.");
responseMsg.setResponseCode(Response.Status.ACCEPTED.toString());
} catch (DeviceManagementException e) {
msg = "Error occurred while modifying configuration settings of Android platform";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
}

@ -0,0 +1,147 @@
/*
* 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 org.wso2.carbon.mdm.services.android.util.Message;
import javax.jws.WebService;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
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.")
@WebService
@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")
})
List<org.wso2.carbon.device.mgt.common.Device> 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")
})
org.wso2.carbon.device.mgt.common.Device 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}")
Message 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")
})
Message updateApplicationList(@ApiParam(name = "id", value = "deviceIdentifier") @PathParam("id") String id,
@ApiParam(name = "applications", value = "updatable applications")
List<Application> applications);
@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")})
String getLicense() throws AndroidAgentException;
}

@ -0,0 +1,184 @@
/*
* 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.util.AndroidAPIUtils;
import org.wso2.carbon.mdm.services.android.util.Message;
import javax.jws.WebService;
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.
*/
@WebService
@Produces({"application/json", "application/xml"})
@Consumes({"application/json", "application/xml"})
public class DeviceManagementServiceImpl {
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 List<Device> 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);
throw new AndroidAgentException(msg, e);
}
return devices;
}
/**
* Fetch Android device details of a given device Id.
*
* @param id Device Id
* @return Device
* @throws AndroidAgentException
*/
@GET
@Path("{id}")
public Device 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) {
Response.status(Response.Status.NOT_FOUND);
}
} catch (DeviceManagementException deviceMgtEx) {
msg = "Error occurred while fetching the device information.";
log.error(msg, deviceMgtEx);
throw new AndroidAgentException(msg, deviceMgtEx);
}
return device;
}
/**
* Update Android device details of given device id.
*
* @param id Device Id
* @param device Device Details
* @return Message
* @throws AndroidAgentException
*/
@PUT
@Path("{id}")
public Message 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) {
Response.status(Response.Status.ACCEPTED);
responseMessage.setResponseMessage("Device information has modified successfully.");
} else {
Response.status(Response.Status.NOT_MODIFIED);
responseMessage.setResponseMessage("Device not found for the update.");
}
} catch (DeviceManagementException e) {
msg = "Error occurred while modifying the device information.";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMessage;
}
@POST
@Path("appList/{id}")
public Message 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);
Response.status(Response.Status.ACCEPTED);
responseMessage.setResponseMessage("Device information has modified successfully.");
} catch (ApplicationManagementException e) {
String msg = "Error occurred while modifying the application list.";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMessage;
}
@GET
@Path("license")
@Produces("text/html")
public String getLicense() throws AndroidAgentException {
License license;
try {
license =
AndroidAPIUtils.getDeviceManagementService().getLicense(
DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID,
DeviceManagementConstants.LanguageCodes.LANGUAGE_CODE_ENGLISH_US);
} catch (DeviceManagementException e) {
String msg = "Error occurred while retrieving the license configured for Android device enrolment";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return (license == null) ? null : license.getText();
}
}

@ -0,0 +1,100 @@
/*
* 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 org.wso2.carbon.mdm.services.android.util.Message;
import javax.jws.WebService;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
/**
* 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.")
@WebService
@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"),
})
Message 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")
})
Message 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")
})
Message 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}")
Message disEnrollDevice(@ApiParam(name = "deviceId", value = "DeviceIdentifier") @PathParam("deviceId") String id)
throws AndroidAgentException;
}

@ -0,0 +1,158 @@
/*
* 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.jws.WebService;
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.
*/
@WebService
@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 Message 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.");
responseMsg.setResponseCode(Response.Status.CREATED.toString());
} else {
Response.status(Response.Status.INTERNAL_SERVER_ERROR);
responseMsg.setResponseMessage("Device enrollment failed.");
responseMsg.setResponseCode(Response.Status.INTERNAL_SERVER_ERROR.toString());
}
} catch (DeviceManagementException e) {
msg = "Error occurred while enrolling the device";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
@GET
@Path("{deviceId}")
public Message 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());
Response.status(Response.Status.ACCEPTED);
} else {
responseMsg.setResponseMessage("Device not found");
responseMsg.setResponseCode(Response.Status.NOT_FOUND.toString());
Response.status(Response.Status.NOT_FOUND);
}
} 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);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
@PUT
@Path("{deviceId}")
public Message 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());
Response.status(Response.Status.ACCEPTED);
} else {
responseMsg.setResponseMessage("Device not found for enrollment");
responseMsg.setResponseCode(Response.Status.NOT_MODIFIED.toString());
Response.status(Response.Status.NOT_MODIFIED);
}
} catch (DeviceManagementException e) {
msg = "Error occurred while modifying enrollment of the device";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
@DELETE
@Path("{deviceId}")
public Message 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());
Response.status(Response.Status.ACCEPTED);
} else {
responseMsg.setResponseMessage("Device not found");
responseMsg.setResponseCode(Response.Status.NOT_FOUND.toString());
Response.status(Response.Status.NOT_FOUND);
}
} catch (DeviceManagementException e) {
msg = "Error occurred while dis enrolling the device";
log.error(msg, e);
throw new AndroidAgentException(msg, e);
}
return responseMsg;
}
}

@ -0,0 +1,414 @@
/*
* 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")
})
List<? extends Operation> 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",
responseContainer = "List",
notes = "Using this API you have the option of hard locking an Android device, where the Administrator " +
"permanently locks the device or screen locking an Android device",
response = String.class)
@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 = "deviceIDs", value =
"DeviceIds to be enable device lock 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
@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("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("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);
}

@ -16,22 +16,22 @@
* under the License. * under the License.
*/ */
package org.wso2.carbon.mdm.services.android; package org.wso2.carbon.mdm.services.android.services.operationmgt.impl;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException;
import org.wso2.carbon.device.mgt.common.notification.mgt.*; 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.Operation;
import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException; import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException;
import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation; import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation;
import org.wso2.carbon.device.mgt.core.operation.mgt.ProfileOperation; import org.wso2.carbon.device.mgt.core.operation.mgt.ProfileOperation;
import org.wso2.carbon.mdm.services.android.bean.*; import org.wso2.carbon.mdm.services.android.bean.*;
import org.wso2.carbon.mdm.services.android.bean.Notification;
import org.wso2.carbon.mdm.services.android.bean.wrapper.*; import org.wso2.carbon.mdm.services.android.bean.wrapper.*;
import org.wso2.carbon.mdm.services.android.exception.AndroidOperationException; import org.wso2.carbon.mdm.services.android.exception.AndroidOperationException;
import org.wso2.carbon.mdm.services.android.services.operationmgt.OperationMgtService;
import org.wso2.carbon.mdm.services.android.util.AndroidAPIUtils; import org.wso2.carbon.mdm.services.android.util.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.AndroidDeviceUtils; import org.wso2.carbon.mdm.services.android.util.AndroidDeviceUtils;
@ -43,15 +43,12 @@ 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 OperationMgtServiceImpl {
* Android Device Operation REST-API implementation.
*/
public class OperationMgtService {
private static Log log = LogFactory.getLog(OperationMgtService.class); private static Log log = LogFactory.getLog(OperationMgtService.class);
private static final String ACCEPT = "Accept"; private static final String ACCEPT = "Accept";
private static final String OPERATION_ERROR_STATUS = "ERROR"; private static final String OPERATION_ERROR_STATUS = "ERROR";
private static final String DEVICE_TYPE_ANDROID = "android"; private static final String DEVICE_TYPE_ANDROID = "android";
@PUT @PUT
@Path("{id}") @Path("{id}")
@ -93,7 +90,7 @@ public class OperationMgtService {
} catch (ApplicationManagementException e) { } catch (ApplicationManagementException e) {
log.error("Issue in retrieving application management service instance", e); log.error("Issue in retrieving application management service instance", e);
} catch (NotificationManagementException e) { } catch (NotificationManagementException e) {
log.error("Issue in retrieving Notification management service instance", e); log.error("Issue in retrieving Notification management service instance", e);
} }
List<? extends Operation> pendingOperations; List<? extends Operation> pendingOperations;
@ -268,7 +265,7 @@ public class OperationMgtService {
CommandOperation operation = new CommandOperation(); CommandOperation operation = new CommandOperation();
operation.setCode(AndroidConstants.OperationCodes.DEVICE_INFO); operation.setCode(AndroidConstants.OperationCodes.DEVICE_INFO);
operation.setType(Operation.Type.COMMAND); operation.setType(Operation.Type.COMMAND);
getApplications(acceptHeader, deviceIDs); getApplications(acceptHeader, deviceIDs);
return AndroidAPIUtils.getOperationResponse(deviceIDs, operation, message, return AndroidAPIUtils.getOperationResponse(deviceIDs, operation, message,
responseMediaType); responseMediaType);
} catch (OperationManagementException e) { } catch (OperationManagementException e) {
@ -908,21 +905,21 @@ public class OperationMgtService {
ApplicationManagementException, NotificationManagementException, DeviceManagementException { ApplicationManagementException, NotificationManagementException, DeviceManagementException {
for (org.wso2.carbon.device.mgt.common.operation.mgt.Operation operation : operations) { for (org.wso2.carbon.device.mgt.common.operation.mgt.Operation operation : operations) {
AndroidAPIUtils.updateOperation(deviceId, operation); AndroidAPIUtils.updateOperation(deviceId, operation);
if(operation.getStatus().equals(OPERATION_ERROR_STATUS)){ if (operation.getStatus().equals(OPERATION_ERROR_STATUS)) {
org.wso2.carbon.device.mgt.common.notification.mgt.Notification notification = new org.wso2.carbon.device.mgt.common.notification.mgt.Notification notification = new
org.wso2.carbon.device.mgt.common.notification.mgt.Notification(); org.wso2.carbon.device.mgt.common.notification.mgt.Notification();
DeviceIdentifier id = new DeviceIdentifier(); DeviceIdentifier id = new DeviceIdentifier();
id.setId(deviceId); id.setId(deviceId);
id.setType(DEVICE_TYPE_ANDROID); id.setType(DEVICE_TYPE_ANDROID);
String deviceName = AndroidAPIUtils.getDeviceManagementService().getDevice(id).getName(); String deviceName = AndroidAPIUtils.getDeviceManagementService().getDevice(id).getName();
notification.setOperationId(operation.getId()); notification.setOperationId(operation.getId());
notification.setStatus(org.wso2.carbon.device.mgt.common.notification.mgt.Notification. notification.setStatus(org.wso2.carbon.device.mgt.common.notification.mgt.Notification.
Status.NEW.toString()); Status.NEW.toString());
notification.setDeviceIdentifier(id); notification.setDeviceIdentifier(id);
notification.setDescription("Operation " + operation.getCode() + " failed to execute on device "+ notification.setDescription("Operation " + operation.getCode() + " failed to execute on device " +
deviceName+". Device ID : " + deviceId); deviceName + ". Device ID : " + deviceId);
AndroidAPIUtils.getNotificationManagementService().addNotification(notification); AndroidAPIUtils.getNotificationManagementService().addNotification(notification);
} }
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Updating operation '" + operation.toString() + "'"); log.debug("Updating operation '" + operation.toString() + "'");
} }

@ -0,0 +1,73 @@
/*
* 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 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")
})
Message 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")
})
List<ProfileFeature> getEffectiveFeatures(@ApiParam(name = "acceptHeader", value = "Accept Header")
@HeaderParam("Accept") String acceptHeader,
@ApiParam(name = "deviceId", value = "DeviceIdentifier")
@PathParam("deviceId") String id) throws AndroidAgentException;
}

@ -16,14 +16,13 @@
* under the License. * under the License.
*/ */
package org.wso2.carbon.mdm.services.android.services.policymgt.impl;
package org.wso2.carbon.mdm.services.android;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
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.policymgt.PolicyMgtService;
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;
import org.wso2.carbon.policy.mgt.common.FeatureManagementException; import org.wso2.carbon.policy.mgt.common.FeatureManagementException;
@ -32,16 +31,14 @@ import org.wso2.carbon.policy.mgt.common.PolicyManagementException;
import org.wso2.carbon.policy.mgt.common.ProfileFeature; import org.wso2.carbon.policy.mgt.common.ProfileFeature;
import org.wso2.carbon.policy.mgt.core.PolicyManagerService; import org.wso2.carbon.policy.mgt.core.PolicyManagerService;
import javax.jws.WebService; import javax.ws.rs.GET;
import javax.ws.rs.*; import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.List; import java.util.List;
@WebService public class PolicyMgtServiceImpl {
@Produces({"application/json", "application/xml"})
@Consumes({"application/json", "application/xml"})
public class PolicyMgtService {
private static Log log = LogFactory.getLog(PolicyMgtService.class); private static Log log = LogFactory.getLog(PolicyMgtService.class);
@GET @GET

@ -69,11 +69,11 @@
</jaxrs:providers> </jaxrs:providers>
</jaxrs:server> </jaxrs:server>
<bean id="deviceMgtServiceBean" class="org.wso2.carbon.mdm.services.android.DeviceManagementService"/> <bean id="deviceMgtServiceBean" class="org.wso2.carbon.mdm.services.android.services.devicemgt.DeviceManagementServiceImpl"/>
<bean id="enrollmentServiceBean" class="org.wso2.carbon.mdm.services.android.EnrollmentService"/> <bean id="enrollmentServiceBean" class="org.wso2.carbon.mdm.services.android.services.enrollment.EnrollmentServiceImpl"/>
<bean id="operationServiceBean" class="org.wso2.carbon.mdm.services.android.OperationMgtService"/> <bean id="operationServiceBean" class="org.wso2.carbon.mdm.services.android.services.operationmgt.OperationMgtServiceImpl"/>
<bean id="policyServiceBean" class="org.wso2.carbon.mdm.services.android.PolicyMgtService"/> <bean id="policyServiceBean" class="org.wso2.carbon.mdm.services.android.services.policymgt.PolicyMgtServiceImpl"/>
<bean id="configurationServiceBean" class="org.wso2.carbon.mdm.services.android.ConfigurationMgtService"/> <bean id="configurationServiceBean" class="org.wso2.carbon.mdm.services.android.services.configuration.ConfigurationMgtServiceImpl"/>
<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>

@ -69,7 +69,7 @@ public class AndroidDeviceManager implements DeviceManager {
} catch (LicenseManagementException e) { } catch (LicenseManagementException e) {
log.error("Error occurred while adding default license for Android devices", e); log.error("Error occurred while adding default license for Android devices", e);
} catch (DeviceManagementException e) { } catch (DeviceManagementException e) {
log.error("Error occurred while adding supported device features for Android platform", e); throw new IllegalStateException("Error occurred while adding Android features to the DB.");
} }
} }
@ -101,13 +101,13 @@ public class AndroidDeviceManager implements DeviceManager {
status = true; status = true;
} catch (MobileDeviceMgtPluginException e) { } catch (MobileDeviceMgtPluginException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while retrieving the Registry instance : " + e.getMessage(), e); "Error occurred while retrieving the Registry instance", e);
} catch (RegistryException e) { } catch (RegistryException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while persisting the Registry resource of Android Configuration : " + e.getMessage(), e); "Error occurred while persisting the Registry resource of Android Configuration", e);
} catch (JAXBException e) { } catch (JAXBException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while parsing the Android configuration : " + e.getMessage(), e); "Error occurred while parsing the Android configuration", e);
} }
return status; return status;
} }
@ -130,13 +130,13 @@ public class AndroidDeviceManager implements DeviceManager {
return null; return null;
} catch (MobileDeviceMgtPluginException e) { } catch (MobileDeviceMgtPluginException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while retrieving the Registry instance : " + e.getMessage(), e); "Error occurred while retrieving the Registry instance", e);
} catch (JAXBException e) { } catch (JAXBException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while parsing the Android configuration : " + e.getMessage(), e); "Error occurred while parsing the Android configuration", e);
} catch (RegistryException e) { } catch (RegistryException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while retrieving the Registry resource of Android Configuration : " + e.getMessage(), e); "Error occurred while retrieving the Registry resource of Android Configuration", e);
} }
} }
@ -163,12 +163,10 @@ public class AndroidDeviceManager implements DeviceManager {
try { try {
AndroidDAOFactory.rollbackTransaction(); AndroidDAOFactory.rollbackTransaction();
} catch (MobileDeviceManagementDAOException mobileDAOEx) { } catch (MobileDeviceManagementDAOException mobileDAOEx) {
String msg = "Error occurred while roll back the device enrol transaction :" + String msg = "Error occurred while roll back the device enrol transaction :" + device.toString();
device.toString();
log.warn(msg, mobileDAOEx); log.warn(msg, mobileDAOEx);
} }
String msg = String msg = "Error occurred while enrolling the Android device : " + device.getDeviceIdentifier();
"Error while enrolling the Android device : " + device.getDeviceIdentifier();
throw new DeviceManagementException(msg, e); throw new DeviceManagementException(msg, e);
} }
return status; return status;
@ -189,11 +187,10 @@ public class AndroidDeviceManager implements DeviceManager {
try { try {
AndroidDAOFactory.rollbackTransaction(); AndroidDAOFactory.rollbackTransaction();
} catch (MobileDeviceManagementDAOException mobileDAOEx) { } catch (MobileDeviceManagementDAOException mobileDAOEx) {
String msg = "Error occurred while roll back the update device transaction :" + String msg = "Error occurred while roll back the update device transaction :" + device.toString();
device.toString();
log.warn(msg, mobileDAOEx); log.warn(msg, mobileDAOEx);
} }
String msg = "Error while updating the enrollment of the Android device : " + String msg = "Error occurred while updating the enrollment of the Android device : " +
device.getDeviceIdentifier(); device.getDeviceIdentifier();
throw new DeviceManagementException(msg, e); throw new DeviceManagementException(msg, e);
} }
@ -219,8 +216,7 @@ public class AndroidDeviceManager implements DeviceManager {
isEnrolled = true; isEnrolled = true;
} }
} catch (MobileDeviceManagementDAOException e) { } catch (MobileDeviceManagementDAOException e) {
String msg = "Error while checking the enrollment status of Android device : " + String msg = "Error occurred while checking the enrollment status of Android device : " + deviceId.getId();
deviceId.getId();
throw new DeviceManagementException(msg, e); throw new DeviceManagementException(msg, e);
} }
return isEnrolled; return isEnrolled;
@ -249,8 +245,7 @@ public class AndroidDeviceManager implements DeviceManager {
device = MobileDeviceManagementUtil.convertToDevice(mobileDevice); device = MobileDeviceManagementUtil.convertToDevice(mobileDevice);
} catch (MobileDeviceManagementDAOException e) { } catch (MobileDeviceManagementDAOException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while fetching the Android device: '" + "Error occurred while fetching the Android device: '" + deviceId.getId() + "'", e);
deviceId.getId() + "'", e);
} }
return device; return device;
} }
@ -294,12 +289,9 @@ public class AndroidDeviceManager implements DeviceManager {
boolean status; boolean status;
Device existingDevice = this.getDevice(deviceIdentifier); Device existingDevice = this.getDevice(deviceIdentifier);
// This object holds the current persisted device object // This object holds the current persisted device object
MobileDevice existingMobileDevice = MobileDevice existingMobileDevice = MobileDeviceManagementUtil.convertToMobileDevice(existingDevice);
MobileDeviceManagementUtil.convertToMobileDevice(existingDevice);
// This object holds the newly received device object from response // This object holds the newly received device object from response
MobileDevice mobileDevice = MobileDeviceManagementUtil.convertToMobileDevice(device); MobileDevice mobileDevice = MobileDeviceManagementUtil.convertToMobileDevice(device);
// Updating current object features using newer ones // Updating current object features using newer ones
existingMobileDevice.setLatitude(mobileDevice.getLatitude()); existingMobileDevice.setLatitude(mobileDevice.getLatitude());
existingMobileDevice.setLongitude(mobileDevice.getLongitude()); existingMobileDevice.setLongitude(mobileDevice.getLongitude());
@ -321,8 +313,7 @@ public class AndroidDeviceManager implements DeviceManager {
device.toString() + "'", e1); device.toString() + "'", e1);
} }
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while updating the Android device: '" + "Error occurred while updating the Android device: '" + device.getDeviceIdentifier() + "'", e);
device.getDeviceIdentifier() + "'", e);
} }
return status; return status;
} }
@ -343,8 +334,7 @@ public class AndroidDeviceManager implements DeviceManager {
} }
} }
} catch (MobileDeviceManagementDAOException e) { } catch (MobileDeviceManagementDAOException e) {
throw new DeviceManagementException("Error occurred while fetching all Android devices", throw new DeviceManagementException("Error occurred while fetching all Android devices", e);
e);
} }
return devices; return devices;
} }

@ -69,7 +69,7 @@ public class WindowsDeviceManager implements DeviceManager {
} catch (LicenseManagementException e) { } catch (LicenseManagementException e) {
log.error("Error occurred while adding default license for Windows devices", e); log.error("Error occurred while adding default license for Windows devices", e);
} catch (DeviceManagementException e) { } catch (DeviceManagementException e) {
log.error("Error occurred while adding supported device features for Windows platform", e); throw new IllegalStateException("Error occurred while adding windows features to the DB.");
} }
} }
@ -79,8 +79,7 @@ public class WindowsDeviceManager implements DeviceManager {
} }
@Override @Override
public boolean saveConfiguration(TenantConfiguration tenantConfiguration) public boolean saveConfiguration(TenantConfiguration tenantConfiguration) throws DeviceManagementException {
throws DeviceManagementException {
boolean status; boolean status;
Resource resource; Resource resource;
try { try {
@ -88,8 +87,7 @@ public class WindowsDeviceManager implements DeviceManager {
log.debug("Persisting windows configurations in Registry"); log.debug("Persisting windows configurations in Registry");
} }
String resourcePath = MobileDeviceManagementUtil.getPlatformConfigPath( String resourcePath = MobileDeviceManagementUtil.getPlatformConfigPath(
DeviceManagementConstants. DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_WINDOWS);
MobileDeviceTypes.MOBILE_DEVICE_TYPE_WINDOWS);
StringWriter writer = new StringWriter(); StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance(TenantConfiguration.class); JAXBContext context = JAXBContext.newInstance(TenantConfiguration.class);
Marshaller marshaller = context.createMarshaller(); Marshaller marshaller = context.createMarshaller();
@ -102,13 +100,13 @@ public class WindowsDeviceManager implements DeviceManager {
status = true; status = true;
} catch (MobileDeviceMgtPluginException e) { } catch (MobileDeviceMgtPluginException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while retrieving the Registry instance : " + e.getMessage(), e); "Error occurred while retrieving the Registry instance", e);
} catch (RegistryException e) { } catch (RegistryException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while persisting the Registry resource of Windows configuration : " + e.getMessage(), e); "Error occurred while persisting the Registry resource of Windows configuration", e);
} catch (JAXBException e) { } catch (JAXBException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while parsing the Windows configuration : " + e.getMessage(), e); "Error occurred while parsing the Windows configuration", e);
} }
return status; return status;
} }
@ -117,45 +115,46 @@ public class WindowsDeviceManager implements DeviceManager {
public TenantConfiguration getConfiguration() throws DeviceManagementException { public TenantConfiguration getConfiguration() throws DeviceManagementException {
Resource resource; Resource resource;
try { try {
String windowsTenantRegistryPath = String windowsTenantRegistryPath = MobileDeviceManagementUtil.
MobileDeviceManagementUtil.getPlatformConfigPath(DeviceManagementConstants. getPlatformConfigPath(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_WINDOWS);
MobileDeviceTypes.MOBILE_DEVICE_TYPE_WINDOWS);
resource = MobileDeviceManagementUtil.getRegistryResource(windowsTenantRegistryPath); resource = MobileDeviceManagementUtil.getRegistryResource(windowsTenantRegistryPath);
if (resource != null) { if (resource != null) {
JAXBContext context = JAXBContext.newInstance(TenantConfiguration.class); JAXBContext context = JAXBContext.newInstance(TenantConfiguration.class);
Unmarshaller unmarshaller = context.createUnmarshaller(); Unmarshaller unmarshaller = context.createUnmarshaller();
return (TenantConfiguration) unmarshaller.unmarshal( return (TenantConfiguration) unmarshaller.unmarshal(new StringReader(
new StringReader(new String((byte[]) resource.getContent(), Charset. new String((byte[]) resource.getContent(), Charset.
forName(MobilePluginConstants.CHARSET_UTF8)))); forName(MobilePluginConstants.CHARSET_UTF8))));
} }
return null; return null;
} catch (MobileDeviceMgtPluginException e) { } catch (MobileDeviceMgtPluginException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while retrieving the Registry instance : " + e.getMessage(), e); "Error occurred while retrieving the Registry instance", e);
} catch (JAXBException e) { } catch (JAXBException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while parsing the Windows configuration : " + e.getMessage(), e); "Error occurred while parsing the Windows configuration", e);
} catch (RegistryException e) { } catch (RegistryException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
"Error occurred while retrieving the Registry resource of Windows configuration : " + e.getMessage(), e); "Error occurred while retrieving the Registry resource of Windows configuration", e);
} }
} }
@Override @Override
public boolean modifyEnrollment(Device device) throws DeviceManagementException { public boolean modifyEnrollment(Device device) throws DeviceManagementException {
boolean status; boolean status = false;
MobileDevice mobileDevice = MobileDeviceManagementUtil.convertToMobileDevice(device); MobileDevice mobileDevice = MobileDeviceManagementUtil.convertToMobileDevice(device);
try { try {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Modifying the Windows device enrollment data"); log.debug("Modifying the Windows device enrollment data");
} }
WindowsDAOFactory.beginTransaction(); WindowsDAOFactory.beginTransaction();
status = daoFactory.getMobileDeviceDAO().updateMobileDevice(mobileDevice); if (daoFactory.getMobileDeviceDAO() != null) {
status = daoFactory.getMobileDeviceDAO().updateMobileDevice(mobileDevice);
}
WindowsDAOFactory.commitTransaction(); WindowsDAOFactory.commitTransaction();
} catch (MobileDeviceManagementDAOException e) { } catch (MobileDeviceManagementDAOException e) {
WindowsDAOFactory.rollbackTransaction(); WindowsDAOFactory.rollbackTransaction();
throw new DeviceManagementException("Error while updating the enrollment of the Windows device : " + throw new DeviceManagementException("Error occurred while updating the enrollment of the " +
device.getDeviceIdentifier(), e); "Windows device : " + device.getDeviceIdentifier(), e);
} finally { } finally {
WindowsDAOFactory.closeConnection(); WindowsDAOFactory.closeConnection();
} }
@ -170,22 +169,21 @@ public class WindowsDeviceManager implements DeviceManager {
@Override @Override
public boolean isEnrolled(DeviceIdentifier deviceId) throws DeviceManagementException { public boolean isEnrolled(DeviceIdentifier deviceId) throws DeviceManagementException {
boolean isEnrolled = false; MobileDevice mobileDevice;
try { try {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Checking the enrollment of Windows device : " + deviceId.getId()); log.debug("Checking the enrollment of Windows device : " + deviceId.getId());
} }
MobileDevice mobileDevice = if (daoFactory.getMobileDeviceDAO() != null) {
daoFactory.getMobileDeviceDAO().getMobileDevice(deviceId.getId()); mobileDevice = daoFactory.getMobileDeviceDAO().getMobileDevice(deviceId.getId());
if (mobileDevice != null) { } else {
isEnrolled = true; throw new DeviceManagementException("Error occurred while getting DAO object.");
} }
} catch (MobileDeviceManagementDAOException e) { } catch (MobileDeviceManagementDAOException e) {
String msg = "Error while checking the enrollment status of Windows device : " + String msg = "Error occurred while checking the enrollment status of Windows device : " + deviceId.getId();
deviceId.getId();
throw new DeviceManagementException(msg, e); throw new DeviceManagementException(msg, e);
} }
return isEnrolled; return (mobileDevice != null);
} }
@Override @Override
@ -201,12 +199,15 @@ public class WindowsDeviceManager implements DeviceManager {
public List<Device> getAllDevices() throws DeviceManagementException { public List<Device> getAllDevices() throws DeviceManagementException {
List<Device> devices = null; List<Device> devices = null;
List<MobileDevice> mobileDevices = null;
try { try {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Fetching the details of all Windows devices"); log.debug("Fetching the details of all Windows devices");
} }
WindowsDAOFactory.openConnection(); WindowsDAOFactory.openConnection();
List<MobileDevice> mobileDevices = daoFactory.getMobileDeviceDAO().getAllMobileDevices(); if (daoFactory.getMobileDeviceDAO() != null) {
mobileDevices = daoFactory.getMobileDeviceDAO().getAllMobileDevices();
}
if (mobileDevices != null) { if (mobileDevices != null) {
devices = new ArrayList<>(mobileDevices.size()); devices = new ArrayList<>(mobileDevices.size());
for (MobileDevice mobileDevice : mobileDevices) { for (MobileDevice mobileDevice : mobileDevices) {
@ -224,13 +225,15 @@ public class WindowsDeviceManager implements DeviceManager {
@Override @Override
public Device getDevice(DeviceIdentifier deviceId) throws DeviceManagementException { public Device getDevice(DeviceIdentifier deviceId) throws DeviceManagementException {
Device device = null; Device device = null;
MobileDevice mobileDevice = null;
try { try {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Getting the details of Windows device : '" + deviceId.getId() + "'"); log.debug("Getting the details of Windows device : '" + deviceId.getId() + "'");
} }
WindowsDAOFactory.openConnection(); WindowsDAOFactory.openConnection();
MobileDevice mobileDevice = daoFactory.getMobileDeviceDAO(). if (daoFactory.getMobileDeviceDAO() != null) {
getMobileDevice(deviceId.getId()); mobileDevice = daoFactory.getMobileDeviceDAO().getMobileDevice(deviceId.getId());
}
device = MobileDeviceManagementUtil.convertToDevice(mobileDevice); device = MobileDeviceManagementUtil.convertToDevice(mobileDevice);
} catch (MobileDeviceManagementDAOException e) { } catch (MobileDeviceManagementDAOException e) {
throw new DeviceManagementException( throw new DeviceManagementException(
@ -293,14 +296,15 @@ public class WindowsDeviceManager implements DeviceManager {
this.modifyEnrollment(device); this.modifyEnrollment(device);
} else { } else {
WindowsDAOFactory.beginTransaction(); WindowsDAOFactory.beginTransaction();
status = daoFactory.getMobileDeviceDAO().addMobileDevice(mobileDevice); if (daoFactory.getMobileDeviceDAO() != null) {
status = daoFactory.getMobileDeviceDAO().addMobileDevice(mobileDevice);
}
WindowsDAOFactory.commitTransaction(); WindowsDAOFactory.commitTransaction();
} }
} catch (MobileDeviceManagementDAOException e) { } catch (MobileDeviceManagementDAOException e) {
WindowsDAOFactory.rollbackTransaction(); WindowsDAOFactory.rollbackTransaction();
String msg = throw new DeviceManagementException("Error occurred while enrolling the windows device : "
"Error while enrolling the windows device : " + device.getDeviceIdentifier(); + device.getDeviceIdentifier(), e);
throw new DeviceManagementException(msg, e);
} }
return status; return status;
} }

@ -26,6 +26,7 @@ import org.wso2.carbon.device.mgt.mobile.dao.MobileDeviceManagementDAOFactory;
import org.wso2.carbon.device.mgt.mobile.dao.MobileFeatureDAO; import org.wso2.carbon.device.mgt.mobile.dao.MobileFeatureDAO;
import org.wso2.carbon.device.mgt.mobile.dto.MobileFeature; import org.wso2.carbon.device.mgt.mobile.dto.MobileFeature;
import org.wso2.carbon.device.mgt.mobile.impl.windows.dao.WindowsDAOFactory; import org.wso2.carbon.device.mgt.mobile.impl.windows.dao.WindowsDAOFactory;
import org.wso2.carbon.device.mgt.mobile.impl.windows.util.WindowsUtils;
import org.wso2.carbon.device.mgt.mobile.util.MobileDeviceManagementUtil; import org.wso2.carbon.device.mgt.mobile.util.MobileDeviceManagementUtil;
import java.util.ArrayList; import java.util.ArrayList;
@ -116,13 +117,13 @@ public class WindowsFeatureManager implements FeatureManager {
featureDAO.deleteFeatureByCode(code); featureDAO.deleteFeatureByCode(code);
WindowsDAOFactory.commitTransaction(); WindowsDAOFactory.commitTransaction();
status = true; status = true;
return status;
} catch (MobileDeviceManagementDAOException e) { } catch (MobileDeviceManagementDAOException e) {
WindowsDAOFactory.rollbackTransaction(); WindowsDAOFactory.rollbackTransaction();
throw new DeviceManagementException("Error occurred while removing the feature", e); throw new DeviceManagementException("Error occurred while removing the feature", e);
} finally { } finally {
WindowsDAOFactory.closeConnection(); WindowsDAOFactory.closeConnection();
} }
return status;
} }
@Override @Override
@ -145,48 +146,49 @@ public class WindowsFeatureManager implements FeatureManager {
* @return Supported features. * @return Supported features.
*/ */
public static List<Feature> getSupportedFeatures() { public static List<Feature> getSupportedFeatures() {
List<Feature> supportedFeatures = new ArrayList<Feature>(); List<Feature> supportedFeatures = new ArrayList<>();
Feature feature = new Feature(); Feature feature;
feature = WindowsUtils.getMobileFeature();
feature.setCode("DEVICE_LOCK"); feature.setCode("DEVICE_LOCK");
feature.setName("Device Lock"); feature.setName("Device Lock");
feature.setDescription("Lock the device"); feature.setDescription("Lock the device");
supportedFeatures.add(feature); supportedFeatures.add(feature);
feature = new Feature(); feature = WindowsUtils.getMobileFeature();
feature.setCode("CAMERA"); feature.setCode("CAMERA");
feature.setName("camera"); feature.setName("camera");
feature.setDescription("Enable or disable camera"); feature.setDescription("Enable or disable camera");
supportedFeatures.add(feature); supportedFeatures.add(feature);
feature = new Feature(); feature = WindowsUtils.getMobileFeature();
feature.setCode("DEVICE_INFO"); feature.setCode("DEVICE_INFO");
feature.setName("Device info"); feature.setName("Device info");
feature.setDescription("Request device information"); feature.setDescription("Request device information");
supportedFeatures.add(feature); supportedFeatures.add(feature);
feature = new Feature(); feature = WindowsUtils.getMobileFeature();
feature.setCode("WIPE_DATA"); feature.setCode("WIPE_DATA");
feature.setName("Wipe Data"); feature.setName("Wipe Data");
feature.setDescription("Factory reset the device"); feature.setDescription("Factory reset the device");
supportedFeatures.add(feature); supportedFeatures.add(feature);
feature = new Feature(); feature = WindowsUtils.getMobileFeature();
feature.setCode("ENCRYPT_STORAGE"); feature.setCode("ENCRYPT_STORAGE");
feature.setName("Encrypt storage"); feature.setName("Encrypt storage");
feature.setDescription("Encrypt storage"); feature.setDescription("Encrypt storage");
supportedFeatures.add(feature); supportedFeatures.add(feature);
feature = new Feature(); feature = WindowsUtils.getMobileFeature();
feature.setCode("DEVICE_RING"); feature.setCode("DEVICE_RING");
feature.setName("Ring"); feature.setName("Ring");
feature.setDescription("Ring the device"); feature.setDescription("Ring the device");
supportedFeatures.add(feature); supportedFeatures.add(feature);
feature = new Feature(); feature = WindowsUtils.getMobileFeature();
feature.setCode("PASSCODE_POLICY"); feature.setCode("PASSCODE_POLICY");
feature.setName("Password Policy"); feature.setName("Password Policy");
feature.setDescription("Set passcode policy"); feature.setDescription("Set passcode policy");
supportedFeatures.add(feature); supportedFeatures.add(feature);
feature = new Feature(); feature = WindowsUtils.getMobileFeature();
feature.setCode("DISENROLL"); feature.setCode("DISENROLL");
feature.setName("DisEnroll"); feature.setName("DisEnroll");
feature.setDescription("DisEnroll the device"); feature.setDescription("DisEnroll the device");
supportedFeatures.add(feature); supportedFeatures.add(feature);
feature = new Feature(); feature = WindowsUtils.getMobileFeature();
feature.setCode("LOCK_RESET"); feature.setCode("LOCK_RESET");
feature.setName("LockReset"); feature.setName("LockReset");
feature.setDescription("Lock Reset device"); feature.setDescription("Lock Reset device");

@ -39,7 +39,8 @@ public class WindowsDAOFactory extends AbstractMobileDeviceManagementDAOFactory
private static ThreadLocal<Connection> currentConnection = new ThreadLocal<>(); private static ThreadLocal<Connection> currentConnection = new ThreadLocal<>();
public WindowsDAOFactory() { public WindowsDAOFactory() {
this.dataSource = getDataSourceMap().get(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_WINDOWS); this.dataSource = getDataSourceMap().get(
DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_WINDOWS);
} }
@Override @Override

@ -21,7 +21,7 @@ package org.wso2.carbon.device.mgt.mobile.impl.windows.dao;
import org.wso2.carbon.device.mgt.mobile.dao.MobileDeviceManagementDAOException; import org.wso2.carbon.device.mgt.mobile.dao.MobileDeviceManagementDAOException;
/** /**
* Implement Exception class for Windows Device Features. * This class responsible for wrapping exceptions related on Windows device features.
*/ */
public class WindowsFeatureManagementDAOException extends MobileDeviceManagementDAOException { public class WindowsFeatureManagementDAOException extends MobileDeviceManagementDAOException {

@ -25,6 +25,7 @@ import org.wso2.carbon.device.mgt.mobile.dao.util.MobileDeviceManagementDAOUtil;
import org.wso2.carbon.device.mgt.mobile.dto.MobileDevice; import org.wso2.carbon.device.mgt.mobile.dto.MobileDevice;
import org.wso2.carbon.device.mgt.mobile.impl.windows.dao.WindowsDAOFactory; import org.wso2.carbon.device.mgt.mobile.impl.windows.dao.WindowsDAOFactory;
import org.wso2.carbon.device.mgt.mobile.impl.windows.util.WindowsPluginConstants; import org.wso2.carbon.device.mgt.mobile.impl.windows.util.WindowsPluginConstants;
import org.wso2.carbon.device.mgt.mobile.impl.windows.util.WindowsUtils;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@ -60,17 +61,7 @@ public class WindowsDeviceDAOImpl implements MobileDeviceDAO {
rs = stmt.executeQuery(); rs = stmt.executeQuery();
while (rs.next()) { while (rs.next()) {
mobileDevice = new MobileDevice(); mobileDevice = WindowsUtils.loadMobileDevices(rs);
mobileDevice.setMobileDeviceId(rs.getString(WindowsPluginConstants.DEVICE_ID));
mobileDevice.setImei(rs.getString(WindowsPluginConstants.IMEI));
mobileDevice.setImsi(rs.getString(WindowsPluginConstants.IMSI));
mobileDevice.setModel(rs.getString(WindowsPluginConstants.DEVICE_MODEL));
mobileDevice.setVendor(rs.getString(WindowsPluginConstants.VENDOR));
mobileDevice.setLatitude(rs.getString(WindowsPluginConstants.LATITUDE));
mobileDevice.setLongitude(rs.getString(WindowsPluginConstants.LONGITUDE));
mobileDevice.setSerial(rs.getString(WindowsPluginConstants.SERIAL));
mobileDevice.setOsVersion(rs.getString(WindowsPluginConstants.LATITUDE));
Map<String, String> propertyMap = new HashMap<>(); Map<String, String> propertyMap = new HashMap<>();
propertyMap.put(WindowsPluginConstants.CHANNEL_URI, rs.getString(WindowsPluginConstants.CHANNEL_URI)); propertyMap.put(WindowsPluginConstants.CHANNEL_URI, rs.getString(WindowsPluginConstants.CHANNEL_URI));
propertyMap.put(WindowsPluginConstants.DEVICE_INFO, rs.getString(WindowsPluginConstants.DEVICE_INFO)); propertyMap.put(WindowsPluginConstants.DEVICE_INFO, rs.getString(WindowsPluginConstants.DEVICE_INFO));
@ -225,15 +216,7 @@ public class WindowsDeviceDAOImpl implements MobileDeviceDAO {
rs = stmt.executeQuery(); rs = stmt.executeQuery();
while (rs.next()) { while (rs.next()) {
mobileDevice = new MobileDevice(); mobileDevice = WindowsUtils.loadMobileDevices(rs);
mobileDevice.setMobileDeviceId(rs.getString(WindowsPluginConstants.DEVICE_ID));
mobileDevice.setVendor(rs.getString(WindowsPluginConstants.IMEI));
mobileDevice.setLatitude(rs.getString(WindowsPluginConstants.IMSI));
mobileDevice.setLongitude(rs.getString(WindowsPluginConstants.OS_VERSION));
mobileDevice.setImei(rs.getString(WindowsPluginConstants.DEVICE_MODEL));
mobileDevice.setImsi(rs.getString(WindowsPluginConstants.VENDOR));
mobileDevice.setOsVersion(rs.getString(WindowsPluginConstants.LATITUDE));
Map<String, String> propertyMap = new HashMap<>(); Map<String, String> propertyMap = new HashMap<>();
propertyMap.put(WindowsPluginConstants.CHANNEL_URI, rs.getString(WindowsPluginConstants.CHANNEL_URI)); propertyMap.put(WindowsPluginConstants.CHANNEL_URI, rs.getString(WindowsPluginConstants.CHANNEL_URI));
propertyMap.put(WindowsPluginConstants.DEVICE_INFO, rs.getString(WindowsPluginConstants.DEVICE_INFO)); propertyMap.put(WindowsPluginConstants.DEVICE_INFO, rs.getString(WindowsPluginConstants.DEVICE_INFO));

@ -43,10 +43,6 @@ public class WindowsFeatureDAOImpl implements MobileFeatureDAO {
private static final Log log = LogFactory.getLog(WindowsFeatureDAOImpl.class); private static final Log log = LogFactory.getLog(WindowsFeatureDAOImpl.class);
public WindowsFeatureDAOImpl() {
}
@Override @Override
public boolean addFeature(MobileFeature mobileFeature) throws MobileDeviceManagementDAOException { public boolean addFeature(MobileFeature mobileFeature) throws MobileDeviceManagementDAOException {
PreparedStatement stmt = null; PreparedStatement stmt = null;

@ -18,18 +18,33 @@
package org.wso2.carbon.device.mgt.mobile.impl.windows.util; package org.wso2.carbon.device.mgt.mobile.impl.windows.util;
import java.util.Map; import org.wso2.carbon.device.mgt.common.Feature;
import org.wso2.carbon.device.mgt.mobile.dto.MobileDevice;
import java.sql.ResultSet;
import java.sql.SQLException;
/** /**
* Contains utility methods used by Windows plugin. * Contains utility methods which are used by Windows plugin.
*/ */
public class WindowsUtils { public class WindowsUtils {
public static String getDeviceProperty(Map<String, String> deviceProperties, String property) {
String deviceProperty = deviceProperties.get(property); public static MobileDevice loadMobileDevices(ResultSet rs) throws SQLException {
if (deviceProperty == null) { MobileDevice mobileDevice = new MobileDevice();
return null; mobileDevice.setMobileDeviceId(rs.getString(WindowsPluginConstants.DEVICE_ID));
} mobileDevice.setImei(rs.getString(WindowsPluginConstants.IMEI));
return deviceProperty; mobileDevice.setImsi(rs.getString(WindowsPluginConstants.IMSI));
mobileDevice.setModel(rs.getString(WindowsPluginConstants.DEVICE_MODEL));
mobileDevice.setVendor(rs.getString(WindowsPluginConstants.VENDOR));
mobileDevice.setLatitude(rs.getString(WindowsPluginConstants.LATITUDE));
mobileDevice.setLongitude(rs.getString(WindowsPluginConstants.LONGITUDE));
mobileDevice.setSerial(rs.getString(WindowsPluginConstants.SERIAL));
mobileDevice.setOsVersion(rs.getString(WindowsPluginConstants.LATITUDE));
return mobileDevice;
}
public static Feature getMobileFeature() {
Feature feature = new Feature();
return feature;
} }
} }

@ -1,120 +0,0 @@
{
"deviceType": {
"label": "Android Sense",
"category": "iot"
},
"analyticStreams": [
{
"name": "Accelerometer",
"table": "DEVICE_ACCELEROMETER_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"ACCELEROMETER", "label":"Accelerometer", "ui-mapping":"y-axis"}}
]
}
},
{
"name": "Battery",
"table": "DEVICE_BATTERY_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"BATTERY", "label":"Battery Level", "ui-mapping":"y-axis"}}
]
}
},
{
"name": "GPS",
"table": "DEVICE_GPS_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.google-map",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"time"}},
{"column": {"name":"LATITUDE", "label":"Latitude", "ui-mapping":"lat"}},
{"column": {"name":"LONGITUDE", "label":"Longitude", "ui-mapping":"lat"}}
]
}
},
{
"name": "Gravity",
"table": "DEVICE_GRAVITY_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"GRAVITY", "label":"Gravity", "ui-mapping":"y-axis"}}
]
}
},
{
"name": "Gyroscope",
"table": "DEVICE_GYROSCOPE_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"GYROSCOPE", "label":"Gyroscope", "ui-mapping":"y-axis"}}
]
}
},
{
"name": "Light",
"table": "DEVICE_LIGHT_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"LIGHT", "label":"Light", "ui-mapping":"y-axis"}}
]
}
},
{
"name": "Magnetic",
"table": "DEVICE_MAGNETIC_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"MAGNETIC", "label":"Magnetic", "ui-mapping":"y-axis"}}
]
}
},
{
"name": "Pressure",
"table": "DEVICE_PRESSURE_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"PRESSURE", "label":"Pressure", "ui-mapping":"y-axis"}}
]
}
},
{
"name": "Proximity",
"table": "DEVICE_PROXIMITY_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.bar-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"PROXIMITY", "label":"Proximity", "ui-mapping":"y-axis"}}
]
}
},
{
"name": "Rotation",
"table": "DEVICE_ROTATION_SUMMARY",
"ui_unit": "cdmf.unit.analytics.line-chart",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"ROTATION", "label":"Rotation", "ui-mapping":"y-axis"}}
]
}
}
]
}

@ -1,6 +1,4 @@
instructions.configure = \ instructions.configure = \
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../conf/device-types/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.androidsense_${feature.version}/configs/,target:${installFolder}/../../conf/device-types/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.androidsense_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.androidsense_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/carbonapps/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/carbonapps/);\
@ -13,7 +11,6 @@ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../data
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.androidsense_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.androidsense_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\
instructions.unconfigure = \ instructions.unconfigure = \
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../conf/device-types/android_sense.json);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/android_sense.war);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/android_sense.war);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/android_sense);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/android_sense);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/android_sense);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/android_sense);\

@ -1,20 +0,0 @@
{
"deviceType": {
"label": "Arduino",
"category": "iot",
"downloadAgentUri": "arduino/enrollment/devices/download"
},
"analyticStreams": [
{
"name": "Temperature",
"table": "DEVICE_TEMPERATURE_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"TEMPERATURE", "label":"temperature", "ui-mapping":"y-axis"}}
]
}
}
]
}

@ -1,6 +1,4 @@
instructions.configure = \ instructions.configure = \
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../conf/device-types/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.arduino_${feature.version}/configs/,target:${installFolder}/../../conf/device-types/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.arduino_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.arduino_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/sketches/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/sketches/);\
@ -14,7 +12,6 @@ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../data
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.arduino_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.arduino_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\
instructions.unconfigure = \ instructions.unconfigure = \
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../conf/device-types/arduino.json);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/arduino.war);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/arduino.war);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/arduino);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/arduino);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/arduino);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/arduino);\

@ -1,20 +0,0 @@
{
"deviceType": {
"label": "RaspberryPi",
"category": "iot",
"downloadAgentUri": "raspberrypi/enrollment/devices/download"
},
"analyticStreams": [
{
"name": "Temperature",
"table": "DEVICE_TEMPERATURE_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"TEMPERATURE", "label":"Temperature", "ui-mapping":"y-axis"}}
]
}
}
]
}

@ -1,6 +1,4 @@
instructions.configure = \ instructions.configure = \
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../conf/device-types/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.raspberrypi_${feature.version}/configs/,target:${installFolder}/../../conf/device-types/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.raspberrypi_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.raspberrypi_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/sketches/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/sketches/);\
@ -14,7 +12,6 @@ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../data
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.raspberrypi_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.raspberrypi_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\
instructions.unconfigure = \ instructions.unconfigure = \
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../conf/device-types/raspberrypi.json);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/raspberrypi.war);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/raspberrypi.war);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/raspberrypi);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/raspberrypi);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/raspberrypi);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/raspberrypi);\

@ -1,11 +1,11 @@
define stream fireAlarmEventStream (deviceID string, temp int); define stream fireAlarmEventStream (deviceID string, temp int);
from fireAlarmEventStream#window.time(7886776 sec) from fireAlarmEventStream#window.time(10 sec)
select deviceID, max(temp) as maxValue select deviceID, max(temp) as maxValue
group by deviceID group by deviceID
insert into analyzeStream for expired-events; insert into analyzeStream for expired-events;
from analyzeStream[maxValue < 88] from analyzeStream[maxValue < 60]
select maxValue select maxValue
insert into bulbOnStream; insert into bulbOnStream;
from fireAlarmEventStream[temp > 1093] from fireAlarmEventStream[temp > 60]
select deviceID, temp select deviceID, temp
insert into bulbOffStream; insert into bulbOffStream;

@ -1,20 +0,0 @@
{
"deviceType": {
"label": "Virtual Firealarm",
"category": "virtual",
"downloadAgentUri": "virtual_firealarm/enrollment/devices/download"
},
"analyticStreams": [
{
"name": "Temperature",
"table": "DEVICE_TEMPERATURE_SUMMARY",
"ui_unit": {
"name": "cdmf.unit.analytics.line-chart",
"data":[
{"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}},
{"column": {"name":"TEMPERATURE", "label":"Temperature", "ui-mapping":"y-axis"}}
]
}
}
]
}

@ -1,6 +1,4 @@
instructions.configure = \ instructions.configure = \
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../conf/device-types/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.virtualfirealarm_${feature.version}/configs/,target:${installFolder}/../../conf/device-types/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.virtualfirealarm_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.iot.virtualfirealarm_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/sketches/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/sketches/);\
@ -19,7 +17,6 @@ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../featur
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/device-types/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/device-types/);\
instructions.unconfigure = \ instructions.unconfigure = \
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../conf/device-types/virtual_firealarm.json);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/virtual_firealarm.war);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/virtual_firealarm.war);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/virtual_firealarm);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/virtual_firealarm);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/virtual_firealarm_scep.war);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/virtual_firealarm_scep.war);\

@ -1,6 +1,4 @@
instructions.configure = \ instructions.configure = \
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../conf/device-types/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/configs/,target:${installFolder}/../../conf/device-types/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.android_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\
@ -18,5 +16,4 @@ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../dep
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-wizard);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.policy-wizard);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.type-view);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.type-view);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/android);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/android);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../conf/device-types/android.json);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../database/WSO2MobileAndroid_DB.h2.db);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../database/WSO2MobileAndroid_DB.h2.db);\

@ -1,6 +1,4 @@
instructions.configure = \ instructions.configure = \
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../conf/device-types/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.windows_${feature.version}/configs/,target:${installFolder}/../../conf/device-types/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.windows_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.windows_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.windows_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.mobile.windows_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\
@ -17,5 +15,4 @@ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../dep
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.windows.policy-wizard);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.windows.policy-wizard);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.windows.type-view);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.windows.type-view);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/windows);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/windows);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../conf/device-types/windows.json);\
org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../database/WSO2MobileWindows_DB.h2.db);\ org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../database/WSO2MobileWindows_DB.h2.db);\

@ -44,6 +44,12 @@
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<!--Swagger Dependency-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--Carbon Kernel Dependencies--> <!--Carbon Kernel Dependencies-->
<dependency> <dependency>
@ -1087,6 +1093,9 @@
<!-- Jetty --> <!-- Jetty -->
<jetty.version>8.1.3.v20120416</jetty.version> <jetty.version>8.1.3.v20120416</jetty.version>
<!-- Swagger -->
<swagger.version>1.5.8</swagger.version>
<!-- Carbon Analytics --> <!-- Carbon Analytics -->
<carbon.analytics.common.version>5.0.11</carbon.analytics.common.version> <carbon.analytics.common.version>5.0.11</carbon.analytics.common.version>
<carbon.analytics.common.version.range>[5.0.11,6.0.0)</carbon.analytics.common.version.range> <carbon.analytics.common.version.range>[5.0.11,6.0.0)</carbon.analytics.common.version.range>

Loading…
Cancel
Save