diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ApplicationSubscriptionInfo.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ApplicationSubscriptionInfo.java new file mode 100644 index 00000000000..648e8585f93 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ApplicationSubscriptionInfo.java @@ -0,0 +1,52 @@ +/* Copyright (c) 2020, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. + * + * Entgra (Pvt) Ltd. 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 org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; + +import java.util.ArrayList; +import java.util.List; + +public class ApplicationSubscriptionInfo { + + List devices; + List subscribers; + List errorDeviceIdentifiers; + String appSupportingDeviceTypeName; + + public List getDevices() { return devices; } + + public void setDevices(List devices) { this.devices = devices; } + + public List getSubscribers() { return subscribers; } + + public void setSubscribers(List subscribers) { this.subscribers = subscribers; } + + public List getErrorDeviceIdentifiers() { return errorDeviceIdentifiers; } + + public void setErrorDeviceIdentifiers(List errorDeviceIdentifiers) { + this.errorDeviceIdentifiers = errorDeviceIdentifiers; + } + + public String getAppSupportingDeviceTypeName() { return appSupportingDeviceTypeName; } + + public void setAppSupportingDeviceTypeName(String appSupportingDeviceTypeName) { + this.appSupportingDeviceTypeName = appSupportingDeviceTypeName; + } +} 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 47545d4c833..158b67ff107 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 @@ -29,6 +29,7 @@ import org.wso2.carbon.apimgt.application.extension.dto.ApiApplicationKey; import org.wso2.carbon.apimgt.application.extension.exception.APIManagerException; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.application.mgt.common.ApplicationInstallResponse; +import org.wso2.carbon.device.application.mgt.common.ApplicationSubscriptionInfo; import org.wso2.carbon.device.application.mgt.common.ApplicationType; import org.wso2.carbon.device.application.mgt.common.DeviceSubscriptionData; import org.wso2.carbon.device.application.mgt.common.DeviceTypes; @@ -76,7 +77,6 @@ import org.wso2.carbon.device.mgt.common.operation.mgt.Activity; import org.wso2.carbon.device.mgt.common.operation.mgt.ActivityStatus; 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.dto.DeviceType; 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; @@ -120,84 +120,16 @@ public class SubscriptionManagerImpl implements SubscriptionManager { log.debug("Install application release which has UUID " + applicationUUID + " to " + params.size() + " users."); } - try { - validateRequest(params, subType, action); - DeviceManagementProviderService deviceManagementProviderService = HelperUtil - .getDeviceManagementProviderService(); - GroupManagementProviderService groupManagementProviderService = HelperUtil - .getGroupManagementProviderService(); - String deviceTypeName = null; - List devices = new ArrayList<>(); - List subscribers = new ArrayList<>(); - List errorDeviceIdentifiers = new ArrayList<>(); - ApplicationInstallResponse applicationInstallResponse; - - //todo validate users, groups and roles - ApplicationDTO applicationDTO = getApplicationDTO(applicationUUID); - if (SubscriptionType.DEVICE.toString().equals(subType)) { - for (T param : params) { - DeviceIdentifier deviceIdentifier = (DeviceIdentifier) param; - if (StringUtils.isEmpty(deviceIdentifier.getId()) || StringUtils - .isEmpty(deviceIdentifier.getType())) { - log.warn("Found a device identifier which has either empty identity of the device or empty" - + " device type. Hence ignoring the device identifier. "); - continue; - } - if (!ApplicationType.WEB_CLIP.toString().equals(applicationDTO.getType())) { - DeviceType deviceType = APIUtil.getDeviceTypeData(applicationDTO.getDeviceTypeId()); - if (!deviceType.getName().equals(deviceIdentifier.getType())) { - log.warn("Found a device identifier which is not matched with the supported device type " - + "of the application release which has UUID " + applicationUUID + " Application " - + "supported device type is " + deviceType.getName() + " and the " - + "identifier of which has a different device type is " + deviceIdentifier.getId()); - errorDeviceIdentifiers.add(deviceIdentifier); - continue; - } - } - devices.add(deviceManagementProviderService.getDevice(deviceIdentifier, false)); - } - } else if (SubscriptionType.USER.toString().equalsIgnoreCase(subType)) { - for (T param : params) { - String username = (String) param; - subscribers.add(username); - devices.addAll(deviceManagementProviderService.getDevicesOfUser(username)); - } - } else if (SubscriptionType.ROLE.toString().equalsIgnoreCase(subType)) { - for (T param : params) { - String roleName = (String) param; - subscribers.add(roleName); - devices.addAll(deviceManagementProviderService.getAllDevicesOfRole(roleName)); - } - } else if (SubscriptionType.GROUP.toString().equalsIgnoreCase(subType)) { - for (T param : params) { - String groupName = (String) param; - subscribers.add(groupName); - devices.addAll(groupManagementProviderService.getAllDevicesOfGroup(groupName, true)); - } - } - if (!ApplicationType.WEB_CLIP.toString().equals(applicationDTO.getType()) && !SubscriptionType.DEVICE - .toString().equals(subType)) { - DeviceType deviceType = APIUtil.getDeviceTypeData(applicationDTO.getDeviceTypeId()); - deviceTypeName = deviceType.getName(); - //filter devices by device type - String tmpDeviceTypeName = deviceTypeName; - devices.removeIf(device -> !tmpDeviceTypeName.equals(device.getType())); - } + validateRequest(params, subType, action); + //todo validate users, groups and roles + ApplicationDTO applicationDTO = getApplicationDTO(applicationUUID); + ApplicationSubscriptionInfo applicationSubscriptionInfo = getAppSubscriptionInfo(applicationDTO, subType, params); + ApplicationInstallResponse applicationInstallResponse = performActionOnDevices(applicationSubscriptionInfo.getAppSupportingDeviceTypeName(), + applicationSubscriptionInfo.getDevices(), applicationDTO, subType, applicationSubscriptionInfo.getSubscribers(), action); - applicationInstallResponse = performActionOnDevices(deviceTypeName, devices, applicationDTO, - subType, subscribers, action); - applicationInstallResponse.setErrorDeviceIdentifiers(errorDeviceIdentifiers); - return applicationInstallResponse; - } catch (DeviceManagementException e) { - String msg = "Error occurred while getting devices of given users or given roles."; - log.error(msg, e); - throw new ApplicationManagementException(msg, e); - } catch (GroupManagementException e) { - String msg = "Error occurred while getting devices of given groups"; - log.error(msg, e); - throw new ApplicationManagementException(msg, e); - } + applicationInstallResponse.setErrorDeviceIdentifiers(applicationSubscriptionInfo.getErrorDeviceIdentifiers()); + return applicationInstallResponse; } @Override @@ -321,141 +253,73 @@ public class SubscriptionManagerImpl implements SubscriptionManager { @Override public void performEntAppSubscription(String applicationUUID, List params, String subType, String action, - boolean requiresUpdatingExternal) - throws ApplicationManagementException { + boolean requiresUpdatingExternal) throws ApplicationManagementException { if (log.isDebugEnabled()) { - log.debug("Google Ent app Install operation is received to application which has UUID " - + applicationUUID + " to perform on " + params.size() + " params."); + log.debug("Google Ent app Install operation is received to application which has UUID " + applicationUUID + + " to perform on " + params.size() + " params."); + } + if (params.isEmpty()) { + String msg = "In order to subscribe/unsubscribe application release, you should provide list of " + + "subscribers. But found an empty list of subscribers."; + log.error(msg); + throw new BadRequestException(msg); } - try { - if (params.isEmpty()) { - String msg = "In order to subscribe/unsubscribe application release, you should provide list of " - + "subscribers. But found an empty list of subscribers."; - log.error(msg); - throw new BadRequestException(msg); - } - - ApplicationDTO applicationDTO = getApplicationDTO(applicationUUID); - ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); - int applicationReleaseId = applicationReleaseDTO.getId(); - if (!ApplicationType.PUBLIC.toString().equals(applicationDTO.getType())) { - String msg = "Application type is not public. Hence you can't perform google ent.install operation on " - + "this application. Application name " + applicationDTO.getName() + " Application Type " - + applicationDTO.getType(); - log.error(msg); - throw new BadRequestException(msg); - } - - List categories = getApplicationCategories(applicationDTO.getId()); - if (!categories.contains("GooglePlaySyncedApp")) { - String msg = "This is not google play store synced application. Hence can't perform enterprise app " - + "installation."; - log.error(msg); - throw new BadRequestException(msg); - } - - DeviceManagementProviderService deviceManagementProviderService = HelperUtil - .getDeviceManagementProviderService(); - - List devices = new ArrayList<>(); - List subscribers = new ArrayList<>(); - List appSubscribingDeviceIds; - List appReSubscribingDeviceIds = new ArrayList<>(); - List deviceIdentifiers = new ArrayList<>(); - //todo validate users, groups and roles - if (SubscriptionType.DEVICE.toString().equals(subType)) { - DeviceType deviceType = APIUtil.getDeviceTypeData(applicationDTO.getDeviceTypeId()); - for (T param : params) { - DeviceIdentifier deviceIdentifier = (DeviceIdentifier) param; - if (StringUtils.isEmpty(deviceIdentifier.getId()) || StringUtils - .isEmpty(deviceIdentifier.getType())) { - log.warn("Found a device identifier which has either empty identity of the device or empty" - + " device type. Hence ignoring the device identifier. "); - continue; - } - if (!deviceType.getName().equals(deviceIdentifier.getType())) { - log.warn("Found a device identifier which is not matched with the supported device type " - + "of the application release which has UUID " + applicationUUID + " Application " - + "supported device type is " + deviceType.getName() + " and the " - + "identifier of which has a different device type is " + deviceIdentifier.getId()); - continue; - } - deviceIdentifiers.add(deviceIdentifier); - devices.add(deviceManagementProviderService.getDevice(deviceIdentifier, false)); - } - } else if (SubscriptionType.USER.toString().equalsIgnoreCase(subType)) { - for (T param : params) { - String username = (String) param; - subscribers.add(username); - devices.addAll(deviceManagementProviderService.getDevicesOfUser(username)); - } - } else if (SubscriptionType.ROLE.toString().equalsIgnoreCase(subType)) { - for (T param : params) { - String roleName = (String) param; - subscribers.add(roleName); - devices.addAll(deviceManagementProviderService.getAllDevicesOfRole(roleName)); - } - } else if (SubscriptionType.GROUP.toString().equalsIgnoreCase(subType)) { - GroupManagementProviderService groupManagementProviderService = HelperUtil - .getGroupManagementProviderService(); - for (T param : params) { - String groupName = (String) param; - subscribers.add(groupName); - devices.addAll(groupManagementProviderService.getAllDevicesOfGroup(groupName, false)); - } - } else { - String msg = "Found invalid subscription type " + subType+ " to install application release" ; - log.error(msg); - throw new BadRequestException(msg); - } + ApplicationDTO applicationDTO = getApplicationDTO(applicationUUID); + ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); + int applicationReleaseId = applicationReleaseDTO.getId(); + if (!ApplicationType.PUBLIC.toString().equals(applicationDTO.getType())) { + String msg = "Application type is not public. Hence you can't perform google ent.install operation on " + + "this application. Application name " + applicationDTO.getName() + " Application Type " + + applicationDTO.getType(); + log.error(msg); + throw new BadRequestException(msg); + } - /*If subscription type is not device we need to crete device identifiers object list by referring retrieved - list of devices.*/ - if (!SubscriptionType.DEVICE.toString().equalsIgnoreCase(subType)) { - DeviceType deviceType = APIUtil.getDeviceTypeData(applicationDTO.getDeviceTypeId()); - String deviceTypeName = deviceType.getName(); - //filter devices by device type - devices.removeIf(device -> !deviceTypeName.equals(device.getType())); - devices.forEach(device -> { - DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); - deviceIdentifier.setId(device.getDeviceIdentifier()); - deviceIdentifier.setType(device.getType()); - deviceIdentifiers.add(deviceIdentifier); - }); - } + List categories = getApplicationCategories(applicationDTO.getId()); + if (!categories.contains("GooglePlaySyncedApp")) { + String msg = "This is not google play store synced application. Hence can't perform enterprise app " + + "installation."; + log.error(msg); + throw new BadRequestException(msg); + } - if (requiresUpdatingExternal) { - //Installing the application - ApplicationPolicyDTO applicationPolicyDTO = new ApplicationPolicyDTO(); - applicationPolicyDTO.setApplicationDTO(applicationDTO); - applicationPolicyDTO.setDeviceIdentifierList(deviceIdentifiers); - applicationPolicyDTO.setAction(action.toUpperCase()); - installEnrollmentApplications(applicationPolicyDTO); - } + List appReSubscribingDeviceIds = new ArrayList<>(); + List deviceIdentifiers = new ArrayList<>(); - appSubscribingDeviceIds = devices.stream().map(Device::getId).collect(Collectors.toList()); - Map deviceSubscriptions = getDeviceSubscriptions(appSubscribingDeviceIds, - applicationReleaseId); - for (Map.Entry deviceSubscription: deviceSubscriptions.entrySet()){ - appReSubscribingDeviceIds.add(deviceSubscription.getKey()); - appSubscribingDeviceIds.remove(deviceSubscription.getKey()); - } + ApplicationSubscriptionInfo applicationSubscriptionInfo = getAppSubscriptionInfo(applicationDTO, subType, + params); + applicationSubscriptionInfo.getDevices().forEach(device -> { + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(device.getDeviceIdentifier()); + deviceIdentifier.setType(device.getType()); + deviceIdentifiers.add(deviceIdentifier); + }); + + if (requiresUpdatingExternal) { + //Installing the application + ApplicationPolicyDTO applicationPolicyDTO = new ApplicationPolicyDTO(); + applicationPolicyDTO.setApplicationDTO(applicationDTO); + applicationPolicyDTO.setDeviceIdentifierList(deviceIdentifiers); + applicationPolicyDTO.setAction(action.toUpperCase()); + installEnrollmentApplications(applicationPolicyDTO); + } - updateSubscriptionsForEntInstall(applicationReleaseId, appSubscribingDeviceIds, appReSubscribingDeviceIds, - subscribers, subType, action); - } catch (DeviceManagementException e) { - String msg = "Error occurred while getting devices of given users or given roles."; - log.error(msg, e); - throw new ApplicationManagementException(msg, e); - } catch (GroupManagementException e) { - String msg = "Error occurred while getting devices of given groups"; - log.error(msg, e); - throw new ApplicationManagementException(msg, e); + List appSubscribingDeviceIds = applicationSubscriptionInfo.getDevices().stream().map(Device::getId) + .collect(Collectors.toList()); + Map deviceSubscriptions = getDeviceSubscriptions(appSubscribingDeviceIds, + applicationReleaseId); + for (Map.Entry deviceSubscription : deviceSubscriptions.entrySet()) { + appReSubscribingDeviceIds.add(deviceSubscription.getKey()); + appSubscribingDeviceIds.remove(deviceSubscription.getKey()); } + + updateSubscriptionsForEntInstall(applicationReleaseId, appSubscribingDeviceIds, appReSubscribingDeviceIds, + applicationSubscriptionInfo.getSubscribers(), subType, action); } - @Override public void installAppsForDevice(DeviceIdentifier deviceIdentifier, List releaseUUIDs) + @Override + public void installAppsForDevice(DeviceIdentifier deviceIdentifier, List releaseUUIDs) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); @@ -519,6 +383,105 @@ public class SubscriptionManagerImpl implements SubscriptionManager { } } + /** + * Gets Application subscribing info by using requesting params + * + * @param applicationDTO Application DTO + * @param params list of subscribers. This list can be of either + * {@link org.wso2.carbon.device.mgt.common.DeviceIdentifier} if {@param subType} is equal + * to DEVICE or + * {@link String} if {@param subType} is USER, ROLE or GROUP + * @param subType subscription type. E.g. DEVICE, USER, ROLE, GROUP {@see { + * @param generic type of the method. + * @return {@link ApplicationSubscriptionInfo} + * @throws ApplicationManagementException if error occurred while getting Application subscription info + */ + private ApplicationSubscriptionInfo getAppSubscriptionInfo(ApplicationDTO applicationDTO, String subType, + List params) throws ApplicationManagementException { + + DeviceManagementProviderService deviceManagementProviderService = HelperUtil + .getDeviceManagementProviderService(); + GroupManagementProviderService groupManagementProviderService = HelperUtil.getGroupManagementProviderService(); + List devices = new ArrayList<>(); + List subscribers = new ArrayList<>(); + List errorDeviceIdentifiers = new ArrayList<>(); + String deviceTypeName = null; + + try { + if (!ApplicationType.WEB_CLIP.toString().equals(applicationDTO.getType())) { + deviceTypeName = APIUtil.getDeviceTypeData(applicationDTO.getDeviceTypeId()).getName(); + } + + if (SubscriptionType.DEVICE.toString().equals(subType)) { + for (T param : params) { + DeviceIdentifier deviceIdentifier = (DeviceIdentifier) param; + if (StringUtils.isEmpty(deviceIdentifier.getId()) || StringUtils + .isEmpty(deviceIdentifier.getType())) { + log.warn("Found a device identifier which has either empty identity of the device or empty" + + " device type. Hence ignoring the device identifier. "); + continue; + } + if (!ApplicationType.WEB_CLIP.toString().equals(applicationDTO.getType()) && !deviceIdentifier + .getType().equals(deviceTypeName)) { + log.warn("Found a device identifier which is not matched with the supported device type " + + "of the application release which has UUID " + applicationDTO + .getApplicationReleaseDTOs().get(0).getUuid() + " Application " + + "supported device type is " + deviceTypeName + " and the identifier of which has a " + + "different device type is " + deviceIdentifier.getId()); + errorDeviceIdentifiers.add(deviceIdentifier); + continue; + } + devices.add(deviceManagementProviderService.getDevice(deviceIdentifier, false)); + } + } else if (SubscriptionType.USER.toString().equalsIgnoreCase(subType)) { + for (T param : params) { + String username = (String) param; + subscribers.add(username); + devices.addAll(deviceManagementProviderService.getDevicesOfUser(username)); + } + } else if (SubscriptionType.ROLE.toString().equalsIgnoreCase(subType)) { + for (T param : params) { + String roleName = (String) param; + subscribers.add(roleName); + devices.addAll(deviceManagementProviderService.getAllDevicesOfRole(roleName)); + } + } else if (SubscriptionType.GROUP.toString().equalsIgnoreCase(subType)) { + for (T param : params) { + String groupName = (String) param; + subscribers.add(groupName); + devices.addAll(groupManagementProviderService.getAllDevicesOfGroup(groupName, true)); + } + } else { + String msg = "Found invalid subscription type " + subType+ " to install application release" ; + log.error(msg); + throw new BadRequestException(msg); + } + + if (!ApplicationType.WEB_CLIP.toString().equals(applicationDTO.getType()) && !SubscriptionType.DEVICE + .toString().equals(subType)) { + //filter devices by device type + String tmpDeviceTypeName = deviceTypeName; + devices.removeIf(device -> !tmpDeviceTypeName.equals(device.getType())); + } + + ApplicationSubscriptionInfo applicationSubscriptionInfo = new ApplicationSubscriptionInfo(); + applicationSubscriptionInfo.setDevices(devices); + applicationSubscriptionInfo.setSubscribers(subscribers); + applicationSubscriptionInfo.setErrorDeviceIdentifiers(errorDeviceIdentifiers); + applicationSubscriptionInfo.setAppSupportingDeviceTypeName(deviceTypeName); + return applicationSubscriptionInfo; + } catch (DeviceManagementException e) { + String msg = "Error occurred while getting devices of given users or given roles or while getting device " + + "type info."; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (GroupManagementException e) { + String msg = "Error occurred while getting devices of given groups"; + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } + } + /** * This method is responsible to update subscription data for google enterprise install. * @@ -567,8 +530,6 @@ public class SubscriptionManagerImpl implements SubscriptionManager { } } - - /** * THis method is responsible to validate application install or uninstall request. * @@ -704,14 +665,12 @@ public class SubscriptionManagerImpl implements SubscriptionManager { || Operation.Status.IN_PROGRESS.toString().equals(deviceSubscriptionDTO.getStatus())) { subscribingDeviceIdHolder.getSkippedDevices().put(deviceIdentifier, device.getId()); } else if (deviceSubscriptionDTO.isUnsubscribed()) { - if (Operation.Status.COMPLETED.toString().equals(deviceSubscriptionDTO.getStatus())) { - subscribingDeviceIdHolder.getAppReInstallableDevices().put(deviceIdentifier, device.getId()); - } else { + if (!Operation.Status.COMPLETED.toString().equals(deviceSubscriptionDTO.getStatus())) { /*We can't ensure whether app is uninstalled successfully or not hence allow to perform both install and uninstall operations*/ subscribingDeviceIdHolder.getAppReUnInstallableDevices().put(deviceIdentifier, device.getId()); - subscribingDeviceIdHolder.getAppReInstallableDevices().put(deviceIdentifier, device.getId()); } + subscribingDeviceIdHolder.getAppReInstallableDevices().put(deviceIdentifier, device.getId()); } else if (!deviceSubscriptionDTO.isUnsubscribed() && Operation.Status.COMPLETED.toString() .equals(deviceSubscriptionDTO.getStatus())) { subscribingDeviceIdHolder.getAppInstalledDevices().put(deviceIdentifier, device.getId()); @@ -1126,8 +1085,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager { } @Override - public PaginationResult getAppInstalledDevices(int offsetValue, int limitValue, String appUUID, - String status) + public PaginationResult getAppInstalledDevices(int offsetValue, int limitValue, String appUUID, String status) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); DeviceManagementProviderService deviceManagementProviderService = HelperUtil 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 bcfd0523262..fcc76981692 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 @@ -20,24 +20,20 @@ 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; - /** * Utility methods used in the Application Management. */ public class HelperUtil { - private static Log log = LogFactory.getLog(HelperUtil.class); + private static final Log log = LogFactory.getLog(HelperUtil.class); private static DeviceManagementProviderService deviceManagementProviderService; private static GroupManagementProviderService groupManagementProviderService; - public static DeviceManagementProviderService getDeviceManagementProviderService() { + public static synchronized DeviceManagementProviderService getDeviceManagementProviderService() { if (deviceManagementProviderService == null) { PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); deviceManagementProviderService = (DeviceManagementProviderService) ctx @@ -51,7 +47,7 @@ public class HelperUtil { return deviceManagementProviderService; } - public static GroupManagementProviderService getGroupManagementProviderService() { + public static synchronized GroupManagementProviderService getGroupManagementProviderService() { if (groupManagementProviderService == null) { PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); groupManagementProviderService = (GroupManagementProviderService) ctx diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json index f929dfc1e92..21144caacf9 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json @@ -17,6 +17,7 @@ "acorn": "^6.2.0", "antd": "^4.0.0", "axios": "^0.19.0", + "babel-eslint": "^10.1.0", "d3": "^5.9.7", "dagre": "^0.8.4", "entgra-icons-react": "^1.0.0", diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/package.json b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/package.json index 91b0a4158b4..7f84052960b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/package.json +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/package.json @@ -13,7 +13,7 @@ "acorn": "^6.2.0", "antd": "^4.0.0", "axios": "^0.18.1", - "babel-eslint": "^9.0.0", + "babel-eslint": "^10.1.0", "d3": "^5.9.7", "dagre": "^0.8.4", "imagemin": "^5.3.1", diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java index 5553e02d227..d19e8358485 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java @@ -47,10 +47,10 @@ public class GeoLocationBasedServiceImplTest { List geoClusters = new ArrayList<>(); geoClusters.add(new GeoCluster(new GeoCoordinate(1.5, 80.7), new GeoCoordinate(1.1, 79.5), new GeoCoordinate(1.9, 82.1), 3, - "tb32", "aegtew234", "android", "1234")); + "tb32", "aegtew234", "test1", "android", "1234")); geoClusters.add(new GeoCluster(new GeoCoordinate(10.2, 86.1), new GeoCoordinate(9.8, 84.7), new GeoCoordinate(11.1, 88.1), 4, - "t1gd", "swerty12s", "android", "1234")); + "t1gd", "swerty12s", "t2test", "android", "1234")); Mockito.doReturn(geoClusters).when(deviceManagementProviderService) .findGeoClusters(null, Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); Response response = geoLocationBasedService.getGeoDeviceLocations(null, 0.4, 15, 75.6, diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java index 3d279928f68..825b684e0c9 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java @@ -1733,6 +1733,7 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { " MAX(DEVICE_LOCATION.LONGITUDE) AS MAX_LONGITUDE," + " SUBSTRING(DEVICE_LOCATION.GEO_HASH,1,?) AS GEOHASH_PREFIX, COUNT(*) AS COUNT," + " MIN(DEVICE.DEVICE_IDENTIFICATION) AS DEVICE_IDENTIFICATION," + + " MIN(DEVICE.NAME) AS NAME," + " MIN(DEVICE_TYPE.NAME) AS TYPE, " + " MIN(DEVICE.LAST_UPDATED_TIMESTAMP) AS LAST_UPDATED_TIMESTAMP " + "FROM DM_DEVICE_LOCATION AS DEVICE_LOCATION,DM_DEVICE AS DEVICE, DM_DEVICE_TYPE AS DEVICE_TYPE " + @@ -1763,13 +1764,14 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { double min_longitude = rs.getDouble("MIN_LONGITUDE"); double max_longitude = rs.getDouble("MAX_LONGITUDE"); String device_identification = rs.getString("DEVICE_IDENTIFICATION"); + String device_name = rs.getString("NAME"); String device_type = rs.getString("TYPE"); String last_seen = rs.getString("LAST_UPDATED_TIMESTAMP"); long count = rs.getLong("COUNT"); String geohashPrefix = rs.getString("GEOHASH_PREFIX"); geoClusters.add(new GeoCluster(new GeoCoordinate(latitude, longitude), new GeoCoordinate(min_latitude, min_longitude), new GeoCoordinate(max_latitude, max_longitude), - count, geohashPrefix, device_identification, device_type, last_seen)); + count, geohashPrefix, device_identification, device_name, device_type, last_seen)); } } catch (SQLException e) { throw new DeviceManagementDAOException("Error occurred while retrieving information of " + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java index 63df06538d8..f4bda812218 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/GenericDeviceDAOImpl.java @@ -30,6 +30,8 @@ import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; import org.wso2.carbon.device.mgt.core.dao.impl.AbstractDeviceDAOImpl; import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; +import org.wso2.carbon.device.mgt.core.geo.GeoCluster; +import org.wso2.carbon.device.mgt.core.geo.geoHash.GeoCoordinate; import org.wso2.carbon.device.mgt.core.report.mgt.Constants; import java.sql.Connection; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java index 7aa74a1f1c4..1d0d9c246c5 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/device/SQLServerDeviceDAOImpl.java @@ -968,6 +968,7 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { + ") AS GEOHASH_PREFIX, " + "COUNT(*) AS COUNT, " + "MIN(DEVICE.DEVICE_IDENTIFICATION) AS DEVICE_IDENTIFICATION, " + + "MIN(DEVICE.NAME) AS NAME, " + "MIN(DEVICE_TYPE.NAME) AS TYPE, " + "MIN(DEVICE.LAST_UPDATED_TIMESTAMP) AS LAST_UPDATED_TIMESTAMP, " + "COUNT(DEVICE_LOCATION.GEO_HASH) " @@ -1004,6 +1005,7 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { double min_longitude = rs.getDouble("MIN_LONGITUDE"); double max_longitude = rs.getDouble("MAX_LONGITUDE"); String device_identification = rs.getString("DEVICE_IDENTIFICATION"); + String device_name = rs.getString("NAME"); String device_type = rs.getString("TYPE"); String last_seen = rs.getString("LAST_UPDATED_TIMESTAMP"); long count = rs.getLong("COUNT"); @@ -1011,7 +1013,7 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl { geoClusters.add(new GeoCluster(new GeoCoordinate(latitude, longitude), new GeoCoordinate(min_latitude, min_longitude), new GeoCoordinate(max_latitude, max_longitude), count, geohashPrefix, - device_identification, device_type, last_seen)); + device_identification, device_name, device_type, last_seen)); } } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/GeoCluster.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/GeoCluster.java index 6fa306f20b8..e4838aaf6e1 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/GeoCluster.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/GeoCluster.java @@ -9,18 +9,20 @@ public class GeoCluster { private long count; private String geohashPrefix; private String deviceIdentification; + private String deviceName; private String deviceType; private String lastSeen; public GeoCluster(GeoCoordinate coordinates, GeoCoordinate southWestBound, GeoCoordinate northEastBound, long count, - String geohashPrefix, String deviceIdentification, String deviceType, String lastSeen){ + String geohashPrefix, String deviceIdentification, String deviceName, String deviceType, String lastSeen){ this.coordinates=coordinates; this.southWestBound=southWestBound; this.northEastBound=northEastBound; this.count=count; this.geohashPrefix=geohashPrefix; this.deviceIdentification=deviceIdentification; + this.deviceName=deviceName; this.deviceType=deviceType; this.lastSeen = lastSeen; @@ -50,6 +52,10 @@ public class GeoCluster { return deviceIdentification; } + public String getDeviceName() { + return deviceName; + } + public String getDeviceType() { return deviceType; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/dao/OTPManagementDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/dao/OTPManagementDAO.java index 4c3690f5d0d..44bb2a3064f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/dao/OTPManagementDAO.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/dao/OTPManagementDAO.java @@ -20,15 +20,16 @@ package org.wso2.carbon.device.mgt.core.otp.mgt.dao; import org.wso2.carbon.device.mgt.common.otp.mgt.dto.OneTimePinDTO; import org.wso2.carbon.device.mgt.core.otp.mgt.exception.OTPManagementDAOException; +import java.util.List; + public interface OTPManagementDAO { /** * Save OTP token data and tenant details of registering user - * @param oneTimePinDTO OTPMailDTO - * @return Primary key of the newly adding data raw + * @param oneTimePinDTOList OTPMailDTO * @throws OTPManagementDAOException if error occurred whule storing data */ - int addOTPData(OneTimePinDTO oneTimePinDTO) throws OTPManagementDAOException; + void addOTPData(List oneTimePinDTOList) throws OTPManagementDAOException; /** * Get OTP data for requesting One Time Token diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/dao/impl/GenericOTPManagementDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/dao/impl/GenericOTPManagementDAOImpl.java index 273cf6c1a58..58b55197a06 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/dao/impl/GenericOTPManagementDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/dao/impl/GenericOTPManagementDAOImpl.java @@ -32,17 +32,20 @@ import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.util.Calendar; +import java.util.List; public class GenericOTPManagementDAOImpl extends AbstractDAOImpl implements OTPManagementDAO { private static final Log log = LogFactory.getLog(GenericOTPManagementDAOImpl.class); @Override - public int addOTPData(OneTimePinDTO oneTimePinDTO) throws OTPManagementDAOException { + public void addOTPData(List oneTimePinDTOList) throws OTPManagementDAOException { if (log.isDebugEnabled()) { log.debug("Request received in DAO Layer to create an OTP data entry"); log.debug("OTP Details : "); - log.debug("OTP key : " + oneTimePinDTO.getOtpToken() + " Email : " + oneTimePinDTO.getEmail()); + for(OneTimePinDTO oneTimePinDTO: oneTimePinDTOList){ + log.debug("OTP key : " + oneTimePinDTO.getOtpToken() + " Email : " + oneTimePinDTO.getEmail()); + } } String sql = "INSERT INTO DM_OTP_DATA " @@ -57,29 +60,25 @@ public class GenericOTPManagementDAOImpl extends AbstractDAOImpl implements OTPM Connection conn = this.getDBConnection(); Calendar calendar = Calendar.getInstance(); Timestamp timestamp = new Timestamp(calendar.getTime().getTime()); - try (PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { - stmt.setString(1, oneTimePinDTO.getOtpToken()); - stmt.setString(2, oneTimePinDTO.getEmail()); - stmt.setString(3, oneTimePinDTO.getEmailType()); - stmt.setString(4, oneTimePinDTO.getMetaInfo()); - stmt.setTimestamp(5, timestamp); - stmt.setInt(6, oneTimePinDTO.getTenantId()); - stmt.setString(7, oneTimePinDTO.getUsername()); - stmt.executeUpdate(); - try (ResultSet rs = stmt.getGeneratedKeys()) { - if (rs.next()) { - return rs.getInt(1); - } - return -1; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + for (OneTimePinDTO oneTimePinDTO : oneTimePinDTOList) { + stmt.setString(1, oneTimePinDTO.getOtpToken()); + stmt.setString(2, oneTimePinDTO.getEmail()); + stmt.setString(3, oneTimePinDTO.getEmailType()); + stmt.setString(4, oneTimePinDTO.getMetaInfo()); + stmt.setTimestamp(5, timestamp); + stmt.setInt(6, oneTimePinDTO.getTenantId()); + stmt.setString(7, oneTimePinDTO.getUsername()); + stmt.addBatch(); } + stmt.executeBatch(); } } catch (DBConnectionException e) { - String msg = "Error occurred while obtaining the DB connection to create an opt entry for email " - + oneTimePinDTO.getEmail(); + String msg = "Error occurred while obtaining the DB connection to create an opt entry."; log.error(msg, e); throw new OTPManagementDAOException(msg, e); } catch (SQLException e) { - String msg = "Error occurred while executing SQL to create an otp entry for email " + oneTimePinDTO.getEmail(); + String msg = "Error occurred while executing SQL to create an otp entry"; log.error(msg, e); throw new OTPManagementDAOException(msg, e); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java index 9b25987e84d..c80502ec4fa 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java @@ -61,6 +61,8 @@ import java.util.List; import java.util.Map; import java.util.Properties; import java.util.UUID; +import java.util.ArrayList; +import java.util.Collections; public class OTPManagementServiceImpl implements OTPManagementService { @@ -82,12 +84,7 @@ public class OTPManagementServiceImpl implements OTPManagementService { otpWrapper.getUsername(), tenant, -1234); try { ConnectionManagerUtil.beginDBTransaction(); - if (this.otpManagementDAO.addOTPData(oneTimePinDTO) == -1) { - ConnectionManagerUtil.rollbackDBTransaction(); - String msg = "OTP data saving failed. Please, contact Administrator"; - log.error(msg); - throw new OTPManagementException(msg); - } + this.otpManagementDAO.addOTPData(Collections.singletonList(oneTimePinDTO)); Properties props = new Properties(); props.setProperty("first-name", tenant.getAdminFirstName()); props.setProperty("otp-token", oneTimePinDTO.getOtpToken()); @@ -98,12 +95,12 @@ public class OTPManagementServiceImpl implements OTPManagementService { log.error(msg, e); throw new OTPManagementException(msg, e); } catch (DBConnectionException e) { - String msg = "Error occurred while getting database connection."; + String msg = "Error occurred while getting database connection to add OPT data."; log.error(msg, e); throw new OTPManagementException(msg, e); } catch (OTPManagementDAOException e) { ConnectionManagerUtil.rollbackDBTransaction(); - String msg = "Error occurred while saving the OTP data. Email address: " + oneTimePinDTO.getEmail(); + String msg = "Error occurred while saving the OTP data for given email" ; log.error(msg, e); throw new OTPManagementException(msg, e); } finally { @@ -219,24 +216,44 @@ public class OTPManagementServiceImpl implements OTPManagementService { } int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); OneTimePinDTO oneTimePinDTO; + List oneTimePinDTOList = new ArrayList<>(); Properties props = new Properties(); props.setProperty("enrollment-steps", enrollmentSteps.toString()); try { + ConnectionManagerUtil.beginDBTransaction(); for (String username : deviceEnrollmentInvitation.getUsernames()) { String emailAddress = DeviceManagerUtil.getUserClaimValue( username, DeviceManagementConstants.User.CLAIM_EMAIL_ADDRESS); oneTimePinDTO = createOneTimePin(emailAddress, OTPEmailTypes.DEVICE_ENROLLMENT.toString(), username, null, tenantId); + oneTimePinDTOList.add(oneTimePinDTO); props.setProperty("first-name", DeviceManagerUtil. getUserClaimValue(username, DeviceManagementConstants.User.CLAIM_FIRST_NAME)); props.setProperty("username", username); props.setProperty("otp-token", oneTimePinDTO.getOtpToken()); sendMail(props, emailAddress, DeviceManagementConstants.EmailAttributes.USER_ENROLLMENT_TEMPLATE); } + this.otpManagementDAO.addOTPData(oneTimePinDTOList); + ConnectionManagerUtil.commitDBTransaction(); } catch (UserStoreException e) { String msg = "Error occurred while getting claim values to invite user"; log.error(msg, e); throw new OTPManagementException(msg, e); + } catch (DBConnectionException e) { + String msg = "Error occurred while getting database connection to add OPT data."; + log.error(msg, e); + throw new OTPManagementException(msg, e); + } catch (TransactionManagementException e) { + String msg = "SQL Error occurred when adding OPT data to send device enrollment Invitation."; + log.error(msg, e); + throw new OTPManagementException(msg, e); + } catch (OTPManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occurred while saving the OTP data."; + log.error(msg, e); + throw new OTPManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); } } diff --git a/features/ui-request-interceptor/io.entgra.ui.request.interceptor.feature/src/main/resources/p2.inf b/features/ui-request-interceptor/io.entgra.ui.request.interceptor.feature/src/main/resources/p2.inf index 6e7e6d01df8..7887868228d 100644 --- a/features/ui-request-interceptor/io.entgra.ui.request.interceptor.feature/src/main/resources/p2.inf +++ b/features/ui-request-interceptor/io.entgra.ui.request.interceptor.feature/src/main/resources/p2.inf @@ -3,3 +3,4 @@ org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../depl org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/io.entgra.ui.request.interceptor_${feature.version}/webapps/ui-request-handler.war,target:${installFolder}/../../deployment/server/webapps/publisher-ui-request-handler.war,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/io.entgra.ui.request.interceptor_${feature.version}/webapps/ui-request-handler.war,target:${installFolder}/../../deployment/server/webapps/store-ui-request-handler.war,overwrite:true);\ org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/io.entgra.ui.request.interceptor_${feature.version}/webapps/ui-request-handler.war,target:${installFolder}/../../deployment/server/webapps/entgra-ui-request-handler.war,overwrite:true);\ +org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/io.entgra.ui.request.interceptor_${feature.version}/webapps/ui-request-handler.war,target:${installFolder}/../../deployment/server/webapps/mdm-reports-ui-request-handler.war,overwrite:true);\