diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java index 8c6c23352c1..d45fb2deadb 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java @@ -21,6 +21,7 @@ package org.wso2.carbon.device.mgt.core.operation.mgt; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementException; @@ -67,7 +68,9 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * This class implements all the functionality exposed as part of the OperationManager. Any transaction initiated @@ -88,10 +91,10 @@ public class OperationManagerImpl implements OperationManager { private OperationDAO operationDAO; private DeviceDAO deviceDAO; private EnrollmentDAO enrollmentDAO; - private NotificationStrategy notificationStrategy; private String deviceType; private DeviceManagementService deviceManagementService; - private long lastUpdatedTimeStamp = 0; + private Map notificationStrategies; + private Map lastUpdatedTimeStamps; public OperationManagerImpl() { commandOperationDAO = OperationManagementDAOFactory.getCommandOperationDAO(); @@ -102,6 +105,8 @@ public class OperationManagerImpl implements OperationManager { operationDAO = OperationManagementDAOFactory.getOperationDAO(); deviceDAO = DeviceManagementDAOFactory.getDeviceDAO(); enrollmentDAO = DeviceManagementDAOFactory.getEnrollmentDAO(); + notificationStrategies = new HashMap<>(); + lastUpdatedTimeStamps = new HashMap<>(); } public OperationManagerImpl(String deviceType, DeviceManagementService deviceManagementService) { @@ -111,23 +116,32 @@ public class OperationManagerImpl implements OperationManager { } public NotificationStrategy getNotificationStrategy() { + // Notification strategy can be set by the platform configurations. Therefore it is needed to + // get tenant specific notification strategy dynamically in the runtime. However since this is + // a resource intensive retrieval, we are maintaining tenant aware local cache here to keep device + // type specific notification strategy. + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(false); + long lastUpdatedTimeStamp = 0; + if (lastUpdatedTimeStamps.containsKey(tenantId)){ + lastUpdatedTimeStamp = lastUpdatedTimeStamps.get(tenantId); + } if (Calendar.getInstance().getTimeInMillis() - lastUpdatedTimeStamp > CACHE_VALIDITY_PERIOD) { PushNotificationConfig pushNoteConfig = deviceManagementService.getPushNotificationConfig(); if (pushNoteConfig != null && !NOTIFIER_TYPE_LOCAL.equals(pushNoteConfig.getType())) { PushNotificationProvider provider = DeviceManagementDataHolder.getInstance() .getPushNotificationProviderRepository().getProvider(pushNoteConfig.getType()); if (provider == null) { - log.error("No registered push notification provider found for the type: '" + - pushNoteConfig.getType() + "'."); + log.error("No registered push notification provider found for the type '" + + pushNoteConfig.getType() + "' under tenant ID '" + tenantId + "'."); return null; } - notificationStrategy = provider.getNotificationStrategy(pushNoteConfig); - } else { - notificationStrategy = null; + notificationStrategies.put(tenantId, provider.getNotificationStrategy(pushNoteConfig)); + } else if (notificationStrategies.containsKey(tenantId)){ + notificationStrategies.remove(tenantId); } - lastUpdatedTimeStamp = Calendar.getInstance().getTimeInMillis(); + lastUpdatedTimeStamps.put(tenantId, Calendar.getInstance().getTimeInMillis()); } - return notificationStrategy; + return notificationStrategies.get(tenantId); } @Override @@ -164,7 +178,7 @@ public class OperationManagerImpl implements OperationManager { boolean isScheduledOperation = this.isTaskScheduledOperation(operation); boolean isNotRepeated = false; boolean isScheduled = false; - notificationStrategy = getNotificationStrategy(); + NotificationStrategy notificationStrategy = getNotificationStrategy(); // check whether device list is greater than batch size notification strategy has enable to send push // notification using scheduler task diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.extensions/src/main/java/org/wso2/carbon/device/mgt/extensions/device/type/template/DeviceTypeManagerService.java b/components/device-mgt/org.wso2.carbon.device.mgt.extensions/src/main/java/org/wso2/carbon/device/mgt/extensions/device/type/template/DeviceTypeManagerService.java index 4c481fc9f35..ca245a1d001 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.extensions/src/main/java/org/wso2/carbon/device/mgt/extensions/device/type/template/DeviceTypeManagerService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.extensions/src/main/java/org/wso2/carbon/device/mgt/extensions/device/type/template/DeviceTypeManagerService.java @@ -22,10 +22,10 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.common.DeviceManager; +import org.wso2.carbon.device.mgt.common.DeviceStatusTaskPluginConfig; import org.wso2.carbon.device.mgt.common.InitialOperationConfig; import org.wso2.carbon.device.mgt.common.MonitoringOperation; import org.wso2.carbon.device.mgt.common.OperationMonitoringTaskConfig; -import org.wso2.carbon.device.mgt.common.DeviceStatusTaskPluginConfig; import org.wso2.carbon.device.mgt.common.ProvisioningConfig; import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManager; import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationEntry; @@ -136,7 +136,7 @@ public class DeviceTypeManagerService implements DeviceManagementService { ConfigProperties configProperties = pushNotificationProvider.getConfigProperties(); if (configProperties != null) { List properties = configProperties.getProperty(); - if (properties != null && properties.size() > 0) { + if (properties != null && !properties.isEmpty()) { for (Property property : properties) { staticProps.put(property.getName(), property.getValue()); } @@ -154,6 +154,7 @@ public class DeviceTypeManagerService implements DeviceManagementService { } private void refreshPlatformConfigurations() { + //Build up push notification configs to use with push notification provider. try { PlatformConfiguration deviceTypeConfig = deviceManager.getConfiguration(); if (deviceTypeConfig != null) { @@ -161,14 +162,17 @@ public class DeviceTypeManagerService implements DeviceManagementService { if (!configuration.isEmpty()) { Map properties = this.getConfigProperty(configuration); String notifierValue = properties.get(NOTIFIER_PROPERTY); + String enabledNotifierType = notifierType; + //In registry we are keeping local notifier as value "1". Other notifiers will have + // a number grater than 1. if (notifierValue != null && notifierValue.equals("1")) { - notifierType = NOTIFIER_TYPE_LOCAL; + enabledNotifierType = NOTIFIER_TYPE_LOCAL; } - pushNotificationConfig = new PushNotificationConfig(notifierType, isScheduled, properties); + pushNotificationConfig = new PushNotificationConfig(enabledNotifierType, isScheduled, properties); } } } catch (DeviceManagementException e) { - log.error("Unable to get the " + type + " platform configuration from registry."); + log.error("Unable to get the " + type + " platform configuration from registry.", e); } } @@ -189,6 +193,7 @@ public class DeviceTypeManagerService implements DeviceManagementService { @Override public PushNotificationConfig getPushNotificationConfig() { + //We only need to update push notification configs if this device type uses registry based configs. if (isRegistryBasedConfigs) { refreshPlatformConfigurations(); }