diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml index dd66b2ab02..2f8d129a4f 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml @@ -83,6 +83,7 @@ javax.xml.bind, org.wso2.carbon.utils.*, org.wso2.carbon.device.mgt.common.*, + io.swagger.annotations.*;resolution:=optional, org.wso2.carbon.device.mgt.core.*, org.bouncycastle.pkcs.jcajce @@ -166,6 +167,12 @@ org.wso2.carbon.devicemgt org.wso2.carbon.device.mgt.common + + + io.swagger + swagger-annotations + provided + diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/dto/CertificateResponse.java b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/dto/CertificateResponse.java index 5ffb8270f3..9d0504e2dc 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/dto/CertificateResponse.java +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/dto/CertificateResponse.java @@ -18,19 +18,42 @@ package org.wso2.carbon.certificate.mgt.core.dto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import java.math.BigInteger; +@ApiModel(value = "CertificateResponse", description = "This class carries all information related to certificates") public class CertificateResponse { + @ApiModelProperty(name = "certificate", value = "The certificate in bytes", required = true) byte[] certificate; + + @ApiModelProperty(name = "serialNumber", value = "It is the unique ID that is used to identify a certificate", required = true) String serialNumber; + + @ApiModelProperty(name = "tenantId", value = "The ID of the tenant who adds the certificate", required = true) int tenantId; + + @ApiModelProperty(name = "commonName", value = "In mutual SSL the common name refers to the serial number of the Android device.", required = true) String commonName; + + @ApiModelProperty(name = "notAfter", value = "The expiration date of the certificate that is inherent to the certificate", required = true) long notAfter; + + @ApiModelProperty(name = "notBefore", value = "The date from when the certificate is valid", required = true) long notBefore; + + @ApiModelProperty(name = "certificateserial", value = "The serial number of the certificate", required = true) BigInteger certificateserial; + + @ApiModelProperty(name = "issuer", value = "The identity of the authority that signs the SSL certificate", required = true) String issuer; + + @ApiModelProperty(name = "subject", value = "The identity of the certificate", required = true) String subject; + + @ApiModelProperty(name = "certificateVersion", value = "The version of the certificate", required = true) int certificateVersion; public long getNotAfter() { diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java index f6c051ebc2..f8cc47cbf4 100755 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java @@ -39,13 +39,19 @@ import org.bouncycastle.cms.CMSException; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.cms.CMSSignedDataGenerator; import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.openssl.PEMWriter; import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.OperatorCreationException; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import org.bouncycastle.pkcs.PKCS10CertificationRequest; import org.bouncycastle.util.Store; -import org.jscep.message.*; +import org.jscep.message.PkcsPkiEnvelopeDecoder; +import org.jscep.message.PkiMessageDecoder; +import org.jscep.message.PkiMessage; +import org.jscep.message.CertRep; +import org.jscep.message.PkcsPkiEnvelopeEncoder; +import org.jscep.message.PkiMessageEncoder; +import org.jscep.message.MessageEncodingException; +import org.jscep.message.MessageDecodingException; import org.jscep.transaction.FailInfo; import org.jscep.transaction.Nonce; import org.jscep.transaction.TransactionId; @@ -65,7 +71,6 @@ import org.wso2.carbon.device.mgt.common.TransactionManagementException; import javax.security.auth.x500.X500Principal; import javax.xml.bind.DatatypeConverter; import java.io.*; -import java.math.BigInteger; import java.security.*; import java.security.cert.Certificate; import java.security.cert.*; @@ -276,7 +281,7 @@ public class CertificateGenerator { public boolean verifySignature(String headerSignature) throws KeystoreException { Certificate certificate = extractCertificateFromSignature(headerSignature); - return (certificate != null); + return (certificate != null); } public CertificateResponse verifyPEMSignature(X509Certificate requestCertificate) throws KeystoreException { @@ -303,7 +308,7 @@ public class CertificateGenerator { public static String getCommonName(X509Certificate requestCertificate) { String distinguishedName = requestCertificate.getSubjectDN().getName(); - if(distinguishedName != null && !distinguishedName.isEmpty()) { + if (distinguishedName != null && !distinguishedName.isEmpty()) { String[] dnSplits = distinguishedName.split(","); for (String dnSplit : dnSplits) { if (dnSplit.contains("CN=")) { @@ -363,12 +368,12 @@ public class CertificateGenerator { X509Certificate reqCert = (X509Certificate) certificateFactory. generateCertificate(byteArrayInputStream); - if(reqCert != null && reqCert.getSerialNumber() != null) { + if (reqCert != null && reqCert.getSerialNumber() != null) { Certificate lookUpCertificate = keyStoreReader.getCertificateByAlias( reqCert.getSerialNumber().toString()); if (lookUpCertificate != null && (lookUpCertificate instanceof X509Certificate)) { - return (X509Certificate)lookUpCertificate; + return (X509Certificate) lookUpCertificate; } } @@ -391,8 +396,8 @@ public class CertificateGenerator { } public X509Certificate generateCertificateFromCSR(PrivateKey privateKey, - PKCS10CertificationRequest request, - String issueSubject) + PKCS10CertificationRequest request, + String issueSubject) throws KeystoreException { CommonUtil commonUtil = new CommonUtil(); @@ -424,10 +429,10 @@ public class CertificateGenerator { certificateBuilder.addExtension(X509Extension.keyUsage, true, new KeyUsage( KeyUsage.digitalSignature | KeyUsage.keyEncipherment)); - if(attributes != null) { + if (attributes != null) { ASN1Encodable extractedValue = getChallengePassword(attributes); - if(extractedValue != null) { + if (extractedValue != null) { certificateBuilder.addExtension(PKCSObjectIdentifiers.pkcs_9_at_challengePassword, true, extractedValue); } @@ -466,7 +471,7 @@ public class CertificateGenerator { for (Attribute attribute : attributes) { if (PKCSObjectIdentifiers.pkcs_9_at_challengePassword.equals(attribute.getAttrType())) { - if(attribute.getAttrValues() != null && attribute.getAttrValues().size() > 0) { + if (attribute.getAttrValues() != null && attribute.getAttrValues().size() > 0) { return attribute.getAttrValues().getObjectAt(0); } } @@ -623,13 +628,12 @@ public class CertificateGenerator { log.error(errorMsg, e); CertificateManagementDAOFactory.rollbackTransaction(); throw new KeystoreException(errorMsg, e); - }finally { + } finally { CertificateManagementDAOFactory.closeConnection(); } } - public String extractChallengeToken(X509Certificate certificate) { byte[] challengePassword = certificate.getExtensionValue( diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Certificate.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Certificate.java index 3676479cae..af03e226aa 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Certificate.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Certificate.java @@ -19,16 +19,25 @@ package org.wso2.carbon.device.mgt.jaxrs.api; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.wso2.carbon.certificate.mgt.core.dto.CertificateResponse; +import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.jaxrs.api.common.MDMAPIException; +import org.wso2.carbon.device.mgt.jaxrs.api.util.ResponsePayload; import org.wso2.carbon.device.mgt.jaxrs.beans.EnrollmentCertificate; import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * All the certificate related tasks such as saving certificates, can be done through this endpoint. */ -@Api(value = "Certificate", description = "certificate related tasks such as saving certificates") +@Api(value = "Certificate", description = "Certificate related tasks such as saving certificates, " + + "can be done through this API") @SuppressWarnings("NonJaxWsWebServices") @Produces({ "application/json", "application/xml" }) @Consumes({ "application/json", "application/xml" }) @@ -43,8 +52,20 @@ public interface Certificate { */ @POST @Path("saveCertificate") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "POST", + value = "Adding an SSL Certificate", + notes = "Add a new SSL certificate to the client end database") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Added successfully"), + @ApiResponse(code = 500, message = "Error occurred while saving the certificate") + }) Response saveCertificate(@HeaderParam("Accept") String acceptHeader, - EnrollmentCertificate[] enrollmentCertificates); + @ApiParam(name = "enrollmentCertificates", value = "certificate with serial, " + + "pem and tenant id", required = true) EnrollmentCertificate[] + enrollmentCertificates); /** * Get a certificate when the serial number is given. @@ -54,7 +75,21 @@ public interface Certificate { */ @GET @Path("{serialNumber}") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "GET", + value = "Getting Details of an SSL Certificate", + notes = "Get the client side SSL certificate details", + response = CertificateResponse.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Notification status updated successfully"), + @ApiResponse(code = 500, message = "Error occurred while converting PEM file to X509Certificate") + }) Response getCertificate(@HeaderParam("Accept") String acceptHeader, + @ApiParam(name = "serialNumber", value = "Provide the serial number of the " + + "certificate that you wish to get the details of", required = true) @PathParam("serialNumber") String serialNumber); /** @@ -67,13 +102,46 @@ public interface Certificate { */ @GET @Path("paginate") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "GET", + value = "Getting the Certificate Details in a Paginated Manner", + notes = "You will have many certificates used for mutual SSL. In a situation where you wish to " + + "view all the certificate details, it is not feasible to show all the details on one " + + "page therefore the details are paginated", + response = PaginationResult.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Invalid start index"), + @ApiResponse(code = 400, message = "Invalid length value"), + @ApiResponse(code = 500, message = "Error occurred while fetching all certificates") + }) Response getAllCertificates(@HeaderParam("Accept") String acceptHeader, - @QueryParam("start") int startIndex, @QueryParam("length") int length) - throws MDMAPIException; + @ApiParam(name = "start", + value = "Provide the starting pagination index as the value", required = true) + @QueryParam("start") int startIndex, + @ApiParam(name = "length", value = "Provide how many certificate details you" + + " require from the starting pagination index as the value", + required = true) @QueryParam("length") int length) throws MDMAPIException; @DELETE @Path("{serialNumber}") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "DELETE", + value = "Deleting an SSL Certificate", + notes = "Delete an SSL certificate that's on the client end", + response = boolean.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Invalid start index"), + @ApiResponse(code = 500, message = "Error when deleting the certificate" + ) }) Response removeCertificate(@HeaderParam("Accept") String acceptHeader, - @PathParam("serialNumber") String serialNumber) throws MDMAPIException; + @ApiParam(name = "serialNumber", value = "Provide the serial number of the " + + "certificate that you wish to delete", required = true) + @PathParam("serialNumber") String serialNumber) throws MDMAPIException; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Configuration.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Configuration.java index a1602eada3..7c5db4f189 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Configuration.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Configuration.java @@ -19,28 +19,71 @@ package org.wso2.carbon.device.mgt.jaxrs.api; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration; +import org.wso2.carbon.device.mgt.jaxrs.api.util.ResponsePayload; import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * General Tenant Configuration REST-API implementation. * All end points support JSON, XMl with content negotiation. */ -@Api(value = "Configuration", description = "General Tenant Configuration implementation") +@Api(value = "Configuration", description = "General Tenant Configuration management capabilities are exposed " + + "through " + + "this API") @SuppressWarnings("NonJaxWsWebServices") @Produces({ "application/json", "application/xml" }) @Consumes({ "application/json", "application/xml" }) public interface Configuration { @POST - Response saveTenantConfiguration(TenantConfiguration configuration); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "POST", + value = "Configuring general platform settings", + notes = "Configure the general platform settings using this REST API") + @ApiResponses(value = { + @ApiResponse(code = 201, message = "Tenant configuration saved successfully"), + @ApiResponse(code = 500, message = "Error occurred while saving the tenant configuration") + }) + Response saveTenantConfiguration(@ApiParam(name = "configuration", value = "The required properties to " + + "update the platform configurations the as the value", + required = true) TenantConfiguration configuration); @GET + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "GET", + value = "Getting General Platform Configurations", + notes = "Get the general platform level configuration details using this REST API", + response = TenantConfiguration.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 500, message = "Error occurred while retrieving the tenant configuration") + }) Response getConfiguration(); @PUT - Response updateConfiguration(TenantConfiguration configuration); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "PUT", + value = "Updating General Platform Configurations", + notes = "Update the notification frequency using this REST API") + @ApiResponses(value = { + @ApiResponse(code = 201, message = "Tenant configuration updated successfully"), + @ApiResponse(code = 500, message = "Error occurred while updating the tenant configuration") + }) + Response updateConfiguration(@ApiParam(name = "configuration", value = "The required properties to update" + + " the platform configurations the as the value", + required = true) TenantConfiguration configuration); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Device.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Device.java index e3d3d9e745..0dc381d335 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Device.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Device.java @@ -20,6 +20,7 @@ package org.wso2.carbon.device.mgt.jaxrs.api; import io.swagger.annotations.*; import org.wso2.carbon.device.mgt.common.EnrolmentInfo; +import org.wso2.carbon.device.mgt.core.dto.DeviceType; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; @@ -28,7 +29,8 @@ import javax.ws.rs.core.Response; /** * Device related operations such as get all the available devices, etc. */ -@Api(value = "Devices") + +@Api(value = "Device", description = "Device related operations such as get all the available devices, etc.") @SuppressWarnings("NonJaxWsWebServices") public interface Device { @@ -43,22 +45,37 @@ public interface Device { consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON, httpMethod = "GET", - value = "Returns the set of devices that matches a given device type, user, role, " - + "enrollment status, ownership type", - notes = "Returns 500 if the operation fails", - response = Device.class, + value = "Returns device list", + notes = "Returns the set of devices that matches a given device type, user, role, " + + "enrollment status, ownership type", + response = org.wso2.carbon.device.mgt.common.Device.class, responseContainer = "List") - @ApiResponses(value = { @ApiResponse(code = 200, message = "List of Devices"), - @ApiResponse(code = 500, message = "Server Error") }) - Response getAllDevices( - @ApiParam(name = "type", value = "Provide the device type, such as ios, android or windows", required = true) @QueryParam("type") String type, - @ApiParam(name = "user", value = "Get the details of the devices registered to a user by providing the user name", required = true) @QueryParam("user") String user, - @ApiParam(name = "role", value = "Get the details of the devices registered to a specific role by providing the role name", required = true) @QueryParam("role") String role, - @ApiParam(name = "status", value = "Provide the device status details, such as active or inactive", required = true) @QueryParam("status") EnrolmentInfo.Status status, - @ApiParam(name = "start", value = "Provide the starting pagination index", required = true) @QueryParam("start") int startIdx, - @ApiParam(name = "length", value = "Provide how many device details you require from the starting pagination index", required = true) @QueryParam("length") int length, - @ApiParam(name = "device-name", value = "Provide the name of a registered device and receive the specified device details", required = true) @QueryParam("device-name") String deviceName, - @ApiParam(name = "ownership", value = "Provide the device ownership type and receive the specific device details", required = true) @QueryParam("ownership") EnrolmentInfo.OwnerShip ownership); + @ApiResponses(value = { + @ApiResponse(code = 200, message = "List of Devices"), + @ApiResponse(code = 500, message = "Error occurred while fetching the device list") + }) + Response getAllDevices(@ApiParam(name = "type", value = "Provide the device type, such as ios, android or" + + " windows", required = true) @QueryParam("type") String type, + @ApiParam(name = "user", value = "Get the details of the devices registered to a " + + "user by providing the user name", required = true) @QueryParam("user") + String user, + @ApiParam(name = "role", value = "Get the details of the devices registered to a " + + "specific role by providing the role name", required = true) + @QueryParam("role") String role, + @ApiParam(name = "status", value = "Provide the device status details, such as " + + "active or inactive", required = true) @QueryParam("status") + EnrolmentInfo.Status status, + @ApiParam(name = "start", value = "Provide the starting pagination index", + required = true) @QueryParam("start") int startIdx, + @ApiParam(name = "length", value = "Provide how many device details you require " + + "from the starting pagination index", required = true) + @QueryParam("length") int length, + @ApiParam(name = "device-name", value = "Provide the name of a registered device " + + "and receive the specified device details", required = true) + @QueryParam("device-name") String deviceName, + @ApiParam(name = "ownership", value = "Provide the device ownership type and " + + "receive the specific device details", required = true) + @QueryParam("ownership") EnrolmentInfo.OwnerShip ownership); /** * Fetch device details for a given device type and device Id. @@ -66,14 +83,6 @@ public interface Device { * @return Device wrapped inside Response */ @GET - @ApiOperation( - produces = MediaType.APPLICATION_JSON, - httpMethod = "GET", - value = "Fetch device details for a given device type and device Id", - notes = "Returns 500 if the operation fails", - response = Device.class) - @ApiResponses(value = { @ApiResponse(code = 200, message = "Matching Device"), - @ApiResponse(code = 500, message = "Server Error") }) @Path("view") @Produces({ MediaType.APPLICATION_JSON }) Response getDevice(@QueryParam("type") String type, @QueryParam("id") String id); @@ -104,14 +113,16 @@ public interface Device { * @return device count */ @GET + @Path("count") @ApiOperation( httpMethod = "GET", - value = "Returns the current device count", - notes = "Returns 500 if the operation fails", + value = "Getting the Device Count", + notes = "Get the number of devices that are registered with WSO2 EMM.", response = Integer.class) - @ApiResponses(value = { @ApiResponse(code = 200, message = "Device count"), - @ApiResponse(code = 500, message = "Server Error") }) - @Path("count") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Device count"), + @ApiResponse(code = 500, message = "Error occurred while fetching the device count") + }) Response getDeviceCount(); /** @@ -123,8 +134,21 @@ public interface Device { */ @GET @Path("name/{name}/{tenantDomain}") - Response getDevicesByName(@PathParam("name") String deviceName, - @PathParam("tenantDomain") String tenantDomain); + @ApiOperation( + httpMethod = "GET", + value = "Get the device details of a specific device via the REST API", + notes = "Get the device details of a specific device", + response = DeviceType.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "List of devices"), + @ApiResponse(code = 500, message = "Error occurred while fetching the devices list of device name") + }) + Response getDevicesByName(@ApiParam(name = "name", value = "The name of the device or windows", + required = true) @PathParam("name") String deviceName, + @ApiParam(name = "tenantDomain", value = "Tenant domain name. The default " + + "tenant domain of WSO2 EMM is carbon.super", required = true) + @PathParam("tenantDomain") String tenantDomain); /** * Get the list of available device types. @@ -133,6 +157,16 @@ public interface Device { */ @GET @Path("types") + @ApiOperation( + httpMethod = "GET", + value = "Getting Details of the Devices Supported via WSO2 EMM", + notes = "You are able to register Android, iOS and Windows devices with WSO2 EMM. This API will " + + "retrieve the device type details that can register with the EMM", + response = DeviceType.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "List of devices based on the type"), + @ApiResponse(code = 500, message = "Error occurred while fetching the list of device types") }) Response getDeviceTypes(); /** diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceInformation.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceInformation.java index 5cff26e61f..40bd74aa62 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceInformation.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceInformation.java @@ -19,25 +19,65 @@ package org.wso2.carbon.device.mgt.jaxrs.api; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo; +import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation; +import org.wso2.carbon.device.mgt.jaxrs.beans.UserCredentialWrapper; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * Device information related operations. */ -@Api(value = "DeviceInfo") + +@Api(value = "DeviceInformation", description = "Device information related operations can be found here.") @SuppressWarnings("NonJaxWsWebServices") public interface DeviceInformation { @GET @Path("{type}/{id}") - Response getDeviceInfo(@PathParam("type") String type, @PathParam("id") String id); + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get device information", + notes = "This will return device information such as CPU usage, memory usage etc.", + response = DeviceInfo.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = ""), + @ApiResponse(code = 400, message = ""), + @ApiResponse(code = 400, message = ""), + @ApiResponse(code = 500, message = "Internal Server Error") + }) + Response getDeviceInfo(@ApiParam(name = "type", value = "Provide the device type, such as ios, android " + + "or windows", required = true) @PathParam("type") String type, + @ApiParam(name = "id", value = "Provide the device identifier", required = true) + @PathParam("id") String id); @GET @Path("location/{type}/{id}") - Response getDeviceLocation(@PathParam("type") String type, @PathParam("id") String id); + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Get the device location", + notes = "This will return the device location including latitude and longitude as well the " + + "physical address", + response = DeviceLocation.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = ""), + @ApiResponse(code = 400, message = ""), + @ApiResponse(code = 400, message = ""), + @ApiResponse(code = 500, message = "Internal Server Error") + }) + Response getDeviceLocation(@ApiParam(name = "type", value = "Provide the device type, such as ios, " + + "android or windows", required = true) @PathParam("type") String type, + @ApiParam(name = "id", value = "Provide the device identifier", + required = true) @PathParam("id") String id); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceNotification.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceNotification.java index 62c2bcdaa3..41f1747b34 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceNotification.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceNotification.java @@ -19,7 +19,12 @@ package org.wso2.carbon.device.mgt.jaxrs.api; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; import org.wso2.carbon.device.mgt.common.notification.mgt.Notification; +import org.wso2.carbon.device.mgt.jaxrs.api.util.ResponsePayload; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -28,31 +33,84 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * DeviceNotification management REST-API implementation. * All end points support JSON, XMl with content negotiation. */ -@Api(value = "DeviceNotification") +@Api(value = "DeviceNotification", description = "Device notification related operations can be found here.") @SuppressWarnings("NonJaxWsWebServices") @Produces({"application/json", "application/xml"}) @Consumes({ "application/json", "application/xml" }) public interface DeviceNotification { @GET + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "GET", + value = "Getting all Device Notification Details", + notes = "Get the details of all notifications that were pushed to the device in WSO2 EMM using " + + "this REST API", + response = Notification.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "List of Notifications"), + @ApiResponse(code = 500, message = "Error occurred while retrieving the notification list") + }) Response getNotifications(); @GET @Path("{status}") - Response getNotificationsByStatus(@PathParam("status") Notification.Status status); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "GET", + value = "Getting the Device Notifications Filtered by the Status", + notes = "Get the details of all the unread notifications or the details of all the read " + + "notifications using this REST API", + response = Notification.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "List of Notifications"), + @ApiResponse(code = 500, message = "Error occurred while retrieving the notification list") + }) + Response getNotificationsByStatus(@ApiParam(name = "status", value = "Provide the notification status as" + + " the value for {status}", required = true) + @PathParam("status") Notification.Status status); @PUT @Path("{id}/{status}") - Response updateNotificationStatus(@PathParam("id") int id, - @PathParam("status") Notification.Status status); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "PUT", + value = "Updating the Device Notification Status", + notes = "When a user has read the the device notification the device notification status must " + + "change from NEW to CHECKED. Update the device notification status using this REST API") + @ApiResponses(value = { + @ApiResponse(code = 201, message = "Notification status updated successfully"), + @ApiResponse(code = 500, message = "Error occurred while updating notification status") + }) + Response updateNotificationStatus( @ApiParam(name = "id", value = "Provide the ID of the notification" + + " you wish you update", required = true) @PathParam("id") int id, + @ApiParam(name = "status", value = "Provide the notification status as" + + " the value", required = true) @PathParam("status") + Notification.Status status); @POST + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "POST", + value = "Sending a Device Notification", + notes = "Notify users on device operation failures and other information using this REST API") + @ApiResponses(value = { + @ApiResponse(code = 201, message = "NNotification has added successfully"), + @ApiResponse(code = 500, message = "Error occurred while updating notification status") + }) Response addNotification(Notification notification); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceSearch.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceSearch.java index ffb72fbebb..5760813e07 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceSearch.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/DeviceSearch.java @@ -19,18 +19,38 @@ package org.wso2.carbon.device.mgt.jaxrs.api; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.wso2.carbon.device.mgt.common.PaginationResult; +import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper; import org.wso2.carbon.device.mgt.common.search.SearchContext; import javax.ws.rs.GET; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * Device search related operations such as getting device information. */ -@Api(value = "DeviceSearch") + +@Api(value = "DeviceSearch", description = "Device searching related operations can be found here.") @SuppressWarnings("NonJaxWsWebServices") public interface DeviceSearch { @GET - Response getDeviceInfo(SearchContext searchContext); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Advanced Search for Devices via the Console", + notes = "Carry out an advanced search via the EMM console", + response = DeviceWrapper.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 500, message = "Error occurred while searching the device information") + }) + Response getDeviceInfo(@ApiParam(name = "enrollmentCertificates", value = "List of search conditions", + required = true) SearchContext searchContext); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Feature.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Feature.java index cafd085015..5051c153fc 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Feature.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Feature.java @@ -18,19 +18,21 @@ package org.wso2.carbon.device.mgt.jaxrs.api; -import io.swagger.annotations.Api; +import io.swagger.annotations.*; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * Features */ -@Api(value = "Feature") + +@Api(value = "Feature", description = "Feature management related operations can be found here.") @SuppressWarnings("NonJaxWsWebServices") @Produces({"application/json", "application/xml"}) @Consumes({"application/json", "application/xml"}) @@ -43,6 +45,20 @@ public interface Feature { */ @GET @Path("/{type}") - Response getFeatures(@PathParam("type") String type); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "GET", + value = "Get Feature Details of a Device", + notes = "WSO2 EMM features enable you to carry out many operations on a given device platform. " + + "Using this REST API you can get the features that can be carried out on a preferred device type," + + " such as iOS, Android or Windows.", + response = org.wso2.carbon.device.mgt.common.Feature.class, + responseContainer = "List") + @ApiResponses(value = { @ApiResponse(code = 200, message = "List of Features"), + @ApiResponse(code = 500, message = "Error occurred while retrieving the list of features" + + ".") }) + Response getFeatures(@ApiParam(name = "type", value = "Provide the device type, such as ios, android or windows", + required = true) @PathParam("type") String type); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Operation.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Operation.java index 9c8f854788..bb54200f16 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Operation.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Operation.java @@ -18,8 +18,12 @@ package org.wso2.carbon.device.mgt.jaxrs.api; -import io.swagger.annotations.Api; +import io.swagger.annotations.*; +import org.wso2.carbon.device.mgt.common.PaginationResult; +import org.wso2.carbon.device.mgt.common.app.mgt.Application; +import org.wso2.carbon.device.mgt.jaxrs.api.common.MDMAPIException; import org.wso2.carbon.device.mgt.jaxrs.api.context.DeviceOperationContext; +import org.wso2.carbon.device.mgt.jaxrs.api.util.ResponsePayload; import org.wso2.carbon.device.mgt.jaxrs.beans.ApplicationWrapper; import javax.ws.rs.GET; @@ -27,12 +31,14 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; /** * */ -@Api(value = "Operation") + +@Api(value = "Operation", description = "Operation management related operations can be found here.") public interface Operation { /* @deprecated */ @@ -41,13 +47,55 @@ public interface Operation { @GET @Path("paginate/{type}/{id}") - Response getDeviceOperations(@PathParam("type") String type, @PathParam("id") String id, - @QueryParam("start") int startIdx, @QueryParam("length") int length, + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "GET", + value = "Getting Pagination Details for Operations on a Device.", + notes = "You will carry out many operations on a device. In a situation where you wish to view the all" + + " the operations carried out on a device it is not feasible to show all the details on one page" + + " therefore the details are paginated." + + " Example: You carry out 21 operations via a given device. When you wish to see the operations " + + "carried out, the details of the 21 operations will be broken down into 3 pages with 10 operation" + + " details per page.", + response = org.wso2.carbon.device.mgt.common.operation.mgt.Operation.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "List of Operations on a device."), + @ApiResponse(code = 500, message = "Error occurred while fetching the operations for the " + + "device.") }) + Response getDeviceOperations(@ApiParam(name = "type", value = "Define the device type as the value for {type}. " + + "Example: ios, android or windows.", + required = true) @PathParam("type") String type, + @ApiParam(name = "id", value = "Define the device ID", + required = true) @PathParam("id") String id, + @ApiParam(name = "start", value = "Provide the starting pagination index. Example 10", + required = true) @QueryParam("start") int startIdx, + @ApiParam(name = "length", value = "Provide how many device details you require from" + + " the starting pagination index. For example if " + + "you require the device details from the 10th " + + "pagination index to the 15th, " + + "you must define 10 as the value for start and 5 " + + "as the value for length.", + required = true) @QueryParam("length") int length, @QueryParam("search") String search); @GET @Path("{type}/{id}") - Response getDeviceOperations(@PathParam("type") String type, @PathParam("id") String id); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "GET", + value = "Getting Device Operation Details.", + responseContainer = "List", + notes = "Get the details of operations carried out on a selected device.", + response = org.wso2.carbon.device.mgt.common.operation.mgt.Operation.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "List of Operations on a device."), + @ApiResponse(code = 500, message = "Error occurred while fetching the operations for the " + + "device.") }) + Response getDeviceOperations(@ApiParam(name = "type", value = "Define the device type as the value for {type}. " + + "Example: ios, android or windows.", + required = true) @PathParam("type") String type, + @ApiParam(name = "id", value = "Define the device ID", + required = true) @PathParam("id") String id); /* @deprecated */ @POST @@ -55,15 +103,73 @@ public interface Operation { @GET @Path("{type}/{id}/apps") - Response getInstalledApps(@PathParam("type") String type, @PathParam("id") String id); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "GET", + value = "Getting Installed Application Details of a Device.", + responseContainer = "List", + notes = "Get the list of applications that a device has subscribed.", + response = Application.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "List of installed application details of a device."), + @ApiResponse(code = 500, message = "Error occurred while fetching the apps of the device" + + ".") }) + Response getInstalledApps(@ApiParam(name = "type", value = "Define the device type as the value for {type}. " + + "Example: ios, android or windows.", + required = true) @PathParam("type") String type, + @ApiParam(name = "id", value = "Define the device ID", + required = true) @PathParam("id") String id); @POST @Path("installApp/{tenantDomain}") - Response installApplication(ApplicationWrapper applicationWrapper, - @PathParam("tenantDomain") String tenantDomain); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "POST", + value = "Installing an Application on a Device.", + notes = "Install a selected application on a device.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Operation was successfully added to the queue."), + @ApiResponse(code = 500, message = "Error occurred while saving the operation.") }) + Response installApplication(@ApiParam(name = "applicationWrapper", value = "Details about the application and the" + + " users and roles it should be " + + "installed on.", + required = true) ApplicationWrapper applicationWrapper, + @ApiParam(name = "tenantDomain", value = "Provide the tenant domain as the value for " + + "{tenantDomain}. The default tenant domain " + + "of WSO2 EMM is carbon.super.", + required = true) @PathParam("tenantDomain") String tenantDomain); @POST @Path("uninstallApp/{tenantDomain}") - Response uninstallApplication(ApplicationWrapper applicationWrapper, - @PathParam("tenantDomain") String tenantDomain); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "POST", + value = "Uninstalling an Application from a Device.", + notes = "Uninstall a selected application from a device.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Operation was successfully added to the queue."), + @ApiResponse(code = 500, message = "Error occurred while saving the operation.") }) + Response uninstallApplication(@ApiParam(name = "applicationWrapper", value = "Details about the application and" + + " the users and roles it should be " + + "uninstalled.", + required = true) ApplicationWrapper applicationWrapper, + @ApiParam(name = "tenantDomain", value = "Provide the tenant domain as the value for " + + "{tenantDomain}. The default tenant domain " + + "of WSO2 EMM is carbon.super.", + required = true) @PathParam("tenantDomain") String tenantDomain); + + + @GET + @Path("activity/{id}") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "POST", + value = "Retrieving the operation details.", + notes = "This will return the operation details including the responses from the devices") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Activity details provided successfully.."), + @ApiResponse(code = 500, message = "Error occurred while fetching the activity for the supplied id.") }) + Response getActivity(@ApiParam(name = "id", value = "Provide activity id {id} as ACTIVITY_(number)", + required = true) @PathParam("id") String id) + throws MDMAPIException; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Policy.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Policy.java index 1eebbb0c69..57a5521328 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Policy.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Policy.java @@ -18,8 +18,9 @@ package org.wso2.carbon.device.mgt.jaxrs.api; -import io.swagger.annotations.Api; +import io.swagger.annotations.*; import org.wso2.carbon.device.mgt.jaxrs.api.common.MDMAPIException; +import org.wso2.carbon.device.mgt.jaxrs.api.util.ResponsePayload; import org.wso2.carbon.device.mgt.jaxrs.beans.PolicyWrapper; import org.wso2.carbon.device.mgt.jaxrs.beans.PriorityUpdatedPolicyWrapper; @@ -37,64 +38,202 @@ import java.util.List; /** * */ -@Api(value = "Policy") + +@Api(value = "Policy", description = "Policy management related operations can be found here.") public interface Policy { @POST @Path("inactive-policy") - Response addPolicy(PolicyWrapper policyWrapper); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Adding a Policy.", + notes = "Add a policy using this REST API command. When adding a policy you will have the option of " + + "saving the policy or saving and publishing the policy. Using the REST API command given below " + + "you are able to save a created Policy and this policy will be in the inactive state") + @ApiResponses(value = { @ApiResponse(code = 201, message = "Created the policy."), + @ApiResponse(code = 500, message = "Policy Management related error occurred when " + + "adding the policy") }) + Response addPolicy(@ApiParam(name = "policyWrapper", value = "Policy details related to the operation.", + required = true) PolicyWrapper policyWrapper); @POST @Path("active-policy") - Response addActivePolicy(PolicyWrapper policyWrapper); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Adding an Active Policy.", + notes = "Add a policy that is in the active state using the REST API command. When adding a policy you " + + "will have the option of saving the policy or saving and publishing the policy. Using the REST " + + "API command given below you are able to save and publish a created policy and this policy will " + + "be in the active state.") + @ApiResponses(value = { @ApiResponse(code = 201, message = "Created the policy."), + @ApiResponse(code = 500, message = "Policy Management related error occurred when " + + "adding the policy") }) + Response addActivePolicy(@ApiParam(name = "policyWrapper", value = "Policy details related to the operation.", + required = true) PolicyWrapper policyWrapper); @GET @Produces({ MediaType.APPLICATION_JSON}) + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting Details of Policies.", + responseContainer = "List", + notes = "Retrieve the details of all the policies that you have created in WSO2 EMM.", + response = org.wso2.carbon.policy.mgt.common.Policy.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "Fetched all policies."), + @ApiResponse(code = 500, message = "Policy Management related error occurred when " + + "fetching the policies.") }) Response getAllPolicies(); @GET @Produces({MediaType.APPLICATION_JSON}) @Path("{id}") - Response getPolicy(@PathParam("id") int policyId); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting Details of a Policy.", + notes = "Retrieve the details of a selected policy in WSO2 EMM.", + response = org.wso2.carbon.policy.mgt.common.Policy.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "Fetched policy details."), + @ApiResponse(code = 500, message = "Policy Management related error occurred when " + + "fetching the policies.") }) + Response getPolicy(@ApiParam(name = "id", value = "Policy ID value to identify a policy uniquely.", + required = true) @PathParam("id") int policyId); @GET @Path("count") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting the Policy Count.", + notes = "Get the number of policies that are created in WSO2 EMM.", + response = Integer.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "Fetched the policy count."), + @ApiResponse(code = 500, message = "Error while Fetching the policy count.") }) Response getPolicyCount(); @PUT @Path("{id}") - Response updatePolicy(PolicyWrapper policyWrapper, @PathParam("id") int policyId); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Updating a Policy.", + notes = "If you wish to make changes to an existing policy, you can do so by updating the policy using " + + "this API") + @ApiResponses(value = { @ApiResponse(code = 201, message = "Policy has been updated successfully."), + @ApiResponse(code = 500, message = "Policy Management related exception in policy " + + "update") }) + Response updatePolicy(@ApiParam(name = "policyWrapper", value = "Policy details related to the operation.", + required = true) PolicyWrapper policyWrapper, + @ApiParam(name = "id", value = "Policy ID value to identify a policy uniquely.", + required = true) @PathParam("id") int policyId); @PUT @Path("priorities") @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) - Response updatePolicyPriorities(List priorityUpdatedPolicies); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Updating the Policy Priority.", + notes = "If you wish to make changes to the existing policy priority order, " + + "you can do so by updating the priority order using this API") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Policy Priorities successfully updated."), + @ApiResponse(code = 400, message = "Policy priorities did not update."), + @ApiResponse(code = 500, message = "Error in updating policy priorities.") }) + Response updatePolicyPriorities(@ApiParam(name = "priorityUpdatedPolicies", + value = "List of policy update details..", + required = true) List priorityUpdatedPolicies); @POST @Path("bulk-remove") @Consumes("application/json") @Produces("application/json") - Response bulkRemovePolicy(List policyIds); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Removing Multiple Policies.", + notes = "In situations where you need to delete more than one policy you can do so using this API.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Policies have been successfully deleted."), + @ApiResponse(code = 400, message = "Policy does not exist."), + @ApiResponse(code = 500, message = "Error in deleting policies.") }) + Response bulkRemovePolicy(@ApiParam(name = "policyIds", value = "Policy ID list to be deleted.", + required = true) List policyIds); @PUT @Produces("application/json") @Path("activate") - Response activatePolicy(List policyIds); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Activating Policies.", + notes = "Using the REST API command you are able to publish a policy in order to bring a policy that is " + + "in the inactive state to the active state.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Policies have been successfully activated."), + @ApiResponse(code = 500, message = "Error in activating policies.") }) + Response activatePolicy(@ApiParam(name = "policyIds", value = "Policy ID list to be activated.", + required = true) List policyIds); @PUT @Produces("application/json") @Path("inactivate") - Response inactivatePolicy(List policyIds) throws MDMAPIException; + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Deactivating Policies.", + notes = "Using the REST API command you are able to unpublish a policy in order to bring a policy that " + + "is in the active state to the inactive state.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Policies have been successfully deactivated."), + @ApiResponse(code = 500, message = "Error in deactivating policies.") }) + Response inactivatePolicy(@ApiParam(name = "policyIds", value = "Policy ID list to be deactivated.", + required = true) List policyIds) throws MDMAPIException; @PUT @Produces("application/json") @Path("apply-changes") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Applying Changes on Policies.", + notes = "Policies in the active state will be applied to new device that register with WSO2 EMM based on" + + " the policy enforcement criteria . In a situation where you need to make changes to existing" + + " policies (removing, activating, deactivating and updating) or add new policies, the existing" + + " devices will not receive these changes immediately. Once all the required changes are made" + + " you need to apply the changes to push the policy changes to the existing devices.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Changes have been successfully updated."), + @ApiResponse(code = 500, message = "Error in updating policies.") }) Response applyChanges(); @GET @Path("start-task/{milliseconds}") - Response startTaskService(@PathParam("milliseconds") int monitoringFrequency); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Starting Policy Monitoring.", + notes = "WSO2 EMM monitors the devices to identify any devices that have not complied to an enforced " + + "policy. The policy monitoring task begins at the point WSO2 EMM has a a published policy. " + + "It will monitor the device based on the policy monitoring frequency that you define in " + + "milliseconds.Using this REST API to start the policy monitoring task is optional as " + + "WSO2 EMM uses an OSGI call to start the monitoring task") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Policy monitoring service started successfully."), + @ApiResponse(code = 500, message = "Policy Management related exception when starting " + + "monitoring service.") }) + Response startTaskService(@ApiParam(name = "milliseconds", value = "Policy monitoring frequency in milliseconds.", + required = true) @PathParam("milliseconds") int monitoringFrequency); @GET @Path("update-task/{milliseconds}") @@ -110,5 +249,20 @@ public interface Policy { @GET @Path("{type}/{id}/active-policy") - Response getDeviceActivePolicy(@PathParam("type") String type, @PathParam("id") String id); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting Policy Enforced Details of a Device.", + notes = "When a device registers with WSO2 EMM a policy is enforced on the device. Initially the EMM " + + "filters the policies based on the Platform (device type), filters based on the device ownership" + + " type , filters based on the user role or name and finally the policy is enforced on the device.", + response = org.wso2.carbon.policy.mgt.common.Policy.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "Fetched current policy."), + @ApiResponse(code = 500, message = "Error occurred while getting the current policy.") }) + Response getDeviceActivePolicy(@ApiParam(name = "type", value = "Define the device type as the value for {type}." + + " Example: ios, android, windows..", + required = true) @PathParam("type") String type, + @ApiParam(name = "id", value = "Define the device ID as the value for {id}.", + required = true) @PathParam("id") String id); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Role.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Role.java index c6f9a9a2cf..a179d32e42 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Role.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Role.java @@ -18,8 +18,11 @@ package org.wso2.carbon.device.mgt.jaxrs.api; -import io.swagger.annotations.Api; +import io.swagger.annotations.*; +import org.wso2.carbon.device.mgt.common.app.mgt.Application; +import org.wso2.carbon.device.mgt.jaxrs.api.util.ResponsePayload; import org.wso2.carbon.device.mgt.jaxrs.beans.RoleWrapper; +import org.wso2.carbon.user.mgt.common.UIPermissionNode; import javax.ws.rs.DELETE; import javax.ws.rs.GET; @@ -36,51 +39,173 @@ import java.util.List; /** * */ -@Api(value = "Role") +@Api(value = "Role", description = "Role management related operations can be found here.") public interface Role { @GET @Produces({ MediaType.APPLICATION_JSON}) + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting the List of Roles.", + responseContainer = "List", + notes = "If you wish to get the details of all the roles in WSO2 EMM, you can do so using this REST API.", + response = String.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "List of available roles"), + @ApiResponse(code = 500, message = "Error occurred while fetching the role list.") }) Response getRoles(); @GET @Path("{userStore}") @Produces({MediaType.APPLICATION_JSON}) - Response getRoles(@PathParam("userStore") String userStore); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting the List of Roles in a User Store.", + responseContainer = "List", + notes = "If you wish to get the details of all the roles in WSO2 EMM, you can do so using this REST API.", + response = String.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "List of available roles"), + @ApiResponse(code = 500, message = "Error occurred while fetching the role list.") }) + Response getRoles(@ApiParam(name = "userStore", value = "Provide the name of the UserStore you wish to get the" + + " details from ", + required = true) @PathParam("userStore") String userStore); @GET @Path("search") @Produces({MediaType.APPLICATION_JSON}) - Response getMatchingRoles(@QueryParam("filter") String filter); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Searching for Roles via the Role Name.", + responseContainer = "List", + notes = "You will have many roles created within WSO2 EMM. As the admin you will need to confirm if a " + + "given role exists in the EMM. In such situation you can search for the role by giving a " + + "character or a few characters of the role name. The search will give you a list of roles that" + + " have the name in the exact order of the characters you provided.", + response = String.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "List of matching roles"), + @ApiResponse(code = 500, message = "Error occurred while fetching the matching role list" + + ".") }) + Response getMatchingRoles(@ApiParam(name = "filter", value = "Provide a character or a few characters in the" + + " role name.", + required = true) @QueryParam("filter") String filter); @GET @Path("permissions") @Produces({MediaType.APPLICATION_JSON}) - Response getPermissions(@QueryParam("rolename") String roleName); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting Permission Details of a Role.", + notes = "In an organization an individual is associated a with set of responsibilities based on their " + + "role. In WSO2 EMM you are able to configure permissions based on the responsibilities carried " + + "out by a role. Therefore if you wish to retrieve the permission details of a role, you can do " + + "so using this REST API.", + response = UIPermissionNode.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "Permission details of a role"), + @ApiResponse(code = 500, message = "Error occurred while fetching the permission " + + "details of a role.") }) + Response getPermissions(@ApiParam(name = "rolename", value = "Provide the name of the role you wish to get the " + + "permission details.", + required = true) @QueryParam("rolename") String roleName); @GET @Path("role") @Produces({MediaType.APPLICATION_JSON}) - Response getRole(@QueryParam("rolename") String roleName); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting Details of a Role.", + notes = "If you wish to get the details of a role in WSO2 EMM, you can do so using this REST API.", + response = RoleWrapper.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "Details of a role."), + @ApiResponse(code = 500, message = "Error occurred while retrieving the user role.") }) + Response getRole(@ApiParam(name = "rolename", value = "Provide the name of the role you wish to get the " + + "details.", + required = true) @QueryParam("rolename") String roleName); @POST @Produces({MediaType.APPLICATION_JSON}) - Response addRole(RoleWrapper roleWrapper); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Adding a Role.", + notes = "You are able to add a new role to WSO2 EMM using the REST API.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Added the role."), + @ApiResponse(code = 500, message = "Error occurred while adding the user role.") }) + Response addRole(@ApiParam(name = "roleWrapper", value = "Role and permission details.", + required = true) RoleWrapper roleWrapper); @PUT @Produces({MediaType.APPLICATION_JSON}) - Response updateRole(@QueryParam("rolename") String roleName, RoleWrapper roleWrapper); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Updating a Role.", + notes = "There will be situations where you will need to update the role details, such as the permissions" + + " or the role name. In such situation you can update the role details.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Updated the role."), + @ApiResponse(code = 500, message = "Error occurred while updating the user role details" + + ".") }) + Response updateRole(@ApiParam(name = "rolename", value = "Provide the name of the role you wish to update.", + required = true) @QueryParam("rolename") String roleName, + @ApiParam(name = "roleWrapper", value = "Role and permission details.", + required = true) RoleWrapper roleWrapper); @DELETE @Produces({MediaType.APPLICATION_JSON}) - Response deleteRole(@QueryParam("rolename") String roleName); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "DELETE", + value = "Deleting a Role.", + notes = "In a situation when your Organization identifies that a specific role is no longer required you " + + "will need to remove the role details from WSO2 EMM.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Deleted the role."), + @ApiResponse(code = 500, message = "Error occurred while deleting the user role details" + + ".") }) + Response deleteRole(@ApiParam(name = "rolename", value = "Provide the name of the role you wish to delete.", + required = true) @QueryParam("rolename") String roleName); @PUT @Path("users") @Produces({MediaType.APPLICATION_JSON}) - Response updateUsers(@QueryParam("rolename") String roleName, List userList); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Adding Users to a Role.", + notes = "Defining the users to a role at the point of creating a new role is optional, " + + "therefore you are able to update the users that belong to a given role after you have created " + + "a role using this REST API." + + "Example: Your Organization hires 30 new engineers. Updating the role details for each user can " + + "be cumbersome, therefore you can define all the new employees that belong to the engineering " + + "role using this API.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Added Users to a Role."), + @ApiResponse(code = 500, message = "Error occurred while saving the users of the role.") }) + Response updateUsers(@ApiParam(name = "rolename", value = "Provide the name of the role you wish to update.", + required = true) @QueryParam("rolename") String roleName, + @ApiParam(name = "userList", value = "Provide the names of the users you will to update.", + required = true) List userList); @GET @Path("count") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting the Role Count.", + response = Integer.class, + notes = "Get the number of roles in WSO2 EMM.") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Retrieved the role count."), + @ApiResponse(code = 500, message = "Error occurred while retrieving the role count.") }) Response getRoleCount(); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/User.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/User.java index e55a2bcb32..c3aefdbd82 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/User.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/User.java @@ -19,6 +19,12 @@ package org.wso2.carbon.device.mgt.jaxrs.api; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.apache.axis2.databinding.types.soapencoding.Integer; +import org.wso2.carbon.device.mgt.jaxrs.api.util.ResponsePayload; import org.wso2.carbon.device.mgt.jaxrs.beans.UserCredentialWrapper; import org.wso2.carbon.device.mgt.jaxrs.beans.UserWrapper; @@ -38,35 +44,117 @@ import java.util.List; /** * This represents the JAX-RS services of User related functionality. */ -@Api(value = "User") +@Api(value = "User", description = "User management related operations can be found here.") public interface User { @POST @Consumes({ MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) - Response addUser(UserWrapper userWrapper); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Adding a User via the REST API", + notes = "Adds a new user to WSO2 EMM using this REST API") + @ApiResponses(value = { + @ApiResponse(code = 201, message = "Created"), + @ApiResponse(code = 500, message = "Exception in trying to add user by username: 'username'") + }) + Response addUser(@ApiParam(name = "userWrapper", value = "Includes the required properties to add a user" + + " as the value", required = true) UserWrapper userWrapper); @GET @Path("view") @Produces({MediaType.APPLICATION_JSON}) - Response getUser(@QueryParam("username") String username); + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting Details of a User", + notes = "If you wish to get the details of a specific user that is registered with WSO2 EMM," + + " you can do so using the REST API", + response = UserWrapper.class) + @ApiResponses(value = { + @ApiResponse(code = 201, message = "User information was retrieved successfully"), + @ApiResponse(code = 400, message = "User by username: 'username' does not exist"), + @ApiResponse(code = 500, message = "Exception in trying to retrieve user by username: 'username'") + }) + Response getUser(@ApiParam(name = "username", value = "Provide the name of the user you wish to get the" + + " details of as the value", required = true) + @QueryParam("username") String username); @PUT @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) - Response updateUser(UserWrapper userWrapper, @QueryParam("username") String username); + @ApiOperation( + consumes = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + produces = MediaType.APPLICATION_JSON + ", " + MediaType.APPLICATION_XML, + httpMethod = "PUT", + value = "Updating Details of a User", + notes = "There will be situations where you will want to update the user details. In such " + + "situation you can update the user details using this REST API") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "User by username: 'username' was successfully updated"), + @ApiResponse(code = 409, message = "User by username: 'username' doesn't exists. Therefore, " + + "request made to update user was refused"), + @ApiResponse(code = 500, message = "Exception in trying to update user by username: 'username'") + }) + Response updateUser(@ApiParam(name = "userWrapper", value = "Provide the name of the user you wish to get" + + " the details of as the value", required = true) UserWrapper userWrapper, + @ApiParam(name = "username", value = "Provide the name of the user you wish to get " + + "the details of as the value", required = true) + @QueryParam("username") String username); @DELETE @Produces({MediaType.APPLICATION_JSON}) - Response removeUser(@QueryParam("username") String username); + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "DELETE", + value = "Deleting a User", + notes = "In a situation where an employee leaves the organization you will need to remove the" + + " user details from WSO2 EMM. In such situations you can use this REST API " + + "to remove a user") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "User by username: 'username' was successfully removed"), + @ApiResponse(code = 400, message = "User by username: 'username' does not exist for removal"), + @ApiResponse(code = 500, message = "Exception in trying to remove user by username: 'username'") + }) + Response removeUser(@ApiParam(name = "username", value = "Provide the name of the user you wish to delete" + + " as the value for {username}", required = true) + @QueryParam("username") String username); @GET @Path("roles") @Produces({MediaType.APPLICATION_JSON}) - Response getRoles(@QueryParam("username") String username); + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting the Role Details of a User", + notes = "A user can be assigned to one or more role in WSO2 EMM. Using this REST API you are " + + "able to get the role/roles a user is assigned to", + response = String.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "User roles obtained for user : 'username'"), + @ApiResponse(code = 400, message = "User by username: 'username' does not exist for role retrieval"), + @ApiResponse(code = 500, message = "Exception in trying to retrieve roles for user by username: 'username'") + }) + Response getRoles(@ApiParam(name = "username", value = "Provide the user name of the user you wish to get" + + " the role details", required = true) @QueryParam("username") String username); @GET @Produces({MediaType.APPLICATION_JSON}) + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting Details of Users", + notes = "If you wish to get the details of all the user registered with WSO2 EMM, you can do so " + + "using the REST API", + response = UserWrapper.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 201, message = "All users were successfully retrieved"), + @ApiResponse(code = 500, message = "Error occurred while retrieving the list of users") + }) Response getAllUsers(); @GET @@ -76,41 +164,152 @@ public interface User { @GET @Path("view-users") - Response getAllUsersByUsername(@QueryParam("username") String userName); + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting User Details by Searching via the User Name", + notes = "You will have 100+ users registered with WSO2 EMM. If you wish to retrieve the user " + + "details of a specific user, and you only remember part of the user's username, " + + "you are able to retrieve the user details by giving a character or a few characters " + + "in the username", + response = String.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "All users by username were successfully retrieved. Obtained" + + " user count: 'count'"), + @ApiResponse(code = 500, message = "Error occurred while retrieving the list of users") + }) + Response getAllUsersByUsername(@ApiParam(name = "username", value = "Provide any user detail of the user" + + " as the value for {username} to retrieve the user details, such " + + "as email address, first name or last name", required = true) + @QueryParam("username") String userName); @GET @Path("users-by-username") - Response getAllUserNamesByUsername(@QueryParam("username") String userName); + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Searching for a User Name", + notes = "You will have 100+ users registered with WSO2 EMM. Therefore if you are unsure of the " + + "user name of a user and need to retrieve the details of a specific user, you can " + + "search for that user by giving a character or a few characters in the username. " + + "You will be given a list of users having the user name with the exact order of the " + + "characters you provided", + response = String.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "All users by username were successfully retrieved. Obtained" + + " user count: 'count'"), + @ApiResponse(code = 500, message = "Error occurred while retrieving the list of users") + }) + Response getAllUserNamesByUsername(@ApiParam(name = "username", value = "Provide a character or a few " + + "character in the user name as the value for {username}", + required = true) @QueryParam("username") String userName); @POST @Path("email-invitation") @Produces({MediaType.APPLICATION_JSON}) - Response inviteExistingUsersToEnrollDevice(List usernames); + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Sending Enrollment Invitations to Users", + notes = "Send the users a mail inviting them to download the EMM mobile application on their " + + "devices using this REST API") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Email invitation was successfully sent to user"), + @ApiResponse(code = 500, message = "Error occurred while retrieving the list of users") + }) + Response inviteExistingUsersToEnrollDevice(@ApiParam(name = "usernames", value = "List of the users to be" + + " invited as the ", required = true) + List usernames); @GET @Produces({MediaType.APPLICATION_JSON}) @Path("devices") - Response getAllDeviceOfUser(@QueryParam("username") String username, @QueryParam("start") int startIdx, - @QueryParam("length") int length); + @ApiOperation( + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "Getting Device Details of a User", + notes = "If you wish to get the details of the devices enrolled by a specific user, you can do " + + "so using this REST API", + response = org.wso2.carbon.device.mgt.common.Device.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 500, message = "Device management error") + }) + Response getAllDeviceOfUser(@ApiParam(name = "username", value = "Provide the name of the user you wish " + + "to get the details", required = true) @QueryParam("username") + String username, + @ApiParam(name = "start", value = "Provide the starting pagination index", + required = true) @QueryParam("start") int startIdx, + @ApiParam(name = "length", value = "Provide how many device details you " + + "require from the starting pagination index", required = true) + @QueryParam("length") int length); @GET - @Path("count") + @Path("count") + @ApiOperation( + httpMethod = "GET", + value = "Getting the User Count", + notes = "Get the number of users in WSO2 EMM", + response = Integer.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 500, message = "Error occurred while retrieving the list of users that exist" + + " within the current tenant") + }) Response getUserCount(); @PUT - @Path("{roleName}/users") - @Produces({MediaType.APPLICATION_JSON}) + @Path("{roleName}/users") + @Produces({MediaType.APPLICATION_JSON}) Response updateRoles(@PathParam("username") String username, List userList); @POST - @Path("change-password") - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - Response resetPassword(UserCredentialWrapper credentials); + @Path("change-password") + @Consumes({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON}) + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Changing the User Password", + notes = "A user is able to change the password to secure their EMM profile via this REST API") + @ApiResponses(value = { + @ApiResponse(code = 201, message = "UserImpl password by username: 'Username' was " + + "successfully changed"), + @ApiResponse(code = 400, message = "Old password does not match"), + @ApiResponse(code = 400, message = "Could not change the password of the user: 'Username'. The" + + " Character Encoding is not supported"), + @ApiResponse(code = 500, message = "Internal Server Error") + }) + Response resetPassword(@ApiParam(name = "credentials", value = "Include the required properties to change" + + " the user password as value", required = true) + UserCredentialWrapper credentials); @POST - @Path("reset-password") - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - Response resetPasswordByAdmin(UserCredentialWrapper credentials); + @Path("reset-password") + @Consumes({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON}) + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Resetting the User Password", + notes = "In a situation where you need to block a user from accessing their EMM profile, " + + "the EMM administrator is able to reset the password. This will change the user's " + + "password and the user will not be able to able to login to the account as he/she is " + + "not aware of the new password.") + @ApiResponses(value = { + @ApiResponse(code = 201, message = "UserImpl password by username: 'Username' was " + + "successfully changed"), + @ApiResponse(code = 400, message = "Old password does not match"), + @ApiResponse(code = 400, message = "Could not change the password of the user: 'Username'. The" + + " Character Encoding is not supported"), + @ApiResponse(code = 500, message = "Internal Server Error") + }) + Response resetPasswordByAdmin(@ApiParam(name = "credentials", value = "Include the required properties " + + "to change a user password as value", + required = true) UserCredentialWrapper credentials); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/CertificateImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/CertificateImpl.java index 76689a3899..de062241f9 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/CertificateImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/CertificateImpl.java @@ -53,7 +53,7 @@ import java.util.List; @SuppressWarnings("NonJaxWsWebServices") @Produces({"application/json", "application/xml"}) @Consumes({ "application/json", "application/xml" }) -public class CertificateImpl implements Certificate{ +public class CertificateImpl implements Certificate { private static Log log = LogFactory.getLog(OperationImpl.class); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/OperationImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/OperationImpl.java index bdca4c5491..8306682668 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/OperationImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/OperationImpl.java @@ -224,4 +224,22 @@ public class OperationImpl implements org.wso2.carbon.device.mgt.jaxrs.api.Opera return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } } + + @Override + @GET + @Path("activity/{id}") + public Response getActivity(@PathParam("id") String id) + throws MDMAPIException { + org.wso2.carbon.device.mgt.common.operation.mgt.Operation operation; + DeviceManagementProviderService dmService; + try { + dmService = DeviceMgtAPIUtils.getDeviceManagementService(); + operation = dmService.getOperationByActivityId(id); + } catch (OperationManagementException e) { + String msg = "Error occurred while fetching the activity for the supplied id."; + log.error(msg, e); + throw new MDMAPIException(msg, e); + } + return Response.status(Response.Status.OK).entity(operation).build(); + } } \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/ApplicationWrapper.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/ApplicationWrapper.java index 4631e4e944..bb43a97643 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/ApplicationWrapper.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/ApplicationWrapper.java @@ -18,14 +18,23 @@ package org.wso2.carbon.device.mgt.jaxrs.beans; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import java.util.List; + +@ApiModel(value = "ApplicationWrapper", description = "Application details together with user, " + + "role or devices the application is associated with.") public class ApplicationWrapper { + @ApiModelProperty(name = "userNameList", value = "List of user names.", required = true ) private List userNameList; + @ApiModelProperty(name = "roleNameList", value = "List of role names.", required = true ) private List roleNameList; + @ApiModelProperty(name = "deviceIdentifiers", value = "List of device identifiers.", required = true ) private List deviceIdentifiers; + @ApiModelProperty(name = "application", value = "Details of the mobile application.", required = true ) private MobileApp application; public MobileApp getApplication() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/EnrollmentCertificate.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/EnrollmentCertificate.java index 40d94da4ed..d6a79db6f9 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/EnrollmentCertificate.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/EnrollmentCertificate.java @@ -18,9 +18,19 @@ package org.wso2.carbon.device.mgt.jaxrs.beans; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(value = "EnrollmentCertificate", description = "Details of certificates used in enrollment.") public class EnrollmentCertificate { + + @ApiModelProperty(name = "serial", value = "The unique ID used to identify a certificate. This is the devices " + + "serial number in case of mutual SSL is used for enrollment.", + required = true ) String serial; + @ApiModelProperty(name = "pem", value = "Case 64 encode .pem file content.", required = true ) String pem; + @ApiModelProperty(name = "tenantId", value = "The ID of the tenant who adds the certificate.", required = true ) int tenantId; public int getTenantId() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/MobileApp.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/MobileApp.java index 7338f6141c..dd6a699c6c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/MobileApp.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/MobileApp.java @@ -18,24 +18,51 @@ package org.wso2.carbon.device.mgt.jaxrs.beans; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import java.util.Properties; /** * This class represents the generic mobile AuthenticationImpl information * which is used by AppM. */ +@ApiModel(value = "ApplicationWrapper", description = "Details of a mobile application.") public class MobileApp { + @ApiModelProperty(name = "id", value = "Id of the app used internally.", required = true ) private String id; + @ApiModelProperty(name = "name", value = "The name of the application.", required = true ) private String name; + @ApiModelProperty(name = "type", value = "The type of the application. The following types of applications are " + + "supported: enterprise, public and webapp..", required = true ) private MobileAppTypes type; + @ApiModelProperty(name = "platform", value = "Platform the app can be installed on .", required = true ) private String platform; + @ApiModelProperty(name = "version", value = "Version of the application.", required = true ) private String version; + @ApiModelProperty(name = "identifier", value = "The package name of the application.", required = true ) private String identifier; + @ApiModelProperty(name = "iconImage", value = "Link to the icon of the app.", required = true ) private String iconImage; + @ApiModelProperty(name = "packageName", value = "Define the exact name of the application package. You can use one " + + "of the following methods to get the package name.\n" + + "Go to the respective application in the play store and copy the" + + " ID or package name from the URL.\n" + + "Example: The play store application URL for the Viber app is " + + "https://play.google.com/store/apps/details?id=com.viber.voip&hl=en." + + " Therefore, the package name or " + + "the application ID is: id=com.viber.voip \n" + + "Download the System Info for Android to your device from the" + + " play store. \n" + + "Once the application is successfully installed go to the Tasks " + + "tab and you will see the package name under the respective " + + "application..", required = true ) private String packageName; + @ApiModelProperty(name = "appIdentifier", value = "The package name of the application.", required = true ) private String appIdentifier; private String location; + @ApiModelProperty(name = "properties", value = "List of meta data.", required = true ) private Properties properties; public MobileAppTypes getType() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PolicyWrapper.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PolicyWrapper.java index c05fa535a5..b8558856fe 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PolicyWrapper.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PolicyWrapper.java @@ -18,21 +18,52 @@ package org.wso2.carbon.device.mgt.jaxrs.beans; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import org.wso2.carbon.device.mgt.common.Device; import java.util.List; +@ApiModel(value = "PolicyWrapper", description = "This class carries all information related to Policy " + + "Wrappers") public class PolicyWrapper { + @ApiModelProperty(name = "id", value = "The policy ID", required = true) private int id; + @ApiModelProperty(name = "profile", value = "Contains the details of the profile that is included in the" + + " policy", required = true) private Profile profile; + @ApiModelProperty(name = "policyName", value = "The name of the policy", required = true) private String policyName; + @ApiModelProperty(name = "description", value = "Gives a description on the policy", required = true) private String description; + @ApiModelProperty(name = "compliance", value = "Provides the non-compliance rules. WSO2 EMM provides the" + + " following non-compliance rules:\n" + + "Enforce - Forcefully enforce the policies on the devices\n" + + "Warning - If the device does not adhere to the given policies a warning message will be sent\n" + + "Monitor - If the device does not adhere to the given policies the server is notified of the " + + "violation unknown to the user and the administrator can take the necessary actions with regard" + + " to the reported", required = true) private String compliance; + @ApiModelProperty(name = "roles", value = "The roles to whom the policy is applied on", required = true) private List roles; + @ApiModelProperty(name = "ownershipType", value = "The policy ownership type. It can be any of the " + + "following values:\n" + + "ANY - The policy will be applied on the BYOD and COPE device types\n" + + "BYOD (Bring Your Own Device) - The policy will only be applied on the BYOD device type\n" + + "COPE (Corporate-Owned, Personally-Enabled) - The policy will only be applied on the COPE " + + "device type", required = true) private String ownershipType; + @ApiModelProperty(name = "devices", value = "Lists out the devices the policy is enforced on", + required = true) private List devices; + @ApiModelProperty(name = "users", value = "Lists out the users on whose devices the policy is enforced", + required = true) private List users; + @ApiModelProperty(name = "tenantId", value = "The ID of the tenant that created the policy", + required = true) private int tenantId; + @ApiModelProperty(name = "profileId", value = "The ID of each profile that is in the selected policy", + required = true) private int profileId; public int getId() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PriorityUpdatedPolicyWrapper.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PriorityUpdatedPolicyWrapper.java index 20f5248f85..56a4764d0b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PriorityUpdatedPolicyWrapper.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/PriorityUpdatedPolicyWrapper.java @@ -18,9 +18,17 @@ package org.wso2.carbon.device.mgt.jaxrs.beans; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(value = "PriorityUpdatedPolicyWrapper", description = "This class carries all information related " + + "to Priority Updated Policy Wrapper ") public class PriorityUpdatedPolicyWrapper { + @ApiModelProperty(name = "id", value = "Define the ID of the policy", required = true) private int id; + @ApiModelProperty(name = "priority", value = "Define the priority of the order, where 1 indicates the " + + "highest priority", required = true) private int priority; public int getId() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/RoleWrapper.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/RoleWrapper.java index b8d633f3f6..ed8cfda09c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/RoleWrapper.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/RoleWrapper.java @@ -18,12 +18,28 @@ package org.wso2.carbon.device.mgt.jaxrs.beans; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import org.wso2.carbon.user.mgt.common.UIPermissionNode; +@ApiModel(value = "RoleWrapper", description = "Role details including permission and the users in the roles are " + + "wrapped here.") public class RoleWrapper { + + @ApiModelProperty(name = "roleName", value = "The name of the role.", required = true) private String roleName; + @ApiModelProperty(name = "permissions", value = "Lists out all the permissions associated with roles.", + required = true) private String[] permissions; + @ApiModelProperty(name = "users", value = "The list of users assigned to the selected role.", + required = true) private String[] users; + @ApiModelProperty(name = "permissionList", value = "This contain the following, " + + "\n resourcePath\tThe path related to the API.\n " + + "displayName\tThe name of the permission that is shown " + + "in the UI.\n" + + "nodeList\tLists out the nested permissions.", + required = true) private UIPermissionNode permissionList; public String getRoleName() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/UserCredentialWrapper.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/UserCredentialWrapper.java index d0c201b8d6..e5674b9de7 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/UserCredentialWrapper.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/UserCredentialWrapper.java @@ -18,13 +18,20 @@ package org.wso2.carbon.device.mgt.jaxrs.beans; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(value = "UserCredentialWrapper", description = "User credentials are included in this class.") public class UserCredentialWrapper { + @ApiModelProperty(name = "username", value = "Username of the user.", required = true ) private String username; /* Base64 encoded password */ + @ApiModelProperty(name = "oldPassword", value = "Old password of the user.", required = true ) private String oldPassword; + @ApiModelProperty(name = "newPassword", value = "New password of the user.", required = true ) private String newPassword; public String getNewPassword() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/UserWrapper.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/UserWrapper.java index c03a762ee3..8009ae233e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/UserWrapper.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/beans/UserWrapper.java @@ -18,16 +18,26 @@ package org.wso2.carbon.device.mgt.jaxrs.beans; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(value = "UserWrapper", description = "User details and the roles of the user.") public class UserWrapper { private String username; /* Base64 encoded password */ + + @ApiModelProperty(name = "password", value = "Base64 encoded password.", required = true ) private String password; + @ApiModelProperty(name = "firstname", value = "The first name of the user.", required = true ) private String firstname; + @ApiModelProperty(name = "lastname", value = "The last name of the user.", required = true ) private String lastname; + @ApiModelProperty(name = "emailAddress", value = "The email address of the user.", required = true ) private String emailAddress; + @ApiModelProperty(name = "roles", value = "List of roles.", required = true ) private String[] roles; public String getUsername() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.common/pom.xml index 94a50811c3..be584f36b0 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/pom.xml @@ -17,7 +17,8 @@ ~ under the License. --> - + device-mgt org.wso2.carbon.devicemgt @@ -47,10 +48,22 @@ org.wso2.carbon.device.mgt.common.* + + javax.xml.bind.annotation, + io.swagger.annotations.*;resolution:=optional + + + + io.swagger + swagger-annotations + provided + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/Device.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/Device.java index feb5f987a2..865aff801e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/Device.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/Device.java @@ -17,19 +17,38 @@ */ package org.wso2.carbon.device.mgt.common; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import java.io.Serializable; import java.util.List; +@ApiModel(value = "Device", description = "This class carries all information related to a managed device.") public class Device implements Serializable{ private static final long serialVersionUID = 1998101711L; + @ApiModelProperty(name = "id", value = "ID of the device in the WSO2 EMM device information database.", + required = true) private int id; + @ApiModelProperty(name = "name", value = "The device name that can be set on the device by the device user.", + required = true) private String name; + @ApiModelProperty(name = "type", value = "The OS type of the device.", required = true) private String type; + @ApiModelProperty(name = "description", value = "Additional information on the device.", required = true) private String description; + @ApiModelProperty(name = "deviceIdentifier", value = "This is a 64-bit number (as a hex string) that is randomly" + + " generated when the user first sets up the device and should" + + " remain constant for the lifetime of the user's device." + + " The value may change if a factory reset is performed on " + + "the device.", + required = true) private String deviceIdentifier; + @ApiModelProperty(name = "enrolmentInfo", value = "This defines the device registration related information. " + + "It is mandatory to define this information.", required = true) private EnrolmentInfo enrolmentInfo; + @ApiModelProperty(name = "features", value = "List of features.", required = true) private List features; private List properties; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceIdentifier.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceIdentifier.java index 3c5e240502..a88bcb465a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceIdentifier.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceIdentifier.java @@ -17,11 +17,19 @@ */ package org.wso2.carbon.device.mgt.common; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import java.io.Serializable; + +@ApiModel(value = "DeviceIdentifier", description = "This contains device details that is used to identify a device " + + "uniquely.") public class DeviceIdentifier implements Serializable{ + @ApiModelProperty(name = "id", value = "Identity of the device.", required = true) private String id; + @ApiModelProperty(name = "type", value = "Type of the device.", required = true) private String type; public DeviceIdentifier() {} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/EnrolmentInfo.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/EnrolmentInfo.java index eb37127d2e..2ba839243c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/EnrolmentInfo.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/EnrolmentInfo.java @@ -18,8 +18,13 @@ */ package org.wso2.carbon.device.mgt.common; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import java.io.Serializable; +@ApiModel(value = "EnrolmentInfo", description = "This class carries all information related to a devices enrollment" + + " status.") public class EnrolmentInfo implements Serializable { private static final long serialVersionUID = 1998101712L; @@ -32,12 +37,24 @@ public class EnrolmentInfo implements Serializable { BYOD, COPE } + @ApiModelProperty(name = "id", value = "ID of the device in the WSO2 EMM device information database.", + required = true) private int id; + @ApiModelProperty(name = "device", value = "Enrolled device.", required = true) private Device device; + @ApiModelProperty(name = "dateOfEnrolment", value = "Date of the device enrollment.", required = true ) private Long dateOfEnrolment; + @ApiModelProperty(name = "dateOfLastUpdate", value = "Date of the device's last update.", required = true ) private Long dateOfLastUpdate; + @ApiModelProperty(name = "ownership", value = "Defines the ownership details. The ownership type can be any of the" + + " following values.\n" + + "BYOD - Bring your own device (BYOD).\n" + + "COPE - Corporate owned personally enabled (COPE).", required = true ) private OwnerShip ownership; + @ApiModelProperty(name = "status", value = "Current status of the device, such as whether the device " + + "is active, removed etc.", required = true ) private Status status; + @ApiModelProperty(name = "owner", value = "The device owner's name.", required = true ) private String owner; public EnrolmentInfo() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/Feature.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/Feature.java index eb48ea1ee5..cea193877e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/Feature.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/Feature.java @@ -20,14 +20,27 @@ package org.wso2.carbon.device.mgt.common; import javax.xml.bind.annotation.XmlElement; import java.io.Serializable; import java.util.List; +import io.swagger.annotations.*; +@ApiModel(value = "Feature", description = "This class carries all information related to a devices enrollment" + + " status.") public class Feature implements Serializable { + @ApiModelProperty(name = "id", value = "Feature Id.", required = true ) private int id; + @ApiModelProperty(name = "code", value = "The code of the feature. For example the code to lock a device" + + " is DEVICE_LOCK.", required = true ) private String code; + @ApiModelProperty(name = "name", value = "A name that describes a feature.", required = true ) private String name; + @ApiModelProperty(name = "description", value = "Provides a description of the features..", required = true ) private String description; + @ApiModelProperty(name = "deviceType", value = "Provide the device type for the respective feature. " + + "Features allow you to perform operations on any device type, " + + "such as android, iOS or windows..", required = true ) private String deviceType; + + @ApiModelProperty(name = "metadataEntries", value = "Properties related to features.", required = true ) private List metadataEntries; @XmlElement diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/PaginationResult.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/PaginationResult.java index 0125b0fd90..433553b2da 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/PaginationResult.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/PaginationResult.java @@ -18,18 +18,30 @@ package org.wso2.carbon.device.mgt.common; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import java.io.Serializable; import java.util.List; /** * This class holds necessary data to represent a paginated result. */ +@ApiModel(value = "PaginationResult", description = "This class carries all information related Pagination Result") public class PaginationResult implements Serializable { private static final long serialVersionUID = 1998101711L; + + @ApiModelProperty(name = "recordsTotal", value = "The total number of records that are given before filtering", required = true) private int recordsTotal; + + @ApiModelProperty(name = "recordsFiltered", value = "The total number of records that are given after filtering", required = true) private int recordsFiltered; + + @ApiModelProperty(name = "draw", value = "The draw counter that this object is a response to, from the draw parameter sent as part of the data request", required = true) private int draw; + + @ApiModelProperty(name = "data", value = "The details of the SSL certificate", required = true) private List data; public int getRecordsTotal() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/app/mgt/Application.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/app/mgt/Application.java index 0d45f903bd..1b17534dcf 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/app/mgt/Application.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/app/mgt/Application.java @@ -18,26 +18,41 @@ */ package org.wso2.carbon.device.mgt.common.app.mgt; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import java.io.Serializable; import java.util.Properties; +@ApiModel(value = "Application", description = "This class carries all information related application") public class Application implements Serializable { private static final long serialVersionUID = 1998101711L; + @ApiModelProperty(name = "id", value = "The ID given to the application when it is stored in the EMM database", required = true) private int id; + @ApiModelProperty(name = "platform", value = "The mobile device platform. It can be android, ios or windows", required = true) private String platform; + @ApiModelProperty(name = "category", value = "The application category", required = true) private String category; + @ApiModelProperty(name = "name", value = "The application's name", required = true) private String name; + private String locationUrl; + @ApiModelProperty(name = "imageUrl", value = "The icon url of the application", required = true) private String imageUrl; + @ApiModelProperty(name = "version", value = "The application's version", required = true) private String version; + @ApiModelProperty(name = "type", value = "The application type", required = true) private String type; + @ApiModelProperty(name = "appProperties", value = "The properties of the application", required = true) private Properties appProperties; + @ApiModelProperty(name = "applicationIdentifier", value = "The application identifier", required = true) private String applicationIdentifier; - + @ApiModelProperty(name = "memoryUsage", value = "AMount of memory used by the application", required = true) private int memoryUsage; + public String getType() { return type; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/configuration/mgt/ConfigurationEntry.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/configuration/mgt/ConfigurationEntry.java index cafc157452..5c8a7b6e86 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/configuration/mgt/ConfigurationEntry.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/configuration/mgt/ConfigurationEntry.java @@ -18,36 +18,46 @@ package org.wso2.carbon.device.mgt.common.configuration.mgt; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + /** * Represents an individual configuration entry. */ +@ApiModel(value = "ConfigurationEntry", description = "This class carries all information related to Tenant Configuration" + + "Settings") public class ConfigurationEntry { - private String name; - private String contentType; - private Object value; + @ApiModelProperty(name = "name", value = "Name of the configuration", required = true) + private String name; + + @ApiModelProperty(name = "contentType", value = "Type of the configuration", required = true) + private String contentType; + + @ApiModelProperty(name = "value", value = "Value of the configuration", required = true) + private Object value; - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public String getContentType() { - return contentType; - } + public String getContentType() { + return contentType; + } - public void setContentType(String contentType) { - this.contentType = contentType; - } + public void setContentType(String contentType) { + this.contentType = contentType; + } - public Object getValue() { - return value; - } + public Object getValue() { + return value; + } - public void setValue(Object value) { - this.value = value; - } + public void setValue(Object value) { + this.value = value; + } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/configuration/mgt/TenantConfiguration.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/configuration/mgt/TenantConfiguration.java index ece6a23a78..df19ddf1dc 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/configuration/mgt/TenantConfiguration.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/configuration/mgt/TenantConfiguration.java @@ -18,6 +18,9 @@ package org.wso2.carbon.device.mgt.common.configuration.mgt; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -30,10 +33,16 @@ import java.util.List; */ @XmlRootElement(name = "tenantConfiguration") @XmlAccessorType(XmlAccessType.NONE) + +@ApiModel(value = "TenantConfiguration", + description = "This class carries all information related to a Tenant configuration") public class TenantConfiguration implements Serializable { @XmlElement(name = "type") + @ApiModelProperty(name = "type", value = "type of device", required = true) private String type; + + @ApiModelProperty(name = "configuration", value = "List of Configuration Entries", required = true) @XmlElement(name = "configuration") private List configuration; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceInfo.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceInfo.java index 92af0d4544..e76daf6611 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceInfo.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceInfo.java @@ -19,6 +19,8 @@ package org.wso2.carbon.device.mgt.common.device.details; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import java.io.Serializable; @@ -26,34 +28,60 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; +@ApiModel(value = "DeviceInfo", description = "This class carries all information related to the device information " + + "provided by a device.") public class DeviceInfo implements Serializable { private static final long serialVersionUID = 1998101733L; + @ApiModelProperty(name = "deviceId", value = "Device Id.", required = true) private int deviceId; + @ApiModelProperty(name = "deviceType", value = "Type of the device.", required = true) private String deviceType; + @ApiModelProperty(name = "deviceId", value = "Device identifier.", required = true) private DeviceIdentifier deviceIdentifier; - + @ApiModelProperty(name = "IMEI", value = "IMEI number of the device.", required = true) private String IMEI; + @ApiModelProperty(name = "IMSI", value = "IMSI number of the device.", required = true) private String IMSI; + @ApiModelProperty(name = "deviceModel", value = "Model of the device.", required = true) private String deviceModel; + @ApiModelProperty(name = "vendor", value = "Vendor of the device.", required = true) private String vendor; + @ApiModelProperty(name = "osVersion", value = "Operating system version.", required = true) private String osVersion; + @ApiModelProperty(name = "batteryLevel", value = "Battery level of the device.", required = true) private Double batteryLevel; + @ApiModelProperty(name = "internalTotalMemory", value = "Total internal memory of the device.", required = true) private Double internalTotalMemory; + @ApiModelProperty(name = "internalAvailableMemory", value = "Total available memory of the device.", + required = true) private Double internalAvailableMemory; + @ApiModelProperty(name = "externalTotalMemory", value = "Total external memory of the device.", required = true) private Double externalTotalMemory; + @ApiModelProperty(name = "externalAvailableMemory", value = "Total external memory avilable of the device.", + required = true) private Double externalAvailableMemory; + @ApiModelProperty(name = "operator", value = "Mobile operator of the device.", required = true) private String operator; + @ApiModelProperty(name = "connectionType", value = "How the device is connected to the network.", required = true) private String connectionType; + @ApiModelProperty(name = "mobileSignalStrength", value = "Current mobile signal strength.", required = true) private Double mobileSignalStrength; + @ApiModelProperty(name = "ssid", value = "ssid of the connected WiFi.", required = true) private String ssid; + @ApiModelProperty(name = "cpuUsage", value = "Current total cpu usage.", required = true) private Double cpuUsage; + @ApiModelProperty(name = "totalRAMMemory", value = "Total Ram memory size.", required = true) private Double totalRAMMemory; + @ApiModelProperty(name = "availableRAMMemory", value = "Available total memory of RAM.", required = true) private Double availableRAMMemory; + @ApiModelProperty(name = "pluggedIn", value = "Whether the device is plugged into power or not.", + required = true) private boolean pluggedIn; + @ApiModelProperty(name = "updatedTime", value = "Device updated time.", required = true) private Date updatedTime; - + @ApiModelProperty(name = "deviceDetailsMap", value = ".", required = true) private Map deviceDetailsMap = new HashMap<>(); public int getDeviceId() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceLocation.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceLocation.java index 1368b92806..5223b0f047 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceLocation.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceLocation.java @@ -19,27 +19,41 @@ package org.wso2.carbon.device.mgt.common.device.details; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import java.io.Serializable; import java.util.Date; +@ApiModel(value = "DeviceLocation", description = "This class carries all information related to the device location " + + "details provided by a device.") public class DeviceLocation implements Serializable { private static final long serialVersionUID = 1998101722L; + @ApiModelProperty(name = "deviceId", value = "Device id", required = true) private int deviceId; + @ApiModelProperty(name = "deviceIdentifier", value = "Device identifier used to identify a device uniquely.", + required = true) private DeviceIdentifier deviceIdentifier; + @ApiModelProperty(name = "latitude", value = "Device GPS latitude.", required = true) private Double latitude; + @ApiModelProperty(name = "longitude", value = "Device GPS longitude.", required = true) private Double longitude; - + @ApiModelProperty(name = "street1", value = "First line of the address.", required = true) private String street1; + @ApiModelProperty(name = "street2", value = "Second part of the address.", required = true) private String street2; - + @ApiModelProperty(name = "city", value = "City of the device location.", required = true) private String city; + @ApiModelProperty(name = "state", value = "State of the device address.", required = true) private String state; + @ApiModelProperty(name = "zip", value = "Zip code of the device address.", required = true) private String zip; + @ApiModelProperty(name = "country", value = "Country of the device address.", required = true) private String country; + @ApiModelProperty(name = "updatedTime", value = "Update time of the device.", required = true) private Date updatedTime; public int getDeviceId() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceWrapper.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceWrapper.java index 0fae898778..205caf531c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceWrapper.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/device/details/DeviceWrapper.java @@ -19,14 +19,23 @@ package org.wso2.carbon.device.mgt.common.device.details; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +@ApiModel(value = "DeviceWrapper", description = "This contains device details including, " + + "location and device meta information.") public class DeviceWrapper { + @ApiModelProperty(name = "device", value = "Device's basic information", required = true) private Device device; + @ApiModelProperty(name = "deviceIdentifier", value = "Device identifier used to identify a device.", + required = true) private DeviceIdentifier deviceIdentifier; + @ApiModelProperty(name = "deviceInfo", value = "Device's runtime information", required = true) private DeviceInfo deviceInfo; + @ApiModelProperty(name = "deviceLocation", value = "Device's current location", required = true) private DeviceLocation deviceLocation; public Device getDevice() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/notification/mgt/Notification.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/notification/mgt/Notification.java index 0d3af9886d..f9f776222a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/notification/mgt/Notification.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/notification/mgt/Notification.java @@ -18,11 +18,15 @@ package org.wso2.carbon.device.mgt.common.notification.mgt; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; /** * DTO of Notification object which is used to communicate Operation notifications to MDM core. */ + +@ApiModel(value = "Notification", description = "This is used to communicate Operation notifications to MDM.") public class Notification { public enum Status{ @@ -33,10 +37,20 @@ public class Notification { ALERT, } + @ApiModelProperty(name = "notificationId", value = "Defines the notification ID.", required = true ) private int notificationId; + @ApiModelProperty(name = "deviceIdentifier", value = "Defines the device identification properties.", + required = true ) private DeviceIdentifier deviceIdentifier; + @ApiModelProperty(name = "description", value = "Provides the message you want to send to the user.", + required = true ) private String description; + @ApiModelProperty(name = "operationId", value = "Provides the operationID.", required = true ) private int operationId; + @ApiModelProperty(name = "status", value = "Provides the status of the message." + + "The following values can be assigned for the status.\n" + + "NEW: The message is in the unread state.\n" + + "CHECKED: The message is in the read state.", required = true ) private Status status; public Status getStatus() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/Operation.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/Operation.java index 3496bacb8c..6add610c78 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/Operation.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/Operation.java @@ -18,12 +18,18 @@ package org.wso2.carbon.device.mgt.common.operation.mgt; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.io.Serializable; +import java.util.List; import java.util.Properties; @XmlRootElement +@ApiModel(value = "Operation", description = "This class carries all information related to a operations that can be " + + "applied on a device.") public class Operation implements Serializable { public enum Type { @@ -38,18 +44,53 @@ public class Operation implements Serializable { REPEAT, NO_REPEAT, PAUSE_SEQUENCE, STOP_SEQUENCE } + @ApiModelProperty(name = "code", value = "The code of the operation that you carried out. For example the code of" + + " the operation carried out to device info operation is DEVICE_INFO.", + required = true) private String code; + @ApiModelProperty(name = "properties", value = "Properties of an operation containing meta information.", + required = true) private Properties properties; + @ApiModelProperty(name = "type", value = "The operation type that was carried out on the device. " + + "The operations types can be one of the following: COMMAND, PROFILE", + required = true) private Type type; + @ApiModelProperty(name = "id", value = "The operations carried out on a device is recorded in a database table. " + + "The ID of the operation in the database table is given as the ID " + + "in the output.", + required = true) private int id; + @ApiModelProperty(name = "status", value = "The status of the operation that has been carried out on a device. The" + + " operation status can be any one of the following:\n" + + "IN-PROGRESS - The operation is processing on the EMM server" + + " side and has not yet been delivered to the device.\n" + + "PENDING - The operation is delivered to the device but the response " + + "from the device is pending.\n" + + "COMPLETED - The operation is delivered to the device and the server has " + + "received a response back from the device.\n" + + "ERROR - An error has occurred while carrying out the operation.", + required = true) private Status status; + @ApiModelProperty(name = "control", value = "How the operation should be executed.", required = true) private Control control; + @ApiModelProperty(name = "receivedTimeStamp", value = "The time WSO2 EMM received the response from the device.", + required = true) private String receivedTimeStamp; + @ApiModelProperty(name = "createdTimeStamp", value = "The time when the operation was requested to be carried out.", + required = true) private String createdTimeStamp; + @ApiModelProperty(name = "isEnabled", value = "If the assigned value is true it indicates that a policy is " + + "enforced on the device. If the assigned value is false it indicates" + + " that a policy is not enforced on a device.", required = true) private boolean isEnabled; + @ApiModelProperty(name = "payLoad", value = "Payload of the operation to be sent to the device", required = true) private Object payLoad; + @ApiModelProperty(name = "operationResponse", value = "Response received from the device", required = true) private String operationResponse; + @ApiModelProperty(name = "activityId", value = "The identifier used to identify the operation uniquely.", + required = true) private String activityId; + private List responses; @Override public boolean equals(Object o) { @@ -218,6 +259,14 @@ public class Operation implements Serializable { this.activityId = activityId; } + public List getResponses() { + return responses; + } + + public void setResponses(List responses) { + this.responses = responses; + } + @Override public String toString() { return "Operation{" + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/OperationResponse.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/OperationResponse.java new file mode 100644 index 0000000000..b993f08743 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/operation/mgt/OperationResponse.java @@ -0,0 +1,43 @@ +/* + * 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.device.mgt.common.operation.mgt; + +public class OperationResponse { + + private String response; + private String recievedTimeStamp; + + public String getResponse() { + return response; + } + + public void setResponse(String response) { + this.response = response; + } + + public String getRecievedTimeStamp() { + return recievedTimeStamp; + } + + public void setRecievedTimeStamp(String recievedTimeStamp) { + this.recievedTimeStamp = recievedTimeStamp; + } +} + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/search/Condition.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/search/Condition.java index 5a4b45dd1e..2cf03c5645 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/search/Condition.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/search/Condition.java @@ -19,12 +19,74 @@ package org.wso2.carbon.device.mgt.common.search; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(value = "Condition", description = "Contains the advance search parameters.") public class Condition { + @ApiModelProperty(name = "conditions", value = "Provide the operation code. You can assign the following operation " + + "codes:\n" + + "DEVICE_MODEL : The model of the device.\n" + + "VENDOR : The name of the device vendor.\n" + + "OS_VERSION : The version of the device operating system.\n" + + "BATTERY_LEVEL : The current level of the device battery.\n" + + "INTERNAL_TOTAL_MEMORY : The total capacity of the internal memory" + + " available in the device.\n" + + "INTERNAL_AVAILABLE_MEMORY : The internal memory in the device " + + "that is available.\n" + + "EXTERNAL_TOTAL_MEMORY : The total capacity of the external memory " + + "available in the device.\n" + + "EXTERNAL_AVAILABLE_MEMORY : The external memory in the device" + + " that is available.\n" + + "CONNECTION_TYPE : Define if the device is connected to the GPRS " + + "or Wi-Fi settings.\n" + + "SSID : The name of the Wifi network that the device is " + + "connected to.\n" + + "CPU_USAGE : The current CPU usage of the mobile device.\n" + + "TOTAL_RAM_MEMORY : The total capacity of the random access " + + "memory available in the device.\n" + + "AVAILABLE_RAM_MEMORY : The random access memory capacity " + + "in the device that is available.\n" + + "PLUGGED_IN : Define true if the device is plugged in for charging " + + "or define false if the device is not plugged in for charging.", + required = true) private String key; + @ApiModelProperty(name = "value", value = "Define the value for the key you provide.\n" + + "Example: If you provide the key as VERSION, you can provide the " + + "value as 5.1, which indicates the version of the mobile device you" + + " are searching.", + required = true) private String value; + @ApiModelProperty(name = "operator", value = "Define the search condition between the key and the value you " + + "provide. The following values can be used to define the search " + + "condition:\n" + + "= : Searches for devices where the key is equal to the value " + + "provided.\n" + + "=! : Searches for devices where the key is not equal to the " + + "value provided.\n" + + "<= : Searches for devices where the key is greater than or equal" + + " to the value provide.\n" + + ">= : Searches for devices where the key is less than or equal to" + + " the value provided.\n" + + "> : Searches for devices where the key is greater than the value" + + " provided.\n" + + "< : Searches for devices where the key is less than the value " + + "provided.\n" + + "Example: If you wish to get the devises that have the version " + + "as 5.1, you need to use the = operator..", + required = true) public String operator; + @ApiModelProperty(name = "conditions", value = "There can be many search options as shown in the sample JSON " + + "definition. The field that connects the independent search " + + "options, is known as state.\n" + + "The following values can be assigned to state.\n" + + "AND : Defines if you want the search result to match all the " + + "search conditions provided.\n" + + "OR : Defines if you want the search result to match either of" + + " the search conditions provided.", + required = true) private State state; public enum State { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/search/SearchContext.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/search/SearchContext.java index c7c4be65ca..5207ddc502 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/search/SearchContext.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/search/SearchContext.java @@ -19,10 +19,17 @@ package org.wso2.carbon.device.mgt.common.search; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import java.util.List; + +@ApiModel(value = "SearchContext", description = "Search details when carrying out a search contain in this class.") public class SearchContext { + @ApiModelProperty(name = "conditions", value = "Contains the advance search parameters.", + required = true) private List conditions; // private int start; // private int end; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml index bb73550ff6..7e36265173 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml @@ -83,6 +83,7 @@ org.apache.catalina.core, org.apache.commons.collections, org.wso2.carbon.email.sender.*, + io.swagger.annotations.*;resolution:=optional, org.wso2.carbon, org.wso2.carbon.base @@ -245,6 +246,12 @@ 1.7.1 + + io.swagger + swagger-annotations + provided + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/DeviceType.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/DeviceType.java index 52ca3ac891..eb363fff1c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/DeviceType.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/DeviceType.java @@ -18,12 +18,19 @@ package org.wso2.carbon.device.mgt.core.dto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import java.io.Serializable; +@ApiModel(value = "DeviceType", description = "This class carries all information related device types") public class DeviceType implements Serializable { private static final long serialVersionUID = 7927802716452548282L; + + @ApiModelProperty(name = "id", value = "Device type id", required = true) private int id; + @ApiModelProperty(name = "name", value = "Device type name", required = true) private String name; public DeviceType() { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/operation/mgt/Operation.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/operation/mgt/Operation.java index 360deb868a..c61b2d304f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/operation/mgt/Operation.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dto/operation/mgt/Operation.java @@ -46,6 +46,7 @@ public class Operation implements Serializable { private boolean isEnabled; private Object payLoad; private Object operationResponse; + private String activityId; public String getCode() { return code; @@ -135,4 +136,12 @@ public class Operation implements Serializable { this.operationResponse = operationResponse; } + public String getActivityId() { + return activityId; + } + + public void setActivityId(String activityId) { + this.activityId = activityId; + } + } \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java index 5ec27f4c7c..6784b0cb70 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java @@ -659,12 +659,57 @@ public class OperationManagerImpl implements OperationManager { @Override public Operation getOperationByActivityId(String activity) throws OperationManagementException { // This parses the operation id from activity id (ex : ACTIVITY_23) and converts to the integer. - int operationId = Integer.parseInt( + Operation operation; + int enrollmentOpMappingId = Integer.parseInt( activity.replace(DeviceManagementConstants.OperationAttributes.ACTIVITY, "")); - if(operationId == 0){ + if(enrollmentOpMappingId == 0){ throw new IllegalArgumentException("Operation ID cannot be null or zero (0)."); } - return this.getOperation(operationId); + try { + OperationManagementDAOFactory.openConnection(); + org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation dtoOperation = + operationDAO.getOperationFromEnrollment(enrollmentOpMappingId); + + if (dtoOperation == null) { + throw new OperationManagementException("Operation not found for given activity Id:" + activity); + } + org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status status = dtoOperation.getStatus(); + if (dtoOperation.getType().equals(org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type.COMMAND)) { + org.wso2.carbon.device.mgt.core.dto.operation.mgt.CommandOperation commandOperation; + commandOperation = + (org.wso2.carbon.device.mgt.core.dto.operation.mgt.CommandOperation) commandOperationDAO. + getOperation(dtoOperation.getId()); + dtoOperation.setEnabled(commandOperation.isEnabled()); + } else if (dtoOperation.getType(). + equals(org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type.CONFIG)) { + dtoOperation = configOperationDAO.getOperation(dtoOperation.getId()); + } else if (dtoOperation.getType().equals(org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type. + PROFILE)) { + dtoOperation = profileOperationDAO.getOperation(dtoOperation.getId()); + } else if (dtoOperation.getType().equals(org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type. + POLICY)) { + dtoOperation = policyOperationDAO.getOperation(dtoOperation.getId()); + } + operation = OperationDAOUtil.convertOperation(dtoOperation); + int enrolmentId = operationDAO.getEnrolmentIdFromMappingId(enrollmentOpMappingId); + if (enrolmentId !=0) { + operation.setResponses(operationDAO.getOperationResponses(enrolmentId, operation.getId())); + } + + operation.setStatus(Operation.Status.valueOf(status.toString())); + operation.setActivityId(activity); + + } catch (SQLException e) { + throw new OperationManagementException("Error occurred while opening a connection to the data source", e); + } catch (OperationManagementDAOException e) { + throw new OperationManagementException("Error occurred while retrieving the operation with activity Id '" + + activity, e); + } finally { + OperationManagementDAOFactory.closeConnection(); + } + + // return this.getOperation(operationId); + return operation; } private OperationDAO lookupOperationDAO(Operation operation) { @@ -722,4 +767,8 @@ public class OperationManagerImpl implements OperationManager { return status; } + private void setActivityId(Operation operation, int enrolmentId) { + operation.setActivityId(DeviceManagementConstants.OperationAttributes.ACTIVITY + enrolmentId); + } + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationDAO.java index 9234953829..c7499d8496 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationDAO.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/OperationDAO.java @@ -19,6 +19,7 @@ package org.wso2.carbon.device.mgt.core.operation.mgt.dao; import org.wso2.carbon.device.mgt.common.PaginationRequest; +import org.wso2.carbon.device.mgt.common.operation.mgt.OperationResponse; import org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation; import java.util.List; @@ -33,6 +34,8 @@ public interface OperationDAO { Operation getOperation(int operationId) throws OperationManagementDAOException; + Operation getOperationFromEnrollment(int enrollmentOpMappingId) throws OperationManagementDAOException; + Operation getOperationByDeviceAndId(int enrolmentId, int operationId) throws OperationManagementDAOException; List getOperationsByDeviceAndStatus(int enrolmentId, Operation.Status status) @@ -58,4 +61,8 @@ public interface OperationDAO { void addOperationResponse(int enrolmentId, int operationId, Object operationResponse) throws OperationManagementDAOException; + List getOperationResponses(int enrolmentId, int operationId) throws OperationManagementDAOException; + + int getEnrolmentIdFromMappingId(int enrollmentOpMappingId) throws OperationManagementDAOException; + } \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java index 592be91c71..45e9f4d2cc 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/impl/GenericOperationDAOImpl.java @@ -20,15 +20,15 @@ package org.wso2.carbon.device.mgt.core.operation.mgt.dao.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.mgt.common.PaginationRequest; +import org.wso2.carbon.device.mgt.common.operation.mgt.OperationResponse; +import org.wso2.carbon.device.mgt.core.DeviceManagementConstants; import org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation; import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationDAO; import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOException; import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOUtil; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; +import java.io.*; import java.sql.*; import java.util.ArrayList; import java.util.Date; @@ -149,7 +149,7 @@ public class GenericOperationDAOImpl implements OperationDAO { try { Connection connection = OperationManagementDAOFactory.getConnection(); stmt = connection.prepareStatement("INSERT INTO DM_DEVICE_OPERATION_RESPONSE(OPERATION_ID,ENROLMENT_ID," + - "OPERATION_RESPONSE) VALUES(?, ?, ?)"); + "OPERATION_RESPONSE, RECEIVED_TIMESTAMP) VALUES(?, ?, ?, ?)"); bao = new ByteArrayOutputStream(); oos = new ObjectOutputStream(bao); oos.writeObject(operationResponse); @@ -157,6 +157,7 @@ public class GenericOperationDAOImpl implements OperationDAO { stmt.setInt(1, operationId); stmt.setInt(2, enrolmentId); stmt.setBytes(3, bao.toByteArray()); + stmt.setTimestamp(4, new Timestamp(new Date().getTime())); stmt.executeUpdate(); } catch (SQLException e) { throw new OperationManagementDAOException("Error occurred while inserting operation response", e); @@ -181,6 +182,92 @@ public class GenericOperationDAOImpl implements OperationDAO { } } + @Override + public List getOperationResponses(int enrolmentId, int operationId) throws + OperationManagementDAOException { + + PreparedStatement stmt = null; + ResultSet rs = null; + List responces = new ArrayList<>(); + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT * FROM DM_DEVICE_OPERATION_RESPONSE WHERE ENROLMENT_ID = ? AND OPERATION_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrolmentId); + stmt.setInt(2, operationId); + rs = stmt.executeQuery(); + + while (rs.next()) { + OperationResponse response = new OperationResponse(); + response.setRecievedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + ByteArrayInputStream bais = null; + ObjectInputStream ois = null; + byte[] contentBytes; + try { + contentBytes = (byte[]) rs.getBytes("OPERATION_RESPONSE"); + bais = new ByteArrayInputStream(contentBytes); + ois = new ObjectInputStream(bais); + response.setResponse(ois.readObject().toString()); + + } finally { + if (bais != null) { + try { + bais.close(); + } catch (IOException e) { + log.warn("Error occurred while closing ByteArrayOutputStream", e); + } + } + if (ois != null) { + try { + ois.close(); + } catch (IOException e) { + log.warn("Error occurred while closing ObjectOutputStream", e); + } + } + } + responces.add(response); + } + + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL Error occurred while retrieving the operation responses for " + + "operation id " + operationId + " and enrolment id " + enrolmentId, e); + } catch (ClassNotFoundException e) { + throw new OperationManagementDAOException("Error occurred while converting the operation responses to string" + + " for operation id " + operationId + " and enrolment id " + enrolmentId, e); + } catch (IOException e) { + throw new OperationManagementDAOException("Error occurred while converting the operation responses to string" + + " for operation id " + operationId + " and enrolment id " + enrolmentId, e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + + return responces; + } + + @Override + public int getEnrolmentIdFromMappingId(int enrollmentOpMappingId) throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT * FROM DM_ENROLMENT_OP_MAPPING WHERE ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrollmentOpMappingId); + rs = stmt.executeQuery(); + + if (rs.next()) { + return rs.getInt("ENROLMENT_ID"); + } + + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL Error occurred while retrieving the enrolment id " + + " for the mapping id '" + enrollmentOpMappingId, e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return -1; + } + @Override public void deleteOperation(int id) throws OperationManagementDAOException { PreparedStatement stmt = null; @@ -231,6 +318,43 @@ public class GenericOperationDAOImpl implements OperationDAO { return operation; } + @Override + public Operation getOperationFromEnrollment(int enrollmentOpMappingId) throws OperationManagementDAOException { + PreparedStatement stmt = null; + ResultSet rs = null; + Operation operation = null; + try { + Connection conn = OperationManagementDAOFactory.getConnection(); + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE, \n" + + " om.STATUS FROM DM_OPERATION o \n" + + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm WHERE dm.ID = ? ) om \n" + + "ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP DESC "; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, enrollmentOpMappingId); + rs = stmt.executeQuery(); + + if (rs.next()) { + operation = new Operation(); + operation.setId(rs.getInt("ID")); + operation.setType(Operation.Type.valueOf(rs.getString("TYPE"))); + operation.setCreatedTimeStamp(rs.getTimestamp("CREATED_TIMESTAMP").toString()); + if (rs.getTimestamp("RECEIVED_TIMESTAMP") == null) { + operation.setReceivedTimeStamp(""); + } else { + operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); + } + operation.setCode(rs.getString("OPERATION_CODE")); + operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS"))); + this.setActivityId(operation, enrollmentOpMappingId); + } + } catch (SQLException e) { + throw new OperationManagementDAOException("SQL error occurred while retrieving the operation .", e); + } finally { + OperationManagementDAOUtil.cleanupResources(stmt, rs); + } + return operation; + } + @Override public Operation getOperationByDeviceAndId(int enrolmentId, int operationId) throws OperationManagementDAOException { PreparedStatement stmt = null; @@ -238,7 +362,7 @@ public class GenericOperationDAOImpl implements OperationDAO { Operation operation = null; try { Connection conn = OperationManagementDAOFactory.getConnection(); - String sql = "SELECT o.ID, o.TYPE, o.CREATED_TIMESTAMP, o.RECEIVED_TIMESTAMP, o.STATUS, o.OPERATION_CODE " + + String sql = "SELECT o.ID, o.TYPE, o.CREATED_TIMESTAMP, o.RECEIVED_TIMESTAMP, o.STATUS, o.OPERATION_CODE, om.ID AS OM_MAPPING_ID " + " FROM (SELECT ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, STATUS," + "OPERATION_CODE FROM DM_OPERATION WHERE id = ?) o INNER JOIN (SELECT * FROM " + "DM_ENROLMENT_OP_MAPPING dm where dm.OPERATION_ID = ? AND dm.ENROLMENT_ID = ?) om " + @@ -260,6 +384,7 @@ public class GenericOperationDAOImpl implements OperationDAO { operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); } operation.setCode(rs.getString("OPERATION_CODE")); + this.setActivityId(operation, rs.getInt("OM_MAPPING_ID")); } } catch (SQLException e) { throw new OperationManagementDAOException("SQL error occurred while retrieving the operation " + @@ -279,7 +404,7 @@ public class GenericOperationDAOImpl implements OperationDAO { List operations = new ArrayList(); try { Connection conn = OperationManagementDAOFactory.getConnection(); - String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE " + + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE, om.ID AS OM_MAPPING_ID" + "FROM DM_OPERATION o " + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + "WHERE dm.ENROLMENT_ID = ? AND dm.STATUS = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP DESC"; @@ -300,6 +425,7 @@ public class GenericOperationDAOImpl implements OperationDAO { } operation.setCode(rs.getString("OPERATION_CODE")); operation.setStatus(status); + this.setActivityId(operation, rs.getInt("OM_MAPPING_ID")); operations.add(operation); } } catch (SQLException e) { @@ -321,7 +447,7 @@ public class GenericOperationDAOImpl implements OperationDAO { List operations = new ArrayList(); try { Connection conn = OperationManagementDAOFactory.getConnection(); - String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE " + + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE, om.ID AS OM_MAPPING_ID " + "FROM DM_OPERATION o " + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + "WHERE dm.ENROLMENT_ID = ? AND dm.STATUS = ?) om ON o.ID = om.OPERATION_ID ORDER BY " + @@ -345,6 +471,7 @@ public class GenericOperationDAOImpl implements OperationDAO { } operation.setCode(rs.getString("OPERATION_CODE")); operation.setStatus(status); + this.setActivityId(operation, rs.getInt("OM_MAPPING_ID")); operations.add(operation); } } catch (SQLException e) { @@ -365,7 +492,7 @@ public class GenericOperationDAOImpl implements OperationDAO { try { Connection conn = OperationManagementDAOFactory.getConnection(); String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, " + - "OPERATION_CODE, om.STATUS FROM DM_OPERATION o " + + "OPERATION_CODE, om.STATUS, om.ID AS OM_MAPPING_ID FROM DM_OPERATION o " + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + "WHERE dm.ENROLMENT_ID = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP DESC"; stmt = conn.prepareStatement(sql); @@ -384,6 +511,7 @@ public class GenericOperationDAOImpl implements OperationDAO { } operation.setCode(rs.getString("OPERATION_CODE")); operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS"))); + this.setActivityId(operation, rs.getInt("OM_MAPPING_ID")); operations.add(operation); } } catch (SQLException e) { @@ -405,7 +533,7 @@ public class GenericOperationDAOImpl implements OperationDAO { try { Connection conn = OperationManagementDAOFactory.getConnection(); String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, " + - "OPERATION_CODE, om.STATUS FROM DM_OPERATION o " + + "OPERATION_CODE, om.STATUS, om.ID AS OM_MAPPING_ID FROM DM_OPERATION o " + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + "WHERE dm.ENROLMENT_ID = ?) om ON o.ID = om.OPERATION_ID ORDER BY o.CREATED_TIMESTAMP DESC LIMIT ?,?"; stmt = conn.prepareStatement(sql); @@ -426,6 +554,7 @@ public class GenericOperationDAOImpl implements OperationDAO { } operation.setCode(rs.getString("OPERATION_CODE")); operation.setStatus(Operation.Status.valueOf(rs.getString("STATUS"))); + this.setActivityId(operation, rs.getInt("OM_MAPPING_ID")); operations.add(operation); } } catch (SQLException e) { @@ -468,7 +597,7 @@ public class GenericOperationDAOImpl implements OperationDAO { try { Connection connection = OperationManagementDAOFactory.getConnection(); stmt = connection.prepareStatement("SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, " + - "OPERATION_CODE FROM DM_OPERATION o " + + "OPERATION_CODE, om.ID AS OM_MAPPING_ID FROM DM_OPERATION o " + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + "WHERE dm.ENROLMENT_ID = ? AND dm.STATUS = ?) om ON o.ID = om.OPERATION_ID " + "ORDER BY o.CREATED_TIMESTAMP ASC LIMIT 1"); @@ -489,6 +618,7 @@ public class GenericOperationDAOImpl implements OperationDAO { } operation.setCode(rs.getString("OPERATION_CODE")); operation.setStatus(Operation.Status.PENDING); + this.setActivityId(operation, rs.getInt("OM_MAPPING_ID")); } return operation; } catch (SQLException e) { @@ -507,7 +637,7 @@ public class GenericOperationDAOImpl implements OperationDAO { List operations = new ArrayList(); try { Connection conn = OperationManagementDAOFactory.getConnection(); - String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE FROM " + + String sql = "SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE, om.ID AS OM_MAPPING_ID FROM " + "(SELECT o.ID, TYPE, CREATED_TIMESTAMP, RECEIVED_TIMESTAMP, OPERATION_CODE " + "FROM DM_OPERATION o WHERE o.TYPE = ?) o " + "INNER JOIN (SELECT * FROM DM_ENROLMENT_OP_MAPPING dm " + @@ -530,6 +660,7 @@ public class GenericOperationDAOImpl implements OperationDAO { operation.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP").toString()); } operation.setCode(rs.getString("OPERATION_CODE")); + this.setActivityId(operation, rs.getInt("OM_MAPPING_ID")); operations.add(operation); } } catch (SQLException e) { @@ -545,4 +676,9 @@ public class GenericOperationDAOImpl implements OperationDAO { return Operation.Type.valueOf(type); } + private void setActivityId(Operation operation, int enrolmentId) { + operation.setActivityId(DeviceManagementConstants.OperationAttributes.ACTIVITY + enrolmentId); + } + + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/util/OperationDAOUtil.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/util/OperationDAOUtil.java index 6625ceab89..03e7e64143 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/util/OperationDAOUtil.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/dao/util/OperationDAOUtil.java @@ -95,7 +95,7 @@ public class OperationDAOUtil { operation.setReceivedTimeStamp(dtoOperation.getReceivedTimeStamp()); operation.setEnabled(dtoOperation.isEnabled()); operation.setProperties(dtoOperation.getProperties()); - operation.setActivityId(DeviceManagementConstants.OperationAttributes.ACTIVITY + dtoOperation.getId()); + operation.setActivityId(dtoOperation.getActivityId()); return operation; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/utility.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/utility.js index 185c2fa029..38cb7032ba 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/utility.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/utility.js @@ -80,18 +80,13 @@ utility = function () { }; publicMethods.getDeviceTypeConfig = function (deviceType) { - var JFile = Packages.java.io.File; - var sep = JFile.separator; - - var systemProcess = require('process'); - var parent = 'file:///' + (systemProcess.getProperty('jaggery.home') || systemProcess.getProperty('carbon.home')).replace(/[\\]/g, '/').replace(/^[\/]/g, ''); - + var unitName = publicMethods.getTenantedDeviceUnitName(deviceType, "type-view"); + if (deviceType in deviceTypeConfigMap) { return deviceTypeConfigMap[deviceType]; } var deviceTypeConfig; - var deviceTypeConfigFile = new File(parent + sep + "repository" + sep + "conf" + sep - + "device-types" + sep + deviceType + ".json"); + var deviceTypeConfigFile = new File("/app/units/" + unitName + "/private/config.json"); if (deviceTypeConfigFile.isExists()) { try { deviceTypeConfigFile.open("r"); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.js index e56c529cc9..085f1f5a69 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/pages/cdmf.page.devices/devices.js @@ -54,12 +54,16 @@ function onRequest(context) { var deviceTypes = []; if (data) { for (var i = 0; i < data.length; i++) { - var deviceType = utility.getDeviceTypeConfig(data[i].name).deviceType; + var config = utility.getDeviceTypeConfig(data[i].name); + if (!config){ + continue; + } + var deviceType = config.deviceType; deviceTypes.push({ "type": data[i].name, "category": deviceType.category, - "label": deviceType.label, - "thumb": utility.getDeviceThumb(data[i].name) + "label": deviceType.label, + "thumb": utility.getDeviceThumb(data[i].name) }); } } diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/pom.xml b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/pom.xml index cfa51b818b..597ea8239a 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/pom.xml +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/pom.xml @@ -53,6 +53,8 @@ ${carbon.device.mgt.version} Policy Management Common Bundle + javax.xml.bind.annotation, + io.swagger.annotations.*;resolution:=optional, org.wso2.carbon.device.mgt.common.*, org.wso2.carbon.device.mgt.core.dto.*, javax.xml.bind.*, @@ -91,6 +93,11 @@ org.wso2.carbon.devicemgt org.wso2.carbon.device.mgt.core + + io.swagger + swagger-annotations + provided + diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Policy.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Policy.java index 25c5f48cc4..4620adb72e 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Policy.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/Policy.java @@ -17,6 +17,8 @@ */ package org.wso2.carbon.policy.mgt.common; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import org.wso2.carbon.device.mgt.common.Device; import javax.xml.bind.annotation.XmlElement; @@ -29,24 +31,50 @@ import java.util.Map; * This class will be the used to create policy object with relevant information for evaluating. */ @XmlRootElement +@ApiModel(value = "Policy", description = "This class carries all information related to Policies") public class Policy implements Comparable, Serializable { private static final long serialVersionUID = 19981017L; + @ApiModelProperty(name = "id", value = "The policy ID", required = true) private int id; // Identifier of the policy. - private int priorityId; // Priority of the policies. This will be used only for simple evaluation. + @ApiModelProperty(name = "priorityId", value = "The priority order of the policy. 1 indicates the highest" + + " priority", required = true) + private int priorityId; // Priority of the policies. This will be used only for simple evaluation. + @ApiModelProperty(name = "profile", value = "Contains the details of the profile that is included in the " + + "policy", required = true) private Profile profile; // Profile + @ApiModelProperty(name = "policyName", value = "The name of the policy", required = true) private String policyName; // Name of the policy. + @ApiModelProperty(name = "generic", value = "If true, this should be applied to all related device", + required = true) private boolean generic; // If true, this should be applied to all related device. + @ApiModelProperty(name = "roles", value = "The roles to whom the policy is applied on", required = true) private List roles; // Roles which this policy should be applied. + @ApiModelProperty(name = "ownershipType", value = "The policy ownership type. It can be any of the " + + "following values:\n" + + "ANY - The policy will be applied on the BYOD and COPE device types\n" + + "BYOD (Bring Your Own Device) - The policy will only be applied on the BYOD device type\n" + + "COPE (Corporate-Owned, Personally-Enabled) - The policy will only be applied on the COPE " + + "device type\n", required = true) private String ownershipType; // Ownership type (COPE, BYOD, CPE) + @ApiModelProperty(name = "devices", value = "Lists out the devices the policy is enforced on", + required = true) private List devices; // Individual devices this policy should be applied + @ApiModelProperty(name = "users", value = "Lists out the users on whose devices the policy is enforced", + required = true) private List users; + @ApiModelProperty(name = "active", value = "If the value is true it indicates that the policy is active. " + + "If the value is false it indicates that the policy is inactive", required = true) private boolean active; + @ApiModelProperty(name = "updated", value = "If you have made changes to the policy but have not applied" + + " these changes to the devices that are registered with EMM, then the value is defined as true." + + " But if you have already applied any changes made to the policy then the value is defined as" + + " false.", required = true) private boolean updated; + @ApiModelProperty(name = "description", value = "Gives a description on the policy", required = true) private String description; - /* Compliance data*/ private String compliance; diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/ProfileFeature.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/ProfileFeature.java index 00e3b65d96..5de755a35d 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/ProfileFeature.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/src/main/java/org/wso2/carbon/policy/mgt/common/ProfileFeature.java @@ -18,16 +18,29 @@ package org.wso2.carbon.policy.mgt.common; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + import java.io.Serializable; +@ApiModel(value = "ProfileFeature", description = "This class carries all information related to profile " + + "features") public class ProfileFeature implements Serializable { private static final long serialVersionUID = 19981018L; + @ApiModelProperty(name = "id", value = "Define the ID", required = true) private int id; + @ApiModelProperty(name = "featureCode", value = "Provide the code that defines the policy you wish to add", + required = true) private String featureCode; + @ApiModelProperty(name = "profileId", value = "Define the ID of the profile", required = true) private int profileId; + @ApiModelProperty(name = "deviceTypeId", value = "The ID used to define the type of the device platform", + required = true) private int deviceTypeId; + @ApiModelProperty(name = "content", value = "The list of parameters that define the policy", + required = true) private Object content; public int getId() { diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql index 67cdf57a33..a767ae6bfb 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql @@ -123,6 +123,7 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_OPERATION_RESPONSE ( ENROLMENT_ID INTEGER NOT NULL, OPERATION_ID INTEGER NOT NULL, OPERATION_RESPONSE BLOB DEFAULT NULL, + RECEIVED_TIMESTAMP TIMESTAMP NULL, PRIMARY KEY (ID), CONSTRAINT fk_dm_device_operation_response_enrollment FOREIGN KEY (ENROLMENT_ID) REFERENCES DM_ENROLMENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql index e18fcf915a..5c7e5e9799 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql @@ -123,6 +123,7 @@ CREATE TABLE DM_DEVICE_OPERATION_RESPONSE ( ENROLMENT_ID INTEGER NOT NULL, OPERATION_ID INTEGER NOT NULL, OPERATION_RESPONSE VARBINARY(max) DEFAULT NULL, + RECEIVED_TIMESTAMP DATETIME2(0) NULL, PRIMARY KEY (ID), CONSTRAINT fk_dm_device_operation_response_enrollment FOREIGN KEY (ENROLMENT_ID) REFERENCES DM_ENROLMENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql index 0fd8889cc3..b7f06c57aa 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql @@ -108,6 +108,7 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_OPERATION_RESPONSE ( ENROLMENT_ID INTEGER NOT NULL, OPERATION_ID INTEGER NOT NULL, OPERATION_RESPONSE BLOB DEFAULT NULL, + RECEIVED_TIMESTAMP TIMESTAMP NULL, PRIMARY KEY (ID), CONSTRAINT fk_dm_device_operation_response_enrollment FOREIGN KEY (ENROLMENT_ID) REFERENCES DM_ENROLMENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql index 7a41ae3a66..fa18093ba9 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql @@ -229,6 +229,7 @@ CREATE TABLE DM_DEVICE_OPERATION_RESPONSE ( ENROLMENT_ID NUMBER(10) NOT NULL, OPERATION_ID NUMBER(10) NOT NULL, OPERATION_RESPONSE BLOB DEFAULT NULL, + RECEIVED_TIMESTAMP TIMESTAMP(0) NULL, CONSTRAINT PK_DM_DEVICE_OP_RESPONSE PRIMARY KEY (ID), CONSTRAINT FK_DM_DEVICE_OP_RES_DEVICE FOREIGN KEY (ENROLMENT_ID) REFERENCES DM_ENROLMENT (ID), diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql index 9ec4ef3778..de4a8ca016 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql @@ -94,6 +94,7 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_OPERATION_RESPONSE ( ENROLMENT_ID INTEGER NOT NULL, OPERATION_ID INTEGER NOT NULL, OPERATION_RESPONSE BYTEA DEFAULT NULL, + RECEIVED_TIMESTAMP TIMESTAMP NULL, CONSTRAINT fk_dm_device_operation_response_enrollment FOREIGN KEY (ENROLMENT_ID) REFERENCES DM_ENROLMENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT fk_dm_device_operation_response_operation FOREIGN KEY (OPERATION_ID) REFERENCES