diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/pom.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/pom.xml index da6c8bc20f0..0a807f27b89 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/pom.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/pom.xml @@ -58,6 +58,7 @@ org.apache.commons.codec.binary;version="${commons-codec.wso2.osgi.version.range}", org.wso2.carbon.device.mgt.core.dto.*;version="${carbon.device.mgt.version}", org.wso2.carbon.device.mgt.core.dao.*;version="${carbon.device.mgt.version}", + org.wso2.carbon.device.mgt.common.operation.mgt.*;version="${carbon.device.mgt.version}", org.w3c.dom, org.json, org.xml.sax, @@ -114,6 +115,10 @@ org.wso2.carbon.devicemgt org.wso2.carbon.device.mgt.core + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.common + diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ApplicationInstallResponse.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ApplicationInstallResponse.java new file mode 100644 index 00000000000..fa0c56b2d7a --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ApplicationInstallResponse.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * you may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.device.application.mgt.common; + +import io.swagger.annotations.ApiModelProperty; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.mgt.common.operation.mgt.Activity; + +import java.util.List; + +public class ApplicationInstallResponse { + @ApiModelProperty( + name = "successfulDevices", + value = "List of successful devices", + dataType = "List[org.wso2.carbon.device.mgt.common.DeviceIdentifier]" + ) + private List successfulDevices; + + @ApiModelProperty( + name = "failedDevices", + value = "List of failed devices", + dataType = "List[org.wso2.carbon.device.mgt.common.DeviceIdentifier]" + ) + private List failedDevices; + + @ApiModelProperty( + name = "activity", + value = "Activity corresponding to the operation" + ) + private Activity activity; + + public List getSuccessfulDevices() { + return successfulDevices; + } + + public void setSuccessfulDevices(List successfulDevices) { + this.successfulDevices = successfulDevices; + } + + public List getFailedDevices() { + return failedDevices; + } + + public void setFailedDevices(List failedDevices) { + this.failedDevices = failedDevices; + } + + public Activity getActivity() { + return activity; + } + + public void setActivity(Activity activity) { + this.activity = activity; + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/DeviceIdentifier.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/DeviceIdentifier.java deleted file mode 100644 index 8f7e656319e..00000000000 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/DeviceIdentifier.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2014, 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.application.mgt.common; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - - -@ApiModel(value = "DeviceIdentifier", description = "This contains device details that is used to identify a device " + - "uniquely.") -public class DeviceIdentifier { - - @ApiModelProperty( - name = "id", - value = "Identity of the device.", - required = true, - example = "d24f870f390352a4") - private String id; - - @ApiModelProperty( - name = "type", - value = "Type of the device.", - required = true, - example = "android") - private String type; - - public DeviceIdentifier() {} - - public DeviceIdentifier(String id, String type) { - this.id = id; - this.type = type; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type.trim(); - } - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - @Override - public String toString() { - return "deviceId {" + - "id='" + id + '\'' + - ", type='" + type + '\'' + - '}'; - } -} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/EnterpriseInstallationDetails.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/EnterpriseInstallationDetails.java new file mode 100644 index 00000000000..6eac1a76ab2 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/EnterpriseInstallationDetails.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * you may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.device.application.mgt.common; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +public class EnterpriseInstallationDetails { + + /** + * This enum represents the type of entities which an application can be installed on. + * + * e.g: An application can be installed on all the devices belong to a user or a specific device group. + */ + @ApiModel + public enum EnterpriseEntity { + USER, ROLE, DEVICE_GROUP + } + + @ApiModelProperty( + name = "applicationUUID", + value = "Application ID", + required = true, + example = "4354c752-109f-11e8-b642-0ed5f89f718b" + ) + private String applicationUUID; + + @ApiModelProperty( + name = "entityType", + value = "Enterprise entity type", + required = true, + example = "USER" + ) + private EnterpriseEntity entityType; + + @ApiModelProperty( + name = "entityValueList", + value = "List of users/roles or device groups.", + required = true, + example = "user1,user2, user3" + ) + private List entityValueList; + + public String getApplicationUUID() { + return applicationUUID; + } + + public void setApplicationUUID(String applicationUUID) { + this.applicationUUID = applicationUUID; + } + + public EnterpriseEntity getEntityType() { + return entityType; + } + + public void setEntityType(EnterpriseEntity entityType) { + this.entityType = entityType; + } + + public List getEntityValueList() { + return entityValueList; + } + + public void setEntityValueList(List entityValueList) { + this.entityValueList = entityValueList; + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/InstallationDetails.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/InstallationDetails.java index 75b484920a1..55dc80ae798 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/InstallationDetails.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/InstallationDetails.java @@ -18,6 +18,7 @@ package org.wso2.carbon.device.application.mgt.common; import io.swagger.annotations.ApiModelProperty; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import java.util.List; @@ -25,30 +26,16 @@ public class InstallationDetails { @ApiModelProperty( name = "applicationUUID", value = "Application ID", - required = true) + required = true + ) private String applicationUUID; - @ApiModelProperty( - name = "versionName", - value = "Version name", - required = true) - private String versionName; - @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, - dataType = "List[org.wso2.carbon.device.mgt.common.DeviceIdentifier]") + dataType = "List[org.wso2.carbon.device.mgt.common.DeviceIdentifier]" + ) private List deviceIdentifiers; public String getApplicationUUID() { @@ -59,30 +46,6 @@ public class InstallationDetails { this.applicationUUID = applicationUUID; } - public String getVersionName() { - return versionName; - } - - public void setVersionName(String versionName) { - this.versionName = versionName; - } - - public List getUserNameList() { - return userNameList; - } - - public void setUserNameList(List userNameList) { - this.userNameList = userNameList; - } - - public List getRoleNameList() { - return roleNameList; - } - - public void setRoleNameList(List roleNameList) { - this.roleNameList = roleNameList; - } - public List getDeviceIdentifiers() { return deviceIdentifiers; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java index 8c10189a8f9..3eb431e12c5 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java @@ -18,10 +18,15 @@ */ package org.wso2.carbon.device.application.mgt.common.services; -import org.wso2.carbon.device.application.mgt.common.*; +import org.wso2.carbon.device.application.mgt.common.Application; +import org.wso2.carbon.device.application.mgt.common.ApplicationList; +import org.wso2.carbon.device.application.mgt.common.ApplicationRelease; +import org.wso2.carbon.device.application.mgt.common.Filter; +import org.wso2.carbon.device.application.mgt.common.LifecycleState; +import org.wso2.carbon.device.application.mgt.common.LifecycleStateTransition; +import org.wso2.carbon.device.application.mgt.common.UnrestrictedRole; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException; -import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import java.util.List; @@ -123,6 +128,14 @@ public interface ApplicationManager { */ Application getApplicationById(int applicationId) throws ApplicationManagementException; + /** + * To get an application associated with the release. + * + * @param appReleaseUUID UUID of the app release + * @return {@link Application} associated with the release + * @throws ApplicationManagementException If unable to retrieve {@link Application} associated with the given UUID + */ + Application getApplicationByRelease(String appReleaseUUID) throws ApplicationManagementException; /** * To get Application with the given UUID. diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/SubscriptionManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/SubscriptionManager.java index 603ac480159..078e2338169 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/SubscriptionManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/SubscriptionManager.java @@ -18,8 +18,9 @@ */ package org.wso2.carbon.device.application.mgt.common.services; -import org.wso2.carbon.device.application.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.application.mgt.common.ApplicationInstallResponse; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import java.util.List; @@ -29,35 +30,42 @@ import java.util.List; public interface SubscriptionManager { /** * To install an application to given list of devices. - * @param applicationUUID Application ID - * @param deviceList Device list - * @return Failed Device List which the application was unable to install - * @throws ApplicationManagementException Application Management Exception + * @param applicationUUID ID of the application to install + * @param deviceList list of device ID's to install the application + * @return {@link ApplicationInstallResponse} object which contains installed application and devices + * @throws ApplicationManagementException if unable to install the application to the given devices */ - List installApplicationForDevices(String applicationUUID, String versionName, - List deviceList) + ApplicationInstallResponse installApplicationForDevices(String applicationUUID, List deviceList) throws ApplicationManagementException; /** * To install an application to given list of users. - * @param applicationUUID Application ID - * @param userList User list - * @return Failed Device List which the application was unable to install - * @throws ApplicationManagementException Application Management Exception + * @param applicationUUID ID of the application to install + * @param userList list of users to install the application + * @return {@link ApplicationInstallResponse} object which contains installed application and devices + * @throws ApplicationManagementException if unable to install the application to devices belong to given users */ - List installApplicationForUsers(String applicationUUID, - List userList, String versionName) + ApplicationInstallResponse installApplicationForUsers(String applicationUUID, List userList) throws ApplicationManagementException; /** - * To install an application to given list of users. - * @param applicationUUID Application ID - * @param roleList Role list - * @return Failed Device List which the application was unable to install - * @throws ApplicationManagementException Application Management Exception + * To install an application to given list of roles. + * @param applicationUUID ID of the application to install + * @param roleList list of roles to install the application + * @return {@link ApplicationInstallResponse} object which contains installed application and devices + * @throws ApplicationManagementException if unable to install the application to devices belong to given roles + */ + ApplicationInstallResponse installApplicationForRoles(String applicationUUID, List roleList) + throws ApplicationManagementException; + + /** + * To install an application to given list of roles. + * @param applicationUUID ID of the application to install + * @param deviceGroupList list of device groups to install the application + * @return {@link ApplicationInstallResponse} object which contains installed application and devices + * @throws ApplicationManagementException if unable to install the application to devices belong to given groups */ - List installApplicationForRoles(String applicationUUID, - List roleList, String versionName) + ApplicationInstallResponse installApplicationForGroups(String applicationUUID, List deviceGroupList) throws ApplicationManagementException; /** @@ -67,8 +75,6 @@ public interface SubscriptionManager { * @return Failed Device List which the application was unable to uninstall * @throws ApplicationManagementException Application Management Exception */ - List uninstallApplication(String applicationUUID, - List deviceList) + List uninstallApplication(String applicationUUID, List deviceList) throws ApplicationManagementException; - } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml index 31014dc167e..57b8686ef8c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml @@ -42,7 +42,7 @@ org.apache.felix maven-bundle-plugin - 1.4.0 + 3.0.1 true diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java index b34d178deaf..e376d038f18 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java @@ -150,5 +150,15 @@ public interface ApplicationDAO { * @throws ApplicationManagementDAOException Application Management DAO Exception. */ void deleteTags(int applicationId) throws ApplicationManagementDAOException; + + /** + * To get an {@link Application} associated with the given release + * + * @param appReleaseUUID UUID of the {@link ApplicationRelease} + * @param tenantId ID of the tenant + * @return {@link Application} associated with the given release UUID + * @throws ApplicationManagementDAOException if unable to fetch the Application from the data store. + */ + Application getApplicationByRelease(String appReleaseUUID, int tenantId) throws ApplicationManagementDAOException; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/SubscriptionDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/SubscriptionDAO.java index 59f3b532f10..e7d02adb78a 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/SubscriptionDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/SubscriptionDAO.java @@ -18,12 +18,71 @@ */ package org.wso2.carbon.device.application.mgt.core.dao; +import org.wso2.carbon.device.application.mgt.common.Application; +import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; +import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; + +import java.util.List; + /** * This interface provides the list of operations that are supported with subscription database. * */ -import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; - public interface SubscriptionDAO { - int addDeviceApplicationMapping(String deviceIdentifier, String applicationUUID, boolean installed) throws ApplicationManagementException; + + /** + * Adds a mapping between devices and the application which the application is installed on. + * + * @param tenantId id of the tenant + * @param subscribedBy username of the user who subscribe the application + * @param deviceList List of {@link Device} which the application is installed on + * @param appId id of the {@link Application} which installs + * @param releaseId id of the {@link org.wso2.carbon.device.application.mgt.common.ApplicationRelease} + * @throws ApplicationManagementDAOException If unable to add a mapping between device and application + */ + void subscribeDeviceToApplication(int tenantId, String subscribedBy, List deviceList, int appId, + int releaseId) throws ApplicationManagementDAOException; + + /** + * Adds a mapping between user and the application which the application is installed on. This mapping will be + * added when an enterprise installation triggered to the user. + * + * @param tenantId id of the tenant + * @param subscribedBy username of the user who subscribe the application + * @param userList list of user names of the users whose devices are subscribed to the application + * @param appId id of the {@link Application} which installs + * @param releaseId id of the {@link org.wso2.carbon.device.application.mgt.common.ApplicationRelease} + * @throws ApplicationManagementDAOException If unable to add a mapping between device and application + */ + void subscribeUserToApplication(int tenantId, String subscribedBy, List userList, int appId, int releaseId) + throws ApplicationManagementDAOException; + + /** + * Adds a mapping between user and the application which the application is installed on. This mapping will be + * added when an enterprise installation triggered to the role. + * + * @param tenantId id of the tenant + * @param subscribedBy username of the user who subscribe the application + * @param roleList list of roles which belongs devices are subscribed to the application + * @param appId id of the {@link Application} which installs + * @param releaseId id of the {@link org.wso2.carbon.device.application.mgt.common.ApplicationRelease} + * @throws ApplicationManagementDAOException If unable to add a mapping between device and application + */ + void subscribeRoleToApplication(int tenantId, String subscribedBy, List roleList, int appId, int releaseId) + throws ApplicationManagementDAOException; + + /** + * Adds a mapping between user and the application which the application is installed on. This mapping will be + * added when an enterprise installation triggered to the role. + * + * @param tenantId id of the tenant + * @param subscribedBy username of the user who subscribe the application + * @param groupList list of {@link DeviceGroup} which belongs the devices that are subscribed to the application + * @param appId id of the {@link Application} which installs + * @param releaseId id of the {@link org.wso2.carbon.device.application.mgt.common.ApplicationRelease} + * @throws ApplicationManagementDAOException If unable to add a mapping between device and application + */ + void subscribeGroupToApplication(int tenantId, String subscribedBy, List groupList, int appId, + int releaseId) throws ApplicationManagementDAOException; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java index f5c5bd33d29..5c48f38486d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java @@ -146,6 +146,39 @@ public class Util { return application; } + + /** + * Populates {@link ApplicationRelease} object with the result obtained from the database. + * + * @param rs {@link ResultSet} from obtained from the database + * @return {@link ApplicationRelease} object populated with the data + * @throws SQLException If unable to populate {@link ApplicationRelease} object with the data + */ + public static ApplicationRelease readApplicationRelease(ResultSet rs) throws SQLException { + ApplicationRelease appRelease = new ApplicationRelease(); + + appRelease.setId(rs.getInt("RELEASE_ID")); + appRelease.setVersion(rs.getString("VERSION")); + appRelease.setTenantId(rs.getString("TENANT_ID")); + appRelease.setUuid(rs.getString("UUID")); + appRelease.setReleaseType(rs.getString("RELEASE_TYPE")); + appRelease.setPrice(rs.getDouble("APP_PRICE")); + appRelease.setAppHashValue(rs.getString("APP_HASH_VALUE")); + appRelease.setAppStoredLoc(rs.getString("STORED_LOCATION")); + appRelease.setBannerLoc(rs.getString("BANNER_LOCATION")); + appRelease.setApplicationCreator(rs.getString("CREATED_BY")); + appRelease.setCreatedAt(rs.getTimestamp("CREATED_AT")); + appRelease.setPublishedBy(rs.getString("PUBLISHED_BY")); + appRelease.setPublishedAt(rs.getTimestamp("PUBLISHED_AT")); + appRelease.setStars(rs.getInt("STARS")); + appRelease.setIsSharedWithAllTenants(rs.getInt("SHARED_WITH_ALL_TENANTS")); + appRelease.setMetaData(rs.getString("APP_META_INFO")); + appRelease.setScreenshotLoc1(rs.getString("SC_1_LOCATION")); + appRelease.setScreenshotLoc2(rs.getString("SC_2_LOCATION")); + appRelease.setScreenshotLoc3(rs.getString("SC_3_LOCATION")); + + return appRelease; + } /** * Cleans up the statement and resultset after executing the query * diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java index e3c6bf748a1..ca4a69fbf3d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java @@ -21,7 +21,13 @@ package org.wso2.carbon.device.application.mgt.core.dao.impl.application; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONException; -import org.wso2.carbon.device.application.mgt.common.*; +import org.wso2.carbon.device.application.mgt.common.Application; +import org.wso2.carbon.device.application.mgt.common.ApplicationList; +import org.wso2.carbon.device.application.mgt.common.ApplicationRelease; +import org.wso2.carbon.device.application.mgt.common.Filter; +import org.wso2.carbon.device.application.mgt.common.Pagination; +import org.wso2.carbon.device.application.mgt.common.Tag; +import org.wso2.carbon.device.application.mgt.common.UnrestrictedRole; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; @@ -29,7 +35,12 @@ import org.wso2.carbon.device.application.mgt.core.dao.common.Util; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; -import java.sql.*; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; import java.util.List; /** @@ -122,7 +133,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic ResultSet rs = null; int isExist = 0; int index = 0; - String sql = "SELECT * FROM AP_APP WHERE NAME = ? AND TYPE = ? TENANT_ID = ?"; + String sql = "SELECT * FROM AP_APP WHERE NAME = ? AND TYPE = ? AND TENANT_ID = ?"; try{ conn = this.getDBConnection(); conn.setAutoCommit(false); @@ -525,6 +536,75 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } } + @Override + public Application getApplicationByRelease(String appReleaseUUID, int tenantId) + throws ApplicationManagementDAOException { + if (log.isDebugEnabled()){ + log.debug("Getting application with the UUID (" + appReleaseUUID + ") from the database"); + } + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + try { + conn = this.getDBConnection(); + String sql = "SELECT AP_APP_RELEASE.ID AS RELEASE_ID, AP_APP_RELEASE.VERSION, AP_APP_RELEASE.TENANT_ID," + + "AP_APP_RELEASE.UUID, AP_APP_RELEASE.RELEASE_TYPE, AP_APP_RELEASE.APP_PRICE, " + + "AP_APP_RELEASE.STORED_LOCATION, AP_APP_RELEASE.BANNER_LOCATION, AP_APP_RELEASE.SC_1_LOCATION," + + "AP_APP_RELEASE.SC_2_LOCATION, AP_APP_RELEASE.SC_3_LOCATION, AP_APP_RELEASE.APP_HASH_VALUE," + + "AP_APP_RELEASE.SHARED_WITH_ALL_TENANTS, AP_APP_RELEASE.APP_META_INFO, AP_APP_RELEASE.CREATED_BY," + + "AP_APP_RELEASE.CREATED_AT, AP_APP_RELEASE.PUBLISHED_BY, AP_APP_RELEASE.PUBLISHED_AT, " + + "AP_APP_RELEASE.STARS," + + "AP_APP.ID AS APP_ID, AP_APP.NAME AS APP_NAME, AP_APP.TYPE AS APP_TYPE, " + + "AP_APP.APP_CATEGORY AS APP_CATEGORY, AP_APP.IS_FREE, AP_UNRESTRICTED_ROLES.ROLE AS ROLE " + + "FROM AP_APP, AP_UNRESTRICTED_ROLES, AP_APP_RELEASE " + + "WHERE AP_APP_RELEASE.UUID=? AND AP_APP.TENANT_ID=?;"; + + stmt = conn.prepareStatement(sql); + stmt.setString(1, appReleaseUUID); + stmt.setInt(2, tenantId); + rs = stmt.executeQuery(); + + if (log.isDebugEnabled()) { + log.debug("Successfully retrieved details of the application with the UUID " + appReleaseUUID); + } + + Application application = null; + while(rs.next()) { + ApplicationRelease appRelease = Util.readApplicationRelease(rs); + application = new Application(); + + application.setId(rs.getInt("APP_ID")); + application.setName(rs.getString("APP_NAME")); + application.setType(rs.getString("APP_TYPE")); + application.setAppCategory(rs.getString("APP_CATEGORY")); + application.setIsFree(rs.getInt("IS_FREE")); + application.setIsRestricted(rs.getInt("RESTRICTED")); + + UnrestrictedRole unrestrictedRole = new UnrestrictedRole(); + unrestrictedRole.setRole(rs.getString("ROLE")); + List unrestrictedRoleList = new ArrayList<>(); + unrestrictedRoleList.add(unrestrictedRole); + + application.setUnrestrictedRoles(unrestrictedRoleList); + + List applicationReleaseList = new ArrayList<>(); + applicationReleaseList.add(appRelease); + + application.setApplicationReleases(applicationReleaseList); + } + return application; + } catch (SQLException e) { + throw new ApplicationManagementDAOException("Error occurred while getting application details with UUID " + + appReleaseUUID + " While executing query ", e); + } catch (JSONException e) { + throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } finally { + Util.cleanupResources(stmt, rs); + } + } + @Override public int getApplicationId(String appName, String appType, int tenantId) throws ApplicationManagementDAOException { Connection conn; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java index b2d2b520d11..3a89159814f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java @@ -19,55 +19,152 @@ package org.wso2.carbon.device.application.mgt.core.dao.impl.subscription; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.dao.SubscriptionDAO; import org.wso2.carbon.device.application.mgt.core.dao.common.Util; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; +import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; +import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; -import java.sql.*; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements SubscriptionDAO { private static Log log = LogFactory.getLog(GenericSubscriptionDAOImpl.class); @Override - public int addDeviceApplicationMapping(String deviceIdentifier, String applicationUUID, boolean installed) throws - ApplicationManagementException { + public void subscribeDeviceToApplication(int tenantId, String subscribedBy, List deviceList, int appId, + int releaseId) throws ApplicationManagementDAOException { Connection conn; PreparedStatement stmt = null; - ResultSet rs = null; - int mappingId = -1; try { conn = this.getDBConnection(); - String sql = "SELECT ID FROM APPM_DEVICE_APPLICATION_MAPPING WHERE DEVICE_IDENTIFIER = ? AND " + - "APPLICATION_UUID = ?"; + long time = System.currentTimeMillis() / 1000; + String sql = "INSERT INTO AP_DEVICE_SUBSCRIPTION(TENANT_ID, SUBSCRIBED_BY, SUBSCRIBED_TIMESTAMP, " + + "DM_DEVICE_ID, AP_APP_RELEASE_ID, AP_APP_ID) VALUES (?, ?, ?, ?, ?, ?)"; stmt = conn.prepareStatement(sql); - stmt.setString(1, deviceIdentifier); - stmt.setString(2, applicationUUID); - rs = stmt.executeQuery(); + for (Device device : deviceList) { + stmt.setInt(1, tenantId); + stmt.setString(2, subscribedBy); + stmt.setLong(3, time); + stmt.setInt(4, device.getId()); + stmt.setInt(5, releaseId); + stmt.setInt(6, appId); + stmt.addBatch(); + if (log.isDebugEnabled()) { + log.debug("Adding a mapping to device ID[" + device.getId() + "] to the application [" + appId + + "], release[" + releaseId + "]"); + } + } + stmt.executeBatch(); + } catch (SQLException | DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while adding device application mapping to DB", + e); + } finally { + Util.cleanupResources(stmt, null); + } + } + + @Override + public void subscribeUserToApplication(int tenantId, String subscribedBy, List userList, int appId, + int releaseId) throws ApplicationManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + try { + conn = this.getDBConnection(); + long time = System.currentTimeMillis() / 1000; + String sql = "INSERT INTO AP_USER_SUBSCRIPTION(TENANT_ID, SUBSCRIBED_BY, SUBSCRIBED_TIMESTAMP, " + + "USER_NAME, AP_APP_RELEASE_ID, AP_APP_ID) VALUES (?, ?, ?, ?, ?, ?)"; + stmt = conn.prepareStatement(sql); + for (String user : userList) { + stmt = conn.prepareStatement(sql); + stmt.setInt(1, tenantId); + stmt.setString(2, subscribedBy); + stmt.setLong(3, time); + stmt.setString(4, user); + stmt.setInt(5, releaseId); + stmt.setInt(6, appId); + stmt.addBatch(); + if (log.isDebugEnabled()) { + log.debug("Adding a mapping to user[" + user + "] to the application [" + appId + "], release[" + + releaseId + "]"); + } + } + stmt.executeBatch(); + } catch (SQLException | DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while adding device application mapping to DB", + e); + } finally { + Util.cleanupResources(stmt, null); + } + } - if (!rs.next()) { - sql = "INSERT INTO APPM_DEVICE_APPLICATION_MAPPING (DEVICE_IDENTIFIER, APPLICATION_UUID, " + - "INSTALLED) VALUES (?, ?, ?)"; - stmt = conn.prepareStatement(sql, new String[]{"id"}); - stmt.setString(1, deviceIdentifier); - stmt.setString(2, applicationUUID); - stmt.setBoolean(3, installed); - stmt.executeUpdate(); + @Override + public void subscribeRoleToApplication(int tenantId, String subscribedBy, List roleList, int appId, + int releaseId) throws ApplicationManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + try { + conn = this.getDBConnection(); + long time = System.currentTimeMillis() / 1000; + String sql = "INSERT INTO AP_ROLE_SUBSCRIPTION(TENANT_ID, SUBSCRIBED_BY, SUBSCRIBED_TIMESTAMP, " + + "ROLE_NAME, AP_APP_RELEASE_ID, AP_APP_ID) VALUES (?, ?, ?, ?, ?, ?)"; + stmt = conn.prepareStatement(sql); + for (String role : roleList) { + stmt.setInt(1, tenantId); + stmt.setString(2, subscribedBy); + stmt.setLong(3, time); + stmt.setString(4, role); + stmt.setInt(5, releaseId); + stmt.setInt(6, appId); + stmt.addBatch(); + if (log.isDebugEnabled()) { + log.debug("Adding a mapping to role[" + role + "] to the application [" + appId + "], release[" + + releaseId + "]"); + } + } + stmt.executeBatch(); + } catch (SQLException | DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while adding device application mapping to DB", + e); + } finally { + Util.cleanupResources(stmt, null); + } + } - rs = stmt.getGeneratedKeys(); - if (rs.next()) { - mappingId = rs.getInt(1); + @Override + public void subscribeGroupToApplication(int tenantId, String subscribedBy, List groupList, int appId, + int releaseId) throws ApplicationManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + try { + conn = this.getDBConnection(); + long time = System.currentTimeMillis() / 1000; + String sql = "INSERT INTO AP_GROUP_SUBSCRIPTION(TENANT_ID, SUBSCRIBED_BY, SUBSCRIBED_TIMESTAMP, " + + "DM_GROUP_ID, AP_APP_RELEASE_ID, AP_APP_ID) VALUES (?, ?, ?, ?, ?, ?)"; + stmt = conn.prepareStatement(sql); + for (DeviceGroup group : groupList) { + stmt.setInt(1, tenantId); + stmt.setString(2, subscribedBy); + stmt.setLong(3, time); + stmt.setInt(4, group.getGroupId()); + stmt.setInt(5, releaseId); + stmt.setInt(6, appId); + stmt.addBatch(); + if (log.isDebugEnabled()) { + log.debug("Adding a mapping to group ID[" + group.getGroupId() + "] to the application [" + appId + + "], release[" + releaseId + "]"); } - return mappingId; - } else { - log.warn("Device[" + deviceIdentifier + "] application[" + applicationUUID + "] mapping already " + - "exists in the DB"); - return -1; } - } catch (SQLException e) { - throw new ApplicationManagementException("Error occurred while adding device application mapping to DB", e); + stmt.executeBatch(); + } catch (SQLException | DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while adding device application mapping to DB", + e); } finally { - Util.cleanupResources(stmt, rs); + Util.cleanupResources(stmt, null); } } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java index 3a8a791f834..6375e6ee69c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java @@ -23,7 +23,15 @@ import org.apache.commons.logging.LogFactory; import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext; -import org.wso2.carbon.device.application.mgt.common.*; +import org.wso2.carbon.device.application.mgt.common.AppLifecycleState; +import org.wso2.carbon.device.application.mgt.common.Application; +import org.wso2.carbon.device.application.mgt.common.ApplicationList; +import org.wso2.carbon.device.application.mgt.common.ApplicationRelease; +import org.wso2.carbon.device.application.mgt.common.Filter; +import org.wso2.carbon.device.application.mgt.common.LifecycleState; +import org.wso2.carbon.device.application.mgt.common.LifecycleStateTransition; +import org.wso2.carbon.device.application.mgt.common.UnrestrictedRole; +import org.wso2.carbon.device.application.mgt.common.User; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException; @@ -38,16 +46,17 @@ import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; import org.wso2.carbon.device.application.mgt.core.exception.ValidationException; import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; -import org.wso2.carbon.device.mgt.core.dao.*; +import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; +import org.wso2.carbon.device.mgt.core.dao.DeviceTypeDAO; import org.wso2.carbon.device.mgt.core.dto.DeviceType; import org.wso2.carbon.user.api.UserRealm; import org.wso2.carbon.user.api.UserStoreException; import org.wso2.carbon.utils.multitenancy.MultitenantUtils; -import java.util.ArrayList; -import java.util.List; import java.sql.Timestamp; +import java.util.ArrayList; import java.util.Date; +import java.util.List; /** * Default Concrete implementation of Application Management related implementations. @@ -273,6 +282,29 @@ public class ApplicationManagerImpl implements ApplicationManager { } } + @Override + public Application getApplicationByRelease(String appReleaseUUID) throws ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + Application application; + try { + ConnectionManagerUtil.openDBConnection(); + application = ApplicationManagementDAOFactory.getApplicationDAO() + .getApplicationByRelease(appReleaseUUID, tenantId); + + if (application.getUnrestrictedRoles().isEmpty() || isRoleExists(application.getUnrestrictedRoles(), + userName)) { + return application; + } + return null; + } catch (UserStoreException e) { + throw new ApplicationManagementException( + "User-store exception while getting application with the application UUID " + appReleaseUUID); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + public Boolean verifyApplicationExistenceById(int appId) throws ApplicationManagementException { try { Boolean isAppExist; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java index b6bb3f53493..b82057447f7 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java @@ -19,22 +19,35 @@ package org.wso2.carbon.device.application.mgt.core.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.application.mgt.common.DeviceIdentifier; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.device.application.mgt.common.Application; +import org.wso2.carbon.device.application.mgt.common.ApplicationInstallResponse; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; +import org.wso2.carbon.device.application.mgt.core.dao.SubscriptionDAO; +import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory; +import org.wso2.carbon.device.application.mgt.core.util.ApplicationManagementUtil; +import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; import org.wso2.carbon.device.application.mgt.core.util.HelperUtil; import org.wso2.carbon.device.mgt.common.Device; -import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.common.InvalidDeviceException; -import org.wso2.carbon.device.mgt.common.app.mgt.DeviceApplicationMapping; +import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; +import org.wso2.carbon.device.mgt.common.group.mgt.GroupManagementException; +import org.wso2.carbon.device.mgt.common.operation.mgt.Activity; import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException; import org.wso2.carbon.device.mgt.core.operation.mgt.ProfileOperation; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; +import org.wso2.carbon.device.mgt.core.service.GroupManagementProviderService; +import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * This is the default implementation for the Subscription Manager. @@ -43,108 +56,262 @@ public class SubscriptionManagerImpl implements SubscriptionManager { private static final Log log = LogFactory.getLog(SubscriptionManagerImpl.class); private static final String INSTALL_APPLICATION = "INSTALL_APPLICATION"; + private SubscriptionDAO subscriptionDAO; + + public SubscriptionManagerImpl() { + this.subscriptionDAO = ApplicationManagementDAOFactory.getSubscriptionDAO(); + } @Override - public List installApplicationForDevices(String applicationUUID, String versionName, - List deviceList) - throws ApplicationManagementException { - return installApplication(applicationUUID, deviceList, versionName); + public ApplicationInstallResponse installApplicationForDevices(String applicationUUID, + List deviceList) throws ApplicationManagementException { + if (log.isDebugEnabled()) { + log.debug("Install application: " + applicationUUID + " to " + deviceList.size() + "devices."); + } + ApplicationManager applicationManager = ApplicationManagementUtil.getApplicationManagerInstance(); + Application application = applicationManager.getApplicationByRelease(applicationUUID); + + return installApplication(application, deviceList); } @Override - public List installApplicationForUsers(String applicationUUID, List userList, - String versionName) throws ApplicationManagementException { - log.info("Install application: " + applicationUUID + " to: " + userList.size() + " users."); + public ApplicationInstallResponse installApplicationForUsers(String applicationUUID, List userList) + throws ApplicationManagementException { + if (log.isDebugEnabled()) { + log.debug("Install application: " + applicationUUID + " to " + userList.size() + " users."); + } + ApplicationManager applicationManager = ApplicationManagementUtil.getApplicationManagerInstance(); + Application application = applicationManager.getApplicationByRelease(applicationUUID); List deviceList = new ArrayList<>(); for (String user : userList) { try { List devicesOfUser = HelperUtil.getDeviceManagementProviderService().getDevicesOfUser(user); - for (Device device : devicesOfUser) { - deviceList.add(new DeviceIdentifier(device - .getDeviceIdentifier(), device.getType())); + devicesOfUser.stream() + .map(device -> new DeviceIdentifier(device.getDeviceIdentifier(), device.getType())) + .forEach(deviceList::add); + if (log.isDebugEnabled()) { + log.debug(devicesOfUser.size() + " found for the provided user list"); } } catch (DeviceManagementException e) { - log.error("Error when extracting the device list from user[" + user + "].", e); + throw new ApplicationManagementException("Error when extracting the device list of user[" + user + "].", + e); } } - return installApplication(applicationUUID, deviceList, versionName); + + ApplicationInstallResponse response = installApplication(application, deviceList); + + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + int applicationReleaseId = application.getApplicationReleases().get(0).getId(); + + try { + ConnectionManagerUtil.openDBConnection(); + subscriptionDAO.subscribeUserToApplication(tenantId, subscriber, userList, application.getId(), + applicationReleaseId); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + + return response; } @Override - public List installApplicationForRoles(String applicationUUID, List roleList, - String versionName) throws ApplicationManagementException { - log.info("Install application: " + applicationUUID + " to: " + roleList.size() + " roles."); + public ApplicationInstallResponse installApplicationForRoles(String applicationUUID, List roleList) + throws ApplicationManagementException { + if (log.isDebugEnabled()) { + log.debug("Install application: " + applicationUUID + " to " + roleList.size() + " roles."); + } + ApplicationManager applicationManager = ApplicationManagementUtil.getApplicationManagerInstance(); + Application application = applicationManager.getApplicationByRelease(applicationUUID); List deviceList = new ArrayList<>(); for (String role : roleList) { try { List devicesOfRole = HelperUtil.getDeviceManagementProviderService().getAllDevicesOfRole(role); - for (Device device : devicesOfRole) { - deviceList.add(new DeviceIdentifier(device - .getDeviceIdentifier(), device.getType())); + devicesOfRole.stream() + .map(device -> new DeviceIdentifier(device.getDeviceIdentifier(), device.getType())) + .forEach(deviceList::add); + if (log.isDebugEnabled()) { + log.debug(devicesOfRole.size() + " found for role: " + role); } } catch (DeviceManagementException e) { - log.error("Error when extracting the device list from role[" + role + "].", e); + throw new ApplicationManagementException( + "Error when extracting the device list from role[" + role + "].", e); } } - return installApplication(applicationUUID, deviceList, versionName); + + ApplicationInstallResponse response = installApplication(application, deviceList); + + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + int applicationReleaseId = application.getApplicationReleases().get(0).getId(); + + try { + ConnectionManagerUtil.openDBConnection(); + subscriptionDAO.subscribeRoleToApplication(tenantId, subscriber, roleList, application.getId(), + applicationReleaseId); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + + return response; } @Override - public List uninstallApplication(String applicationUUID, - List deviceList) + public ApplicationInstallResponse installApplicationForGroups(String applicationUUID, List deviceGroupList) throws ApplicationManagementException { - return null; + if (log.isDebugEnabled()) { + log.debug("Install application: " + applicationUUID + " to " + deviceGroupList.size() + " groups."); + } + ApplicationManager applicationManager = ApplicationManagementUtil.getApplicationManagerInstance(); + Application application = applicationManager.getApplicationByRelease(applicationUUID); + GroupManagementProviderService groupManagementProviderService = HelperUtil.getGroupManagementProviderService(); + List groupList = new ArrayList<>(); + List deviceList = new ArrayList<>(); + for (String groupName : deviceGroupList) { + try { + DeviceGroup deviceGroup = groupManagementProviderService.getGroup(groupName); + groupList.add(deviceGroup); + int deviceCount = groupManagementProviderService.getDeviceCount(deviceGroup.getGroupId()); + List devicesOfGroups = groupManagementProviderService + .getDevices(deviceGroup.getGroupId(), 0, deviceCount); + devicesOfGroups.stream() + .map(device -> new DeviceIdentifier(device.getDeviceIdentifier(), device.getType())) + .forEach(deviceList::add); + } catch (GroupManagementException e) { + throw new ApplicationManagementException( + "Error when extracting the device list from group[" + groupName + "].", e); + } + } + + ApplicationInstallResponse response = installApplication(application, deviceList); + + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + int applicationReleaseId = application.getApplicationReleases().get(0).getId(); + + try { + ConnectionManagerUtil.openDBConnection(); + subscriptionDAO.subscribeGroupToApplication(tenantId, subscriber, groupList, application.getId(), + applicationReleaseId); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + + return response; } - private List installApplication(String applicationUUID, List deviceList, - String versionName) throws ApplicationManagementException { + @Override + public List uninstallApplication(String applicationUUID, List deviceList) + throws ApplicationManagementException { return null; -// List failedDeviceList = new ArrayList<>(deviceList); -// // Todo: try whether we can optimise this by sending bulk inserts to db -// // Todo: atomicity is not maintained as deveice managment provider service uses separate db connection. fix this?? -// log.info("Install application: " + applicationUUID + "[" + versionName + "]" + " to: " -// + deviceList.size() + " devices."); -// for (DeviceIdentifier device : deviceList) { -// org.wso2.carbon.device.mgt.common.DeviceIdentifier deviceIdentifier = new org.wso2.carbon.device.mgt -// .common.DeviceIdentifier(device.getId(), device.getType()); -// try { -// DeviceManagementProviderService dmpService = HelperUtil.getDeviceManagementProviderService(); -// if (!dmpService.isEnrolled(deviceIdentifier)) { -// log.error("Device with ID: [" + device.getId() + "] is not enrolled to install the application."); -// } else { -// if (log.isDebugEnabled()) { -// log.debug("Installing application to : " + device.getId()); -// } -// //Todo: generating one time download link for the application and put install operation to device. -// -// // put app install operation to the device -// ProfileOperation operation = new ProfileOperation(); -// operation.setCode(INSTALL_APPLICATION); -// operation.setType(Operation.Type.PROFILE); -// operation.setPayLoad("{'type':'enterprise', 'url':'http://10.100.5.76:8000/app-debug.apk', 'app':'" -// + applicationUUID + "'}"); -// List deviceIdentifiers = new ArrayList<>(); -// deviceIdentifiers.add(deviceIdentifier); -// dmpService.addOperation(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, -// operation, deviceIdentifiers); -// -// DeviceApplicationMapping deviceApp = new DeviceApplicationMapping(); -// deviceApp.setDeviceIdentifier(device.getId()); -// deviceApp.setApplicationUUID(applicationUUID); -// deviceApp.setVersionName(versionName); -// deviceApp.setInstalled(false); -// dmpService.addDeviceApplicationMapping(deviceApp); -//// DeviceManagementDAOFactory.openConnection(); -//// ApplicationManagementDAOFactory.getSubscriptionDAO().addDeviceApplicationMapping(device.getId(), applicationUUID, false); -// failedDeviceList.remove(device); -// } -// } catch (DeviceManagementException | OperationManagementException | InvalidDeviceException e) { -// log.error("Error while installing application to device[" + deviceIdentifier.getId() + "]", e); -// } -// finally { -// DeviceManagementDAOFactory.closeConnection(); -// } -// } -// return failedDeviceList; + } + + private ApplicationInstallResponse installApplication(Application application, + List deviceIdentifierList) throws ApplicationManagementException { + DeviceManagementProviderService deviceManagementProviderService = HelperUtil + .getDeviceManagementProviderService(); + + ApplicationInstallResponse response = validateDevices(deviceIdentifierList, application.getType()); + /* + Group the valid device list by device type. Following lambda expression produces a map containing device type + as the key and the list of device identifiers as the corresponding value. + */ + Map> deviceTypeIdentifierMap = response.getSuccessfulDevices().stream() + .collect(Collectors.groupingBy(DeviceIdentifier::getType)); + + for (Map.Entry> entry : deviceTypeIdentifierMap.entrySet()) { + Operation operation = generateOperationPayloadByDeviceType(entry.getKey(), application); + try { + Activity activity = deviceManagementProviderService + .addOperation(entry.getKey(), operation, entry.getValue()); + response.setActivity(activity); + } catch (OperationManagementException e) { + response.setSuccessfulDevices(null); + response.setFailedDevices(deviceIdentifierList); + throw new ApplicationManagementException("Error occurred while adding the application install " + + "operation to devices", e); + } catch (InvalidDeviceException e) { + //This exception should not occur because the validation has already been done. + throw new ApplicationManagementException("The list of device identifiers are invalid"); + } + } + + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + int applicationReleaseId = application.getApplicationReleases().get(0).getId(); + try { + ConnectionManagerUtil.openDBConnection(); + List deviceList = new ArrayList<>(); + for (DeviceIdentifier deviceIdentifier : response.getSuccessfulDevices()) { + try { + deviceList.add(deviceManagementProviderService.getDevice(deviceIdentifier)); + } catch (DeviceManagementException e) { + log.error("Unable to fetch device for device identifier: " + deviceIdentifier.toString()); + } + } + subscriptionDAO.subscribeDeviceToApplication(tenantId, subscriber, deviceList, application.getId(), + applicationReleaseId); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + + return response; + } + + private Operation generateOperationPayloadByDeviceType(String deviceType, Application application) { + ProfileOperation operation = new ProfileOperation(); + operation.setCode(INSTALL_APPLICATION); + operation.setType(Operation.Type.PROFILE); + + //todo: generate operation payload correctly for all types of devices. + operation.setPayLoad( + "{'type':'enterprise', 'url':'" + application.getApplicationReleases().get(0).getAppStoredLoc() + + "', 'app':'" + application.getApplicationReleases().get(0).getUuid() + "'}"); + return operation; + } + + /** + * Validates the preconditions which is required to satisfy from the device which is required to install the + * application. + * + * This method check two preconditions whether the application type is compatible to install in the device and + * whether the device is enrolled in the system. + * + * @param deviceIdentifierList List of {@link DeviceIdentifier} which the validation happens + * @param appPlatform type of the application + * @return {@link ApplicationInstallResponse} which contains compatible and incompatible device identifiers + */ + private ApplicationInstallResponse validateDevices(List deviceIdentifierList, + String appPlatform) { + ApplicationInstallResponse applicationInstallResponse = new ApplicationInstallResponse(); + List failedDevices = new ArrayList<>(); + List compatibleDevices = new ArrayList<>(); + + for (DeviceIdentifier deviceIdentifier : deviceIdentifierList) { + try { + if (appPlatform == null || !(appPlatform.equals("WEB_CLIP") || appPlatform + .equals(deviceIdentifier.getType()))) { + log.error("Device with ID: [" + deviceIdentifier.getId() + "] of type: [" + + deviceIdentifier.getType() + "] is not compatible with the application of type: [" + + appPlatform + "]"); + failedDevices.add(deviceIdentifier); + continue; + } + + if (!DeviceManagerUtil.isValidDeviceIdentifier(deviceIdentifier)) { + log.error("Device with ID: [" + deviceIdentifier.getId() + "] is not valid to install the " + + "application."); + applicationInstallResponse.getFailedDevices().add(deviceIdentifier); + } + } catch (DeviceManagementException e) { + log.error("Error occurred while validating the device: [" + deviceIdentifier.getId() + "]", e); + failedDevices.add(deviceIdentifier); + } + compatibleDevices.add(deviceIdentifier); + } + applicationInstallResponse.setFailedDevices(failedDevices); + applicationInstallResponse.setSuccessfulDevices(compatibleDevices); + + return applicationInstallResponse; } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/HelperUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/HelperUtil.java index b1297dfa8bc..fbad305355f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/HelperUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/HelperUtil.java @@ -21,8 +21,11 @@ package org.wso2.carbon.device.application.mgt.core.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; +import org.wso2.carbon.device.mgt.core.service.GroupManagementProviderService; +import java.util.List; import java.util.UUID; /** @@ -33,6 +36,7 @@ public class HelperUtil { private static Log log = LogFactory.getLog(HelperUtil.class); private static DeviceManagementProviderService deviceManagementProviderService; + private static GroupManagementProviderService groupManagementProviderService; public static String generateApplicationUuid() { return UUID.randomUUID().toString(); @@ -56,4 +60,21 @@ public class HelperUtil { return deviceManagementProviderService; } + public static GroupManagementProviderService getGroupManagementProviderService() { + if (groupManagementProviderService == null) { + synchronized (HelperUtil.class) { + if (groupManagementProviderService == null) { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + groupManagementProviderService = (GroupManagementProviderService) ctx + .getOSGiService(GroupManagementProviderService.class, null); + if (groupManagementProviderService == null) { + String msg = "Group management provider service has not initialized."; + log.error(msg); + throw new IllegalStateException(msg); + } + } + } + } + return groupManagementProviderService; + } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/pom.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/pom.xml index 6ed2dd59bf3..1a7bbecce25 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/pom.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/pom.xml @@ -163,6 +163,10 @@ org.wso2.carbon.device.application.mgt.common provided + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.common + io.swagger swagger-annotations diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/beans/ErrorResponse.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/beans/ErrorResponse.java index 7727b7a6954..3b78219b855 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/beans/ErrorResponse.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/beans/ErrorResponse.java @@ -21,6 +21,7 @@ package org.wso2.carbon.device.application.mgt.publisher.api.beans; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import org.wso2.carbon.device.application.mgt.publisher.api.beans.ErrorListItem; import java.util.ArrayList; import java.util.List; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/SubscriptionManagementAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/SubscriptionManagementAPI.java index fb6d0e24465..8449da1cf5d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/SubscriptionManagementAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/SubscriptionManagementAPI.java @@ -17,14 +17,29 @@ */ package org.wso2.carbon.device.application.mgt.publisher.api.services; -import io.swagger.annotations.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.Extension; +import io.swagger.annotations.ExtensionProperty; +import io.swagger.annotations.Info; +import io.swagger.annotations.SwaggerDefinition; +import io.swagger.annotations.Tag; import org.wso2.carbon.apimgt.annotations.api.Scopes; -import org.wso2.carbon.device.application.mgt.publisher.api.beans.ErrorResponse; import org.wso2.carbon.device.application.mgt.common.Application; +import org.wso2.carbon.device.application.mgt.common.ApplicationInstallResponse; +import org.wso2.carbon.device.application.mgt.common.EnterpriseInstallationDetails; import org.wso2.carbon.device.application.mgt.common.InstallationDetails; import javax.validation.Valid; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -43,9 +58,8 @@ import javax.ws.rs.core.Response; } ), tags = { - @Tag(name = "subscription_management, device_management", description = "Subscription Management " + - "related " - + "APIs") + @Tag(name = "subscription_management, device_management", description = "Subscription Management " + + "related APIs") } ) @Scopes( @@ -82,7 +96,7 @@ public interface SubscriptionManagementAPI { produces = MediaType.APPLICATION_JSON, httpMethod = "POST", value = "Install an application", - notes = "This will install an application to a given list of devices/users/roles", + notes = "This will install an application to a given list of devices", tags = "Subscription Management", extensions = { @Extension(properties = { @@ -94,24 +108,74 @@ public interface SubscriptionManagementAPI { value = { @ApiResponse( code = 200, - message = "OK. \n Successfully installed the application.", - response = Application.class), + message = "OK. \n Successfully sent the install application operation.", + response = ApplicationInstallResponse.class + ), @ApiResponse( code = 304, - message = "Not Modified. \n " + - "Empty body because the application is already installed."), + message = "Not Modified. \n Empty body because the application is already installed." + ), + @ApiResponse( + code = 404, + message = "Not Found. \n Application cannot be found to install." + ), @ApiResponse( code = 500, - message = "Internal Server Error. \n Error occurred while installing the application.", - response = ErrorResponse.class) + message = "Internal Server Error. \n Error occurred while installing the application." + ) }) Response installApplication( @ApiParam( name = "installationDetails", value = "The application ID and list of devices/users/roles", - required = true) + required = true + ) @Valid InstallationDetails installationDetails); + @POST + @Path("/enterprise-install-application") + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Install an application to the devices belong to an enterprise entity", + notes = "This will install an application to a given list of groups/users/roles", + tags = "Subscription Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "perm:subscription:install") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully sent the install application operation.", + response = ApplicationInstallResponse.class + ), + @ApiResponse( + code = 304, + message = "Not Modified. \n Empty body because the application is already installed." + ), + @ApiResponse( + code = 404, + message = "Not Found. \n Application cannot be found to install." + ), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Error occurred while installing the application." + ) + }) + Response enterpriseInstallApplication( + @ApiParam( + name = "enterpriseInstallationDetails", + value = "The application ID and list of devices/users/roles", + required = true) + @Valid EnterpriseInstallationDetails enterpriseInstallationDetails); + @POST @Path("/uninstall-application") @Produces(MediaType.APPLICATION_JSON) @@ -121,7 +185,7 @@ public interface SubscriptionManagementAPI { produces = MediaType.APPLICATION_JSON, httpMethod = "POST", value = "Uninstall an application", - notes = "This will uninstall an application to a given list of devices/users/roles", + notes = "This will uninstall an application from given list of devices", tags = "Subscription Management", extensions = { @Extension(properties = { @@ -134,23 +198,73 @@ public interface SubscriptionManagementAPI { @ApiResponse( code = 200, message = "OK. \n Successfully uninstalled the application.", - response = Application.class), + response = Application.class + ), @ApiResponse( code = 304, - message = "Not Modified. \n " + - "Empty body because the application is already uninstalled."), + message = "Not Modified. \n Empty body because the application is already uninstalled." + ), + @ApiResponse( + code = 404, + message = "Not Found. \n Application cannot be found to uninstall." + ), @ApiResponse( code = 500, - message = "Internal Server Error. \n Error occurred while installing the application.", - response = ErrorResponse.class) + message = "Internal Server Error. \n Error occurred while uninstalling the application." + ) }) Response uninstallApplication( @ApiParam( name = "installationDetails", - value = "The application ID and list of devices/users/roles", + value = "The application ID and list of devices", required = true) @Valid InstallationDetails installationDetails); + @POST + @Path("/enterprise-uninstall-application") + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Uninstall an application from the devices belong to an enterprise entity", + notes = "This will uninstall an application from devices belong to given list of groups/users/roles", + tags = "Subscription Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "perm:subscription:uninstall") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully uninstalled the application.", + response = Application.class + ), + @ApiResponse( + code = 304, + message = "Not Modified. \n Empty body because the application is already uninstalled." + ), + @ApiResponse( + code = 404, + message = "Not Found. \n Application cannot be found to uninstall." + ), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Error occurred while uninstalling the application." + ) + }) + Response enterpriseUninstallApplication( + @ApiParam( + name = "enterpriseInstallationDetails", + value = "The application ID and list of groups/users/roles", + required = true + ) + @Valid EnterpriseInstallationDetails enterpriseInstallationDetails); + @GET @Path("/application/{applicationUUID}/device/{deviceId}") @Produces(MediaType.APPLICATION_JSON) @@ -173,23 +287,27 @@ public interface SubscriptionManagementAPI { @ApiResponse( code = 200, message = "OK. \n Successfully installed the application.", - response = Application.class), + response = Application.class + ), @ApiResponse( code = 304, message = "Not Modified. \n " + - "Empty body because the application is already installed."), + "Empty body because the application is already installed." + ), @ApiResponse( code = 500, - message = "Internal Server Error. \n Error occurred while fetching the application.", - response = ErrorResponse.class) + message = "Internal Server Error. \n Error occurred while fetching the application." + ) }) Response getApplication( @ApiParam( name = "applicationUUID", - value = "Application ID") + value = "Application ID" + ) @QueryParam("applicationUUID") String applicationUUID, @ApiParam( name = "deviceId", - value = "The device ID") + value = "The device ID" + ) @QueryParam("deviceId") String deviceId); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/SubscriptionManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/SubscriptionManagementAPIImpl.java index 54d38779f7b..558400b39cf 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/SubscriptionManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/SubscriptionManagementAPIImpl.java @@ -20,12 +20,14 @@ package org.wso2.carbon.device.application.mgt.store.api.services.impl; import io.swagger.annotations.ApiParam; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.application.mgt.common.ApplicationInstallResponse; +import org.wso2.carbon.device.application.mgt.common.EnterpriseInstallationDetails; import org.wso2.carbon.device.application.mgt.store.api.APIUtil; import org.wso2.carbon.device.application.mgt.publisher.api.services.SubscriptionManagementAPI; -import org.wso2.carbon.device.application.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.application.mgt.common.InstallationDetails; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import javax.validation.Valid; import javax.ws.rs.POST; @@ -47,33 +49,70 @@ public class SubscriptionManagementAPIImpl implements SubscriptionManagementAPI{ @Override @POST @Path("/install-application") - public Response installApplication(@ApiParam(name = "installationDetails", value = "The application ID and list" + - " the devices/users/roles", required = true) @Valid InstallationDetails installationDetails) { - Object result; + public Response installApplication(@ApiParam(name = "installationDetails", value = "Application ID and list of" + + "devices", required = true) @Valid InstallationDetails installationDetails) { SubscriptionManager subscriptionManager = APIUtil.getSubscriptionManager(); + String applicationUUID = installationDetails.getApplicationUUID(); + + if (applicationUUID.isEmpty() || installationDetails.getDeviceIdentifiers().isEmpty()) { + String msg = "Some or all data in the incoming request is empty. Therefore unable to proceed with the " + + "installation."; + log.error(msg); + return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + } + + try { + ApplicationInstallResponse response = subscriptionManager.installApplicationForDevices(applicationUUID, + installationDetails.getDeviceIdentifiers()); + return Response.status(Response.Status.OK).entity(response).build(); + } catch (ApplicationManagementException e) { + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("Error occurred while installing the application for devices" + ": " + e.getMessage()) + .build(); + } + } + + @Override + public Response enterpriseInstallApplication(EnterpriseInstallationDetails enterpriseInstallationDetails) { + SubscriptionManager subscriptionManager = APIUtil.getSubscriptionManager(); + String msg; + String applicationUUID = enterpriseInstallationDetails.getApplicationUUID(); + EnterpriseInstallationDetails.EnterpriseEntity enterpriseEntity = enterpriseInstallationDetails.getEntityType(); + List entityValueList = enterpriseInstallationDetails.getEntityValueList(); + ApplicationInstallResponse response; + + if (applicationUUID.isEmpty()) { + msg = "Application UUID is empty in the incoming request. Therefore unable to proceed with the " + + "installation."; + log.error(msg); + return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + } + + if (enterpriseEntity == null || entityValueList.isEmpty()) { + msg = "Some or all details of the entity is empty in the incoming request. Therefore unable to proceed " + + "with the installation."; + log.error(msg); + return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + } + try { - String applicationUUID = installationDetails.getApplicationUUID(); - String versionName = installationDetails.getVersionName(); - if (!installationDetails.getDeviceIdentifiers().isEmpty()) { - List deviceList = installationDetails.getDeviceIdentifiers(); - result = subscriptionManager.installApplicationForDevices(applicationUUID, versionName, deviceList); - } else if (!installationDetails.getUserNameList().isEmpty()) { - List userList = installationDetails.getUserNameList(); - result = subscriptionManager.installApplicationForUsers(applicationUUID, userList, versionName); - } else if (!installationDetails.getRoleNameList().isEmpty()) { - List roleList = installationDetails.getRoleNameList(); - result = subscriptionManager.installApplicationForRoles(applicationUUID, roleList, versionName); + if (EnterpriseInstallationDetails.EnterpriseEntity.USER.equals(enterpriseEntity)) { + response = subscriptionManager.installApplicationForUsers(applicationUUID, entityValueList); + } else if (EnterpriseInstallationDetails.EnterpriseEntity.ROLE.equals(enterpriseEntity)) { + response = subscriptionManager.installApplicationForRoles(applicationUUID, entityValueList); + } else if (EnterpriseInstallationDetails.EnterpriseEntity.DEVICE_GROUP.equals(enterpriseEntity)) { + response = subscriptionManager.installApplicationForGroups(applicationUUID, entityValueList); } else { - result = "Missing request data!"; - return Response.status(Response.Status.BAD_REQUEST).entity(result).build(); + msg = "Entity type does not match either USER, ROLE or DEVICE_GROUP. Therefore unable to proceed with " + + "the installation"; + log.error(msg); + return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); } - HashMap response = new HashMap<>(); - response.put("failedDevices", result); return Response.status(Response.Status.OK).entity(response).build(); } catch (ApplicationManagementException e) { - String msg = "Error occurred while installing the application"; - log.error(msg, e); - return Response.status(Response.Status.BAD_REQUEST).build(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("Error occurred while installing the application for devices" + ": " + e.getMessage()) + .build(); } } @@ -83,6 +122,12 @@ public class SubscriptionManagementAPIImpl implements SubscriptionManagementAPI{ return null; } + @Override + public Response enterpriseUninstallApplication( + EnterpriseInstallationDetails enterpriseInstallationDetails) { + return null; + } + @Override public Response getApplication(@ApiParam(name = "applicationUUID", value = "Application ID") String applicationUUID, @ApiParam(name = "deviceId", value = "The device ID")