diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/pom.xml b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/pom.xml new file mode 100644 index 000000000..ae948f1b4 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/pom.xml @@ -0,0 +1,149 @@ + + + + + org.wso2.carbon.devicemgt-plugins + extensions + 2.2.2-SNAPSHOT + ../pom.xml + + 4.0.0 + 2.2.2-SNAPSHOT + org.wso2.carbon.appmgt.mdm.osgiconnector + bundle + WSO2 Carbon - App Manager WSO2 MDM OSGI Connector Component + http://maven.apache.org + + + + + org.apache.felix + maven-scr-plugin + + + generate-scr-scrdescriptor + + scr + + + + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.artifactId} + ${project.artifactId} + org.wso2.carbon.appmgt.mdm.osgiconnector.internal + + org.wso2.carbon.device.mgt.core.*, + org.wso2.carbon.appmgt.mobile.utils.*, + org.wso2.carbon.appmgt.mobile.mdm.*, + org.wso2.carbon.appmgt.mobile.interfaces.*, + *;resolution:=optional + + + !org.wso2.carbon.appmgt.mdm.osgiconnector.internal, + org.wso2.carbon.appmgt.mdm.osgiconnector.* + + + + + + + + + org.wso2.carbon.appmgt + org.wso2.carbon.appmgt.mobile + + + org.apache.ws.commons.axiom + axiom-api + + + org.apache.ws.commons.axiom + axiom-impl + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.core + + + org.apache.ws.commons.axiom + axiom-api + + + org.apache.ws.commons.axiom + axiom-impl + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.policy.mgt.core + + + org.apache.ws.commons.axiom + axiom-api + + + org.apache.ws.commons.axiom + axiom-impl + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.common + + + org.apache.ws.commons.axiom + axiom-api + + + org.apache.ws.commons.axiom + axiom-impl + + + + + commons-io.wso2 + commons-io + + + com.googlecode.json-simple.wso2 + json-simple + + + com.googlecode.plist + dd-plist + + + org.apache.felix + org.apache.felix.scr + + + com.google.code.gson + gson + + + + diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/ApplicationOperationsImpl.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/ApplicationOperationsImpl.java new file mode 100644 index 000000000..766698c9c --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/ApplicationOperationsImpl.java @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.MobileApp; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.MobileAppTypes; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.common.DeviceApplicationException; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.util.AndroidApplicationOperationUtil; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.util.IOSApplicationOperationUtil; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.util.MDMAppConstants; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.util.MDMServiceAPIUtils; +import org.wso2.carbon.appmgt.mobile.beans.ApplicationOperationAction; +import org.wso2.carbon.appmgt.mobile.beans.ApplicationOperationDevice; +import org.wso2.carbon.appmgt.mobile.interfaces.ApplicationOperations; +import org.wso2.carbon.appmgt.mobile.mdm.App; +import org.wso2.carbon.appmgt.mobile.mdm.Device; +import org.wso2.carbon.appmgt.mobile.utils.MobileApplicationException; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.Platform; +import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; +import org.wso2.carbon.device.mgt.common.operation.mgt.Activity; +import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +public class ApplicationOperationsImpl implements ApplicationOperations { + + private static final Log log = LogFactory.getLog(ApplicationOperationsImpl.class); + + /** + * @param applicationOperationAction holds the information needs to perform an action on mdm. + * @throws MobileApplicationException + */ + public String performAction(ApplicationOperationAction applicationOperationAction) + throws MobileApplicationException { + if (log.isDebugEnabled()) { + log.debug(applicationOperationAction.getAction() + " action is triggered for " + + applicationOperationAction.getType() +"."); + } + + Operation operation = null; + List deviceIdentifiers = new ArrayList<>(); + List deviceList; + if (MDMAppConstants.USER.equals(applicationOperationAction.getType())) { + String userName = null; + try { + for (String param : applicationOperationAction.getParams()) { + userName = param; + + deviceList = MDMServiceAPIUtils + .getDeviceManagementService(applicationOperationAction.getTenantId()). + getDevicesOfUser(userName); + + for (org.wso2.carbon.device.mgt.common.Device device : deviceList) { + if(applicationOperationAction.getApp().getPlatform().equalsIgnoreCase(device.getType())){ + deviceIdentifiers.add(getDeviceIdentifierByDevice(device)); + } + } + } + } catch (DeviceManagementException devEx) { + String errorMsg = "Error occurred fetch device for user " + userName + + " at app installation"; + logError(errorMsg, devEx); + throw new MobileApplicationException(errorMsg, devEx); + } + } else if (MDMAppConstants.ROLE.equals(applicationOperationAction.getType())) { + String userRole = null; + try { + for (String param : applicationOperationAction.getParams()) { + userRole = param; + + deviceList = MDMServiceAPIUtils + .getDeviceManagementService(applicationOperationAction.getTenantId()). + getAllDevicesOfRole(userRole); + + for (org.wso2.carbon.device.mgt.common.Device device : deviceList) { + deviceIdentifiers.add(getDeviceIdentifierByDevice(device)); + } + } + } catch (DeviceManagementException devMgtEx) { + String errorMsg = "Error occurred fetch device for user role " + userRole + + " at app installation"; + logError(errorMsg, devMgtEx); + throw new MobileApplicationException(errorMsg, devMgtEx); + } + + } else if (MDMAppConstants.DEVICE.equals(applicationOperationAction.getType())) { + DeviceIdentifier deviceIdentifier; + for (String param : applicationOperationAction.getParams()) { + deviceIdentifier = new DeviceIdentifier(); + if (isValidJSON(param)) { + JSONParser parser = new JSONParser(); + try { + JSONObject parsedObj = (JSONObject) parser.parse(param); + deviceIdentifier.setId((String) parsedObj.get(MDMAppConstants.ID)); + deviceIdentifier.setType((String) parsedObj.get(MDMAppConstants.TYPE)); + deviceIdentifiers.add(deviceIdentifier); + } catch (ParseException e) { + logError("Device Identifier is not valid json object.", e); + throw new MobileApplicationException(e); + } + + } + } + } else { + throw new IllegalStateException("invalid type is received from app store."); + } + App app = applicationOperationAction.getApp(); + MobileApp mobileApp = new MobileApp(); + mobileApp.setId(app.getId()); + mobileApp.setType(MobileAppTypes.valueOf(app.getType().toUpperCase())); + mobileApp.setAppIdentifier(app.getAppIdentifier()); + mobileApp.setIconImage(app.getIconImage()); + mobileApp.setIdentifier(app.getIdentifier()); + mobileApp.setLocation(app.getLocation()); + mobileApp.setName(app.getName()); + mobileApp.setPackageName(app.getPackageName()); + mobileApp.setPlatform(app.getPlatform()); + mobileApp.setVersion(app.getVersion()); + Properties properties = new Properties(); + + if (MDMAppConstants.IOS.equals(app.getPlatform())) { + if (MDMAppConstants.ENTERPRISE.equals(app.getType())) { + properties.put(MDMAppConstants.IOSConstants.IS_REMOVE_APP, true); + properties.put(MDMAppConstants.IOSConstants.IS_PREVENT_BACKUP, true); + } else if (MDMAppConstants.IOSConstants.PUBLIC.equals(app.getType())) { + properties.put(MDMAppConstants.IOSConstants.I_TUNES_ID, app.getIdentifier()); + properties.put(MDMAppConstants.IOSConstants.IS_REMOVE_APP, true); + properties.put(MDMAppConstants.IOSConstants.IS_PREVENT_BACKUP, true); + } else if (MDMAppConstants.WEBAPP.equals(app.getType())) { + properties.put(MDMAppConstants.IOSConstants.LABEL, app.getName()); + properties.put(MDMAppConstants.IOSConstants.IS_REMOVE_APP, true); + } + } else if (MDMAppConstants.WEBAPP.equals(app.getPlatform())) { + properties.put(MDMAppConstants.IOSConstants.LABEL, app.getName()); + properties.put(MDMAppConstants.IOSConstants.IS_REMOVE_APP, true); + } + mobileApp.setProperties(properties); + Activity activity = null; + try { + if (deviceIdentifiers.size() > 0) { + if (deviceIdentifiers.get(0).getType().equalsIgnoreCase(Platform.ANDROID.toString())) { + if (MDMAppConstants.INSTALL.equals(applicationOperationAction.getAction())) { + operation = AndroidApplicationOperationUtil + .createInstallAppOperation(mobileApp, applicationOperationAction.getSchedule()); + } else if (MDMAppConstants.UPDATE.equals(applicationOperationAction.getAction())) { + operation = AndroidApplicationOperationUtil + .createUpdateAppOperation(mobileApp, applicationOperationAction.getSchedule()); + } else { + operation = AndroidApplicationOperationUtil + .createAppUninstallOperation(mobileApp, applicationOperationAction.getSchedule()); + } + } else if (deviceIdentifiers.get(0).getType().equalsIgnoreCase(Platform.IOS.toString())) { + if (MDMAppConstants.INSTALL.equals(applicationOperationAction.getAction())) { + operation = + IOSApplicationOperationUtil.createInstallAppOperation(mobileApp); + } else { + operation = + IOSApplicationOperationUtil.createAppUninstallOperation(mobileApp); + } + } + activity = MDMServiceAPIUtils.getAppManagementService(applicationOperationAction.getTenantId()) + .installApplicationForDevices(operation, deviceIdentifiers); + + + } + + if(activity != null){ + return activity.getActivityId(); + } + + return null; + + } catch (DeviceApplicationException mdmExce) { + logError("Error in creating operation object using app.", mdmExce); + throw new MobileApplicationException(mdmExce.getMessage()); + } catch (ApplicationManagementException appMgtExce) { + logError("Error in app installation.", appMgtExce); + throw new MobileApplicationException(appMgtExce.getErrorMessage()); + } + + } + + /** + * Create a new device identifier from Device object. + * @param device device which is to be retrieved type and id + * @return created device identifier + */ + private static DeviceIdentifier getDeviceIdentifierByDevice( + org.wso2.carbon.device.mgt.common.Device device) { + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(device.getDeviceIdentifier()); + deviceIdentifier.setType(device.getType()); + + return deviceIdentifier; + } + + /** + * @param applicationOperationDevice holds the information needs to retrieve device list. + * @return List of devices + * @throws MobileApplicationException + */ + public List getDevices(ApplicationOperationDevice applicationOperationDevice) + throws MobileApplicationException { + + List devices; + try { + List deviceList = MDMServiceAPIUtils + .getDeviceManagementService(applicationOperationDevice.getTenantId()). + getDevicesOfUser( + applicationOperationDevice.getCurrentUser().getUsername()); + devices = new ArrayList<>(deviceList.size()); + if(log.isDebugEnabled()){ + log.debug("device list got from mdm "+ deviceList.toString()); + } + for (org.wso2.carbon.device.mgt.common.Device commonDevice : deviceList) { + if (MDMAppConstants.ACTIVE + .equals(commonDevice.getEnrolmentInfo().getStatus().toString(). + toLowerCase())) { + Device device = new Device(); + org.wso2.carbon.appmgt.mobile.beans.DeviceIdentifier deviceIdentifier = + new org.wso2.carbon.appmgt.mobile.beans.DeviceIdentifier(); + deviceIdentifier.setId(commonDevice.getDeviceIdentifier()); + deviceIdentifier.setType(commonDevice.getType()); + device.setDeviceIdentifier(deviceIdentifier); + device.setName(commonDevice.getName()); + device.setModel(commonDevice.getName()); + device.setType(MDMAppConstants.MOBILE_DEVICE); + String imgUrl; + if (MDMAppConstants.ANDROID.equalsIgnoreCase(commonDevice.getType())) { + imgUrl = String.format(applicationOperationDevice.getConfigParams() + .get(MDMAppConstants.IMAGE_URL), + MDMAppConstants.NEXUS); + } else if (MDMAppConstants.IOS.equalsIgnoreCase(commonDevice.getType())) { + imgUrl = String.format(applicationOperationDevice.getConfigParams() + .get(MDMAppConstants.IMAGE_URL), + MDMAppConstants.IPHONE); + } else { + imgUrl = String.format(applicationOperationDevice.getConfigParams() + .get(MDMAppConstants.IMAGE_URL), + MDMAppConstants.NONE); + } + device.setImage(imgUrl); + device.setPlatform(commonDevice.getType()); + devices.add(device); + } + } + } catch (DeviceManagementException e) { + logError("Error While retrieving Device List.", e); + throw new MobileApplicationException(e.getMessage()); + + } + return devices; + } + + private boolean isValidJSON(String json) { + JSONParser parser = new JSONParser(); + try { + parser.parse(json); + } catch (ParseException e) { + return false; + } + return true; + } + + private void logError(String errorMessage, Throwable e) { + if (log.isDebugEnabled()) { + log.error(errorMessage, e); + } else { + log.error(errorMessage); + } + } + +} + diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/internal/DeviceApplicationServiceComponent.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/internal/DeviceApplicationServiceComponent.java new file mode 100644 index 000000000..085f3a650 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/internal/DeviceApplicationServiceComponent.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.internal; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.component.ComponentContext; +import org.wso2.carbon.appmgt.mdm.osgiconnector.ApplicationOperationsImpl; +import org.wso2.carbon.appmgt.mobile.interfaces.ApplicationOperations; + +/** + * @scr.component name="org.wso2.carbon.appmgt.mdm.osgiconnector" immediate="true" + */ + +public class DeviceApplicationServiceComponent { + + private static final Log log = LogFactory.getLog(DeviceApplicationServiceComponent.class); + + private ServiceRegistration mdmServiceRegistration; + + protected void activate(ComponentContext context) { + BundleContext bundleContext = context.getBundleContext(); + mdmServiceRegistration = bundleContext + .registerService(ApplicationOperations.class.getName(), new ApplicationOperationsImpl(), null); + if (log.isDebugEnabled()) { + log.debug("Device Application Service Component activated."); + } + + } + + protected void deactivate(ComponentContext context) { + if (mdmServiceRegistration != null) { + mdmServiceRegistration.unregister(); + mdmServiceRegistration = null; + } + if (log.isDebugEnabled()) { + log.debug("Device Application Service Component deactivated."); + } + + } + +} + + diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/MobileApp.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/MobileApp.java new file mode 100644 index 000000000..2933669a4 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/MobileApp.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.beans; + +import java.util.Properties; + +/** + * This class represents the generic mobile Application information + * which is used by AppM. + */ +public class MobileApp { + + private String id; + private String name; + private MobileAppTypes type; + private String platform; + private String version; + private String identifier; + private String iconImage; + private String packageName; + private String appIdentifier; + private String location; + private Properties properties; + + public MobileAppTypes getType() { + return type; + } + + public void setType(MobileAppTypes type) { + this.type = type; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPlatform() { + return platform; + } + + public void setPlatform(String platform) { + this.platform = platform; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getIconImage() { + return iconImage; + } + + public void setIconImage(String iconImage) { + this.iconImage = iconImage; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getAppIdentifier() { + return appIdentifier; + } + + public void setAppIdentifier(String appIdentifier) { + this.appIdentifier = appIdentifier; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/MobileAppTypes.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/MobileAppTypes.java new file mode 100644 index 000000000..9b1b306c0 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/MobileAppTypes.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.beans; + +public enum MobileAppTypes { + ENTERPRISE, WEBAPP, PUBLIC + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/AndroidApplication.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/AndroidApplication.java new file mode 100644 index 000000000..d638d7b11 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/AndroidApplication.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.beans.android; + +import com.google.gson.Gson; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.common.DeviceApplicationException; + +public class AndroidApplication { + private String type; + private String appIdentifier; + + public String getAppIdentifier() { + return appIdentifier; + } + + public void setAppIdentifier(String appIdentifier) { + this.appIdentifier = appIdentifier; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String toJSON() throws DeviceApplicationException { + Gson gson = new Gson(); + return gson.toJson(this); + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/AppStoreApplication.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/AppStoreApplication.java new file mode 100644 index 000000000..6f78eb244 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/AppStoreApplication.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.beans.android; + +import com.google.gson.Gson; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.common.DeviceApplicationException; + +import java.io.Serializable; + +/** + * This class represents the Appstore Application information. + */ +public class AppStoreApplication extends AndroidApplication implements Serializable { + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/EnterpriseApplication.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/EnterpriseApplication.java new file mode 100644 index 000000000..f8990e585 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/EnterpriseApplication.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.beans.android; + +import com.google.gson.Gson; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.common.DeviceApplicationException; + +import java.io.Serializable; + +/** + * This class represents the Enterprise Application information. + */ +public class EnterpriseApplication extends AndroidApplication implements Serializable { + + private String url; + private String schedule; + private String packageName; + + public String getSchedule() { + return schedule; + } + + public void setSchedule(String schedule) { + this.schedule = schedule; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/WebApplication.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/WebApplication.java new file mode 100644 index 000000000..08a35e08e --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/android/WebApplication.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.beans.android; + +import com.google.gson.Gson; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.common.DeviceApplicationException; + +import java.io.Serializable; + +/** + * This class represents the Web Application information. + */ +public class WebApplication implements Serializable { + + private String name; + private String url; + private String type; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String toJSON() throws DeviceApplicationException { + Gson gson = new Gson(); + return gson.toJson(this); + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/AppStoreApplication.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/AppStoreApplication.java new file mode 100644 index 000000000..b8e6a4e09 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/AppStoreApplication.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.ios; + +import java.io.Serializable; + +public class AppStoreApplication extends IOSApplication implements Serializable { + + private int iTunesStoreID; + + public int getiTunesStoreID() { + return iTunesStoreID; + } + + public void setiTunesStoreID(int iTunesStoreID) { + this.iTunesStoreID = iTunesStoreID; + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/EnterpriseApplication.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/EnterpriseApplication.java new file mode 100644 index 000000000..3a09b7325 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/EnterpriseApplication.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.ios; + +import java.io.Serializable; + +public class EnterpriseApplication extends IOSApplication implements Serializable { + + private String manifestURL; + + public String getManifestURL() { + return manifestURL; + } + + public void setManifestURL(String manifestURL) { + this.manifestURL = manifestURL; + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/IOSApplication.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/IOSApplication.java new file mode 100644 index 000000000..12a8db23a --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/IOSApplication.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.beans.ios; + +import com.google.gson.Gson; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.common.DeviceApplicationException; + +public class IOSApplication { + + private String identifier; + private boolean removeAppUponMDMProfileRemoval; + private boolean preventBackupOfAppData; + private String bundleId; + private String UUID; + + public String getUUID() { + return UUID; + } + + public void setUUID(String UUID) { + this.UUID = UUID; + } + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public boolean isRemoveAppUponMDMProfileRemoval() { + return removeAppUponMDMProfileRemoval; + } + + public void setRemoveAppUponMDMProfileRemoval(boolean removeAppUponMDMProfileRemoval) { + this.removeAppUponMDMProfileRemoval = removeAppUponMDMProfileRemoval; + } + + public boolean isPreventBackupOfAppData() { + return preventBackupOfAppData; + } + + public void setPreventBackupOfAppData(boolean preventBackupOfAppData) { + this.preventBackupOfAppData = preventBackupOfAppData; + } + + public String getBundleId() { + return bundleId; + } + + public void setBundleId(String bundleId) { + this.bundleId = bundleId; + } + + public String toJSON() throws DeviceApplicationException { + Gson gson = new Gson(); + return gson.toJson(this); + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/RemoveApplication.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/RemoveApplication.java new file mode 100644 index 000000000..22c7963de --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/RemoveApplication.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.beans.ios; + +import com.google.gson.Gson; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.common.DeviceApplicationException; + +import java.io.Serializable; + +public class RemoveApplication implements Serializable { + + private String bundleId; + + public String getBundleId() { + return bundleId; + } + + public void setBundleId(String bundleId) { + this.bundleId = bundleId; + } + + public String toJSON() throws DeviceApplicationException { + Gson gson = new Gson(); + return gson.toJson(this); + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/WebClip.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/WebClip.java new file mode 100644 index 000000000..000374c43 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/beans/ios/WebClip.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.beans.ios; + +import com.google.gson.Gson; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.common.DeviceApplicationException; + +public class WebClip { + + private String URL; + private String label; + private String icon; + private String isRemovable; + private String UUID; + + public String getUUID() { + return UUID; + } + + public void setUUID(String UUID) { + this.UUID = UUID; + } + + public String getURL() { + return URL; + } + + public void setURL(String URL) { + this.URL = URL; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getIsRemovable() { + return isRemovable; + } + + public void setIsRemovable(String isRemovable) { + this.isRemovable = isRemovable; + } + + public String toJSON() throws DeviceApplicationException { + Gson gson = new Gson(); + return gson.toJson(this); + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/common/DeviceApplicationException.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/common/DeviceApplicationException.java new file mode 100644 index 000000000..84818e4a0 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/common/DeviceApplicationException.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.common; + +public class DeviceApplicationException extends Exception { + + private static final long serialVersionUID = 5136875495185597926L; + private String errorMessage; + + public DeviceApplicationException(String msg, Exception e) { + super(msg, e); + setErrorMessage(msg); + } + + public DeviceApplicationException(String msg, Throwable cause) { + super(msg, cause); + setErrorMessage(msg); + } + + public DeviceApplicationException(String msg) { + super(msg); + setErrorMessage(msg); + } + + public DeviceApplicationException() { + super(); + } + + public DeviceApplicationException(Throwable cause) { + super(cause); + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/AndroidApplicationOperationUtil.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/AndroidApplicationOperationUtil.java new file mode 100644 index 000000000..7c1288b1a --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/AndroidApplicationOperationUtil.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.util; + +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.MobileApp; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.android.AppStoreApplication; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.android.EnterpriseApplication; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.android.WebApplication; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.common.DeviceApplicationException; +import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; +import org.wso2.carbon.device.mgt.core.operation.mgt.ProfileOperation; + +/** + * This class contains the all the operations related to Android. + */ +public class AndroidApplicationOperationUtil { + + /** + * Create Install Application operation. + * + * @param application MobileApp application + * @return operation + * @throws DeviceApplicationException + */ + public static Operation createInstallAppOperation(MobileApp application, String schedule) throws + DeviceApplicationException { + + ProfileOperation operation = new ProfileOperation(); + operation.setCode(MDMAppConstants.AndroidConstants.OPCODE_INSTALL_APPLICATION); + operation.setType(Operation.Type.PROFILE); + switch (application.getType()) { + case ENTERPRISE: + EnterpriseApplication enterpriseApplication = new EnterpriseApplication(); + enterpriseApplication.setType(application.getType().toString()); + enterpriseApplication.setUrl(application.getLocation()); + enterpriseApplication.setSchedule(schedule); + enterpriseApplication.setPackageName(application.getPackageName()); + operation.setPayLoad(enterpriseApplication.toJSON()); + break; + case PUBLIC: + setOperationForPublicApp(operation, application); + break; + case WEBAPP: + setOperationForWebApp(operation, application); + break; + default: + String errorMessage = "Invalid application type."; + throw new DeviceApplicationException(errorMessage); + } + return operation; + } + + /** + * Create Update Application operation. + * + * @param application MobileApp application + * @return operation + * @throws DeviceApplicationException + */ + public static Operation createUpdateAppOperation(MobileApp application, String schedule) throws + DeviceApplicationException { + + ProfileOperation operation = new ProfileOperation(); + operation.setCode(MDMAppConstants.AndroidConstants.OPCODE_UPDATE_APPLICATION); + operation.setType(Operation.Type.PROFILE); + switch (application.getType()) { + case ENTERPRISE: + EnterpriseApplication enterpriseApplication = new EnterpriseApplication(); + enterpriseApplication.setType(application.getType().toString()); + enterpriseApplication.setUrl(application.getLocation()); + enterpriseApplication.setSchedule(schedule); + operation.setPayLoad(enterpriseApplication.toJSON()); + break; + case PUBLIC: + setOperationForPublicApp(operation, application); + break; + case WEBAPP: + setOperationForWebApp(operation, application); + break; + default: + String errorMessage = "Invalid application type."; + throw new DeviceApplicationException(errorMessage); + } + return operation; + } + + /** + * Create Uninstall Application operation. + * + * @param application MobileApp application + * @return operation + * @throws DeviceApplicationException + */ + public static Operation createAppUninstallOperation(MobileApp application, String schedule) throws + DeviceApplicationException { + + ProfileOperation operation = new ProfileOperation(); + operation.setCode(MDMAppConstants.AndroidConstants.OPCODE_UNINSTALL_APPLICATION); + operation.setType(Operation.Type.PROFILE); + + switch (application.getType()) { + case ENTERPRISE: + EnterpriseApplication enterpriseApplication = new EnterpriseApplication(); + enterpriseApplication.setType(application.getType().toString()); + enterpriseApplication.setAppIdentifier(application.getIdentifier()); + enterpriseApplication.setSchedule(schedule); + operation.setPayLoad(enterpriseApplication.toJSON()); + break; + case PUBLIC: + setOperationForPublicApp(operation, application); + break; + case WEBAPP: + setOperationForWebApp(operation, application); + break; + default: + String errorMessage = "Invalid application type."; + throw new DeviceApplicationException(errorMessage); + } + return operation; + } + + private static void setOperationForPublicApp(Operation operation, MobileApp application) + throws DeviceApplicationException { + AppStoreApplication appStoreApplication = new AppStoreApplication(); + appStoreApplication.setType(application.getType().toString()); + appStoreApplication.setAppIdentifier(application.getIdentifier()); + operation.setPayLoad(appStoreApplication.toJSON()); + } + + private static void setOperationForWebApp(Operation operation, MobileApp application) + throws DeviceApplicationException { + WebApplication webApplication = new WebApplication(); + webApplication.setUrl(application.getLocation()); + webApplication.setName(application.getName()); + webApplication.setType(application.getType().toString()); + operation.setPayLoad(webApplication.toJSON()); + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/IOSApplicationOperationUtil.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/IOSApplicationOperationUtil.java new file mode 100644 index 000000000..3167ed8d3 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/IOSApplicationOperationUtil.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.util; + +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.MobileApp; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.ios.AppStoreApplication; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.ios.WebClip; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.common.DeviceApplicationException; +import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; +import org.wso2.carbon.device.mgt.core.operation.mgt.ProfileOperation; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.ios.EnterpriseApplication; +import org.wso2.carbon.appmgt.mdm.osgiconnector.mdmmgt.beans.ios.RemoveApplication; + +import java.util.Properties; + +/** + * This class contains the all the operations related to IOS. + */ +public class IOSApplicationOperationUtil { + + /** + * Create Install Application operation. + * + * @param application MobileApp application + * @return operation + * @throws DeviceApplicationException + */ + public static Operation createInstallAppOperation(MobileApp application) throws + DeviceApplicationException { + + ProfileOperation operation = new ProfileOperation(); + switch (application.getType()) { + case ENTERPRISE: + EnterpriseApplication enterpriseApplication = new EnterpriseApplication(); + enterpriseApplication.setBundleId(application.getId()); + enterpriseApplication.setIdentifier(application.getIdentifier()); + enterpriseApplication.setManifestURL(application.getLocation()); + + Properties properties = application.getProperties(); + enterpriseApplication.setPreventBackupOfAppData( + (Boolean) properties.get(MDMAppConstants.IOSConstants.IS_PREVENT_BACKUP)); + enterpriseApplication.setRemoveAppUponMDMProfileRemoval( + (Boolean) properties.get(MDMAppConstants.IOSConstants.IS_REMOVE_APP)); + operation.setCode( + MDMAppConstants.IOSConstants.OPCODE_INSTALL_ENTERPRISE_APPLICATION); + operation.setPayLoad(enterpriseApplication.toJSON()); + operation.setType(Operation.Type.COMMAND); + break; + case PUBLIC: + AppStoreApplication appStoreApplication = new AppStoreApplication(); + appStoreApplication.setRemoveAppUponMDMProfileRemoval( + (Boolean) application.getProperties() + .get(MDMAppConstants.IOSConstants.IS_REMOVE_APP)); + appStoreApplication.setIdentifier(application.getIdentifier()); + appStoreApplication.setPreventBackupOfAppData((Boolean) application.getProperties(). + get(MDMAppConstants.IOSConstants.IS_PREVENT_BACKUP)); + appStoreApplication.setBundleId(application.getId()); + appStoreApplication.setiTunesStoreID((Integer) application.getProperties(). + get(MDMAppConstants.IOSConstants.I_TUNES_ID)); + operation.setCode(MDMAppConstants.IOSConstants.OPCODE_INSTALL_STORE_APPLICATION); + operation.setType(Operation.Type.COMMAND); + operation.setPayLoad(appStoreApplication.toJSON()); + break; + case WEBAPP: + WebClip webClip = new WebClip(); + webClip.setIcon(application.getIconImage()); + webClip.setIsRemovable(application.getProperties(). + getProperty(MDMAppConstants.IOSConstants.IS_REMOVE_APP)); + webClip.setLabel(application.getProperties(). + getProperty(MDMAppConstants.IOSConstants.LABEL)); + webClip.setURL(application.getLocation()); + operation.setCode(MDMAppConstants.IOSConstants.OPCODE_INSTALL_WEB_APPLICATION); + operation.setType(Operation.Type.PROFILE); + operation.setPayLoad(webClip.toJSON()); + break; + default: + String errorMessage = "Invalid application type."; + throw new DeviceApplicationException(errorMessage); + } + return operation; + } + + /** + * Create uninstall operations. + * + * @param application + * @return Uninstall operation + * @throws DeviceApplicationException + */ + public static Operation createAppUninstallOperation(MobileApp application) throws + DeviceApplicationException { + ProfileOperation operation = new ProfileOperation(); + operation.setCode(MDMAppConstants.IOSConstants.OPCODE_REMOVE_APPLICATION); + operation.setType(Operation.Type.PROFILE); + RemoveApplication removeApplication = new RemoveApplication(); + removeApplication.setBundleId(application.getIdentifier()); + operation.setPayLoad(removeApplication.toJSON()); + return operation; + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/MDMAppConstants.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/MDMAppConstants.java new file mode 100644 index 000000000..5903b6484 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/MDMAppConstants.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.util; + +/** + * This class holds all the constants used for IOS and Android. + */ +public class MDMAppConstants { + + public static final String USER = "user"; + public static final String ROLE = "role"; + public static final String IOS = "ios"; + public static final String ANDROID = "android"; + public static final String WEBAPP = "webapp"; + public static final String INSTALL = "install"; + public static final String UPDATE = "update"; + public static final String ACTIVE = "active"; + public static final String ENTERPRISE = "enterprise"; + public static final String DEVICE = "device"; + public static final String MOBILE_DEVICE = "mobileDevice"; + public static final String NEXUS = "nexus"; + public static final String IPHONE = "iphone"; + public static final String NONE = "none"; + public static final String IMAGE_URL = "ImageURL"; + public static final String TYPE = "type"; + public static final String ID = "id"; + + public class IOSConstants { + + private IOSConstants() { + throw new AssertionError(); + } + + public static final String IS_REMOVE_APP = "isRemoveApp"; + public static final String IS_PREVENT_BACKUP = "isPreventBackup"; + public static final String I_TUNES_ID = "iTunesId"; + public static final String LABEL = "label"; + public static final String PUBLIC = "public"; + public static final String OPCODE_INSTALL_ENTERPRISE_APPLICATION = + "INSTALL_ENTERPRISE_APPLICATION"; + public static final String OPCODE_INSTALL_STORE_APPLICATION = "INSTALL_STORE_APPLICATION"; + public static final String OPCODE_INSTALL_WEB_APPLICATION = "WEB_CLIP"; + public static final String OPCODE_REMOVE_APPLICATION = "REMOVE_APPLICATION"; + } + + public class AndroidConstants { + private AndroidConstants() { + throw new AssertionError(); + } + + public static final String OPCODE_INSTALL_APPLICATION = "INSTALL_APPLICATION"; + public static final String OPCODE_UPDATE_APPLICATION = "UPDATE_APPLICATION"; + public static final String OPCODE_UNINSTALL_APPLICATION = "UNINSTALL_APPLICATION"; + } + + public class RegistryConstants { + private RegistryConstants() { + throw new AssertionError(); + } + + public static final String GENERAL_CONFIG_RESOURCE_PATH = "general"; + } + + public class APPManagerConstants { + private static final String APP_MANAGER_MDM_SERVICE_NAME = + "org.wso2.carbon.appmgt.mobile.interfaces.MDMOperations"; + } + +} diff --git a/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/MDMServiceAPIUtils.java b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/MDMServiceAPIUtils.java new file mode 100644 index 000000000..922f01732 --- /dev/null +++ b/components/extensions/org.wso2.carbon.appmgt.mdm.osgiconnector/src/main/java/org/wso2/carbon/appmgt/mdm/osgiconnector/mdmmgt/util/MDMServiceAPIUtils.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.appmgt.mdm.osgiconnector.mdmmgt.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.core.app.mgt.ApplicationManagementProviderService; +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; + +/** + * MDMServiceAPIUtils class provides utility function. + */ +public class MDMServiceAPIUtils { + + private static Log log = LogFactory.getLog(MDMServiceAPIUtils.class); + + /** + * Returns the DeviceManagementProviderService osgi service. + * + * @param tenantId tenant id + * @return DeviceManagementProviderService + */ + public static DeviceManagementProviderService getDeviceManagementService(int tenantId) { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + ctx.setTenantId(tenantId, true); + DeviceManagementProviderService deviceManagementProviderService = + (DeviceManagementProviderService) ctx + .getOSGiService(DeviceManagementProviderService.class, null); + if (deviceManagementProviderService == null) { + String msg = "Device Management provider service has not initialized."; + log.error(msg); + throw new IllegalStateException(msg); + } + return deviceManagementProviderService; + } + + /** + * Returns the ApplicationManagementProviderService osgi service. + * + * @param tenantId tenant id + * @return ApplicationManagementProviderService + */ + public static ApplicationManagementProviderService getAppManagementService(int tenantId) { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + ctx.setTenantId(tenantId, true); + ApplicationManagementProviderService applicationManagementProviderService = + (ApplicationManagementProviderService) ctx. + getOSGiService( + ApplicationManagementProviderService.class, + null); + if (applicationManagementProviderService == null) { + String msg = "Application management service has not initialized."; + log.error(msg); + throw new IllegalStateException(msg); + } + return applicationManagementProviderService; + } + +} diff --git a/components/extensions/pom.xml b/components/extensions/pom.xml new file mode 100644 index 000000000..ddd840fb7 --- /dev/null +++ b/components/extensions/pom.xml @@ -0,0 +1,58 @@ + + + + + + + org.wso2.carbon.devicemgt-plugins + carbon-device-mgt-plugins-parent + 2.2.2-SNAPSHOT + ../../pom.xml + + + 4.0.0 + extensions + pom + WSO2 Carbon - Mobile Plugins Extensions + http://wso2.org + + + org.wso2.carbon.appmgt.mdm.osgiconnector + + + + + + + org.apache.felix + maven-scr-plugin + 1.7.2 + + + generate-scr-scrdescriptor + + scr + + + + + + + + diff --git a/features/extensions-feature/org.wso2.carbon.appmgt.mdm.osgiconnector.feature/pom.xml b/features/extensions-feature/org.wso2.carbon.appmgt.mdm.osgiconnector.feature/pom.xml new file mode 100644 index 000000000..8f8fe607f --- /dev/null +++ b/features/extensions-feature/org.wso2.carbon.appmgt.mdm.osgiconnector.feature/pom.xml @@ -0,0 +1,94 @@ + + + + 4.0.0 + + + org.wso2.carbon.devicemgt-plugins + extensions-feature + 2.2.2-SNAPSHOT + ../pom.xml + + + org.wso2.carbon.appmgt.mdm.osgiconnector.feature + pom + 2.2.2-SNAPSHOT + WSO2 Carbon - App management MDM OSGI Connector + http://wso2.org + This feature contains the core bundles required for APP management OSGI MDM connection + + + + + org.wso2.carbon.devicemgt-plugins + org.wso2.carbon.appmgt.mdm.osgiconnector + 2.2.2-SNAPSHOT + + + org.apache.ws.commons.axiom + axiom-api + + + org.apache.ws.commons.axiom + axiom-impl + + + + + com.googlecode.plist + dd-plist + + + + + + + org.wso2.maven + carbon-p2-plugin + ${carbon.p2.plugin.version} + + + 4-p2-feature-generation + package + + p2-feature-gen + + + org.wso2.carbon.appmgt.mdm.osgiconnector + ../etc/feature.properties + + + org.wso2.carbon.p2.category.type:server + + org.eclipse.equinox.p2.type.group:false + + + + + org.wso2.carbon.devicemgt-plugins:org.wso2.carbon.appmgt.mdm.osgiconnector:2.2.2-SNAPSHOT + com.googlecode.plist:dd-plist:${googlecode.plist.version} + + + + + + + + + + + diff --git a/features/extensions-feature/pom.xml b/features/extensions-feature/pom.xml new file mode 100644 index 000000000..f394e9ae3 --- /dev/null +++ b/features/extensions-feature/pom.xml @@ -0,0 +1,40 @@ + + + + + + + org.wso2.carbon.devicemgt-plugins + carbon-device-mgt-plugins-parent + 2.2.2-SNAPSHOT + ../../pom.xml + + + 4.0.0 + extensions-feature + 2.2.2-SNAPSHOT + pom + WSO2 Carbon - Device Management Extensions + http://wso2.org + + + org.wso2.carbon.appmgt.mdm.osgiconnector.feature + + + diff --git a/pom.xml b/pom.xml index 80af5aba4..ef5677db0 100644 --- a/pom.xml +++ b/pom.xml @@ -37,8 +37,10 @@ components/mobile-plugins components/iot-plugins + components/extensions features/mobile-plugins-feature features/iot-plugins-feature + features/extensions-feature @@ -527,6 +529,13 @@ ${carbon.devicemgt.plugins.version} + + + org.wso2.carbon.appmgt + org.wso2.carbon.appmgt.mobile + ${carbon.appmgt.version} + + org.eclipse.osgi @@ -712,6 +721,63 @@ org.wso2.carbon.registry.api ${carbon.kernel.version} + + + org.wso2.carbon.governance + org.wso2.carbon.governance.api + ${carbon.governance.version} + + + org.apache.juddi.wso2 + juddi + + + org.wso2.carbon.registry + org.wso2.carbon.registry.common + + + org.wso2.carbon + org.wso2.carbon.registry.core + + + org.wso2.carbon.registry + org.wso2.carbon.registry.admin.api + + + org.wso2.carbon.registry + org.wso2.carbon.registry.indexing + + + com.ibm.icu + icu4j + + + org.eclipse.equinox + org.eclipse.equinox.registry + + + eclipse + validateutility + + + org.apache.ws.commons.axiom + axiom-api + + + org.apache.ws.commons.axiom + axiom-impl + + + org.wso2.carbon.registry + org.wso2.carbon.registry.extensions + + + javax.servlet + servlet-api + + + + org.wso2.carbon org.wso2.carbon.registry.core @@ -917,6 +983,16 @@ axiom-impl ${axiom-api.version} + + commons-io + commons-io + ${commons-io.version} + + + commons-io.wso2 + commons-io + ${commons-io-wso2.version} + log4j log4j @@ -984,15 +1060,20 @@ - commons-io - commons-io - ${commons-io.version} + org.apache.felix + org.apache.felix.scr + ${apache-felix.version} com.googlecode.json-simple.wso2 json-simple ${json-simple.version} + + com.googlecode.plist + dd-plist + ${googlecode.plist.version} + org.wso2.carbon.identity org.wso2.carbon.identity.oauth.stub @@ -1124,6 +1205,10 @@ 1.2.2-SNAPSHOT [1.1.1, 2.0.0) + + + 1.2.3-SNAPSHOT + 2.2.2-SNAPSHOT @@ -1175,6 +1260,11 @@ 3.0.21 2.2.4 1.0.2 + 2.4.0.wso2v1 + 2.4 + 1.0.8 + 1.8 + 3.1.0.wso2v2 @@ -1195,7 +1285,6 @@ 1.6.17 2.0.0 - 2.4 3.0.0.wso2v1 (3.0.0, 4.0.0] 0.9.1