Add new feature to install applications for device

4.x.x
Dharmakeerthi Lasantha 4 years ago committed by Saad Sahibjan
parent 05055937e7
commit 1919fbde16

@ -21,6 +21,7 @@ import org.wso2.carbon.device.application.mgt.common.ExecutionStatus;
import org.wso2.carbon.device.application.mgt.common.dto.ScheduledSubscriptionDTO; import org.wso2.carbon.device.application.mgt.common.dto.ScheduledSubscriptionDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.SubscriptionManagementException; import org.wso2.carbon.device.application.mgt.common.exception.SubscriptionManagementException;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.common.PaginationResult;
import java.util.List; import java.util.List;
@ -101,6 +102,18 @@ public interface SubscriptionManager {
<T> void performEntAppSubscription(String applicationUUID, List<T> params, String subType, String action, <T> void performEntAppSubscription(String applicationUUID, List<T> params, String subType, String action,
boolean requiresUpdatingExternal) throws ApplicationManagementException; boolean requiresUpdatingExternal) throws ApplicationManagementException;
/**
* Install given application releases for given device. If application is already installed that application skips.
* This is used in enterprise app installing policy.
*
* @param deviceIdentifier Device identifiers
* @param releaseUUID UUIs of applicatios
* @throws ApplicationManagementException if error occurred while installing given applications into the given
* device
*/
void installAppsForDevice(DeviceIdentifier deviceIdentifier, List<String> releaseUUID)
throws ApplicationManagementException;
/*** /***
* This method used to get the app id ,device ids and pass them to DM service method. * This method used to get the app id ,device ids and pass them to DM service method.
* *

@ -94,6 +94,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -261,7 +262,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
log.error(msg, e); log.error(msg, e);
throw new SubscriptionManagementException(msg, e); throw new SubscriptionManagementException(msg, e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
String msg = "Error occurred while retrieving the database connection"; String msg = "Error occurred while retrieving the database connection to clean the scheduled subscriptions";
log.error(msg, e); log.error(msg, e);
throw new SubscriptionManagementException(msg, e); throw new SubscriptionManagementException(msg, e);
} finally { } finally {
@ -454,6 +455,70 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
} }
} }
@Override public void installAppsForDevice(DeviceIdentifier deviceIdentifier, List<String> releaseUUIDs)
throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
Device device;
try {
device = DataHolder.getInstance().getDeviceManagementService().getDevice(deviceIdentifier, false);
if (device == null) {
String msg = "Invalid device identifier is received and couldn't find an deveice for the requested "
+ "device identifier. Device UUID: " + deviceIdentifier.getId() + " Device Type: "
+ deviceIdentifier.getType();
log.error(msg);
throw new BadRequestException(msg);
}
} catch (DeviceManagementException e) {
String msg = "Error occured while getting device data for given device identifier.Device UUID: "
+ deviceIdentifier.getId() + " Device Type: " + deviceIdentifier.getType();
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
}
List<DeviceIdentifier> appInstallingDevices = new ArrayList<>();
for (String releaseUUID : releaseUUIDs) {
try {
ConnectionManagerUtil.openDBConnection();
ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(releaseUUID, tenantId);
if (applicationDTO != null) {
List<DeviceSubscriptionDTO> deviceSubscriptionDTOS = this.subscriptionDAO
.getDeviceSubscriptions(applicationDTO.getApplicationReleaseDTOs().get(0).getId(),
tenantId);
AtomicBoolean isAppSubscribable = new AtomicBoolean(true);
for (DeviceSubscriptionDTO deviceSubscriptionDTO : deviceSubscriptionDTOS) {
if (device.getId() == deviceSubscriptionDTO.getDeviceId() && !deviceSubscriptionDTO
.isUnsubscribed()) {
isAppSubscribable.set(false);
break;
}
}
if (isAppSubscribable.get()) {
appInstallingDevices.add(deviceIdentifier);
}
}
} catch (DBConnectionException e) {
String msg = " Error occurred while getting DB connection to retrieve app data data from DB. Device "
+ "UUID: " + deviceIdentifier.getId() + " Device Type: " + deviceIdentifier.getType();
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
String msg = " Error occurred while getting application data from DB. Device UUID: " + deviceIdentifier
.getId() + " Device Type: " + deviceIdentifier.getType();
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} finally {
ConnectionManagerUtil.closeDBConnection();
}
if (!appInstallingDevices.isEmpty()) {
performBulkAppOperation(releaseUUID, appInstallingDevices, SubscriptionType.DEVICE.toString(),
SubAction.INSTALL.toString());
}
}
}
/** /**
* This method is responsible to update subscription data for google enterprise install. * This method is responsible to update subscription data for google enterprise install.
* *
@ -584,14 +649,12 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
List<DeviceIdentifier> identifiers; List<DeviceIdentifier> identifiers;
if (!deviceIdentifierMap.containsKey(identifier.getType())) { if (!deviceIdentifierMap.containsKey(identifier.getType())) {
identifiers = new ArrayList<>(); identifiers = new ArrayList<>();
identifiers.add(identifier);
deviceIdentifierMap.put(identifier.getType(), identifiers);
} else { } else {
identifiers = deviceIdentifierMap.get(identifier.getType()); identifiers = deviceIdentifierMap.get(identifier.getType());
}
identifiers.add(identifier); identifiers.add(identifier);
deviceIdentifierMap.put(identifier.getType(), identifiers); deviceIdentifierMap.put(identifier.getType(), identifiers);
} }
}
for (Map.Entry<String, List<DeviceIdentifier>> entry : deviceIdentifierMap.entrySet()) { for (Map.Entry<String, List<DeviceIdentifier>> entry : deviceIdentifierMap.entrySet()) {
Activity activity = addAppOperationOnDevices(applicationDTO, new ArrayList<>(entry.getValue()), Activity activity = addAppOperationOnDevices(applicationDTO, new ArrayList<>(entry.getValue()),
entry.getKey(), action); entry.getKey(), action);

@ -930,9 +930,9 @@ public class PolicyManagerImpl implements PolicyManager {
try { try {
device = deviceManagementService.getDevice(deviceIdentifier, false); device = deviceManagementService.getDevice(deviceIdentifier, false);
} catch (DeviceManagementException e) { } catch (DeviceManagementException e) {
PolicyManagementDAOFactory.rollbackTransaction(); String msg = "Error occurred while getting the device details (" + deviceIdentifier.getId() + ")";
throw new PolicyManagementException("Error occurred while getting the device details (" + log.error(msg, e);
deviceIdentifier.getId() + ")", e); throw new PolicyManagementException(msg, e);
} }
int deviceId = device.getId(); int deviceId = device.getId();
try { try {

Loading…
Cancel
Save