Merge branch 'master' of https://github.com/wso2/carbon-device-mgt into das-ext

revert-70aa11f8
ayyoob 9 years ago
commit 2aa5257cda

@ -32,16 +32,13 @@ import org.wso2.carbon.device.mgt.common.app.mgt.Application;
import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException;
import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; 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.common.operation.mgt.OperationManagementException;
import org.wso2.carbon.device.mgt.common.spi.DeviceManagementService;
import org.wso2.carbon.device.mgt.core.DeviceManagementConstants; import org.wso2.carbon.device.mgt.core.DeviceManagementConstants;
import org.wso2.carbon.device.mgt.core.DeviceManagementPluginRepository;
import org.wso2.carbon.device.mgt.core.app.mgt.config.AppManagementConfig; import org.wso2.carbon.device.mgt.core.app.mgt.config.AppManagementConfig;
import org.wso2.carbon.device.mgt.core.app.mgt.oauth.ServiceAuthenticator; import org.wso2.carbon.device.mgt.core.app.mgt.oauth.ServiceAuthenticator;
import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager; import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager;
import org.wso2.carbon.device.mgt.core.config.identity.IdentityConfigurations; import org.wso2.carbon.device.mgt.core.config.identity.IdentityConfigurations;
import org.wso2.carbon.device.mgt.core.dao.*; import org.wso2.carbon.device.mgt.core.dao.*;
import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder;
import org.wso2.carbon.device.mgt.core.internal.PluginInitializationListener;
import org.wso2.carbon.identity.oauth.stub.OAuthAdminServiceException; import org.wso2.carbon.identity.oauth.stub.OAuthAdminServiceException;
import org.wso2.carbon.identity.oauth.stub.OAuthAdminServiceStub; import org.wso2.carbon.identity.oauth.stub.OAuthAdminServiceStub;
import org.wso2.carbon.identity.oauth.stub.dto.OAuthConsumerAppDTO; import org.wso2.carbon.identity.oauth.stub.dto.OAuthConsumerAppDTO;
@ -56,9 +53,6 @@ import java.util.List;
*/ */
public class ApplicationManagerProviderServiceImpl implements ApplicationManagementProviderService { public class ApplicationManagerProviderServiceImpl implements ApplicationManagementProviderService {
private ConfigurationContext configCtx;
private ServiceAuthenticator authenticator;
private String oAuthAdminServiceUrl;
private DeviceDAO deviceDAO; private DeviceDAO deviceDAO;
private ApplicationDAO applicationDAO; private ApplicationDAO applicationDAO;
private ApplicationMappingDAO applicationMappingDAO; private ApplicationMappingDAO applicationMappingDAO;
@ -67,19 +61,6 @@ public class ApplicationManagerProviderServiceImpl implements ApplicationManagem
private static final Log log = LogFactory.getLog(ApplicationManagerProviderServiceImpl.class); private static final Log log = LogFactory.getLog(ApplicationManagerProviderServiceImpl.class);
public ApplicationManagerProviderServiceImpl(AppManagementConfig appManagementConfig) { public ApplicationManagerProviderServiceImpl(AppManagementConfig appManagementConfig) {
IdentityConfigurations identityConfig = DeviceConfigurationManager.getInstance().getDeviceManagementConfig().
getDeviceManagementConfigRepository().getIdentityConfigurations();
this.authenticator =
new ServiceAuthenticator(identityConfig.getAdminUsername(), identityConfig.getAdminPassword());
this.oAuthAdminServiceUrl =
identityConfig.getServerUrl() + DeviceManagementConstants.AppManagement.OAUTH_ADMIN_SERVICE;
try {
this.configCtx = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, null);
} catch (AxisFault e) {
throw new IllegalArgumentException("Error occurred while initializing Axis2 Configuration Context. " +
"Please check if an appropriate axis2.xml is provided", e);
}
this.deviceDAO = DeviceManagementDAOFactory.getDeviceDAO(); this.deviceDAO = DeviceManagementDAOFactory.getDeviceDAO();
this.applicationDAO = DeviceManagementDAOFactory.getApplicationDAO(); this.applicationDAO = DeviceManagementDAOFactory.getApplicationDAO();
this.applicationMappingDAO = DeviceManagementDAOFactory.getApplicationMappingDAO(); this.applicationMappingDAO = DeviceManagementDAOFactory.getApplicationMappingDAO();
@ -112,7 +93,6 @@ public class ApplicationManagerProviderServiceImpl implements ApplicationManagem
@Override @Override
public void installApplicationForDevices(Operation operation, List<DeviceIdentifier> deviceIds) public void installApplicationForDevices(Operation operation, List<DeviceIdentifier> deviceIds)
throws ApplicationManagementException { throws ApplicationManagementException {
try { try {
DeviceManagementDataHolder.getInstance().getDeviceManagementProvider().addOperation(operation, deviceIds); DeviceManagementDataHolder.getInstance().getDeviceManagementProvider().addOperation(operation, deviceIds);
DeviceManagementDataHolder.getInstance().getDeviceManagementProvider().notifyOperationToDevices DeviceManagementDataHolder.getInstance().getDeviceManagementProvider().notifyOperationToDevices
@ -207,50 +187,6 @@ public class ApplicationManagerProviderServiceImpl implements ApplicationManagem
} }
} }
public void updateInstalledApplicationListOfDevice(
DeviceIdentifier deviceIdentifier, List<Application> applications) throws ApplicationManagementException {
}
private OAuthConsumerAppDTO getAppInfo() throws ApplicationManagementException {
OAuthConsumerAppDTO appInfo = null;
try {
OAuthAdminServiceStub oAuthAdminServiceStub =
new OAuthAdminServiceStub(configCtx, oAuthAdminServiceUrl);
authenticator.authenticate(oAuthAdminServiceStub._getServiceClient());
try {
appInfo = oAuthAdminServiceStub.getOAuthApplicationDataByAppName(
DeviceManagementConstants.AppManagement.OAUTH_APPLICATION_NAME);
}
//application doesn't exist. Due to the way getOAuthApplicationDataByAppName has been
//implemented, it throws an AxisFault if the App doesn't exist. Hence the catch.
catch (AxisFault fault) {
oAuthAdminServiceStub.registerOAuthApplicationData(this.getRequestDTO());
appInfo = oAuthAdminServiceStub.getOAuthApplicationDataByAppName(
DeviceManagementConstants.AppManagement.OAUTH_APPLICATION_NAME);
}
} catch (RemoteException e) {
handleException("Error occurred while retrieving app info", e);
} catch (OAuthAdminServiceException e) {
handleException("Error occurred while invoking OAuth admin service stub", e);
}
return appInfo;
}
private OAuthConsumerAppDTO getRequestDTO() {
OAuthConsumerAppDTO appDTO = new OAuthConsumerAppDTO();
appDTO.setApplicationName(DeviceManagementConstants.AppManagement.OAUTH_APPLICATION_NAME);
appDTO.setGrantTypes(
DeviceManagementConstants.AppManagement.OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS);
appDTO.setOAuthVersion(DeviceManagementConstants.AppManagement.OAUTH_VERSION_2);
return appDTO;
}
private void handleException(String msg, Exception e) throws ApplicationManagementException {
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
}
@Override @Override
public void updateApplicationListInstalledInDevice( public void updateApplicationListInstalledInDevice(
DeviceIdentifier deviceIdentifier, List<Application> applications) throws ApplicationManagementException { DeviceIdentifier deviceIdentifier, List<Application> applications) throws ApplicationManagementException {

@ -17,8 +17,14 @@
*/ */
package org.wso2.carbon.device.mgt.core.config; package org.wso2.carbon.device.mgt.core.config;
import org.wso2.carbon.device.mgt.core.config.identity.IdentityConfigurations;
import org.wso2.carbon.device.mgt.core.config.policy.PolicyConfiguration;
import org.wso2.carbon.device.mgt.core.config.task.TaskConfiguration;
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
/** /**
* Represents Device Mgt configuration. * Represents Device Mgt configuration.
@ -27,6 +33,10 @@ import javax.xml.bind.annotation.XmlRootElement;
public final class DeviceManagementConfig { public final class DeviceManagementConfig {
private DeviceManagementConfigRepository deviceManagementConfigRepository; private DeviceManagementConfigRepository deviceManagementConfigRepository;
private TaskConfiguration taskConfiguration;
private IdentityConfigurations identityConfigurations;
private PolicyConfiguration policyConfiguration;
//private List<String> pushNotificationProviders;
@XmlElement(name = "ManagementRepository", required = true) @XmlElement(name = "ManagementRepository", required = true)
public DeviceManagementConfigRepository getDeviceManagementConfigRepository() { public DeviceManagementConfigRepository getDeviceManagementConfigRepository() {
@ -37,4 +47,43 @@ public final class DeviceManagementConfig {
this.deviceManagementConfigRepository = deviceManagementConfigRepository; this.deviceManagementConfigRepository = deviceManagementConfigRepository;
} }
@XmlElement(name = "IdentityConfiguration", required = true)
public IdentityConfigurations getIdentityConfigurations() {
return identityConfigurations;
}
public void setIdentityConfigurations(IdentityConfigurations identityConfigurations) {
this.identityConfigurations = identityConfigurations;
}
@XmlElement(name = "PolicyConfiguration", required = true)
public PolicyConfiguration getPolicyConfiguration() {
return policyConfiguration;
}
public void setPolicyConfiguration(PolicyConfiguration policyConfiguration) {
this.policyConfiguration = policyConfiguration;
} }
@XmlElement(name = "TaskConfiguration", required = true)
public TaskConfiguration getTaskConfiguration() {
return taskConfiguration;
}
public void setTaskConfiguration(TaskConfiguration taskConfiguration) {
this.taskConfiguration = taskConfiguration;
}
// @XmlElementWrapper(name = "PushNotificationProviders", required = true)
// @XmlElement(name = "Provider", required = true)
// public List<String> getPushNotificationProviders() {
// return pushNotificationProviders;
// }
//
// public void setPushNotificationProviders(List<String> pushNotificationProviders) {
// this.pushNotificationProviders = pushNotificationProviders;
// }
}

@ -31,12 +31,7 @@ import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "ManagementRepository") @XmlRootElement(name = "ManagementRepository")
public class DeviceManagementConfigRepository { public class DeviceManagementConfigRepository {
// private EmailConfigurations emailConfigurations;
private TaskConfiguration taskConfiguration;
private DataSourceConfig dataSourceConfig; private DataSourceConfig dataSourceConfig;
private IdentityConfigurations identityConfigurations;
private PolicyConfiguration policyConfiguration;
@XmlElement(name = "DataSourceConfiguration", required = true) @XmlElement(name = "DataSourceConfiguration", required = true)
public DataSourceConfig getDataSourceConfig() { public DataSourceConfig getDataSourceConfig() {
@ -47,40 +42,4 @@ public class DeviceManagementConfigRepository {
this.dataSourceConfig = dataSourceConfig; this.dataSourceConfig = dataSourceConfig;
} }
// @XmlElement(name = "EmailClientConfiguration", required = true)
// public EmailConfigurations getEmailConfigurations() {
// return emailConfigurations;
// }
//
// public void setEmailConfigurations(EmailConfigurations emailConfigurations) {
// this.emailConfigurations = emailConfigurations;
// }
@XmlElement(name = "IdentityConfiguration", required = true)
public IdentityConfigurations getIdentityConfigurations() {
return identityConfigurations;
}
public void setIdentityConfigurations(IdentityConfigurations identityConfigurations) {
this.identityConfigurations = identityConfigurations;
}
@XmlElement(name = "PolicyConfiguration", required = true)
public PolicyConfiguration getPolicyConfiguration() {
return policyConfiguration;
}
public void setPolicyConfiguration(PolicyConfiguration policyConfiguration) {
this.policyConfiguration = policyConfiguration;
}
@XmlElement(name = "TaskConfiguration", required = true)
public TaskConfiguration getTaskConfiguration() {
return taskConfiguration;
}
public void setTaskConfiguration(TaskConfiguration taskConfiguration) {
this.taskConfiguration = taskConfiguration;
}
} }

@ -31,7 +31,7 @@ public class PolicyConfiguration {
private int minRetriesToMarkUnreachable; private int minRetriesToMarkUnreachable;
private int minRetriesToMarkInactive; private int minRetriesToMarkInactive;
@XmlElement(name = "monitoringClass", required = true) @XmlElement(name = "MonitoringClass", required = true)
public String getMonitoringClass() { public String getMonitoringClass() {
return monitoringClass; return monitoringClass;
} }
@ -40,7 +40,7 @@ public class PolicyConfiguration {
this.monitoringClass = monitoringClass; this.monitoringClass = monitoringClass;
} }
@XmlElement(name = "maxRetries", required = true) @XmlElement(name = "MaxRetries", required = true)
public int getMaxRetries() { public int getMaxRetries() {
return maxRetries; return maxRetries;
} }
@ -49,7 +49,7 @@ public class PolicyConfiguration {
this.maxRetries = maxRetries; this.maxRetries = maxRetries;
} }
@XmlElement(name = "minRetriesToMarkUnreachable", required = true) @XmlElement(name = "MinRetriesToMarkUnreachable", required = true)
public int getMinRetriesToMarkUnreachable() { public int getMinRetriesToMarkUnreachable() {
return minRetriesToMarkUnreachable; return minRetriesToMarkUnreachable;
} }
@ -58,7 +58,7 @@ public class PolicyConfiguration {
this.minRetriesToMarkUnreachable = minRetriesToMarkUnreachable; this.minRetriesToMarkUnreachable = minRetriesToMarkUnreachable;
} }
@XmlElement(name = "monitoringEnable", required = true) @XmlElement(name = "MonitoringEnable", required = true)
public boolean getMonitoringEnable() { public boolean getMonitoringEnable() {
return monitoringEnable; return monitoringEnable;
} }
@ -67,7 +67,7 @@ public class PolicyConfiguration {
this.monitoringEnable = monitoringEnable; this.monitoringEnable = monitoringEnable;
} }
@XmlElement(name = "minRetriesToMarkInactive", required = true) @XmlElement(name = "MinRetriesToMarkInactive", required = true)
public int getMinRetriesToMarkInactive() { public int getMinRetriesToMarkInactive() {
return minRetriesToMarkInactive; return minRetriesToMarkInactive;
} }
@ -76,7 +76,7 @@ public class PolicyConfiguration {
this.minRetriesToMarkInactive = minRetriesToMarkInactive; this.minRetriesToMarkInactive = minRetriesToMarkInactive;
} }
@XmlElement(name = "monitoringFrequency", required = true) @XmlElement(name = "MonitoringFrequency", required = true)
public int getMonitoringFrequency() { public int getMonitoringFrequency() {
return monitoringFrequency; return monitoringFrequency;
} }
@ -84,4 +84,5 @@ public class PolicyConfiguration {
public void setMonitoringFrequency(int monitoringFrequency) { public void setMonitoringFrequency(int monitoringFrequency) {
this.monitoringFrequency = monitoringFrequency; this.monitoringFrequency = monitoringFrequency;
} }
} }

@ -52,8 +52,9 @@ public class DeviceTaskManagerServiceComponent {
log.debug("Initializing device details retrieving task manager bundle."); log.debug("Initializing device details retrieving task manager bundle.");
} }
// This will start the device details retrieving task. // This will start the device details retrieving task.
boolean taskEnable = DeviceConfigurationManager.getInstance().getDeviceManagementConfig(). boolean taskEnable =
getDeviceManagementConfigRepository().getTaskConfiguration().isEnabled(); DeviceConfigurationManager.getInstance().getDeviceManagementConfig().getTaskConfiguration().
isEnabled();
if (taskEnable) { if (taskEnable) {
DeviceTaskManagerService taskManagerService = new DeviceTaskManagerServiceImpl(); DeviceTaskManagerService taskManagerService = new DeviceTaskManagerServiceImpl();
taskManagerService.startTask(); taskManagerService.startTask();
@ -70,7 +71,6 @@ public class DeviceTaskManagerServiceComponent {
@SuppressWarnings("unused") @SuppressWarnings("unused")
protected void deactivate(ComponentContext componentContext) { protected void deactivate(ComponentContext componentContext) {
try { try {
DeviceTaskManagerService taskManagerService = new DeviceTaskManagerServiceImpl(); DeviceTaskManagerService taskManagerService = new DeviceTaskManagerServiceImpl();
taskManagerService.stopTask(); taskManagerService.stopTask();
@ -93,6 +93,7 @@ public class DeviceTaskManagerServiceComponent {
} }
DeviceManagementDataHolder.getInstance().setTaskService(null); DeviceManagementDataHolder.getInstance().setTaskService(null);
} }
} }

@ -22,18 +22,16 @@ package org.wso2.carbon.device.mgt.core.task;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
public class Utils { public class Utils {
public static Map<String, Long> getTenantedTaskOperationMap(Map<Integer, Map<String, Long>> map) {
public static HashMap<String, Long> getTenantedTaskOperationMap(HashMap<Integer, HashMap<String, Long>> map) {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
if (map.containsKey(tenantId)) { if (map.containsKey(tenantId)) {
return map.get(tenantId); return map.get(tenantId);
} else { } else {
HashMap<String, Long> mp = new HashMap<>(); Map<String, Long> mp = new HashMap<>();
map.put(tenantId, mp); map.put(tenantId, mp);
return mp; return mp;
} }

@ -36,23 +36,19 @@ import org.wso2.carbon.device.mgt.core.task.TaskOperation;
import org.wso2.carbon.device.mgt.core.task.Utils; import org.wso2.carbon.device.mgt.core.task.Utils;
import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class DeviceTaskManagerImpl implements DeviceTaskManager { public class DeviceTaskManagerImpl implements DeviceTaskManager {
private static Log log = LogFactory.getLog(DeviceTaskManagerImpl.class); private static Log log = LogFactory.getLog(DeviceTaskManagerImpl.class);
private static HashMap<Integer, HashMap<String, Long>> map = new HashMap<>(); private static Map<Integer, Map<String, Long>> map = new HashMap<>();
@Override @Override
public List<TaskOperation> getOperationList() throws DeviceMgtTaskException { public List<TaskOperation> getOperationList() throws DeviceMgtTaskException {
TaskConfiguration taskConfiguration =
TaskConfiguration taskConfiguration = DeviceConfigurationManager.getInstance().getDeviceManagementConfig(). DeviceConfigurationManager.getInstance().getDeviceManagementConfig().getTaskConfiguration();
getDeviceManagementConfigRepository().getTaskConfiguration();
List<TaskConfiguration.Operation> ops = taskConfiguration.getOperations(); List<TaskConfiguration.Operation> ops = taskConfiguration.getOperations();
List<TaskOperation> taskOperations = new ArrayList<>(); List<TaskOperation> taskOperations = new ArrayList<>();
@ -68,29 +64,25 @@ public class DeviceTaskManagerImpl implements DeviceTaskManager {
@Override @Override
public int getTaskFrequency() throws DeviceMgtTaskException { public int getTaskFrequency() throws DeviceMgtTaskException {
return DeviceConfigurationManager.getInstance().getDeviceManagementConfig().getTaskConfiguration().
return DeviceConfigurationManager.getInstance().getDeviceManagementConfig(). getFrequency();
getDeviceManagementConfigRepository().getTaskConfiguration().getFrequency();
} }
@Override @Override
public String getTaskImplementedClazz() throws DeviceMgtTaskException { public String getTaskImplementedClazz() throws DeviceMgtTaskException {
return DeviceConfigurationManager.getInstance().getDeviceManagementConfig().getTaskConfiguration().
return DeviceConfigurationManager.getInstance().getDeviceManagementConfig(). getTaskClazz();
getDeviceManagementConfigRepository().getTaskConfiguration().getTaskClazz();
} }
@Override @Override
public boolean isTaskEnabled() throws DeviceMgtTaskException { public boolean isTaskEnabled() throws DeviceMgtTaskException {
return DeviceConfigurationManager.getInstance().getDeviceManagementConfig().getTaskConfiguration().
return DeviceConfigurationManager.getInstance().getDeviceManagementConfig(). isEnabled();
getDeviceManagementConfigRepository().getTaskConfiguration().isEnabled();
} }
@Override @Override
public void addOperations() throws DeviceMgtTaskException { public void addOperations() throws DeviceMgtTaskException {
DeviceManagementProviderService deviceManagementProviderService = DeviceManagementProviderService deviceManagementProviderService =
DeviceManagementDataHolder.getInstance().getDeviceManagementProvider(); DeviceManagementDataHolder.getInstance().getDeviceManagementProvider();
try { try {
@ -98,7 +90,6 @@ public class DeviceTaskManagerImpl implements DeviceTaskManager {
List<String> operations = this.getValidOperationNames(); List<String> operations = this.getValidOperationNames();
if (!devices.isEmpty()) { if (!devices.isEmpty()) {
for (String str : operations) { for (String str : operations) {
CommandOperation operation = new CommandOperation(); CommandOperation operation = new CommandOperation();
operation.setEnabled(true); operation.setEnabled(true);
@ -116,17 +107,15 @@ public class DeviceTaskManagerImpl implements DeviceTaskManager {
} catch (OperationManagementException e) { } catch (OperationManagementException e) {
throw new DeviceMgtTaskException("Error occurred while adding the operations to devices", e); throw new DeviceMgtTaskException("Error occurred while adding the operations to devices", e);
} }
} }
@Override @Override
public List<String> getValidOperationNames() throws DeviceMgtTaskException { public List<String> getValidOperationNames() throws DeviceMgtTaskException {
List<TaskOperation> taskOperations = this.getOperationList(); List<TaskOperation> taskOperations = this.getOperationList();
List<String> opNames = new ArrayList<>(); List<String> opNames = new ArrayList<>();
Long milliseconds = System.currentTimeMillis(); Long milliseconds = System.currentTimeMillis();
int frequency = this.getTaskFrequency(); int frequency = this.getTaskFrequency();
HashMap<String, Long> mp = Utils.getTenantedTaskOperationMap(map); Map<String, Long> mp = Utils.getTenantedTaskOperationMap(map);
for (TaskOperation top : taskOperations) { for (TaskOperation top : taskOperations) {
if (!mp.containsKey(top.getTaskName())) { if (!mp.containsKey(top.getTaskName())) {
@ -163,5 +152,6 @@ public class DeviceTaskManagerImpl implements DeviceTaskManager {
return false; return false;
} }
} }

@ -27,7 +27,6 @@ import org.wso2.carbon.device.mgt.common.app.mgt.Application;
import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException;
import org.wso2.carbon.device.mgt.core.DeviceManagementPluginRepository; import org.wso2.carbon.device.mgt.core.DeviceManagementPluginRepository;
import org.wso2.carbon.device.mgt.core.TestDeviceManagementService; import org.wso2.carbon.device.mgt.core.TestDeviceManagementService;
import org.wso2.carbon.device.mgt.core.app.mgt.config.AppManagementConfig;
import org.wso2.carbon.device.mgt.core.common.TestDataHolder; import org.wso2.carbon.device.mgt.core.common.TestDataHolder;
import java.util.ArrayList; import java.util.ArrayList;
@ -35,13 +34,11 @@ import java.util.List;
public class ApplicationManagementProviderServiceTest { public class ApplicationManagementProviderServiceTest {
private ApplicationManagementProviderService appMgtProvider;
private static final Log log = LogFactory.getLog(ApplicationManagementProviderServiceTest.class); private static final Log log = LogFactory.getLog(ApplicationManagementProviderServiceTest.class);
private DeviceManagementPluginRepository deviceManagementPluginRepository = null;
@BeforeClass @BeforeClass
public void init() { public void init() {
deviceManagementPluginRepository = new DeviceManagementPluginRepository(); DeviceManagementPluginRepository deviceManagementPluginRepository = new DeviceManagementPluginRepository();
TestDeviceManagementService testDeviceManagementService = TestDeviceManagementService testDeviceManagementService =
new TestDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE, TestDataHolder.SUPER_TENANT_DOMAIN); new TestDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE, TestDataHolder.SUPER_TENANT_DOMAIN);
try { try {
@ -82,8 +79,7 @@ public class ApplicationManagementProviderServiceTest {
deviceId.setId(deviceIdentifier); deviceId.setId(deviceIdentifier);
deviceId.setType(device.getType()); deviceId.setType(device.getType());
AppManagementConfig appManagementConfig = new AppManagementConfig(); ApplicationManagementProviderService appMgtProvider = new ApplicationManagerProviderServiceImpl();
appMgtProvider = new ApplicationManagerProviderServiceImpl();
try { try {
appMgtProvider.updateApplicationListInstalledInDevice(deviceId, applications); appMgtProvider.updateApplicationListInstalledInDevice(deviceId, applications);

@ -20,6 +20,7 @@ var groupModule = {};
(function (groupModule) { (function (groupModule) {
var log = new Log("/app/modules/group.js"); var log = new Log("/app/modules/group.js");
var userModule = require("/app/modules/user.js").userModule;
var constants = require('/app/modules/constants.js'); var constants = require('/app/modules/constants.js');
var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); var devicemgtProps = require('/app/conf/devicemgt-props.js').config();
var utility = require("/app/modules/utility.js").utility; var utility = require("/app/modules/utility.js").utility;
@ -32,7 +33,12 @@ var groupModule = {};
var endPoint; var endPoint;
groupModule.getGroupCount = function () { groupModule.getGroupCount = function () {
var permissions = userModule.getUIPermissions();
if (permissions.LIST_ALL_GROUPS) {
endPoint = groupServiceEndpoint + "/count";
} else if (permissions.LIST_GROUPS) {
endPoint = groupServiceEndpoint + "/user/" + user.username + "/count"; endPoint = groupServiceEndpoint + "/user/" + user.username + "/count";
}
return serviceInvokers.XMLHttp.get( return serviceInvokers.XMLHttp.get(
endPoint, function (responsePayload) { endPoint, function (responsePayload) {
return responsePayload; return responsePayload;

@ -100,18 +100,19 @@
<th data-for="By Ownership" class="select-filter"></th> <th data-for="By Ownership" class="select-filter"></th>
<th class="no-sort"></th> <th class="no-sort"></th>
</tr> </tr>
<tr class="bulk-action-row"> <!--TODO: Enable bulk action row after gain compatibility with iot operation bar-->
<th colspan="7"> <!--<tr class="bulk-action-row">-->
<div id="operation-bar" class="hidden"> <!--<th colspan="7">-->
{{unit "mdm.unit.device.operation-bar"}} <!--<div id="operation-bar" class="hidden">-->
</div> <!--{{!unit "mdm.unit.device.operation-bar"}}-->
<div id="operation-guide" class="bs-callout bs-callout-info"> <!--</div>-->
<h4>Enabling Device Operations</h4> <!--<div id="operation-guide" class="bs-callout bs-callout-info">-->
<p>To enable device operations, select the desired platform from above <!--<h4>Enabling Device Operations</h4>-->
filter.</p> <!--<p>To enable device operations, select the desired platform from above-->
</div> <!--filter.</p>-->
</th> <!--</div>-->
</tr> <!--</th>-->
<!--</tr>-->
</thead> </thead>
<tbody id="ast-container"> <tbody id="ast-container">
@ -326,7 +327,6 @@
{{#zone "bottomJs"}} {{#zone "bottomJs"}}
<script id="device-listing" data-current-user="{{currentUser.username}}" data-device-types="{{deviceTypes}}" <script id="device-listing" data-current-user="{{currentUser.username}}" data-device-types="{{deviceTypes}}"
data-image-resource="{{@app.context}}/public/cdmf.unit.device.type." data-image-resource="{{@app.context}}/public/cdmf.unit.device.type."
src="{{@page.publicUri}}/templates/listing.hbs"
type="text/x-handlebars-template"></script> type="text/x-handlebars-template"></script>
{{js "js/listing.js"}} {{js "js/listing.js"}}
{{/zone}} {{/zone}}

@ -70,7 +70,6 @@ $(document).ready(function () {
addDeviceSelectedClass(this); addDeviceSelectedClass(this);
}); });
var i;
var permissionList = $("#permission").data("permission"); var permissionList = $("#permission").data("permission");
for (var key in permissionList) { for (var key in permissionList) {
if (permissionList.hasOwnProperty(key)) { if (permissionList.hasOwnProperty(key)) {
@ -163,10 +162,8 @@ function toTitleCase(str) {
function loadDevices(searchType, searchParam){ function loadDevices(searchType, searchParam){
var deviceListing = $("#device-listing"); var deviceListing = $("#device-listing");
var deviceListingSrc = deviceListing.attr("src");
var imageResource = deviceListing.data("image-resource"); var imageResource = deviceListing.data("image-resource");
var currentUser = deviceListing.data("currentUser"); var currentUser = deviceListing.data("currentUser");
var frontEndPagination = false;
var serviceURL; var serviceURL;
if ($.hasPermission("LIST_DEVICES")) { if ($.hasPermission("LIST_DEVICES")) {
@ -206,6 +203,16 @@ function loadDevices(searchType, searchParam){
return type; return type;
} }
function getDeviceTypeCategory(type) {
var deviceTypes = deviceListing.data("deviceTypes");
for (var i = 0; i < deviceTypes.length; i++) {
if (deviceTypes[i].type == type) {
return deviceTypes[i].category;
}
}
return type;
}
$('#device-grid').datatables_extended ({ $('#device-grid').datatables_extended ({
serverSide: true, serverSide: true,
processing: false, processing: false,
@ -238,7 +245,8 @@ function loadDevices(searchType, searchParam){
return html; return html;
}}, }},
{ targets: 2, data: 'enrolmentInfo.owner', className: 'fade-edge remove-padding-top'}, { targets: 2, data: 'enrolmentInfo.owner', className: 'fade-edge remove-padding-top'},
{ targets: 3, data: 'enrolmentInfo.status', className: 'fade-edge remove-padding-top' , {
targets: 3, data: 'enrolmentInfo.status', className: 'fade-edge remove-padding-top',
render: function ( status, type, row, meta ) { render: function ( status, type, row, meta ) {
var html; var html;
switch (status) { switch (status) {
@ -257,11 +265,22 @@ function loadDevices(searchType, searchParam){
} }
return html; return html;
}}, }},
{ targets: 4, data: 'type' , className: 'fade-edge remove-padding-top' , {
targets: 4, data: 'type', className: 'fade-edge remove-padding-top',
render: function ( status, type, row, meta ) { render: function ( status, type, row, meta ) {
return getDeviceTypeLabel(row.type); return getDeviceTypeLabel(row.type);
}}, }
{ targets: 5, data: 'enrolmentInfo.ownership' , className: 'fade-edge remove-padding-top' }, },
{
targets: 5, data: 'enrolmentInfo.ownership', className: 'fade-edge remove-padding-top',
render: function (status, type, row, meta) {
if (getDeviceTypeCategory(row.type) == 'mobile') {
return row.enrolmentInfo.ownership;
} else {
return null;
}
}
},
{ targets: 6, data: 'enrolmentInfo.status' , className: 'text-right content-fill text-left-on-grid-view no-wrap' , { targets: 6, data: 'enrolmentInfo.status' , className: 'text-right content-fill text-left-on-grid-view no-wrap' ,
render: function ( status, type, row, meta ) { render: function ( status, type, row, meta ) {
var deviceType = row.type; var deviceType = row.type;
@ -271,6 +290,15 @@ function loadDevices(searchType, searchParam){
html = '<a href="device/' + deviceType + '?id=' + deviceIdentifier + '" data-click-event="remove-form"' + html = '<a href="device/' + deviceType + '?id=' + deviceIdentifier + '" data-click-event="remove-form"' +
' class="btn padding-reduce-on-grid-view"><span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>' + ' class="btn padding-reduce-on-grid-view"><span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>' +
'<i class="fw fw-view fw-stack-1x"></i></span><span class="hidden-xs hidden-on-grid-view">View</span></a>'; '<i class="fw fw-view fw-stack-1x"></i></span><span class="hidden-xs hidden-on-grid-view">View</span></a>';
html += '<a href="analytics?deviceId=' + deviceIdentifier + '&deviceType=' + deviceType + '&deviceName=' + row.name + '" ' +
'data-click-event="remove-form" class="btn padding-reduce-on-grid-view"><span class="fw-stack">' +
'<i class="fw fw-ring fw-stack-2x"></i><i class="fw fw-statistics fw-stack-1x"></i></span>' +
'<span class="hidden-xs hidden-on-grid-view">Analytics</span>';
html += '<a href="#" data-click-event="remove-form" class="btn padding-reduce-on-grid-view edit-device-link" ' +
'data-deviceid="' + deviceIdentifier + '" data-devicetype="' + deviceType + '" data-devicename="' + row.name + '">' +
'<span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>' +
'<i class="fw fw-edit fw-stack-1x"></i></span>' +
'<span class="hidden-xs hidden-on-grid-view">Edit</span></a>';
} }
return html; return html;
}} }}
@ -285,6 +313,7 @@ function loadDevices(searchType, searchParam){
var status = data.enrolmentInfo.status; var status = data.enrolmentInfo.status;
var ownership = data.enrolmentInfo.ownership; var ownership = data.enrolmentInfo.ownership;
var deviceType = data.type; var deviceType = data.type;
var category = getDeviceTypeCategory(deviceType);
$.each($('td', row), function (colIndex) { $.each($('td', row), function (colIndex) {
switch(colIndex) { switch(colIndex) {
case 1: case 1:
@ -304,18 +333,21 @@ function loadDevices(searchType, searchParam){
case 4: case 4:
$(this).attr('data-grid-label', "Type"); $(this).attr('data-grid-label', "Type");
$(this).attr('data-search', deviceType); $(this).attr('data-search', deviceType);
$(this).attr('data-display', deviceType); $(this).attr('data-display', getDeviceTypeLabel(deviceType));
break; break;
case 5: case 5:
if (category == 'mobile') {
$(this).attr('data-grid-label', "Ownership"); $(this).attr('data-grid-label', "Ownership");
$(this).attr('data-search', ownership); $(this).attr('data-search', ownership);
$(this).attr('data-display', ownership); $(this).attr('data-display', ownership);
}
break; break;
} }
}); });
}, },
"fnDrawCallback": function( oSettings ) { "fnDrawCallback": function( oSettings ) {
$(".icon .text").res_text(0.2); $(".icon .text").res_text(0.2);
attachDeviceEvents();
} }
}); });
$(deviceCheckbox).click(function () { $(deviceCheckbox).click(function () {
@ -338,50 +370,6 @@ function openCollapsedNav() {
}); });
} }
function loadGroupedDevices(groupId) {
var serviceURL = "api/group/id/" + groupId + "/device/all";
var deviceListing = $("#device-listing");
var deviceListingSrc = deviceListing.attr("src");
var imageResource = deviceListing.data("image-resource");
var currentUser = deviceListing.data("currentUser");
$.template("device-listing", deviceListingSrc, function (template) {
var loadGroupRequest = $.ajax({
url: serviceURL,
method: "GET",
contentType: "application/json",
accept: "application/json"
});
loadGroupRequest.done(function (data) {
data = JSON.parse(data);
var viewModel = {};
viewModel.devices = data.data;
viewModel.imageLocation = imageResource;
viewModel.isGroupView = "true";
if (viewModel.devices.length > 0) {
$('#device-grid').removeClass('hidden');
var content = template(viewModel);
$("#ast-container").html(content);
/*
* On device checkbox select add parent selected style class
*/
$(deviceCheckbox).click(function () {
addDeviceSelectedClass(this);
});
attachDeviceEvents();
} else {
$('#device-table').addClass('hidden');
$('#device-listing-status-msg').text('No device is available to be displayed.');
}
$("#loading-content").remove();
$('#device-grid').datatables_extended();
$(".icon .text").res_text(0.2);
});
});
}
function initPage() { function initPage() {
var deviceListing = $("#device-listing"); var deviceListing = $("#device-listing");
var currentUser = deviceListing.data("currentUser"); var currentUser = deviceListing.data("currentUser");
@ -642,9 +630,9 @@ function attachDeviceEvents() {
}); });
postOperationRequest.done(function (data) { postOperationRequest.done(function (data) {
$(modalPopupContent).html($('#edit-device-200-content').html()); $(modalPopupContent).html($('#edit-device-200-content').html());
$("h4[data-deviceid='" + deviceId + "']").html(newDeviceName);
setTimeout(function () { setTimeout(function () {
hidePopup(); hidePopup();
location.reload(false);
}, 2000); }, 2000);
}); });
postOperationRequest.fail(function (jqXHR, textStatus) { postOperationRequest.fail(function (jqXHR, textStatus) {

@ -17,6 +17,7 @@
{{/zone}} {{/zone}}
{{#zone "navbarActions"}} {{#zone "navbarActions"}}
{{#if permissions.ADD_GROUP}}
<li> <li>
<a href="{{@app.context}}/group/add" class="cu-btn"> <a href="{{@app.context}}/group/add" class="cu-btn">
<span class="icon fw-stack"> <span class="icon fw-stack">
@ -26,6 +27,7 @@
Add Group Add Group
</a> </a>
</li> </li>
{{/if}}
{{/zone}} {{/zone}}
{{#zone "content"}} {{#zone "content"}}
@ -33,6 +35,7 @@
<div class="wr-hidden-operations wr-advance-operations"></div> <div class="wr-hidden-operations wr-advance-operations"></div>
<div class="col-md-12 wr-page-content"> <div class="col-md-12 wr-page-content">
<div> <div>
<span id="permission" data-permission="{{permissions.list}}"></span>
{{#if groupCount}} {{#if groupCount}}
<div class="container-fluid"> <div class="container-fluid">
<table class="table table-striped table-hover list-table display responsive nowrap data-table table-selectable grid-view" <table class="table table-striped table-hover list-table display responsive nowrap data-table table-selectable grid-view"

@ -21,14 +21,15 @@ function onRequest(context) {
var userModule = require("/app/modules/user.js").userModule; var userModule = require("/app/modules/user.js").userModule;
var constants = require("/app/modules/constants.js"); var constants = require("/app/modules/constants.js");
var currentUser = session.get(constants.USER_SESSION_KEY); var currentUser = session.get(constants.USER_SESSION_KEY);
var page_data = {}; var page = {};
if (currentUser) { if (currentUser) {
page_data.permissions = userModule.getUIPermissions(); page.permissions = userModule.getUIPermissions();
page_data.currentUser = currentUser; page.permissions.list = stringify(page.permissions);
page.currentUser = currentUser;
var groupCount = groupModule.getGroupCount(); var groupCount = groupModule.getGroupCount();
if (groupCount > 0) { if (groupCount > 0) {
page_data.groupCount = groupCount; page.groupCount = groupCount;
} }
} }
return page_data; return page;
} }

@ -82,6 +82,19 @@ function toTitleCase(str) {
}); });
} }
(function () {
var permissionSet = {};
//This method is used to setup permission for device listing
$.setPermission = function (permission) {
permissionSet[permission] = true;
};
$.hasPermission = function (permission) {
return permissionSet[permission];
};
})();
function loadGroups() { function loadGroups() {
var groupListing = $("#group-listing"); var groupListing = $("#group-listing");
var groupListingSrc = groupListing.attr("src"); var groupListingSrc = groupListing.attr("src");
@ -108,8 +121,21 @@ function loadGroups() {
$(".icon .text").res_text(0.2); $(".icon .text").res_text(0.2);
}; };
invokerUtil.get("/devicemgt_admin/groups/user/" + currentUser + "?start=0&rowCount=1000", var serviceURL;
successCallback, function (message) { if ($.hasPermission("LIST_ALL_GROUPS")) {
serviceURL = "/devicemgt_admin/groups?start=0&rowCount=1000";
} else if ($.hasPermission("LIST_GROUPS")) {
//Get authenticated users groups
serviceURL = "/devicemgt_admin/groups/user/" + currentUser + "?start=0&rowCount=1000";
} else {
$("#loading-content").remove();
$('#device-table').addClass('hidden');
$('#device-listing-status-msg').text('Permission denied.');
$("#device-listing-status").removeClass(' hidden');
return;
}
invokerUtil.get(serviceURL, successCallback, function (message) {
displayErrors(message.content); displayErrors(message.content);
}); });
@ -129,6 +155,13 @@ function openCollapsedNav() {
* DOM ready functions. * DOM ready functions.
*/ */
$(document).ready(function () { $(document).ready(function () {
var permissionList = $("#permission").data("permission");
for (var key in permissionList) {
if (permissionList.hasOwnProperty(key)) {
$.setPermission(key);
}
}
loadGroups(); loadGroups();
//$('#device-grid').datatables_extended(); //$('#device-grid').datatables_extended();
@ -138,30 +171,36 @@ $(document).ready(function () {
}); });
/* for device list sorting drop down */ /* for device list sorting drop down */
$(".ctrl-filter-type-switcher").popover({ $(".ctrl-filter-type-switcher").popover(
{
html: true, html: true,
content: function () { content: function () {
return $("#content-filter-types").html(); return $("#content-filter-types").html();
} }
}); }
);
/* for data tables*/ /* for data tables*/
$('[data-toggle="tooltip"]').tooltip(); $('[data-toggle="tooltip"]').tooltip();
$("[data-toggle=popover]").popover(); $("[data-toggle=popover]").popover();
$(".ctrl-filter-type-switcher").popover({ $(".ctrl-filter-type-switcher").popover(
{
html: true, html: true,
content: function () { content: function () {
return $('#content-filter-types').html(); return $('#content-filter-types').html();
} }
}); }
);
$('#nav').affix({ $('#nav').affix(
{
offset: { offset: {
top: $('header').height() top: $('header').height()
} }
}); }
);
}); });
@ -212,12 +251,14 @@ function attachEvents() {
$('#user-names').html('<div style="height:100px" data-state="loading" data-loading-text="Loading..." data-loading-style="icon-only" data-loading-inverse="true"></div>'); $('#user-names').html('<div style="height:100px" data-state="loading" data-loading-text="Loading..." data-loading-style="icon-only" data-loading-inverse="true"></div>');
showPopup(); showPopup();
$("a#share-group-next-link").hide(); $("a#share-group-next-link").hide();
var userRequest = $.ajax({ var userRequest = $.ajax(
{
url: "api/user/all", url: "api/user/all",
method: "GET", method: "GET",
contentType: "application/json", contentType: "application/json",
accept: "application/json" accept: "application/json"
}); }
);
userRequest.done(function (data, txtStatus, jqxhr) { userRequest.done(function (data, txtStatus, jqxhr) {
var users = JSON.parse(data); var users = JSON.parse(data);
var status = jqxhr.status; var status = jqxhr.status;
@ -318,10 +359,9 @@ function attachEvents() {
var successCallback = function (data) { var successCallback = function (data) {
data = JSON.parse(data); data = JSON.parse(data);
if (data.status == 200) { if (data.status == 200) {
$(modalPopupContent).html($('#edit-group-200-content').html());
$("h4[data-groupid='" + groupId + "']").html(newGroupName);
setTimeout(function () { setTimeout(function () {
hidePopup(); hidePopup();
location.reload(false);
}, 2000); }, 2000);
} else { } else {
displayErrors(status); displayErrors(status);

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
* *
* WSO2 Inc. licenses this file to you under the Apache License, * WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except * Version 2.0 (the "License"); you may not use this file except
@ -78,7 +78,8 @@ $.fn.datatables_extended = function(settings){
$( "#operation-guide" ).hide(); $( "#operation-guide" ).hide();
$( "#operation-bar" ).removeClass("hidden"); $( "#operation-bar" ).removeClass("hidden");
$("#operation-bar").show(); $("#operation-bar").show();
loadOperationBar(val); //TODO: Enable after adding iot operations bar
//loadOperationBar(val);
} }
} }
@ -86,13 +87,14 @@ $.fn.datatables_extended = function(settings){
$(column).each(function () { $(column).each(function () {
if ($(column.nodes()).attr('data-search')) { if ($(column.nodes()).attr('data-search')) {
var titles = []; var values = [];
column.nodes().unique().sort().each(function (d, j) { column.nodes().unique().sort().each(function (d, j) {
var title = $(d).attr('data-display'); var title = $(d).attr('data-display');
if ($.inArray(title, titles) < 0) { var value = $(d).attr('data-search');
titles.push(title); if ($.inArray(value, values) < 0) {
if (title !== undefined) { values.push(value);
select.append('<option value="' + title + '">' + title + '</option>') if (value !== undefined) {
select.append('<option value="' + value + '">' + title + '</option>')
} }
} }
}); });

@ -2193,7 +2193,7 @@ input[type=number].form-control {
} }
.table.list-table.grid-view .padding-reduce-on-grid-view { .table.list-table.grid-view .padding-reduce-on-grid-view {
padding: 2px; padding: 1px;
} }
.table.list-table.grid-view .text-left-on-grid-view { .table.list-table.grid-view .text-left-on-grid-view {
@ -6428,7 +6428,7 @@ body.inverse .fade-edge:after {
display: none; display: none;
} }
.table.list-table.grid-view .padding-reduce-on-grid-view { .table.list-table.grid-view .padding-reduce-on-grid-view {
padding: 2px; padding: 1px;
} }
.table.list-table.grid-view .text-left-on-grid-view { .table.list-table.grid-view .text-left-on-grid-view {
text-align: left; text-align: left;

@ -24,18 +24,19 @@
<Name>jdbc/DM_DS</Name> <Name>jdbc/DM_DS</Name>
</JndiLookupDefinition> </JndiLookupDefinition>
</DataSourceConfiguration> </DataSourceConfiguration>
</ManagementRepository>
<IdentityConfiguration> <IdentityConfiguration>
<ServerUrl>https://localhost:9443</ServerUrl> <ServerUrl>https://localhost:9443</ServerUrl>
<AdminUsername>admin</AdminUsername> <AdminUsername>admin</AdminUsername>
<AdminPassword>admin</AdminPassword> <AdminPassword>admin</AdminPassword>
</IdentityConfiguration> </IdentityConfiguration>
<PolicyConfiguration> <PolicyConfiguration>
<monitoringClass>org.wso2.carbon.policy.mgt</monitoringClass> <MonitoringClass>org.wso2.carbon.policy.mgt</MonitoringClass>
<monitoringEnable>true</monitoringEnable> <MonitoringEnable>true</MonitoringEnable>
<monitoringFrequency>60000</monitoringFrequency> <MonitoringFrequency>60000</MonitoringFrequency>
<maxRetries>5</maxRetries> <MaxRetries>5</MaxRetries>
<minRetriesToMarkUnreachable>8</minRetriesToMarkUnreachable> <MinRetriesToMarkUnreachable>8</MinRetriesToMarkUnreachable>
<minRetriesToMarkInactive>20</minRetriesToMarkInactive> <MinRetriesToMarkInactive>20</MinRetriesToMarkInactive>
</PolicyConfiguration> </PolicyConfiguration>
<TaskConfiguration> <TaskConfiguration>
<Enable>true</Enable> <Enable>true</Enable>
@ -56,6 +57,5 @@
</Operation> </Operation>
</Operations> </Operations>
</TaskConfiguration> </TaskConfiguration>
</ManagementRepository>
</DeviceMgtConfiguration> </DeviceMgtConfiguration>

Loading…
Cancel
Save