From ba47af3186237930f011585396b6fd795b5df79c Mon Sep 17 00:00:00 2001 From: ayyoob Date: Wed, 18 May 2016 19:33:04 +0530 Subject: [PATCH 1/3] added api application registration filter --- .../pom.xml | 10 ++ ...ApiApplicationRegistrationServiceImpl.java | 5 +- .../api/filter/ApiPermissionFilter.java | 118 ++++++++++++++++++ .../extension/api/filter/Permission.java | 60 +++++++++ .../api/filter/PermissionConfiguration.java | 41 ++++++ .../extension/api/util/APIUtil.java | 13 ++ .../src/main/webapp/META-INF/permissions.xml | 6 +- .../src/main/webapp/WEB-INF/web.xml | 10 ++ .../jaggeryapps/devicemgt/app/modules/init.js | 2 +- 9 files changed, 259 insertions(+), 6 deletions(-) create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/ApiPermissionFilter.java create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/Permission.java create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/PermissionConfiguration.java diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml index b1c7c57bcb..14379e2e3b 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml @@ -157,6 +157,16 @@ org.wso2.carbon.apimgt.application.extension provided + + org.wso2.carbon + org.wso2.carbon.user.core + provided + + + org.wso2.carbon + org.wso2.carbon.user.api + provided + diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/ApiApplicationRegistrationServiceImpl.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/ApiApplicationRegistrationServiceImpl.java index 7c24b40ffd..cc0bb20a9f 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/ApiApplicationRegistrationServiceImpl.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/ApiApplicationRegistrationServiceImpl.java @@ -59,6 +59,7 @@ public class ApiApplicationRegistrationServiceImpl implements ApiApplicationRegi } String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm() .getRealmConfiguration().getAdminUserName(); + username = username + "@" + APIUtil.getTenantDomainOftheUser(); PrivilegedCarbonContext.getThreadLocalCarbonContext().setUsername(username); APIManagementProviderService apiManagementProviderService = APIUtil.getAPIManagementProviderService(); ApiApplicationKey apiApplicationKey = apiManagementProviderService.generateAndRetrieveApplicationKeys( @@ -81,7 +82,7 @@ public class ApiApplicationRegistrationServiceImpl implements ApiApplicationRegi @POST public Response register(RegistrationProfile registrationProfile) { try { - String username = APIUtil.getAuthenticatedUser(); + String username = APIUtil.getAuthenticatedUser() + "@" + APIUtil.getTenantDomainOftheUser(); APIManagementProviderService apiManagementProviderService = APIUtil.getAPIManagementProviderService(); if (registrationProfile.isMappingAnExistingOAuthApp()) { JSONObject jsonStringObject = new JSONObject(); @@ -116,7 +117,7 @@ public class ApiApplicationRegistrationServiceImpl implements ApiApplicationRegi @DELETE public Response unregister(@QueryParam("applicationName") String applicationName) { try { - String username = APIUtil.getAuthenticatedUser(); + String username = APIUtil.getAuthenticatedUser() + "@" + APIUtil.getTenantDomainOftheUser(); APIManagementProviderService apiManagementProviderService = APIUtil.getAPIManagementProviderService(); apiManagementProviderService.removeAPIApplication(applicationName, username); return Response.status(Response.Status.ACCEPTED).build(); diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/ApiPermissionFilter.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/ApiPermissionFilter.java new file mode 100644 index 0000000000..1395566b70 --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/ApiPermissionFilter.java @@ -0,0 +1,118 @@ +package org.wso2.carbon.apimgt.application.extension.api.filter; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.apimgt.application.extension.api.util.APIUtil; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.user.api.UserRealm; +import org.wso2.carbon.user.api.UserStoreException; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +/** + * this filter check for permission for the request + */ +public class ApiPermissionFilter implements Filter{ + private static final Log log = LogFactory.getLog(ApiPermissionFilter.class); + private static final String UI_EXECUTE = "ui.execute"; + private static final String PERMISSION_CONFIG_PATH = File.separator + "META-INF" + File.separator + + "permissions.xml"; + private static final String PERMISSION_PREFIX = "/permission/admin"; + private static List permissions; + private static final String WEBAPP_CONTEXT = "/api-application-registration"; + @Override + public void init(FilterConfig filterConfig) throws ServletException { + InputStream permissionStream = filterConfig.getServletContext().getResourceAsStream(PERMISSION_CONFIG_PATH); + if (permissionStream != null) { + try { + JAXBContext cdmContext = JAXBContext.newInstance(PermissionConfiguration.class); + Unmarshaller unmarshaller = cdmContext.createUnmarshaller(); + PermissionConfiguration permissionConfiguration = (PermissionConfiguration) + unmarshaller.unmarshal(permissionStream); + permissions = permissionConfiguration.getPermissions(); + } catch (JAXBException e) { + log.error("invalid permissions.xml", e); + } + + } + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + if (servletRequest instanceof HttpServletRequest) { + String uri = ((HttpServletRequest)servletRequest).getRequestURI(); + boolean status = false; + if (uri.contains("register/tenants")) { + String urlPermission = getPermission("/register/tenants/*"); + if (urlPermission != null) { + status = isUserAuthorized(PERMISSION_PREFIX + urlPermission, UI_EXECUTE); + } + } else { + String urlPermission = getPermission(uri); + if (urlPermission != null) { + status = isUserAuthorized(PERMISSION_PREFIX + urlPermission, UI_EXECUTE); + } + } + if (status) { + filterChain.doFilter(servletRequest, servletResponse); + } else { + HttpServletResponse res = (HttpServletResponse) servletResponse; + res.setStatus(HttpServletResponse.SC_FORBIDDEN); + return; + } + } else { + HttpServletResponse res = (HttpServletResponse) servletResponse; + res.setStatus(HttpServletResponse.SC_FORBIDDEN); + return; + } + } + + @Override + public void destroy() { + //do nothing + } + + private static String getPermission(String url) { + if (permissions != null) { + for (int i = 0; i < permissions.size(); i++) { + Permission permission = permissions.get(i); + if ((WEBAPP_CONTEXT + permission.getUrl()).equals(url)) { + return permission.getPath(); + } + } + } + return null; + } + + /** + * Check whether the client is authorized with the given permission and action. + * @param permission Carbon permission that requires for the use + * @param action Carbon permission action that requires for the given permission. + * @return boolean - true if user is authorized else return false. + */ + private boolean isUserAuthorized(String permission, String action) { + PrivilegedCarbonContext context = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + String username = context.getUsername(); + try { + UserRealm userRealm = APIUtil.getRealmService().getTenantUserRealm(PrivilegedCarbonContext + .getThreadLocalCarbonContext().getTenantId()); + return userRealm.getAuthorizationManager().isUserAuthorized(username, permission, action); + } catch (UserStoreException e) { + String errorMsg = String.format("Unable to authorize the user : %s", username, e); + log.error(errorMsg, e); + return false; + } + } + +} diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/Permission.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/Permission.java new file mode 100644 index 0000000000..069e94473c --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/Permission.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015, 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.apimgt.application.extension.api.filter; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * This class represents the information related to permission. + */ +@XmlRootElement (name = "Permission") +public class Permission { + + private String path; // permission string + private String url; // url of the resource + private String method; // http method + + public String getPath() { + return path; + } + + @XmlElement (name = "path", required = true) + public void setPath(String path) { + this.path = path; + } + + public String getUrl() { + return url; + } + + @XmlElement (name = "url", required = true) + public void setUrl(String url) { + this.url = url; + } + + public String getMethod() { + return method; + } + + @XmlElement (name = "method", required = true) + public void setMethod(String method) { + this.method = method; + } +} diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/PermissionConfiguration.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/PermissionConfiguration.java new file mode 100644 index 0000000000..22a416873a --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/filter/PermissionConfiguration.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015, 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.apimgt.application.extension.api.filter; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +/** + * This class represents the information related to permission configuration. + */ +@XmlRootElement (name = "PermissionConfiguration") +public class PermissionConfiguration { + + private List permissions; + + public List getPermissions() { + return permissions; + } + + @XmlElement (name = "Permission", required = true) + public void setPermissions(List permissions) { + this.permissions = permissions; + } +} diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java index b15bcd1944..299ff01c3d 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/java/org/wso2/carbon/apimgt/application/extension/api/util/APIUtil.java @@ -22,6 +22,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.apimgt.application.extension.APIManagementProviderService; import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.user.core.service.RealmService; /** * This class provides utility functions used by REST-API. @@ -57,4 +58,16 @@ public class APIUtil { } return apiManagementProviderService; } + + public static RealmService getRealmService() { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + RealmService realmService = + (RealmService) ctx.getOSGiService(RealmService.class, null); + if (realmService == null) { + String msg = "Device Management service has not initialized."; + log.error(msg); + throw new IllegalStateException(msg); + } + return realmService; + } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/META-INF/permissions.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/META-INF/permissions.xml index 213141cc67..1feabf3925 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/META-INF/permissions.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/META-INF/permissions.xml @@ -30,21 +30,21 @@ Register tenant specific application - /device-mgt + /device-mgt/admin /register/tenants/* POST super_admin_user Register application - /device-mgt/api/application/add + /device-mgt/user/api/application /register POST application_user Delete application - /device-mgt/api/application/remove + /device-mgt/user/api/application /unregister DELETE application_user diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/WEB-INF/web.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/WEB-INF/web.xml index 7aaaf3002d..549bf4c1bd 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/WEB-INF/web.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/src/main/webapp/WEB-INF/web.xml @@ -49,4 +49,14 @@ managed-api-enabled false + + + ApiPermissionFilter + org.wso2.carbon.apimgt.application.extension.api.filter.ApiPermissionFilter + + + ApiPermissionFilter + /* + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/init.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/init.js index 9474dd2697..8d2b0c197f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/init.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/modules/init.js @@ -29,6 +29,6 @@ var utility = require("/app/modules/utility.js")["utility"]; var permissions = { '/permission/admin/device-mgt/user': ['ui.execute'], - '/permission/admin/device-mgt/api/application': ['ui.execute'] + '/permission/admin/manage/api/subscribe': ['ui.execute'] }; userModule.addRole("internal/devicemgt-user", ["admin"], permissions); From 7eb111078a23f372fe25b59911dffffe1981aa40 Mon Sep 17 00:00:00 2001 From: charitha Date: Thu, 19 May 2016 00:07:40 +0530 Subject: [PATCH 2/3] Fix for https://wso2.org/jira/browse/IOTS-110 MT issue --- .../core/RegistryBasedResourceLoader.java | 8 +- ...EmailSenderAxis2ConfigContextObserver.java | 61 +------------ .../internal/EmailSenderServiceComponent.java | 73 +--------------- .../sender/core/internal/EmailUtils.java | 87 +++++++++++++++++++ 4 files changed, 94 insertions(+), 135 deletions(-) create mode 100644 components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailUtils.java diff --git a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/RegistryBasedResourceLoader.java b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/RegistryBasedResourceLoader.java index 7ba350e07c..8b12607fc6 100644 --- a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/RegistryBasedResourceLoader.java +++ b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/RegistryBasedResourceLoader.java @@ -27,7 +27,7 @@ import org.wso2.carbon.context.RegistryType; import org.wso2.carbon.registry.api.Registry; import org.wso2.carbon.registry.api.RegistryException; -import java.io.*; +import java.io.InputStream; public class RegistryBasedResourceLoader extends ResourceLoader { @@ -46,12 +46,12 @@ public class RegistryBasedResourceLoader extends ResourceLoader { if (registry == null) { throw new IllegalStateException("No valid registry instance is attached to the current carbon context"); } - if (!registry.resourceExists(EMAIL_CONFIG_BASE_LOCATION + "/" + name + ".vm")) { + if (!registry.resourceExists(EMAIL_CONFIG_BASE_LOCATION + "/" + name)) { throw new ResourceNotFoundException("Resource '" + name + "' does not exist"); } org.wso2.carbon.registry.api.Resource resource = - registry.get(EMAIL_CONFIG_BASE_LOCATION + "/" + name + ".vm"); - + registry.get(EMAIL_CONFIG_BASE_LOCATION + "/" + name); + resource.setMediaType("text/plain"); return resource.getContentStream(); } catch (RegistryException e) { throw new ResourceNotFoundException("Error occurred while retrieving resource", e); diff --git a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderAxis2ConfigContextObserver.java b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderAxis2ConfigContextObserver.java index 4bd0cc5cca..0a4cea270c 100644 --- a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderAxis2ConfigContextObserver.java +++ b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderAxis2ConfigContextObserver.java @@ -21,22 +21,11 @@ package org.wso2.carbon.email.sender.core.internal; import org.apache.axis2.context.ConfigurationContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.context.CarbonContext; -import org.wso2.carbon.context.RegistryType; import org.wso2.carbon.email.sender.core.EmailSenderConfigurationFailedException; -import org.wso2.carbon.registry.api.Collection; -import org.wso2.carbon.registry.api.Registry; -import org.wso2.carbon.registry.api.RegistryException; -import org.wso2.carbon.registry.api.Resource; import org.wso2.carbon.utils.Axis2ConfigurationContextObserver; -import org.wso2.carbon.utils.CarbonUtils; -import java.io.File; -import java.io.FilenameFilter; +class EmailSenderAxis2ConfigContextObserver implements Axis2ConfigurationContextObserver { -public class EmailSenderAxis2ConfigContextObserver implements Axis2ConfigurationContextObserver { - - private static final String EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH = "email-templates"; private static final Log log = LogFactory.getLog(EmailSenderAxis2ConfigContextObserver.class); @Override @@ -47,7 +36,7 @@ public class EmailSenderAxis2ConfigContextObserver implements Axis2Configuration @Override public void createdConfigurationContext(ConfigurationContext configurationContext) { try { - this.setupEmailTemplates(); + EmailUtils.setupEmailTemplates(); } catch (EmailSenderConfigurationFailedException e) { log.error("Error occurred while setting up email templates", e); } @@ -63,50 +52,4 @@ public class EmailSenderAxis2ConfigContextObserver implements Axis2Configuration } - private void setupEmailTemplates() throws EmailSenderConfigurationFailedException { - File templateDir = - new File(CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator + "resources" - + File.separator + "email-templates"); - if (!templateDir.exists()) { - if (log.isDebugEnabled()) { - log.debug("The directory that is expected to use as the container for all email templates is not " + - "available. Therefore, no template is uploaded to the registry"); - } - } - if (templateDir.canRead()) { - File[] templates = templateDir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - name = name.toLowerCase(); - return name.endsWith(".vm"); - } - }); - try { - Registry registry = - CarbonContext.getThreadLocalCarbonContext().getRegistry(RegistryType.SYSTEM_CONFIGURATION); - if (!registry.resourceExists(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH)) { - Collection collection = registry.newCollection(); - registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH, collection); - for (File template : templates) { - Resource resource = registry.newResource(); - resource.setContent(template); - registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource); - } - } else { - for (File template : templates) { - if (!registry.resourceExists( - EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName())) { - Resource resource = registry.newResource(); - resource.setContent(template); - registry.put( - EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource); - } - } - } - } catch (RegistryException e) { - throw new EmailSenderConfigurationFailedException("Error occurred while setting up email templates", e); - } - } - } - } diff --git a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderServiceComponent.java b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderServiceComponent.java index 38b8e451dd..3d4e3933ed 100644 --- a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderServiceComponent.java +++ b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailSenderServiceComponent.java @@ -17,28 +17,16 @@ */ package org.wso2.carbon.email.sender.core.internal; -import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.osgi.service.component.ComponentContext; import org.wso2.carbon.email.sender.core.EmailSenderConfig; -import org.wso2.carbon.email.sender.core.EmailSenderConfigurationFailedException; import org.wso2.carbon.email.sender.core.service.EmailSenderService; import org.wso2.carbon.email.sender.core.service.EmailSenderServiceImpl; -import org.wso2.carbon.registry.api.Collection; -import org.wso2.carbon.registry.api.Registry; -import org.wso2.carbon.registry.api.RegistryException; -import org.wso2.carbon.registry.api.Resource; import org.wso2.carbon.registry.core.service.RegistryService; import org.wso2.carbon.utils.Axis2ConfigurationContextObserver; -import org.wso2.carbon.utils.CarbonUtils; import org.wso2.carbon.utils.ConfigurationContextService; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FilenameFilter; -import java.io.IOException; - /** * @scr.component name="org.wso2.carbon.email.sender.EmailSenderServiceComponent" immediate="true" * @scr.reference name="registry.service" @@ -56,7 +44,6 @@ import java.io.IOException; */ public class EmailSenderServiceComponent { - private static final String EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH = "/email-templates"; private static Log log = LogFactory.getLog(EmailSenderServiceComponent.class); @SuppressWarnings("unused") @@ -69,7 +56,7 @@ public class EmailSenderServiceComponent { EmailSenderConfig.init(); /* Setting up default email templates */ - this.setupEmailTemplates(); + EmailUtils.setupEmailTemplates(); /* Registering declarative service instances exposed by EmailSenderServiceComponent */ this.registerServices(componentContext); @@ -98,64 +85,6 @@ public class EmailSenderServiceComponent { componentContext.getBundleContext().registerService(EmailSenderService.class, emailServiceProvider, null); } - private void setupEmailTemplates() throws EmailSenderConfigurationFailedException { - File templateDir = - new File(CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator + - "resources" + File.separator + "email-templates"); - if (!templateDir.exists()) { - if (log.isDebugEnabled()) { - log.debug("The directory that is expected to use as the container for all email templates is not " + - "available. Therefore, no template is uploaded to the registry"); - } - } - if (templateDir.canRead()) { - File[] templates = templateDir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - name = name.toLowerCase(); - return name.endsWith(".vm"); - } - }); - try { - Registry registry = - EmailSenderDataHolder.getInstance().getRegistryService().getConfigSystemRegistry(); - if (!registry.resourceExists(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH)) { - Collection collection = registry.newCollection(); - registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH, collection); - for (File template : templates) { - Resource resource = registry.newResource(); - String contents = FileUtils.readFileToString(template); - resource.setContent(contents.getBytes()); - registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource); - } - } else { - /* Existence of a given resource is not checked consciously, before performing registry.put() below. - * The rationale is that, the only less expensive way that one can check if a resource exists is - * that through registry.resourceExists(), which only checks if 'some' resource exists at the given - * registry path. However, this does not capture scenarios where there can be updated contents to - * the same resource of which the path hasn't changed after it has been initialized for the first - * time. Therefore, whenever the server starts-up, all email templates are updated just to avoid - * the aforementioned problem */ - for (File template : templates) { - Resource resource = registry.newResource(); - String contents = FileUtils.readFileToString(template); - resource.setContent(contents.getBytes()); - registry.put( - EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource); - } - } - } catch (RegistryException e) { - throw new EmailSenderConfigurationFailedException("Error occurred while setting up email templates", e); - } catch (FileNotFoundException e) { - throw new EmailSenderConfigurationFailedException("Error occurred while writing template file " + - "contents as an input stream of a resource", e); - } catch (IOException e) { - throw new EmailSenderConfigurationFailedException("Error occurred while serializing file " + - "contents to a string", e); - } - } - } - /** * Sets Registry Service. * diff --git a/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailUtils.java b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailUtils.java new file mode 100644 index 0000000000..8088d95503 --- /dev/null +++ b/components/email-sender/org.wso2.carbon.email.sender.core/src/main/java/org/wso2/carbon/email/sender/core/internal/EmailUtils.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2014, 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.email.sender.core.internal; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.email.sender.core.EmailSenderConfigurationFailedException; +import org.wso2.carbon.registry.api.Collection; +import org.wso2.carbon.registry.api.Registry; +import org.wso2.carbon.registry.api.RegistryException; +import org.wso2.carbon.registry.api.Resource; +import org.wso2.carbon.utils.CarbonUtils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FilenameFilter; +import java.io.IOException; + +class EmailUtils { + + private static final String EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH = "/email-templates"; + private static Log log = LogFactory.getLog(EmailSenderServiceComponent.class); + + static void setupEmailTemplates() throws EmailSenderConfigurationFailedException { + File templateDir = + new File(CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator + + "resources" + File.separator + "email-templates"); + if (!templateDir.exists()) { + if (log.isDebugEnabled()) { + log.debug("The directory that is expected to use as the container for all email templates is not " + + "available. Therefore, no template is uploaded to the registry"); + } + } + if (templateDir.canRead()) { + File[] templates = templateDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + name = name.toLowerCase(); + return name.endsWith(".vm"); + } + }); + try { + int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); + Registry registry = + EmailSenderDataHolder.getInstance().getRegistryService().getConfigSystemRegistry(tenantId); + if (!registry.resourceExists(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH)) { + Collection collection = registry.newCollection(); + registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH, collection); + for (File template : templates) { + Resource resource = registry.newResource(); + resource.setMediaType("text/plain"); + String contents = FileUtils.readFileToString(template); + resource.setContent(contents); + registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + + template.getName().replace(".vm", ""), resource); + } + } + } catch (RegistryException e) { + throw new EmailSenderConfigurationFailedException("Error occurred while setting up email templates", e); + } catch (FileNotFoundException e) { + throw new EmailSenderConfigurationFailedException("Error occurred while writing template file " + + "contents as an input stream of a resource", e); + } catch (IOException e) { + throw new EmailSenderConfigurationFailedException("Error occurred while serializing file " + + "contents to a string", e); + } + } + } + +} From a375252a944c37c8d88873876f716a9efbc6a7bb Mon Sep 17 00:00:00 2001 From: prabathabey Date: Thu, 19 May 2016 00:20:45 +0530 Subject: [PATCH 3/3] Adding pluggable push notification framework --- .../pom.xml | 147 +++++++++ .../gcm/GCMBasedPushNotificationProvider.java | 39 +++ .../provider/gcm/GCMNotificationStrategy.java | 134 +++++++++ .../provider/gcm/internal/GCMDataHolder.java | 40 +++ .../GCMPushNotificationServiceComponent.java | 70 +++++ .../pom.xml | 148 +++++++++ .../MQTTBasedPushNotificationProvider.java | 37 +++ .../mqtt/MQTTNotificationStrategy.java | 85 ++++++ .../MQTTPushNotificationStrategyUtil.java | 46 +++ .../mqtt/internal/MQTTDataHolder.java | 50 ++++ .../MQTTPushNotificationServiceComponent.java | 83 ++++++ .../internal/util/MQTTAdapterConstants.java | 37 +++ .../pom.xml | 144 +++++++++ .../XMPPBasedPushNotificationProvider.java | 37 +++ .../xmpp/XMPPNotificationStrategy.java | 42 +++ .../xmpp/internal/XMPPDataHolder.java | 40 +++ .../XMPPPushNotificationServiceComponent.java | 70 +++++ components/device-mgt-extensions/pom.xml | 42 +++ .../mgt/jaxrs/api/impl/OperationImpl.java | 9 +- .../notification/NotificationContext.java | 55 ++++ .../notification/NotificationStrategy.java | 29 ++ .../notification/PushNotificationConfig.java | 16 +- ...hNotificationExecutionFailedException.java | 45 +++ .../PushNotificationProvider.java | 27 ++ .../org.wso2.carbon.device.mgt.core/pom.xml | 1 + ...ApplicationManagerProviderServiceImpl.java | 72 ++--- .../core/config/DeviceManagementConfig.java | 22 +- .../internal/DeviceManagementDataHolder.java | 11 + .../DeviceManagementServiceComponent.java | 19 +- .../operation/mgt/OperationManagerImpl.java | 281 ++++++++++-------- .../mgt/OperationManagerRepository.java | 46 +++ ...PushNotificationBasedOperationManager.java | 120 ++++++++ .../mgt/PushNotificationConfigRepository.java | 43 +++ ...icationEnabledDeviceManagementService.java | 31 ++ .../mgt/PushNotificationProviderFactory.java | 36 +++ .../PushNotificationProviderRepository.java | 60 ++++ ...rtedPushNotificationProviderException.java | 45 +++ .../DeviceManagementProviderService.java | 34 ++- .../DeviceManagementProviderServiceImpl.java | 78 +++-- .../core/task/impl/DeviceTaskManagerImpl.java | 8 +- .../pom.xml | 21 +- .../mgt/core/PolicyManagerServiceImpl.java | 8 +- .../impl/ComplianceDecisionPointImpl.java | 8 +- .../core/mgt/impl/MonitoringManagerImpl.java | 7 +- .../pom.xml | 106 +++++++ .../src/main/resources/build.properties | 1 + .../src/main/resources/p2.inf | 1 + .../pom.xml | 106 +++++++ .../src/main/resources/build.properties | 1 + .../src/main/resources/p2.inf | 1 + .../pom.xml | 106 +++++++ .../src/main/resources/build.properties | 1 + .../src/main/resources/p2.inf | 1 + features/device-mgt-extensions/pom.xml | 41 +++ .../src/main/resources/conf/cdm-config.xml | 4 + pom.xml | 31 +- 56 files changed, 2606 insertions(+), 217 deletions(-) create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/pom.xml create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMBasedPushNotificationProvider.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMNotificationStrategy.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/internal/GCMDataHolder.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/internal/GCMPushNotificationServiceComponent.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/pom.xml create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTBasedPushNotificationProvider.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTNotificationStrategy.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTPushNotificationStrategyUtil.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/MQTTDataHolder.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/MQTTPushNotificationServiceComponent.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/util/MQTTAdapterConstants.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/pom.xml create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/XMPPBasedPushNotificationProvider.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/XMPPNotificationStrategy.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/internal/XMPPDataHolder.java create mode 100644 components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/internal/XMPPPushNotificationServiceComponent.java create mode 100644 components/device-mgt-extensions/pom.xml create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/NotificationContext.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/NotificationStrategy.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationExecutionFailedException.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationProvider.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerRepository.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationBasedOperationManager.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationConfigRepository.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationEnabledDeviceManagementService.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationProviderFactory.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationProviderRepository.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/UnsupportedPushNotificationProviderException.java create mode 100644 features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/pom.xml create mode 100644 features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/src/main/resources/build.properties create mode 100644 features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/src/main/resources/p2.inf create mode 100644 features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/pom.xml create mode 100644 features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/src/main/resources/build.properties create mode 100644 features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/src/main/resources/p2.inf create mode 100644 features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/pom.xml create mode 100644 features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/src/main/resources/build.properties create mode 100644 features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/src/main/resources/p2.inf create mode 100644 features/device-mgt-extensions/pom.xml diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/pom.xml b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/pom.xml new file mode 100644 index 0000000000..a15fcce6ef --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/pom.xml @@ -0,0 +1,147 @@ + + + + + + + device-mgt-extensions + org.wso2.carbon.devicemgt + 1.1.0-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm + bundle + WSO2 Carbon - GCM Based Push Notification Provider Implementation + WSO2 Carbon - GCM Based Push Notification Provider Implementation + http://wso2.org + + + + org.wso2.carbon.governance + org.wso2.carbon.governance.api + + + org.wso2.carbon + org.wso2.carbon.registry.api + + + org.wso2.carbon + org.wso2.carbon.registry.core + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.common + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.core + + + org.apache.ws.commons.axiom + axiom-api + + + org.wso2.carbon + org.wso2.carbon.utils + + + org.wso2.orbit.org.scannotation + scannotation + + + org.eclipse.osgi + org.eclipse.osgi + + + org.eclipse.osgi + org.eclipse.osgi.services + + + org.wso2.tomcat + tomcat + + + org.wso2.tomcat + tomcat-servlet-api + + + javax.ws.rs + jsr311-api + + + org.apache.axis2.wso2 + axis2 + + + commons-lang.wso2 + commons-lang + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + provided + + + com.google.code.gson + gson + + + org.json.wso2 + json + + + org.wso2.carbon.analytics-common + org.wso2.carbon.event.output.adapter.core + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.artifactId} + ${project.artifactId} + ${carbon.device.mgt.version} + GCM Based Push Notification Provider Bundle + + !org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.internal, + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.* + + + com.google.gson, + org.osgi.service.component, + org.wso2.carbon.device.mgt.common.operation.mgt, + org.wso2.carbon.device.mgt.common.push.notification, + org.apache.commons.logging, + org.wso2.carbon.device.mgt.common, + org.wso2.carbon.device.mgt.core.service + + + + + + + + diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMBasedPushNotificationProvider.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMBasedPushNotificationProvider.java new file mode 100644 index 0000000000..5168e25e25 --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMBasedPushNotificationProvider.java @@ -0,0 +1,39 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.gcm; + +import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationProvider; + +public class GCMBasedPushNotificationProvider implements PushNotificationProvider { + + private static final String PS_PROVIDER_GCM = "GCM"; + + @Override + public String getType() { + return PS_PROVIDER_GCM; + } + + @Override + public NotificationStrategy getNotificationStrategy(PushNotificationConfig config) { + return new GCMNotificationStrategy(config); + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMNotificationStrategy.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMNotificationStrategy.java new file mode 100644 index 0000000000..65738e4ee1 --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/GCMNotificationStrategy.java @@ -0,0 +1,134 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.gcm; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.push.notification.NotificationContext; +import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationExecutionFailedException; +import org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.internal.GCMDataHolder; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; + +public class GCMNotificationStrategy implements NotificationStrategy { + + private static final String GCM_TOKEN = "GCM_TOKEN"; + private final static String GCM_ENDPOINT = "https://gcm-http.googleapis.com/gcm/send"; + private static final String GCM_API_KEY = "gcmAPIKey"; + private static final int TIME_TO_LIVE = 60; + private static final int HTTP_STATUS_CODE_OK = 200; + private PushNotificationConfig config; + + public GCMNotificationStrategy(PushNotificationConfig config) { + this.config = config; + } + + @Override + public void init() { + + } + + @Override + public void execute(NotificationContext ctx) throws PushNotificationExecutionFailedException { + try { + Device device = + GCMDataHolder.getInstance().getDeviceManagementProviderService().getDevice(ctx.getDeviceId()); + this.sendWakeUpCall(ctx.getOperation().getCode(), device); + } catch (DeviceManagementException e) { + throw new PushNotificationExecutionFailedException("Error occurred while retrieving device information", e); + } catch (IOException e) { + throw new PushNotificationExecutionFailedException("Error occurred while sending push notification", e); + } + } + + @Override + public NotificationContext buildContext() { + return null; + } + + private void sendWakeUpCall(String message, + Device device) throws IOException, PushNotificationExecutionFailedException { + OutputStream os = null; + byte[] bytes = getGCMRequest(message, getGCMToken(device.getProperties())).getBytes(); + + HttpURLConnection conn = null; + try { + conn = (HttpURLConnection) (new URL(config.getProperty(GCM_ENDPOINT)).openConnection()); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setFixedLengthStreamingMode(bytes.length); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Authorization", "key=" + config.getProperty(GCM_API_KEY)); + + os = conn.getOutputStream(); + os.write(bytes); + } finally { + if (os != null) { + os.close(); + } + } + int status = conn.getResponseCode(); + if (status != HTTP_STATUS_CODE_OK) { + throw new PushNotificationExecutionFailedException("Push notification sending failed with the HTTP " + + "error code '" + status + "'"); + } + } + + private static String getGCMRequest(String message, String registrationId) { + JsonObject gcmRequest = new JsonObject(); + gcmRequest.addProperty("delay_while_idle", false); + gcmRequest.addProperty("time_to_live", TIME_TO_LIVE); + + //Add message to GCM request + JsonObject data = new JsonObject(); + if (message != null && !message.isEmpty()) { + data.addProperty("data", message); + gcmRequest.add("data", data); + } + + //Set device reg-id + JsonArray regIds = new JsonArray(); + regIds.add(new JsonPrimitive(registrationId)); + + gcmRequest.add("registration_ids", regIds); + return gcmRequest.toString(); + } + + private static String getGCMToken(List properties) { + String gcmToken = null; + for (Device.Property property : properties) { + if (GCM_TOKEN.equals(property.getName())) { + gcmToken = property.getValue(); + break; + } + } + return gcmToken; + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/internal/GCMDataHolder.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/internal/GCMDataHolder.java new file mode 100644 index 0000000000..67b44109af --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/internal/GCMDataHolder.java @@ -0,0 +1,40 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.gcm.internal; + +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; + +public class GCMDataHolder { + + private DeviceManagementProviderService deviceManagementProviderService; + private static GCMDataHolder thisInstance = new GCMDataHolder(); + + public static GCMDataHolder getInstance() { + return thisInstance; + } + + public DeviceManagementProviderService getDeviceManagementProviderService() { + return deviceManagementProviderService; + } + + public void setDeviceManagementProviderService(DeviceManagementProviderService deviceManagementProviderService) { + this.deviceManagementProviderService = deviceManagementProviderService; + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/internal/GCMPushNotificationServiceComponent.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/internal/GCMPushNotificationServiceComponent.java new file mode 100644 index 0000000000..6e5171ec4b --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/gcm/internal/GCMPushNotificationServiceComponent.java @@ -0,0 +1,70 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.gcm.internal; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.osgi.service.component.ComponentContext; +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; + +/** + * @scr.component name="org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.internal.GCMPushNotificationServiceComponent" immediate="true" + * @scr.reference name="carbon.device.mgt.provider" + * interface="org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService" + * cardinality="1..1" + * policy="dynamic" + * bind="setDeviceManagementProviderService" + * unbind="unsetDeviceManagementProviderService" + */ +public class GCMPushNotificationServiceComponent { + + private static final Log log = LogFactory.getLog(GCMPushNotificationServiceComponent.class); + + @SuppressWarnings("unused") + protected void activate(ComponentContext componentContext) { + try { + if (log.isDebugEnabled()) { + log.debug("Initializing GCM based push notification provider implementation bundle"); + } + //Do nothing + if (log.isDebugEnabled()) { + log.debug("GCM based push notification provider implementation bundle has been successfully " + + "initialized"); + } + } catch (Throwable e) { + log.error("Error occurred while initializing GCM based push notification provider " + + "implementation bundle", e); + } + } + + protected void deactivate(ComponentContext componentContext) { + //Do nothing + } + + protected void setDeviceManagementProviderService( + DeviceManagementProviderService deviceManagementProviderService) { + GCMDataHolder.getInstance().setDeviceManagementProviderService(deviceManagementProviderService); + } + + protected void unsetDeviceManagementProviderService( + DeviceManagementProviderService deviceManagementProviderService) { + GCMDataHolder.getInstance().setDeviceManagementProviderService(deviceManagementProviderService); + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/pom.xml b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/pom.xml new file mode 100644 index 0000000000..d06f9e6417 --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/pom.xml @@ -0,0 +1,148 @@ + + + + + + + device-mgt-extensions + org.wso2.carbon.devicemgt + 1.1.0-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt + bundle + WSO2 Carbon - MQTT Based Push Notification Provider Implementation + WSO2 Carbon - MQTT Based Push Notification Provider Implementation + http://wso2.org + + + + org.wso2.carbon.governance + org.wso2.carbon.governance.api + + + org.wso2.carbon + org.wso2.carbon.registry.api + + + org.wso2.carbon + org.wso2.carbon.registry.core + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.common + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.core + + + org.apache.ws.commons.axiom + axiom-api + + + org.wso2.carbon + org.wso2.carbon.utils + + + org.wso2.orbit.org.scannotation + scannotation + + + org.eclipse.osgi + org.eclipse.osgi + + + org.eclipse.osgi + org.eclipse.osgi.services + + + org.wso2.tomcat + tomcat + + + org.wso2.tomcat + tomcat-servlet-api + + + javax.ws.rs + jsr311-api + + + org.apache.axis2.wso2 + axis2 + + + commons-lang.wso2 + commons-lang + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + provided + + + com.google.code.gson + gson + + + org.json.wso2 + json + + + org.wso2.carbon.analytics-common + org.wso2.carbon.event.output.adapter.core + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.artifactId} + ${project.artifactId} + ${carbon.device.mgt.version} + MQTT Based Push Notification Provider Bundle + + !org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.internal, + org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.* + + + org.apache.commons.logging, + org.osgi.service.component, + org.wso2.carbon.context, + org.wso2.carbon.device.mgt.common.operation.mgt, + org.wso2.carbon.device.mgt.common.push.notification, + org.wso2.carbon.device.mgt.core.service, + org.wso2.carbon.event.output.adapter.core, + org.wso2.carbon.event.output.adapter.core.exception + + + + + + + + diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTBasedPushNotificationProvider.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTBasedPushNotificationProvider.java new file mode 100644 index 0000000000..c4f645b255 --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTBasedPushNotificationProvider.java @@ -0,0 +1,37 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.mqtt; + +import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationProvider; + +public class MQTTBasedPushNotificationProvider implements PushNotificationProvider { + + @Override + public String getType() { + return "MQTT"; + } + + @Override + public NotificationStrategy getNotificationStrategy(PushNotificationConfig config) { + return new MQTTNotificationStrategy(config); + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTNotificationStrategy.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTNotificationStrategy.java new file mode 100644 index 0000000000..849b481208 --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTNotificationStrategy.java @@ -0,0 +1,85 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.mqtt; + +import org.wso2.carbon.device.mgt.common.push.notification.NotificationContext; +import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationExecutionFailedException; +import org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.internal.MQTTDataHolder; +import org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.internal.util.MQTTAdapterConstants; +import org.wso2.carbon.event.output.adapter.core.MessageType; +import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterConfiguration; +import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterException; + +import java.util.HashMap; +import java.util.Map; + +public class MQTTNotificationStrategy implements NotificationStrategy { + + private static final String MQTT_ADAPTER_PROPERTY_NAME = "mqtt.adapter.name"; + private static final String MQTT_ADAPTER_TOPIC = "mqtt.adapter.topic"; + private static final String MQTT_ADAPTER_NAME = "mqtt.push.notification.publisher"; + + public MQTTNotificationStrategy(PushNotificationConfig config) { + OutputEventAdapterConfiguration adapterConfig = new OutputEventAdapterConfiguration(); + adapterConfig.setType(MQTTAdapterConstants.MQTT_ADAPTER_TYPE); + adapterConfig.setName(MQTT_ADAPTER_NAME); + adapterConfig.setMessageFormat(MessageType.JSON); + + Map configProperties = new HashMap(); + configProperties.put(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_BROKER_URL, + config.getProperty(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_BROKER_URL)); + configProperties.put(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_USERNAME, + config.getProperty(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_USERNAME)); + configProperties.put(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_DCR_URL, + config.getProperty(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_DCR_URL)); + configProperties.put(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_CLEAR_SESSION, + config.getProperty(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_CLEAR_SESSION)); + configProperties.put(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_SCOPES, + config.getProperty(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_SCOPES)); + configProperties.put(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_MESSAGE_QOS, + config.getProperty(MQTTAdapterConstants.MQTT_ADAPTER_PROPERTY_MESSAGE_QOS)); + adapterConfig.setStaticProperties(configProperties); + try { + MQTTDataHolder.getInstance().getOutputEventAdapterService().create(adapterConfig); + } catch (OutputEventAdapterException e) { + throw new RuntimeException("Error occurred while initializing MQTT output event adapter", e); + } + } + + @Override + public void init() { + + } + + @Override + public void execute(NotificationContext ctx) throws PushNotificationExecutionFailedException { + Map dynamicProperties = ctx.getProperties(); + dynamicProperties.put("topic", (String) ctx.getOperation().getProperties().get(MQTT_ADAPTER_TOPIC)); + MQTTDataHolder.getInstance().getOutputEventAdapterService().publish(MQTT_ADAPTER_NAME, dynamicProperties, + ctx.getOperation().getPayLoad()); + } + + @Override + public NotificationContext buildContext() { + return null; + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTPushNotificationStrategyUtil.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTPushNotificationStrategyUtil.java new file mode 100644 index 0000000000..fe3d83f365 --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/MQTTPushNotificationStrategyUtil.java @@ -0,0 +1,46 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.mqtt; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterService; + +public class MQTTPushNotificationStrategyUtil { + + private static final Log log = LogFactory.getLog(MQTTPushNotificationStrategyUtil.class); + + public static String getAuthenticatedUser() { + CarbonContext carbonContext = CarbonContext.getThreadLocalCarbonContext(); + String username = carbonContext.getUsername(); + String tenantDomain = carbonContext.getTenantDomain(); + if (username.endsWith(tenantDomain)) { + return username.substring(0, username.lastIndexOf("@")); + } + return username; + } + + public static String getAuthenticatedUserTenantDomain() { + return CarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + } + + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/MQTTDataHolder.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/MQTTDataHolder.java new file mode 100644 index 0000000000..90d68f036a --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/MQTTDataHolder.java @@ -0,0 +1,50 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.mqtt.internal; + +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; +import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterService; + +public class MQTTDataHolder { + + private OutputEventAdapterService outputEventAdapterService; + private DeviceManagementProviderService deviceManagementProviderService; + private static MQTTDataHolder thisInstance = new MQTTDataHolder(); + + public static MQTTDataHolder getInstance() { + return thisInstance; + } + + public DeviceManagementProviderService getDeviceManagementProviderService() { + return deviceManagementProviderService; + } + + public void setDeviceManagementProviderService(DeviceManagementProviderService deviceManagementProviderService) { + this.deviceManagementProviderService = deviceManagementProviderService; + } + + public void setOutputEventAdapterService(OutputEventAdapterService outputEventAdapterService) { + this.outputEventAdapterService = outputEventAdapterService; + } + + public OutputEventAdapterService getOutputEventAdapterService() { + return outputEventAdapterService; + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/MQTTPushNotificationServiceComponent.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/MQTTPushNotificationServiceComponent.java new file mode 100644 index 0000000000..25fed275cd --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/MQTTPushNotificationServiceComponent.java @@ -0,0 +1,83 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.mqtt.internal; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.osgi.service.component.ComponentContext; +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; +import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterService; + +/** + * @scr.component name="org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.internal.MQTTPushNotificationServiceComponent" immediate="true" + * @scr.reference name="carbon.device.mgt.provider" + * interface="org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService" + * cardinality="1..1" + * policy="dynamic" + * bind="setDeviceManagementProviderService" + * unbind="unsetDeviceManagementProviderService" + * @scr.reference name="event.output.adapter.service" + * interface="org.wso2.carbon.event.output.adapter.core.OutputEventAdapterService" + * cardinality="1..1" policy="dynamic" bind="setOutputEventAdapterService" + * unbind="unsetOutputEventAdapterService" + */ +public class MQTTPushNotificationServiceComponent { + + private static final Log log = LogFactory.getLog(MQTTPushNotificationServiceComponent.class); + + @SuppressWarnings("unused") + protected void activate(ComponentContext componentContext) { + try { + if (log.isDebugEnabled()) { + log.debug("Initializing MQTT based push notification provider implementation bundle"); + } + //Do nothing + if (log.isDebugEnabled()) { + log.debug("MQTT based push notification provider implementation bundle has been successfully " + + "initialized"); + } + } catch (Throwable e) { + log.error("Error occurred while initializing MQTT based push notification provider " + + "implementation bundle", e); + } + } + + protected void deactivate(ComponentContext componentContext) { + //Do nothing + } + + protected void setDeviceManagementProviderService( + DeviceManagementProviderService deviceManagementProviderService) { + MQTTDataHolder.getInstance().setDeviceManagementProviderService(deviceManagementProviderService); + } + + protected void unsetDeviceManagementProviderService( + DeviceManagementProviderService deviceManagementProviderService) { + MQTTDataHolder.getInstance().setDeviceManagementProviderService(deviceManagementProviderService); + } + + protected void setOutputEventAdapterService(OutputEventAdapterService outputEventAdapterService){ + MQTTDataHolder.getInstance().setOutputEventAdapterService(outputEventAdapterService); + } + + protected void unsetOutputEventAdapterService(OutputEventAdapterService outputEventAdapterService){ + MQTTDataHolder.getInstance().setOutputEventAdapterService(null); + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/util/MQTTAdapterConstants.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/util/MQTTAdapterConstants.java new file mode 100644 index 0000000000..534afb3ab7 --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/mqtt/internal/util/MQTTAdapterConstants.java @@ -0,0 +1,37 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.mqtt.internal.util; + +public final class MQTTAdapterConstants { + + private MQTTAdapterConstants() { + throw new AssertionError(); + } + + public static final String MQTT_ADAPTER_TYPE = "oauth-mqtt"; + public static final String MQTT_ADAPTER_PROPERTY_BROKER_URL = "url"; + public static final String MQTT_ADAPTER_PROPERTY_USERNAME = "username"; + public static final String MQTT_ADAPTER_PROPERTY_DCR_URL = "dcrUrl"; + public static final String MQTT_ADAPTER_PROPERTY_SCOPES = "scopes"; + public static final String MQTT_ADAPTER_PROPERTY_PASSWORD = "password"; + public static final String MQTT_ADAPTER_PROPERTY_CLIENT_ID = "clientId"; + public static final String MQTT_ADAPTER_PROPERTY_CLEAR_SESSION = "cleanSession"; + public static final String MQTT_ADAPTER_PROPERTY_MESSAGE_QOS = "qos"; + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/pom.xml b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/pom.xml new file mode 100644 index 0000000000..8c16fa3a4b --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/pom.xml @@ -0,0 +1,144 @@ + + + + + + + device-mgt-extensions + org.wso2.carbon.devicemgt + 1.1.0-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp + bundle + WSO2 Carbon - XMPP Based Push Notification Provider Implementation + WSO2 Carbon - XMPP Based Push Notification Provider Implementation + http://wso2.org + + + + org.wso2.carbon.governance + org.wso2.carbon.governance.api + + + org.wso2.carbon + org.wso2.carbon.registry.api + + + org.wso2.carbon + org.wso2.carbon.registry.core + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.common + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.core + + + org.apache.ws.commons.axiom + axiom-api + + + org.wso2.carbon + org.wso2.carbon.utils + + + org.wso2.orbit.org.scannotation + scannotation + + + org.eclipse.osgi + org.eclipse.osgi + + + org.eclipse.osgi + org.eclipse.osgi.services + + + org.wso2.tomcat + tomcat + + + org.wso2.tomcat + tomcat-servlet-api + + + javax.ws.rs + jsr311-api + + + org.apache.axis2.wso2 + axis2 + + + commons-lang.wso2 + commons-lang + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + provided + + + com.google.code.gson + gson + + + org.json.wso2 + json + + + org.wso2.carbon.analytics-common + org.wso2.carbon.event.output.adapter.core + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.artifactId} + ${project.artifactId} + ${carbon.device.mgt.version} + XMPP Based Push Notification Provider Bundle + + !org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.internal, + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.* + + + org.apache.commons.logging, + org.osgi.service.component, + org.wso2.carbon.device.mgt.common.push.notification, + org.wso2.carbon.device.mgt.core.service + + + + + + + + diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/XMPPBasedPushNotificationProvider.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/XMPPBasedPushNotificationProvider.java new file mode 100644 index 0000000000..df3799408f --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/XMPPBasedPushNotificationProvider.java @@ -0,0 +1,37 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.xmpp; + +import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationProvider; + +public class XMPPBasedPushNotificationProvider implements PushNotificationProvider { + + @Override + public String getType() { + return "XMPP"; + } + + @Override + public NotificationStrategy getNotificationStrategy(PushNotificationConfig pushNotificationConfig) { + return null; + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/XMPPNotificationStrategy.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/XMPPNotificationStrategy.java new file mode 100644 index 0000000000..a8d460c7c2 --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/XMPPNotificationStrategy.java @@ -0,0 +1,42 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.xmpp; + +import org.wso2.carbon.device.mgt.common.push.notification.NotificationContext; +import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationExecutionFailedException; + +public class XMPPNotificationStrategy implements NotificationStrategy { + + @Override + public void init() { + + } + + @Override + public void execute(NotificationContext ctx) throws PushNotificationExecutionFailedException { + + } + + @Override + public NotificationContext buildContext() { + return null; + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/internal/XMPPDataHolder.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/internal/XMPPDataHolder.java new file mode 100644 index 0000000000..e9f38543a2 --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/internal/XMPPDataHolder.java @@ -0,0 +1,40 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.xmpp.internal; + +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; + +public class XMPPDataHolder { + + private DeviceManagementProviderService deviceManagementProviderService; + private static XMPPDataHolder thisInstance = new XMPPDataHolder(); + + public static XMPPDataHolder getInstance() { + return thisInstance; + } + + public DeviceManagementProviderService getDeviceManagementProviderService() { + return deviceManagementProviderService; + } + + public void setDeviceManagementProviderService(DeviceManagementProviderService deviceManagementProviderService) { + this.deviceManagementProviderService = deviceManagementProviderService; + } + +} diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/internal/XMPPPushNotificationServiceComponent.java b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/internal/XMPPPushNotificationServiceComponent.java new file mode 100644 index 0000000000..3cf153c09f --- /dev/null +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/src/main/java/org/wso2/carbon/device/mgt/extensions/push/notification/provider/xmpp/internal/XMPPPushNotificationServiceComponent.java @@ -0,0 +1,70 @@ +/* + * 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.device.mgt.extensions.push.notification.provider.xmpp.internal; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.osgi.service.component.ComponentContext; +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; + +/** + * @scr.component name="org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.internal.XMPPPushNotificationServiceComponent" immediate="true" + * @scr.reference name="carbon.device.mgt.provider" + * interface="org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService" + * cardinality="1..1" + * policy="dynamic" + * bind="setDeviceManagementProviderService" + * unbind="unsetDeviceManagementProviderService" + */ +public class XMPPPushNotificationServiceComponent { + + private static final Log log = LogFactory.getLog(XMPPPushNotificationServiceComponent.class); + + @SuppressWarnings("unused") + protected void activate(ComponentContext componentContext) { + try { + if (log.isDebugEnabled()) { + log.debug("Initializing XMPP based push notification provider implementation bundle"); + } + //Do nothing + if (log.isDebugEnabled()) { + log.debug("XMPP based push notification provider implementation bundle has been successfully " + + "initialized"); + } + } catch (Throwable e) { + log.error("Error occurred while initializing XMPP based push notification provider " + + "implementation bundle", e); + } + } + + protected void deactivate(ComponentContext componentContext) { + //Do nothing + } + + protected void setDeviceManagementProviderService( + DeviceManagementProviderService deviceManagementProviderService) { + XMPPDataHolder.getInstance().setDeviceManagementProviderService(deviceManagementProviderService); + } + + protected void unsetDeviceManagementProviderService( + DeviceManagementProviderService deviceManagementProviderService) { + XMPPDataHolder.getInstance().setDeviceManagementProviderService(deviceManagementProviderService); + } + +} diff --git a/components/device-mgt-extensions/pom.xml b/components/device-mgt-extensions/pom.xml new file mode 100644 index 0000000000..c1210f488a --- /dev/null +++ b/components/device-mgt-extensions/pom.xml @@ -0,0 +1,42 @@ + + + + + + + carbon-devicemgt + org.wso2.carbon.devicemgt + 1.1.0-SNAPSHOT + ../../pom.xml + + + 4.0.0 + device-mgt-extensions + pom + WSO2 Carbon - Device Management Extensions + WSO2 Carbon - Device Management Extensions + http://wso2.org + + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm + org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/OperationImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/OperationImpl.java index edd4fc1906..f4631514c9 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/OperationImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/impl/OperationImpl.java @@ -128,7 +128,14 @@ public class OperationImpl implements org.wso2.carbon.device.mgt.jaxrs.api.Opera ResponsePayload responseMsg = new ResponsePayload(); try { dmService = DeviceMgtAPIUtils.getDeviceManagementService(); - int operationId = dmService.addOperation(operationContext.getOperation(), operationContext.getDevices()); + + //TODO: Fix this properly later adding device type to be passed in when the task manage executes "addOperations()" + String type = null; + List deviceIdentifiers = operationContext.getDevices(); + if (deviceIdentifiers.size() > 0) { + type = deviceIdentifiers.get(0).getType(); + } + int operationId = dmService.addOperation(type, operationContext.getOperation(), operationContext.getDevices()); if (operationId > 0) { responseMsg.setStatusCode(HttpStatus.SC_CREATED); responseMsg.setMessageFromServer("Operation has added successfully."); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/NotificationContext.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/NotificationContext.java new file mode 100644 index 0000000000..546e4fcf29 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/NotificationContext.java @@ -0,0 +1,55 @@ +/* + * 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.device.mgt.common.push.notification; + +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; + +import java.util.Map; + +public class NotificationContext { + + private DeviceIdentifier deviceId; + + private Operation operation; + + private Map properties; + + public NotificationContext(DeviceIdentifier deviceId) { + this.deviceId = deviceId; + } + + public NotificationContext(DeviceIdentifier deviceId, Operation operation) { + this.deviceId = deviceId; + this.operation = operation; + } + + public DeviceIdentifier getDeviceId() { + return deviceId; + } + + public Map getProperties() { + return properties; + } + + public Operation getOperation() { + return operation; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/NotificationStrategy.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/NotificationStrategy.java new file mode 100644 index 0000000000..137c87034b --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/NotificationStrategy.java @@ -0,0 +1,29 @@ +/* + * 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.device.mgt.common.push.notification; + +public interface NotificationStrategy { + + void init(); + + void execute(NotificationContext ctx) throws PushNotificationExecutionFailedException; + + NotificationContext buildContext(); + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationConfig.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationConfig.java index 8bced1717e..56cb65648e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationConfig.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationConfig.java @@ -18,24 +18,32 @@ */ package org.wso2.carbon.device.mgt.common.push.notification; -import java.util.Set; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Map; +@XmlRootElement(name = "PushNotificationProviderConfiguration") public class PushNotificationConfig { private String type; - private Set properties; + Map properties; - public PushNotificationConfig(String type, Set properties) { + public PushNotificationConfig(String type, Map properties) { this.type = type; this.properties = properties; } + @XmlElement(name = "Type", required = true) public String getType() { return type; } - public Set getProperties() { + public Map getProperties() { return properties; } + public String getProperty(String name) { + return properties.get(name); + } + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationExecutionFailedException.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationExecutionFailedException.java new file mode 100644 index 0000000000..83f726e09b --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationExecutionFailedException.java @@ -0,0 +1,45 @@ +/* + * 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.device.mgt.common.push.notification; + +public class PushNotificationExecutionFailedException extends Exception { + + private static final long serialVersionUID = -3151279311923070297L; + + public PushNotificationExecutionFailedException(String msg, Exception nestedEx) { + super(msg, nestedEx); + } + + public PushNotificationExecutionFailedException(String message, Throwable cause) { + super(message, cause); + } + + public PushNotificationExecutionFailedException(String msg) { + super(msg); + } + + public PushNotificationExecutionFailedException() { + super(); + } + + public PushNotificationExecutionFailedException(Throwable cause) { + super(cause); + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationProvider.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationProvider.java new file mode 100644 index 0000000000..c406670453 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/push/notification/PushNotificationProvider.java @@ -0,0 +1,27 @@ +/* + * 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.device.mgt.common.push.notification; + +public interface PushNotificationProvider { + + String getType(); + + NotificationStrategy getNotificationStrategy(PushNotificationConfig config); + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml index 7e36265173..4ce3faf47b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml @@ -91,6 +91,7 @@ !org.wso2.carbon.device.mgt.core.internal, org.wso2.carbon.device.mgt.core.* + * diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/app/mgt/ApplicationManagerProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/app/mgt/ApplicationManagerProviderServiceImpl.java index a19f7c3f6a..2df1177d20 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/app/mgt/ApplicationManagerProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/app/mgt/ApplicationManagerProviderServiceImpl.java @@ -80,13 +80,13 @@ public class ApplicationManagerProviderServiceImpl implements ApplicationManagem @Override public void updateApplicationStatus(DeviceIdentifier deviceId, Application application, - String status) throws ApplicationManagementException { + String status) throws ApplicationManagementException { } @Override public String getApplicationStatus(DeviceIdentifier deviceId, - Application application) throws ApplicationManagementException { + Application application) throws ApplicationManagementException { return null; } @@ -94,17 +94,19 @@ public class ApplicationManagerProviderServiceImpl implements ApplicationManagem public void installApplicationForDevices(Operation operation, List deviceIds) throws ApplicationManagementException { try { - DeviceManagementDataHolder.getInstance().getDeviceManagementProvider().addOperation(operation, deviceIds); + //TODO: Fix this properly later adding device type to be passed in when the task manage executes "addOperations()" + String type = null; + if (deviceIds.size() > 0) { + type = deviceIds.get(0).getType(); + } + DeviceManagementDataHolder.getInstance().getDeviceManagementProvider().addOperation(type, operation, + deviceIds); DeviceManagementDataHolder.getInstance().getDeviceManagementProvider().notifyOperationToDevices (operation, deviceIds); - } catch (OperationManagementException opeEx) { - String errorMsg = "Error in add operation at app installation:" + opeEx.getErrorMessage(); - log.error(errorMsg, opeEx); - throw new ApplicationManagementException(errorMsg, opeEx); - }catch (DeviceManagementException deviceEx){ - String errorMsg = "Error in notify operation at app installation:" + deviceEx.getErrorMessage(); - log.error(errorMsg, deviceEx); - throw new ApplicationManagementException(errorMsg, deviceEx); + } catch (OperationManagementException e) { + throw new ApplicationManagementException("Error in add operation at app installation", e); + } catch (DeviceManagementException e) { + throw new ApplicationManagementException("Error in notify operation at app installation", e); } } @@ -119,7 +121,6 @@ public class ApplicationManagerProviderServiceImpl implements ApplicationManagem DeviceIdentifier deviceIdentifier; - for (String user : userNameList) { userName = user; deviceList = DeviceManagementDataHolder.getInstance().getDeviceManagementProvider().getDevicesOfUser @@ -132,18 +133,20 @@ public class ApplicationManagerProviderServiceImpl implements ApplicationManagem deviceIdentifierList.add(deviceIdentifier); } } + //TODO: Fix this properly later adding device type to be passed in when the task manage executes "addOperations()" + String type = null; + if (deviceIdentifierList.size() > 0) { + type = deviceIdentifierList.get(0).getType(); + } DeviceManagementDataHolder.getInstance().getDeviceManagementProvider() - .addOperation(operation, deviceIdentifierList); + .addOperation(type, operation, deviceIdentifierList); - } catch (DeviceManagementException devEx) { - String errorMsg = "Error in get devices for user: "+userName+ " in app installation:" + devEx.getErrorMessage(); - log.error(errorMsg, devEx); - throw new ApplicationManagementException(errorMsg, devEx); + } catch (DeviceManagementException e) { + throw new ApplicationManagementException("Error in get devices for user: " + userName + + " in app installation", e); - } catch (OperationManagementException opeEx) { - String errorMsg = "Error in add operation at app installation:" + opeEx.getErrorMessage(); - log.error(errorMsg, opeEx); - throw new ApplicationManagementException(errorMsg, opeEx); + } catch (OperationManagementException e) { + throw new ApplicationManagementException("Error in add operation at app installation", e); } } @@ -170,19 +173,20 @@ public class ApplicationManagerProviderServiceImpl implements ApplicationManagem deviceIdentifierList.add(deviceIdentifier); } } - DeviceManagementDataHolder.getInstance().getDeviceManagementProvider() - .addOperation(operation, deviceIdentifierList); - - } catch (DeviceManagementException devEx) { - String errorMsg = "Error in get devices for user role "+userRole+ " in app installation:" - + devEx.getErrorMessage(); - log.error(errorMsg, devEx); - throw new ApplicationManagementException(errorMsg, devEx); - - } catch (OperationManagementException opeEx) { - String errorMsg = "Error in add operation at app installation:" + opeEx.getErrorMessage(); - log.error(errorMsg, opeEx); - throw new ApplicationManagementException(errorMsg, opeEx); + //TODO: Fix this properly later adding device type to be passed in when the task manage executes "addOperations()" + String type = null; + if (deviceIdentifierList.size() > 0) { + type = deviceIdentifierList.get(0).getType(); + } + DeviceManagementDataHolder.getInstance().getDeviceManagementProvider().addOperation(type, operation, + deviceIdentifierList); + + } catch (DeviceManagementException e) { + throw new ApplicationManagementException("Error in get devices for user role " + userRole + + " in app installation", e); + + } catch (OperationManagementException e) { + throw new ApplicationManagementException("Error in add operation at app installation", e); } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/DeviceManagementConfig.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/DeviceManagementConfig.java index ee11038ca4..30f7f7ea94 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/DeviceManagementConfig.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/DeviceManagementConfig.java @@ -31,13 +31,14 @@ import java.util.List; * Represents Device Mgt configuration. */ @XmlRootElement(name = "DeviceMgtConfiguration") +@SuppressWarnings("unused") public final class DeviceManagementConfig { private DeviceManagementConfigRepository deviceManagementConfigRepository; private TaskConfiguration taskConfiguration; private IdentityConfigurations identityConfigurations; private PolicyConfiguration policyConfiguration; - //private List pushNotificationProviders; + private List pushNotificationProviders; private DTConfiguration dTDepyloymentConfiguration; @XmlElement(name = "ManagementRepository", required = true) @@ -86,15 +87,16 @@ public final class DeviceManagementConfig { this.dTDepyloymentConfiguration = dTDeploymentConfiguration; } -// @XmlElementWrapper(name = "PushNotificationProviders", required = true) -// @XmlElement(name = "Provider", required = true) -// public List getPushNotificationProviders() { -// return pushNotificationProviders; -// } -// -// public void setPushNotificationProviders(List pushNotificationProviders) { -// this.pushNotificationProviders = pushNotificationProviders; -// } + + @XmlElementWrapper(name = "PushNotificationProviders", required = true) + @XmlElement(name = "Provider", required = true) + public List getPushNotificationProviders() { + return pushNotificationProviders; + } + + public void setPushNotificationProviders(List pushNotificationProviders) { + this.pushNotificationProviders = pushNotificationProviders; + } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementDataHolder.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementDataHolder.java index 0f966baf3b..8ca3ca45cc 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementDataHolder.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementDataHolder.java @@ -24,6 +24,7 @@ import org.wso2.carbon.device.mgt.common.license.mgt.LicenseManager; import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManager; import org.wso2.carbon.device.mgt.core.app.mgt.config.AppManagementConfig; import org.wso2.carbon.device.mgt.core.config.license.LicenseConfig; +import org.wso2.carbon.device.mgt.core.push.notification.mgt.PushNotificationProviderRepository; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.device.mgt.core.service.GroupManagementProviderService; import org.wso2.carbon.email.sender.core.service.EmailSenderService; @@ -53,6 +54,7 @@ public class DeviceManagementDataHolder { private GroupManagementProviderService groupManagementProviderService; private TaskService taskService; private EmailSenderService emailSenderService; + private PushNotificationProviderRepository pushNotificationProviderRepository; private DeviceManagementDataHolder() {} @@ -196,4 +198,13 @@ public class DeviceManagementDataHolder { this.emailSenderService = emailSenderService; } + public void setPushNotificationProviderRepository( + PushNotificationProviderRepository pushNotificationProviderRepository) { + this.pushNotificationProviderRepository = pushNotificationProviderRepository; + } + + public PushNotificationProviderRepository getPushNotificationProviderRepository() { + return pushNotificationProviderRepository; + } + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java index 09ac3fcd90..eee04e06da 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/DeviceManagementServiceComponent.java @@ -30,6 +30,8 @@ import org.wso2.carbon.device.mgt.common.notification.mgt.NotificationManagement import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException; import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManager; import org.wso2.carbon.device.mgt.common.permission.mgt.PermissionManagerService; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationProvider; import org.wso2.carbon.device.mgt.common.spi.DeviceManagementService; import org.wso2.carbon.device.mgt.core.DeviceManagementConstants; import org.wso2.carbon.device.mgt.core.DeviceManagementPluginRepository; @@ -49,6 +51,8 @@ import org.wso2.carbon.device.mgt.core.notification.mgt.dao.NotificationManageme import org.wso2.carbon.device.mgt.core.operation.mgt.OperationManagerImpl; import org.wso2.carbon.device.mgt.core.operation.mgt.dao.OperationManagementDAOFactory; import org.wso2.carbon.device.mgt.core.permission.mgt.PermissionManagerServiceImpl; +import org.wso2.carbon.device.mgt.core.push.notification.mgt.PushNotificationConfigRepository; +import org.wso2.carbon.device.mgt.core.push.notification.mgt.PushNotificationProviderRepository; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderServiceImpl; import org.wso2.carbon.device.mgt.core.service.GroupManagementProviderService; @@ -153,15 +157,26 @@ public class DeviceManagementServiceComponent { NotificationManagementDAOFactory.init(dsConfig); OperationManagementDAOFactory.init(dsConfig); - /*Initialize Operation Manager*/ + + /* Initialize Operation Manager */ this.initOperationsManager(); + + PushNotificationProviderRepository pushNotificationRepo = new PushNotificationProviderRepository(); + List pushNotificationProviders = config.getPushNotificationProviders(); + if (pushNotificationProviders != null) { + for (String pushNoteProvider : pushNotificationProviders) { + pushNotificationRepo.addProvider(pushNoteProvider); + } + } + DeviceManagementDataHolder.getInstance().setPushNotificationProviderRepository(pushNotificationRepo); + /* If -Dsetup option enabled then create device management database schema */ String setupOption = System.getProperty(DeviceManagementConstants.Common.PROPERTY_SETUP); if (setupOption != null) { if (log.isDebugEnabled()) { log.debug("-Dsetup is enabled. Device management repository schema initialization is about to " + - "begin"); + "begin"); } this.setupDeviceManagementSchema(dsConfig); } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java index 6784b0cb70..f0dfbe95dc 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerImpl.java @@ -27,6 +27,9 @@ import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroupConstants; 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.OperationManager; +import org.wso2.carbon.device.mgt.common.push.notification.NotificationContext; +import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationExecutionFailedException; import org.wso2.carbon.device.mgt.core.DeviceManagementConstants; import org.wso2.carbon.device.mgt.core.dao.DeviceDAO; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; @@ -62,6 +65,7 @@ public class OperationManagerImpl implements OperationManager { private OperationMappingDAO operationMappingDAO; private OperationDAO operationDAO; private DeviceDAO deviceDAO; + private NotificationStrategy notificationStrategy; public OperationManagerImpl() { commandOperationDAO = OperationManagementDAOFactory.getCommandOperationDAO(); @@ -73,6 +77,11 @@ public class OperationManagerImpl implements OperationManager { deviceDAO = DeviceManagementDAOFactory.getDeviceDAO(); } + public OperationManagerImpl(NotificationStrategy notificationStrategy) { + this(); + this.notificationStrategy = notificationStrategy; + } + @Override public int addOperation(Operation operation, List deviceIds) throws OperationManagementException { @@ -80,66 +89,92 @@ public class OperationManagerImpl implements OperationManager { log.debug("operation:[" + operation.toString() + "]"); for (DeviceIdentifier deviceIdentifier : deviceIds) { log.debug("device identifier id:[" + deviceIdentifier.getId() + "] type:[" + - deviceIdentifier.getType() + "]"); + deviceIdentifier.getType() + "]"); } } + + List authorizedDeviceList = this.getAuthorizedDevices(operation, deviceIds); + if (authorizedDeviceList.size() <= 0) { + log.info("User : " + getUser() + " is not authorized to perform operations on given device-list."); + return -1; + } + + List enrolments = this.getEnrollmentsByStatus(deviceIds); try { - List authorizedDeviceList; - if (operation != null && isAuthenticationSkippedOperation(operation)) { - authorizedDeviceList = deviceIds; - } else { - authorizedDeviceList = DeviceManagementDataHolder.getInstance(). - getDeviceAccessAuthorizationService().isUserAuthorized(deviceIds, DeviceGroupConstants. - Permissions.DEFAULT_OPERATOR_PERMISSIONS).getAuthorizedDevices(); - } - if (authorizedDeviceList.size() > 0) { - try { - int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); - List enrolments; + + OperationManagementDAOFactory.beginTransaction(); + org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation operationDto = + OperationDAOUtil.convertOperation(operation); + int operationId = this.lookupOperationDAO(operation).addOperation(operationDto); + for (EnrolmentInfo enrolmentInfo : enrolments) { + if (operationDto.getControl() == + org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Control.NO_REPEAT) { + operationDAO.updateEnrollmentOperationsStatus(enrolmentInfo.getId(), operationDto.getCode(), + org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.PENDING, + org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.REPEATED); + } + operationMappingDAO.addOperationMapping(operationId, enrolmentInfo.getId()); + if (notificationStrategy != null) { try { - DeviceManagementDAOFactory.openConnection(); - enrolments = deviceDAO.getEnrolmentsByStatus(authorizedDeviceList, EnrolmentInfo.Status.ACTIVE, tenantId); - } catch (SQLException e) { - throw new OperationManagementException("Error occurred while opening a connection the data " + - "source", e); - } finally { - DeviceManagementDAOFactory.closeConnection(); - } - OperationManagementDAOFactory.beginTransaction(); - org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation operationDto = - OperationDAOUtil.convertOperation(operation); - int operationId = this.lookupOperationDAO(operation).addOperation(operationDto); - for (EnrolmentInfo enrolmentInfo : enrolments) { - if(operationDto.getControl() == - org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Control.NO_REPEAT){ - operationDAO.updateEnrollmentOperationsStatus(enrolmentInfo.getId(), operationDto.getCode(), - org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.PENDING, - org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.REPEATED); - } - operationMappingDAO.addOperationMapping(operationId, enrolmentInfo.getId()); + notificationStrategy.execute(new NotificationContext( + new DeviceIdentifier(enrolmentInfo.getDevice().getDeviceIdentifier(), + enrolmentInfo.getDevice().getType()))); + } catch (PushNotificationExecutionFailedException e) { + log.error("Error occurred while sending push notifications to " + + enrolmentInfo.getDevice().getType() + " device carrying id '" + + enrolmentInfo.getDevice().getDeviceIdentifier() + "'", e); } - OperationManagementDAOFactory.commitTransaction(); - return operationId; - } catch (OperationManagementDAOException e) { - OperationManagementDAOFactory.rollbackTransaction(); - throw new OperationManagementException("Error occurred while adding operation", e); - } catch (DeviceManagementDAOException e) { - OperationManagementDAOFactory.rollbackTransaction(); - throw new OperationManagementException("Error occurred while retrieving device metadata", e); - } catch (TransactionManagementException e) { - throw new OperationManagementException("Error occurred while initiating the transaction", e); - } finally { - OperationManagementDAOFactory.closeConnection(); } + } + OperationManagementDAOFactory.commitTransaction(); + return operationId; + } catch (OperationManagementDAOException e) { + OperationManagementDAOFactory.rollbackTransaction(); + throw new OperationManagementException("Error occurred while adding operation", e); + } catch (TransactionManagementException e) { + throw new OperationManagementException("Error occurred while initiating the transaction", e); + } finally { + OperationManagementDAOFactory.closeConnection(); + } + + } + + private List getAuthorizedDevices( + Operation operation, List deviceIds) throws OperationManagementException { + List authorizedDeviceList; + try { + if (operation != null && isAuthenticationSkippedOperation(operation)) { + authorizedDeviceList = deviceIds; } else { - log.info("User : " + getUser() + " is not authorized to perform operations on given device-list."); + authorizedDeviceList = DeviceManagementDataHolder.getInstance(). + getDeviceAccessAuthorizationService().isUserAuthorized(deviceIds).getAuthorizedDevices(); } } catch (DeviceAccessAuthorizationException e) { throw new OperationManagementException("Error occurred while authorizing access to the devices for user :" + - this.getUser(), e); + this.getUser(), e); } - return -1; + return authorizedDeviceList; + } + + private List getEnrollmentsByStatus( + List deviceIds) throws OperationManagementException { + List enrolments; + int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); + try { + DeviceManagementDAOFactory.openConnection(); + enrolments = deviceDAO.getEnrolmentsByStatus(deviceIds, EnrolmentInfo.Status.ACTIVE, tenantId); + } catch (SQLException e) { + throw new OperationManagementException("Error occurred while opening a connection the data " + + "source", e); + } catch (DeviceManagementDAOException e) { + OperationManagementDAOFactory.rollbackTransaction(); + throw new OperationManagementException( + "Error occurred while retrieving enrollments by status", e); + } finally { + DeviceManagementDAOFactory.closeConnection(); + } + return enrolments; } @Override @@ -162,8 +197,8 @@ public class OperationManagerImpl implements OperationManager { OperationManagementDAOFactory.openConnection(); if (enrolmentId < 0) { throw new OperationManagementException("Device not found for given device " + - "Identifier:" + deviceId.getId() + " and given type" + - deviceId.getType()); + "Identifier:" + deviceId.getId() + " and given type" + + deviceId.getType()); } List operationList = operationDAO.getOperationsForDevice(enrolmentId); @@ -174,12 +209,12 @@ public class OperationManagerImpl implements OperationManager { } } catch (OperationManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving the list of " + - "operations assigned for '" + deviceId.getType() + - "' device '" + deviceId.getId() + "'", e); + "operations assigned for '" + deviceId.getType() + + "' device '" + deviceId.getId() + "'", e); } catch (DeviceManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving metadata of '" + - deviceId.getType() + "' device carrying the identifier '" + - deviceId.getId() + "'"); + deviceId.getType() + "' device carrying the identifier '" + + deviceId.getId() + "'"); } catch (SQLException e) { throw new OperationManagementException( "Error occurred while opening a connection to the data source", e); @@ -191,7 +226,7 @@ public class OperationManagerImpl implements OperationManager { } } catch (DeviceAccessAuthorizationException e) { throw new OperationManagementException("Error occurred while authorizing access to the devices for user : " + - this.getUser(), e); + this.getUser(), e); } return operations; } @@ -218,8 +253,8 @@ public class OperationManagerImpl implements OperationManager { OperationManagementDAOFactory.openConnection(); if (enrolmentId < 0) { throw new OperationManagementException("Device not found for given device " + - "Identifier:" + deviceId.getId() + " and given type" + - deviceId.getType()); + "Identifier:" + deviceId.getId() + " and given type" + + deviceId.getType()); } List operationList = operationDAO.getOperationsForDevice(enrolmentId, request); @@ -234,12 +269,12 @@ public class OperationManagerImpl implements OperationManager { paginationResult.setRecordsFiltered(count); } catch (OperationManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving the list of " + - "operations assigned for '" + deviceId.getType() + - "' device '" + deviceId.getId() + "'", e); + "operations assigned for '" + deviceId.getType() + + "' device '" + deviceId.getId() + "'", e); } catch (DeviceManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving metadata of '" + - deviceId.getType() + "' device carrying the identifier '" + - deviceId.getId() + "'"); + deviceId.getType() + "' device carrying the identifier '" + + deviceId.getId() + "'"); } catch (SQLException e) { throw new OperationManagementException( "Error occurred while opening a connection to the data source", e); @@ -251,7 +286,7 @@ public class OperationManagerImpl implements OperationManager { } } catch (DeviceAccessAuthorizationException e) { throw new OperationManagementException("Error occurred while authorizing access to the devices for user : " + - this.getUser(), e); + this.getUser(), e); } return paginationResult; @@ -259,7 +294,7 @@ public class OperationManagerImpl implements OperationManager { @Override public List getPendingOperations(DeviceIdentifier deviceId) throws - OperationManagementException { + OperationManagementException { if (log.isDebugEnabled()) { log.debug("Device identifier id:[" + deviceId.getId() + "] type:[" + deviceId.getType() + "]"); } @@ -281,8 +316,8 @@ public class OperationManagerImpl implements OperationManager { OperationManagementDAOFactory.openConnection(); if (enrolmentId < 0) { throw new OperationManagementException("Device not found for the given device Identifier:" + - deviceId.getId() + " and given type:" + - deviceId.getType()); + deviceId.getId() + " and given type:" + + deviceId.getType()); } dtoOperationList.addAll(commandOperationDAO.getOperationsByDeviceAndStatus( enrolmentId, org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.PENDING)); @@ -300,12 +335,12 @@ public class OperationManagerImpl implements OperationManager { Collections.sort(operations, new OperationCreateTimeComparator()); } catch (OperationManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving the list of " + - "pending operations assigned for '" + deviceId.getType() + - "' device '" + deviceId.getId() + "'", e); + "pending operations assigned for '" + deviceId.getType() + + "' device '" + deviceId.getId() + "'", e); } catch (DeviceManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving the device " + - "for device Identifier type -'" + deviceId.getType() + - "' and device Id '" + deviceId.getId() + "'", e); + "for device Identifier type -'" + deviceId.getType() + + "' and device Id '" + deviceId.getId() + "'", e); } catch (SQLException e) { throw new OperationManagementException( "Error occurred while opening a connection to the data source", e); @@ -314,11 +349,11 @@ public class OperationManagerImpl implements OperationManager { } } else { log.info("User : " + getUser() + " is not authorized to fetch operations on device : " - + deviceId.getId()); + + deviceId.getId()); } } catch (DeviceAccessAuthorizationException e) { throw new OperationManagementException("Error occurred while authorizing access to the devices for user :" + - this.getUser(), e); + this.getUser(), e); } return operations; } @@ -345,27 +380,27 @@ public class OperationManagerImpl implements OperationManager { OperationManagementDAOFactory.openConnection(); if (enrolmentId < 0) { throw new OperationManagementException("Device not found for given device " + - "Identifier:" + deviceId.getId() + " and given type" + - deviceId.getType()); + "Identifier:" + deviceId.getId() + " and given type" + + deviceId.getType()); } org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation dtoOperation = operationDAO. - getNextOperation(enrolmentId); + getNextOperation(enrolmentId); if (dtoOperation != null) { if (org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type.COMMAND. - equals(dtoOperation.getType())) { + equals(dtoOperation.getType())) { org.wso2.carbon.device.mgt.core.dto.operation.mgt.CommandOperation commandOperation; commandOperation = (org.wso2.carbon.device.mgt.core.dto.operation.mgt.CommandOperation) commandOperationDAO. - getOperation(dtoOperation.getId()); + getOperation(dtoOperation.getId()); dtoOperation.setEnabled(commandOperation.isEnabled()); } else if (org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type.CONFIG. - equals(dtoOperation.getType())) { + equals(dtoOperation.getType())) { dtoOperation = configOperationDAO.getOperation(dtoOperation.getId()); } else if (org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type.PROFILE. - equals(dtoOperation.getType())) { + equals(dtoOperation.getType())) { dtoOperation = profileOperationDAO.getOperation(dtoOperation.getId()); } else if (org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type.POLICY. - equals(dtoOperation.getType())) { + equals(dtoOperation.getType())) { dtoOperation = policyOperationDAO.getOperation(dtoOperation.getId()); } operation = OperationDAOUtil.convertOperation(dtoOperation); @@ -374,8 +409,8 @@ public class OperationManagerImpl implements OperationManager { throw new OperationManagementException("Error occurred while retrieving next pending operation", e); } catch (DeviceManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving the device " + - "for device Identifier type -'" + deviceId.getType() + - "' and device Id '" + deviceId.getId(), e); + "for device Identifier type -'" + deviceId.getType() + + "' and device Id '" + deviceId.getId(), e); } catch (SQLException e) { throw new OperationManagementException( "Error occurred while opening a connection to the data source", e); @@ -384,11 +419,11 @@ public class OperationManagerImpl implements OperationManager { } } else { log.info("User : " + getUser() + " is not authorized to fetch operations on device : " - + deviceId.getId()); + + deviceId.getId()); } } catch (DeviceAccessAuthorizationException e) { throw new OperationManagementException("Error occurred while authorizing access to the devices for user : " + - this.getUser(), e); + this.getUser(), e); } return operation; } @@ -411,15 +446,15 @@ public class OperationManagerImpl implements OperationManager { enrolmentId = deviceDAO.getEnrolmentByStatus(deviceId, EnrolmentInfo.Status.ACTIVE, tenantId); } catch (SQLException e) { throw new OperationManagementException("Error occurred while opening a connection to the" + - " data source", e); + " data source", e); } finally { DeviceManagementDAOFactory.closeConnection(); } OperationManagementDAOFactory.beginTransaction(); if (operation.getStatus() != null) { operationDAO.updateOperationStatus(enrolmentId, operationId, - org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status. - valueOf(operation.getStatus().toString())); + org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status. + valueOf(operation.getStatus().toString())); } if (operation.getOperationResponse() != null) { operationDAO.addOperationResponse(enrolmentId, operationId, operation.getOperationResponse()); @@ -429,12 +464,12 @@ public class OperationManagerImpl implements OperationManager { OperationManagementDAOFactory.rollbackTransaction(); throw new OperationManagementException( "Error occurred while updating the operation: " + operationId + " status:" + - operation.getStatus(), e); + operation.getStatus(), e); } catch (DeviceManagementDAOException e) { OperationManagementDAOFactory.rollbackTransaction(); throw new OperationManagementException( - "Error occurred while fetching the device for device identifier: " + deviceId.getId() + - "type:" + deviceId.getType(), e); + "Error occurred while fetching the device for device identifier: " + deviceId.getId() + + "type:" + deviceId.getType(), e); } catch (TransactionManagementException e) { throw new OperationManagementException("Error occurred while initiating a transaction", e); } finally { @@ -442,11 +477,11 @@ public class OperationManagerImpl implements OperationManager { } } else { log.info("User : " + getUser() + " is not authorized to update operations on device : " - + deviceId.getId()); + + deviceId.getId()); } } catch (DeviceAccessAuthorizationException e) { throw new OperationManagementException("Error occurred while authorizing access to the devices for user :" + - this.getUser(), e); + this.getUser(), e); } } @@ -478,7 +513,7 @@ public class OperationManagerImpl implements OperationManager { Operation operation = null; if (log.isDebugEnabled()) { log.debug("Operation Id: " + operationId + " Device Type: " + deviceId.getType() + " Device Identifier: " + - deviceId.getId()); + deviceId.getId()); } try { boolean isUserAuthorized = DeviceManagementDataHolder.getInstance().getDeviceAccessAuthorizationService(). @@ -496,16 +531,16 @@ public class OperationManagerImpl implements OperationManager { OperationManagementDAOFactory.openConnection(); if (enrolmentId < 0) { throw new OperationManagementException("Device not found for given device identifier: " + - deviceId.getId() + " type: " + deviceId.getType()); + deviceId.getId() + " type: " + deviceId.getType()); } org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation dtoOperation = operationDAO. - getOperationByDeviceAndId(enrolmentId, operationId); + getOperationByDeviceAndId(enrolmentId, operationId); if (dtoOperation.getType(). equals(org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type.COMMAND)) { org.wso2.carbon.device.mgt.core.dto.operation.mgt.CommandOperation commandOperation; commandOperation = (org.wso2.carbon.device.mgt.core.dto.operation.mgt.CommandOperation) commandOperationDAO. - getOperation(dtoOperation.getId()); + getOperation(dtoOperation.getId()); dtoOperation.setEnabled(commandOperation.isEnabled()); } else if (dtoOperation.getType(). equals(org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type.CONFIG)) { @@ -520,30 +555,30 @@ public class OperationManagerImpl implements OperationManager { if (dtoOperation == null) { throw new OperationManagementException("Operation not found for operation Id:" + operationId + - " device id:" + deviceId.getId()); + " device id:" + deviceId.getId()); } operation = OperationDAOUtil.convertOperation(dtoOperation); } catch (OperationManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving the list of " + - "operations assigned for '" + deviceId.getType() + - "' device '" + deviceId.getId() + "'", e); + "operations assigned for '" + deviceId.getType() + + "' device '" + deviceId.getId() + "'", e); } catch (DeviceManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving the device " + - "for device Identifier type -'" + deviceId.getType() + - "' and device Id '" + deviceId.getId() + "'", e); + "for device Identifier type -'" + deviceId.getType() + + "' and device Id '" + deviceId.getId() + "'", e); } catch (SQLException e) { throw new OperationManagementException("Error occurred while opening connection to the data source", - e); + e); } finally { OperationManagementDAOFactory.closeConnection(); } } else { log.info("User : " + getUser() + " is not authorized to fetch operations on device : " - + deviceId.getId()); + + deviceId.getId()); } } catch (DeviceAccessAuthorizationException e) { throw new OperationManagementException("Error occurred while authorizing access to the devices for user :" + - this.getUser(), e); + this.getUser(), e); } return operation; } @@ -571,18 +606,18 @@ public class OperationManagerImpl implements OperationManager { if (enrolmentId < 0) { throw new OperationManagementException( "Device not found for device id:" + deviceId.getId() + " " + "type:" + - deviceId.getType()); + deviceId.getType()); } org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status dtoOpStatus = org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.valueOf(status.toString()); dtoOperationList.addAll(commandOperationDAO.getOperationsByDeviceAndStatus(enrolmentId, dtoOpStatus)); dtoOperationList.addAll(configOperationDAO.getOperationsByDeviceAndStatus(enrolmentId, - org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.PENDING)); + org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.PENDING)); dtoOperationList.addAll(profileOperationDAO.getOperationsByDeviceAndStatus(enrolmentId, - org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.PENDING)); + org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.PENDING)); dtoOperationList.addAll(policyOperationDAO.getOperationsByDeviceAndStatus(enrolmentId, - org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.PENDING)); + org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Status.PENDING)); Operation operation; @@ -593,13 +628,13 @@ public class OperationManagerImpl implements OperationManager { } catch (OperationManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving the list of " + - "operations assigned for '" + deviceId.getType() + - "' device '" + - deviceId.getId() + "' and status:" + status.toString(), e); + "operations assigned for '" + deviceId.getType() + + "' device '" + + deviceId.getId() + "' and status:" + status.toString(), e); } catch (DeviceManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving the device " + - "for device Identifier type -'" + deviceId.getType() + - "' and device Id '" + deviceId.getId(), e); + "for device Identifier type -'" + deviceId.getType() + + "' and device Id '" + deviceId.getId(), e); } catch (SQLException e) { throw new OperationManagementException( "Error occurred while opening a connection to the data source", e); @@ -608,11 +643,11 @@ public class OperationManagerImpl implements OperationManager { } } else { log.info("User : " + getUser() + " is not authorized to fetch operations on device : " - + deviceId.getId()); + + deviceId.getId()); } } catch (DeviceAccessAuthorizationException e) { throw new OperationManagementException("Error occurred while authorizing access to the devices for user :" + - this.getUser(), e); + this.getUser(), e); } return operations; } @@ -623,7 +658,7 @@ public class OperationManagerImpl implements OperationManager { try { OperationManagementDAOFactory.openConnection(); org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation dtoOperation = operationDAO. - getOperation(operationId); + getOperation(operationId); if (dtoOperation == null) { throw new OperationManagementException("Operation not found for given Id:" + operationId); } @@ -632,22 +667,22 @@ public class OperationManagerImpl implements OperationManager { org.wso2.carbon.device.mgt.core.dto.operation.mgt.CommandOperation commandOperation; commandOperation = (org.wso2.carbon.device.mgt.core.dto.operation.mgt.CommandOperation) commandOperationDAO. - getOperation(dtoOperation.getId()); + getOperation(dtoOperation.getId()); dtoOperation.setEnabled(commandOperation.isEnabled()); } else if (dtoOperation.getType(). equals(org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type.CONFIG)) { dtoOperation = configOperationDAO.getOperation(dtoOperation.getId()); } else if (dtoOperation.getType().equals(org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type. - PROFILE)) { + PROFILE)) { dtoOperation = profileOperationDAO.getOperation(dtoOperation.getId()); } else if (dtoOperation.getType().equals(org.wso2.carbon.device.mgt.core.dto.operation.mgt.Operation.Type. - POLICY)) { + POLICY)) { dtoOperation = policyOperationDAO.getOperation(dtoOperation.getId()); } operation = OperationDAOUtil.convertOperation(dtoOperation); } catch (OperationManagementDAOException e) { throw new OperationManagementException("Error occurred while retrieving the operation with operation Id '" + - operationId, e); + operationId, e); } catch (SQLException e) { throw new OperationManagementException("Error occurred while opening a connection to the data source", e); } finally { @@ -662,7 +697,7 @@ public class OperationManagerImpl implements OperationManager { Operation operation; int enrollmentOpMappingId = Integer.parseInt( activity.replace(DeviceManagementConstants.OperationAttributes.ACTIVITY, "")); - if(enrollmentOpMappingId == 0){ + if (enrollmentOpMappingId == 0) { throw new IllegalArgumentException("Operation ID cannot be null or zero (0)."); } try { @@ -692,7 +727,7 @@ public class OperationManagerImpl implements OperationManager { } operation = OperationDAOUtil.convertOperation(dtoOperation); int enrolmentId = operationDAO.getEnrolmentIdFromMappingId(enrollmentOpMappingId); - if (enrolmentId !=0) { + if (enrolmentId != 0) { operation.setResponses(operationDAO.getOperationResponses(enrolmentId, operation.getId())); } @@ -754,10 +789,10 @@ public class OperationManagerImpl implements OperationManager { boolean status; switch (operation.getCode()) { - case DeviceManagementConstants.AuthorizationSkippedOperationCodes.POLICY_OPERATION_CODE : + case DeviceManagementConstants.AuthorizationSkippedOperationCodes.POLICY_OPERATION_CODE: status = true; break; - case DeviceManagementConstants.AuthorizationSkippedOperationCodes.MONITOR_OPERATION_CODE : + case DeviceManagementConstants.AuthorizationSkippedOperationCodes.MONITOR_OPERATION_CODE: status = true; break; default: diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerRepository.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerRepository.java new file mode 100644 index 0000000000..fb85d91fca --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/operation/mgt/OperationManagerRepository.java @@ -0,0 +1,46 @@ +/* + * 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.device.mgt.core.operation.mgt; + +import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManager; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class OperationManagerRepository { + + private Map operationManagers; + + public OperationManagerRepository() { + operationManagers = new ConcurrentHashMap<>(); + } + + public void addOperationManager(String type, OperationManager operationManager) { + operationManagers.put(type, operationManager); + } + + public OperationManager getOperationManager(String type) { + return operationManagers.get(type); + } + + public void removeOperationManager(String type) { + operationManagers.remove(type); + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationBasedOperationManager.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationBasedOperationManager.java new file mode 100644 index 0000000000..94486be464 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationBasedOperationManager.java @@ -0,0 +1,120 @@ +/* + * 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.device.mgt.core.push.notification.mgt; + +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.PaginationRequest; +import org.wso2.carbon.device.mgt.common.PaginationResult; +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.OperationManager; +import org.wso2.carbon.device.mgt.common.push.notification.NotificationContext; +import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationExecutionFailedException; + +import java.util.List; + +public class PushNotificationBasedOperationManager implements OperationManager { + + private OperationManager operationManager; + private NotificationStrategy notificationProvider; + + public PushNotificationBasedOperationManager( + OperationManager operationManager, NotificationStrategy notificationProvider) { + this.operationManager = operationManager; + this.notificationProvider = notificationProvider; + } + + @Override + public int addOperation(Operation operation, + List devices) throws OperationManagementException { + int operationId = this.operationManager.addOperation(operation, devices); + for (DeviceIdentifier deviceId : devices) { + try { + this.notificationProvider.execute(new NotificationContext(deviceId)); + } catch (PushNotificationExecutionFailedException e) { + throw new OperationManagementException("Error occurred while sending push notification to device", e); + } + } + return operationId; + } + + @Override + public List getOperations(DeviceIdentifier deviceId) throws OperationManagementException { + return this.operationManager.getOperations(deviceId); + } + + @Override + public PaginationResult getOperations(DeviceIdentifier deviceId, + PaginationRequest request) throws OperationManagementException { + return this.operationManager.getOperations(deviceId, request); + } + + @Override + public List getPendingOperations( + DeviceIdentifier deviceId) throws OperationManagementException { + return this.operationManager.getPendingOperations(deviceId); + } + + @Override + public Operation getNextPendingOperation(DeviceIdentifier deviceId) throws OperationManagementException { + return this.operationManager.getNextPendingOperation(deviceId); + } + + @Override + public void updateOperation(DeviceIdentifier deviceId, + Operation operation) throws OperationManagementException { + this.operationManager.updateOperation(deviceId, operation); + } + + @Override + public void deleteOperation(int operationId) throws OperationManagementException { + this.operationManager.deleteOperation(operationId); + } + + @Override + public Operation getOperationByDeviceAndOperationId( + DeviceIdentifier deviceId, int operationId) throws OperationManagementException { + return this.operationManager.getOperationByDeviceAndOperationId(deviceId, operationId); + } + + @Override + public List getOperationsByDeviceAndStatus( + DeviceIdentifier deviceId, + Operation.Status status) throws OperationManagementException { + try { + return this.operationManager.getOperationsByDeviceAndStatus(deviceId, status); + } catch (DeviceManagementException e) { + throw new OperationManagementException("Error occurred while retrieving the list of operations by " + + "device and status", e); + } + } + + @Override + public Operation getOperation(int operationId) throws OperationManagementException { + return this.operationManager.getOperation(operationId); + } + + @Override + public Operation getOperationByActivityId(String activity) throws OperationManagementException { + return this.operationManager.getOperationByActivityId(activity); + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationConfigRepository.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationConfigRepository.java new file mode 100644 index 0000000000..5e55404d56 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationConfigRepository.java @@ -0,0 +1,43 @@ +/* + * 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.device.mgt.core.push.notification.mgt; + +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig; + +import java.util.HashMap; +import java.util.Map; + +public class PushNotificationConfigRepository { + + private Map configs; + + public PushNotificationConfigRepository() { + configs = new HashMap<>(); + } + + public void addConfig(PushNotificationConfig config) { + configs.put(CarbonContext.getThreadLocalCarbonContext().getTenantId(), config); + } + + public PushNotificationConfig getConfig() { + return configs.get(CarbonContext.getThreadLocalCarbonContext().getTenantId()); + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationEnabledDeviceManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationEnabledDeviceManagementService.java new file mode 100644 index 0000000000..186329181e --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationEnabledDeviceManagementService.java @@ -0,0 +1,31 @@ +/* + * 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.device.mgt.core.push.notification.mgt; + +import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy; +import org.wso2.carbon.device.mgt.common.spi.DeviceManagementService; + +public class PushNotificationEnabledDeviceManagementService { + + public PushNotificationEnabledDeviceManagementService( + DeviceManagementService provider, NotificationStrategy strategy) { + + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationProviderFactory.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationProviderFactory.java new file mode 100644 index 0000000000..609fb74106 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationProviderFactory.java @@ -0,0 +1,36 @@ +/* + * 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.device.mgt.core.push.notification.mgt; + +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationProvider; +import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; + +public class PushNotificationProviderFactory { + + public static PushNotificationProvider getPushNotificationFactory(String type) { + PushNotificationProvider provider = + DeviceManagementDataHolder.getInstance().getPushNotificationProviderRepository().getProvider(type); + if (provider == null) { + throw new UnsupportedPushNotificationProviderException("Push notification type '" + type + + "' is not supported"); + } + return provider; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationProviderRepository.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationProviderRepository.java new file mode 100644 index 0000000000..822f62dff1 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/PushNotificationProviderRepository.java @@ -0,0 +1,60 @@ +/* + * 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.device.mgt.core.push.notification.mgt; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationProvider; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class PushNotificationProviderRepository { + + private Map providers; + private static final Log log = LogFactory.getLog(PushNotificationProviderRepository.class); + + public PushNotificationProviderRepository() { + this.providers = new ConcurrentHashMap<>(); + } + + public void addProvider(PushNotificationProvider provider) { + providers.put(provider.getType(), provider); + } + + public void addProvider(String className) { + try { + Class clz = Class.forName(className); + PushNotificationProvider provider = (PushNotificationProvider) clz.newInstance(); + providers.put(provider.getType(), provider); + } catch (ClassNotFoundException e) { + log.error("Provided push notification provider implementation '" + className + "' cannot be found", e); + } catch (InstantiationException e) { + log.error("Error occurred while instantiating push notification provider implementation '" + + className + "'", e); + } catch (IllegalAccessException e) { + log.error("Error occurred while adding push notification provider implementation '" + className + "'", e); + } + } + + public PushNotificationProvider getProvider(String type) { + return providers.get(type); + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/UnsupportedPushNotificationProviderException.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/UnsupportedPushNotificationProviderException.java new file mode 100644 index 0000000000..f7434216ae --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/push/notification/mgt/UnsupportedPushNotificationProviderException.java @@ -0,0 +1,45 @@ +/* + * 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.device.mgt.core.push.notification.mgt; + +public class UnsupportedPushNotificationProviderException extends RuntimeException { + + private static final long serialVersionUID = -3151279321923070297L; + + public UnsupportedPushNotificationProviderException(String msg, Exception nestedEx) { + super(msg, nestedEx); + } + + public UnsupportedPushNotificationProviderException(String message, Throwable cause) { + super(message, cause); + } + + public UnsupportedPushNotificationProviderException(String msg) { + super(msg); + } + + public UnsupportedPushNotificationProviderException() { + super(); + } + + public UnsupportedPushNotificationProviderException(Throwable cause) { + super(cause); + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java index 1a6cd8b7e8..69e49d2c9e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java @@ -27,6 +27,7 @@ import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration; import org.wso2.carbon.device.mgt.common.license.mgt.License; 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.OperationManager; import org.wso2.carbon.device.mgt.core.dto.DeviceType; @@ -36,7 +37,7 @@ import java.util.List; * Proxy class for all Device Management related operations that take the corresponding plugin type in * and resolve the appropriate plugin implementation */ -public interface DeviceManagementProviderService extends OperationManager { +public interface DeviceManagementProviderService { List getAllDevices(String deviceType) throws DeviceManagementException; @@ -212,6 +213,35 @@ public interface DeviceManagementProviderService extends OperationManager { boolean setStatus(DeviceIdentifier deviceId, String currentOwner, EnrolmentInfo.Status status) throws DeviceManagementException; - void notifyOperationToDevices(Operation operation, List deviceIds) throws DeviceManagementException; + void notifyOperationToDevices(Operation operation, + List deviceIds) throws DeviceManagementException; + + int addOperation(String type, Operation operation, + List devices) throws OperationManagementException; + + List getOperations(DeviceIdentifier deviceId) throws OperationManagementException; + + PaginationResult getOperations(DeviceIdentifier deviceId, + PaginationRequest request) throws OperationManagementException; + + List getPendingOperations( + DeviceIdentifier deviceId) throws OperationManagementException; + + Operation getNextPendingOperation(DeviceIdentifier deviceId) throws OperationManagementException; + + void updateOperation(DeviceIdentifier deviceId, Operation operation) throws OperationManagementException; + + void deleteOperation(String type, int operationId) throws OperationManagementException; + + Operation getOperationByDeviceAndOperationId(DeviceIdentifier deviceId, int operationId) + throws OperationManagementException; + + List getOperationsByDeviceAndStatus(DeviceIdentifier identifier, + Operation.Status status) + throws OperationManagementException, DeviceManagementException; + + Operation getOperation(String type, int operationId) throws OperationManagementException; + + Operation getOperationByActivityId(String activity) throws OperationManagementException; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java index 3324da66ac..8543b76e79 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java @@ -35,6 +35,8 @@ import org.wso2.carbon.device.mgt.common.license.mgt.License; import org.wso2.carbon.device.mgt.common.license.mgt.LicenseManagementException; 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.push.notification.NotificationStrategy; +import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig; import org.wso2.carbon.device.mgt.common.spi.DeviceManagementService; import org.wso2.carbon.device.mgt.core.DeviceManagementPluginRepository; import org.wso2.carbon.device.mgt.core.dao.DeviceDAO; @@ -46,6 +48,8 @@ import org.wso2.carbon.device.mgt.core.dto.DeviceType; import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; import org.wso2.carbon.device.mgt.core.internal.DeviceManagementServiceComponent; import org.wso2.carbon.device.mgt.core.internal.PluginInitializationListener; +import org.wso2.carbon.device.mgt.core.operation.mgt.OperationManagerImpl; +import org.wso2.carbon.device.mgt.core.operation.mgt.OperationManagerRepository; import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; import org.wso2.carbon.email.sender.core.ContentProviderInfo; import org.wso2.carbon.email.sender.core.EmailContext; @@ -70,9 +74,11 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv private DeviceTypeDAO deviceTypeDAO; private EnrollmentDAO enrollmentDAO; private DeviceManagementPluginRepository pluginRepository; + private OperationManagerRepository operationManagerRepository; public DeviceManagementProviderServiceImpl() { this.pluginRepository = new DeviceManagementPluginRepository(); + this.operationManagerRepository = new OperationManagerRepository(); initDataAccessObjects(); /* Registering a listener to retrieve events when some device management service plugin is installed after * the component is done getting initialized */ @@ -88,7 +94,8 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv @Override public boolean saveConfiguration(TenantConfiguration configuration) throws DeviceManagementException { DeviceManager dms = - this.getPluginRepository().getDeviceManagementService(configuration.getType(), this.getTenantId()).getDeviceManager(); + pluginRepository.getDeviceManagementService(configuration.getType(), + this.getTenantId()).getDeviceManager(); return dms.saveConfiguration(configuration); } @@ -100,7 +107,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv @Override public TenantConfiguration getConfiguration(String deviceType) throws DeviceManagementException { DeviceManager dms = - this.getPluginRepository().getDeviceManagementService(deviceType, this.getTenantId()).getDeviceManager(); + pluginRepository.getDeviceManagementService(deviceType, this.getTenantId()).getDeviceManager(); if (dms == null) { if (log.isDebugEnabled()) { log.debug("Device type '" + deviceType + "' does not have an associated device management " + @@ -154,7 +161,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv if (existingEnrolmentInfo != null && newEnrolmentInfo != null) { //Get all the enrollments of current user for the same device List enrolmentInfos = this.getEnrollmentsOfUser(existingDevice.getId(), - newEnrolmentInfo.getOwner()); + newEnrolmentInfo.getOwner()); for (EnrolmentInfo enrolmentInfo : enrolmentInfos) { //If the enrollments are same then we'll update the existing enrollment. if (enrolmentInfo.equals(newEnrolmentInfo)) { @@ -182,15 +189,15 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv DeviceManagementDAOFactory.commitTransaction(); if (log.isDebugEnabled()) { log.debug("An enrolment is successfully added with the id '" + enrolmentId + - "' associated with " + "the device identified by key '" + - device.getDeviceIdentifier() + "', which belongs to " + "platform '" + - device.getType() + " upon the user '" + device.getEnrolmentInfo().getOwner() + - "'"); + "' associated with " + "the device identified by key '" + + device.getDeviceIdentifier() + "', which belongs to " + "platform '" + + device.getType() + " upon the user '" + device.getEnrolmentInfo().getOwner() + + "'"); } status = true; } else { log.warn("Unable to update device enrollment for device : " + device.getDeviceIdentifier() + - " belonging to user : " + device.getEnrolmentInfo().getOwner()); + " belonging to user : " + device.getEnrolmentInfo().getOwner()); } } catch (DeviceManagementDAOException e) { DeviceManagementDAOFactory.rollbackTransaction(); @@ -277,7 +284,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv enrolmentInfos = enrollmentDAO.getEnrollmentsOfUser(deviceId, user, this.getTenantId()); } catch (DeviceManagementDAOException e) { throw new DeviceManagementException("Error occurred while obtaining the enrollment information device for" + - "id '" + deviceId + "' and user : " + user, e); + "id '" + deviceId + "' and user : " + user, e); } catch (SQLException e) { throw new DeviceManagementException("Error occurred while opening a connection to the data source", e); } finally { @@ -424,7 +431,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv count = deviceDAO.getDeviceCountByType(deviceType, tenantId); } catch (DeviceManagementDAOException e) { throw new DeviceManagementException("Error occurred while retrieving device list pertaining to " + - "the current tenant of type " + deviceType, e); + "the current tenant of type " + deviceType, e); } catch (SQLException e) { throw new DeviceManagementException("Error occurred while opening a connection to the data source", e); } finally { @@ -435,7 +442,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv if (deviceManager == null) { if (log.isDebugEnabled()) { log.debug("Device Manager associated with the device type '" + device.getType() + "' is null. " + - "Therefore, not attempting method 'isEnrolled'"); + "Therefore, not attempting method 'isEnrolled'"); } devices.add(device); continue; @@ -467,7 +474,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv count = deviceDAO.getDeviceCount(request, tenantId); } catch (DeviceManagementDAOException e) { throw new DeviceManagementException("Error occurred while retrieving device list pertaining to " + - "the current tenant", e); + "the current tenant", e); } catch (SQLException e) { throw new DeviceManagementException("Error occurred while opening a connection to the data source", e); } finally { @@ -478,7 +485,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv if (deviceManager == null) { if (log.isDebugEnabled()) { log.debug("Device Manager associated with the device type '" + device.getType() + "' is null. " + - "Therefore, not attempting method 'isEnrolled'"); + "Therefore, not attempting method 'isEnrolled'"); } devices.add(device); continue; @@ -546,7 +553,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv try { EmailContext ctx = new EmailContext.EmailContextBuilder(new ContentProviderInfo("user-enrollment", params), - metaInfo.getRecipients()).build(); + metaInfo.getRecipients()).build(); DeviceManagementDataHolder.getInstance().getEmailSenderService().sendEmail(ctx); } catch (EmailSendingFailedException e) { throw new DeviceManagementException("Error occurred while sending enrollment invitation", e); @@ -571,7 +578,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv try { EmailContext ctx = new EmailContext.EmailContextBuilder(new ContentProviderInfo("user-registration", params), - metaInfo.getRecipients()).build(); + metaInfo.getRecipients()).build(); DeviceManagementDataHolder.getInstance().getEmailSenderService().sendEmail(ctx); } catch (EmailSendingFailedException e) { throw new DeviceManagementException("Error occurred while sending user registration notification", e); @@ -620,7 +627,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv device = deviceDAO.getDevice(deviceId, status, this.getTenantId()); } catch (DeviceManagementDAOException e) { throw new DeviceManagementException("Error occurred while obtaining the device for id " + - "'" + deviceId.getId() + "'", e); + "'" + deviceId.getId() + "'", e); } catch (SQLException e) { throw new DeviceManagementException("Error occurred while opening a connection to the data source", e); } finally { @@ -633,7 +640,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv if (deviceManager == null) { if (log.isDebugEnabled()) { log.debug("Device Manager associated with the device type '" + deviceId.getType() + "' is null. " + - "Therefore, not attempting method 'getDevice'"); + "Therefore, not attempting method 'getDevice'"); } return device; } @@ -693,7 +700,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv return deviceTypesResponse; } - @Override + @Override public boolean updateDeviceInfo(DeviceIdentifier deviceId, Device device) throws DeviceManagementException { DeviceManager deviceManager = this.getDeviceManager(deviceId.getType()); if (deviceManager == null) { @@ -758,7 +765,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv for (DeviceIdentifier deviceId : deviceIds) { DeviceManagementService dms = - getPluginRepository().getDeviceManagementService(deviceId.getType(), this.getTenantId()); + pluginRepository.getDeviceManagementService(deviceId.getType(), this.getTenantId()); //TODO FIX THIS WITH PUSH NOTIFICATIONS //dms.notifyOperationToDevices(operation, deviceIds); } @@ -808,12 +815,8 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv } } - private DeviceManagementPluginRepository getPluginRepository() { - return pluginRepository; - } - @Override - public int addOperation(Operation operation, + public int addOperation(String type, Operation operation, List devices) throws OperationManagementException { return DeviceManagementDataHolder.getInstance().getOperationManager().addOperation(operation, devices); } @@ -846,7 +849,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv } @Override - public void deleteOperation(int operationId) throws OperationManagementException { + public void deleteOperation(String type, int operationId) throws OperationManagementException { DeviceManagementDataHolder.getInstance().getOperationManager().deleteOperation(operationId); } @@ -866,7 +869,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv } @Override - public Operation getOperation(int operationId) throws OperationManagementException { + public Operation getOperation(String type, int operationId) throws OperationManagementException { return DeviceManagementDataHolder.getInstance().getOperationManager().getOperation(operationId); } @@ -910,7 +913,6 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv devices.add(device); } return devices; - } @Override @@ -928,7 +930,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv deviceCount = deviceDAO.getDeviceCountByUser(username, tenantId); } catch (DeviceManagementDAOException e) { throw new DeviceManagementException("Error occurred while retrieving the list of devices that " + - "belong to the user '" + username + "'", e); + "belong to the user '" + username + "'", e); } catch (SQLException e) { throw new DeviceManagementException("Error occurred while opening a connection to the data source", e); } finally { @@ -940,7 +942,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv if (deviceManager == null) { if (log.isDebugEnabled()) { log.debug("Device Manager associated with the device type '" + device.getType() + "' is null. " + - "Therefore, not attempting method 'isEnrolled'"); + "Therefore, not attempting method 'isEnrolled'"); } devices.add(device); continue; @@ -1039,7 +1041,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv return deviceDAO.getDeviceCount(username, this.getTenantId()); } catch (DeviceManagementDAOException e) { throw new DeviceManagementException("Error occurred while retrieving the device count of user '" - + username + "'", e); + + username + "'", e); } catch (SQLException e) { throw new DeviceManagementException("Error occurred while opening a connection to the data source", e); } finally { @@ -1104,7 +1106,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv result.setRecordsFiltered(deviceCount); } catch (DeviceManagementDAOException e) { throw new DeviceManagementException("Error occurred while fetching the list of devices that matches to '" - + deviceName + "'", e); + + deviceName + "'", e); } catch (SQLException e) { throw new DeviceManagementException("Error occurred while opening a connection to the data source", e); } finally { @@ -1147,6 +1149,17 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv public void registerDeviceManagementService(DeviceManagementService deviceManagementService) { try { pluginRepository.addDeviceManagementProvider(deviceManagementService); + PushNotificationConfig pushNoteConfig = deviceManagementService.getPushNotificationConfig(); + if (pushNoteConfig != null) { + NotificationStrategy notificationStrategy = + DeviceManagementDataHolder.getInstance().getPushNotificationProviderRepository().getProvider( + pushNoteConfig.getType()).getNotificationStrategy(pushNoteConfig); + operationManagerRepository.addOperationManager( + deviceManagementService.getType(), new OperationManagerImpl(notificationStrategy)); + } else { + operationManagerRepository.addOperationManager( + deviceManagementService.getType(), new OperationManagerImpl()); + } } catch (DeviceManagementException e) { log.error("Error occurred while registering device management plugin '" + deviceManagementService.getType() + "'", e); @@ -1157,6 +1170,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv public void unregisterDeviceManagementService(DeviceManagementService deviceManagementService) { try { pluginRepository.removeDeviceManagementProvider(deviceManagementService); + operationManagerRepository.removeOperationManager(deviceManagementService.getType()); } catch (DeviceManagementException e) { log.error("Error occurred while un-registering device management plugin '" + deviceManagementService.getType() + "'", e); @@ -1230,7 +1244,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv private DeviceManager getDeviceManager(String deviceType) { DeviceManagementService deviceManagementService = - this.getPluginRepository().getDeviceManagementService(deviceType, this.getTenantId()); + pluginRepository.getDeviceManagementService(deviceType, this.getTenantId()); if (deviceManagementService == null) { if (log.isDebugEnabled()) { log.debug("Device type '" + deviceType + "' does not have an associated device management " + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/task/impl/DeviceTaskManagerImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/task/impl/DeviceTaskManagerImpl.java index b3bd8d5db0..ab83fd3587 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/task/impl/DeviceTaskManagerImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/task/impl/DeviceTaskManagerImpl.java @@ -95,7 +95,13 @@ public class DeviceTaskManagerImpl implements DeviceTaskManager { operation.setEnabled(true); operation.setType(Operation.Type.COMMAND); operation.setCode(str); - deviceManagementProviderService.addOperation(operation, DeviceManagerUtil.convertDevices(devices)); + //TODO: Fix this properly later adding device type to be passed in when the task manage executes "addOperations()" + String type = null; + if (devices.size() > 0) { + type = devices.get(0).getType(); + } + deviceManagementProviderService.addOperation(type, operation, + DeviceManagerUtil.convertDevices(devices)); } } else { if (log.isDebugEnabled()) { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml index 41aa93f835..a0484f63cd 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml @@ -50,6 +50,10 @@ org.wso2.carbon.devicemgt org.wso2.carbon.device.mgt.common + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.core + org.apache.ws.commons.axiom axiom-api @@ -91,8 +95,21 @@ commons-lang - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.core + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + provided + + + com.google.code.gson + gson + + + org.json.wso2 + json + + + org.wso2.carbon.analytics-common + org.wso2.carbon.event.output.adapter.core diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/PolicyManagerServiceImpl.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/PolicyManagerServiceImpl.java index 2027c10a7f..24bfc8294d 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/PolicyManagerServiceImpl.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/PolicyManagerServiceImpl.java @@ -96,7 +96,13 @@ public class PolicyManagerServiceImpl implements PolicyManagerService { } List deviceIdentifiers = new ArrayList(); deviceIdentifiers.add(deviceIdentifier); - PolicyManagementDataHolder.getInstance().getDeviceManagementService().addOperation( + + //TODO: Fix this properly later adding device type to be passed in when the task manage executes "addOperations()" + String type = null; + if (deviceIdentifiers.size() > 0) { + type = deviceIdentifiers.get(0).getType(); + } + PolicyManagementDataHolder.getInstance().getDeviceManagementService().addOperation(type, PolicyManagerUtil.transformPolicy(policy), deviceIdentifiers); return policy; } catch (PolicyEvaluationException e) { diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/impl/ComplianceDecisionPointImpl.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/impl/ComplianceDecisionPointImpl.java index 45f92146b2..94b1107440 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/impl/ComplianceDecisionPointImpl.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/impl/ComplianceDecisionPointImpl.java @@ -160,8 +160,14 @@ public class ComplianceDecisionPointImpl implements ComplianceDecisionPoint { } policyOperation.setProfileOperations(profileOperationList); policyOperation.setPayLoad(policyOperation.getProfileOperations()); + + //TODO: Fix this properly later adding device type to be passed in when the task manage executes "addOperations()" + String type = null; + if (deviceIdentifiers.size() > 0) { + type = deviceIdentifiers.get(0).getType(); + } PolicyManagementDataHolder.getInstance().getDeviceManagementService(). - addOperation(policyOperation, deviceIdentifiers); + addOperation(type, policyOperation, deviceIdentifiers); } diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java index 9f6df4969c..25bb2709d8 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java @@ -402,8 +402,13 @@ public class MonitoringManagerImpl implements MonitoringManager { // appListOperation.setType(Operation.Type.COMMAND); // appListOperation.setCode(OPERATION_APP_LIST); + //TODO: Fix this properly later adding device type to be passed in when the task manage executes "addOperations()" + String type = null; + if (deviceIdentifiers.size() > 0) { + type = deviceIdentifiers.get(0).getType(); + } DeviceManagementProviderService service = new DeviceManagementProviderServiceImpl(); - service.addOperation(monitoringOperation, deviceIdentifiers); + service.addOperation(type, monitoringOperation, deviceIdentifiers); // service.addOperation(infoOperation, deviceIdentifiers); // service.addOperation(appListOperation, deviceIdentifiers); } diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/pom.xml b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/pom.xml new file mode 100644 index 0000000000..139f1c2eef --- /dev/null +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/pom.xml @@ -0,0 +1,106 @@ + + + + + + + org.wso2.carbon.devicemgt + device-mgt-extensions-feature + 1.1.0-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature + pom + 1.1.0-SNAPSHOT + WSO2 Carbon - GCM Based Push Notification Provider Feature + http://wso2.org + WSO2 Carbon - MQTT Based Push Notification Provider Feature + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm + + + + + + + maven-resources-plugin + 2.6 + + + copy-resources + generate-resources + + copy-resources + + + src/main/resources + + + resources + + build.properties + p2.inf + + + + + + + + + org.wso2.maven + carbon-p2-plugin + ${carbon.p2.plugin.version} + + + p2-feature-generation + package + + p2-feature-gen + + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm + ../../../features/etc/feature.properties + + + org.wso2.carbon.p2.category.type:server + org.eclipse.equinox.p2.type.group:false + + + + + org.wso2.carbon.devicemgt:org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm:${carbon.device.mgt.version} + + + + org.wso2.carbon.core.server:${carbon.kernel.version} + org.wso2.carbon.device.mgt.server:${carbon.device.mgt.version} + + + + + + + + diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/src/main/resources/build.properties b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/src/main/resources/build.properties new file mode 100644 index 0000000000..9c86577d76 --- /dev/null +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/src/main/resources/build.properties @@ -0,0 +1 @@ +custom = true diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/src/main/resources/p2.inf b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/src/main/resources/p2.inf new file mode 100644 index 0000000000..7ab37b9d7d --- /dev/null +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature/src/main/resources/p2.inf @@ -0,0 +1 @@ +instructions.configure = \ \ No newline at end of file diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/pom.xml b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/pom.xml new file mode 100644 index 0000000000..452d0c3feb --- /dev/null +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/pom.xml @@ -0,0 +1,106 @@ + + + + + + + org.wso2.carbon.devicemgt + device-mgt-extensions-feature + 1.1.0-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature + pom + 1.1.0-SNAPSHOT + WSO2 Carbon - MQTT Based Push Notification Provider Feature + http://wso2.org + WSO2 Carbon - MQTT Based Push Notification Provider Feature + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt + + + + + + + maven-resources-plugin + 2.6 + + + copy-resources + generate-resources + + copy-resources + + + src/main/resources + + + resources + + build.properties + p2.inf + + + + + + + + + org.wso2.maven + carbon-p2-plugin + ${carbon.p2.plugin.version} + + + p2-feature-generation + package + + p2-feature-gen + + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt + ../../../features/etc/feature.properties + + + org.wso2.carbon.p2.category.type:server + org.eclipse.equinox.p2.type.group:false + + + + + org.wso2.carbon.devicemgt:org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt:${carbon.device.mgt.version} + + + + org.wso2.carbon.core.server:${carbon.kernel.version} + org.wso2.carbon.device.mgt.server:${carbon.device.mgt.version} + + + + + + + + diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/src/main/resources/build.properties b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/src/main/resources/build.properties new file mode 100644 index 0000000000..9c86577d76 --- /dev/null +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/src/main/resources/build.properties @@ -0,0 +1 @@ +custom = true diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/src/main/resources/p2.inf b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/src/main/resources/p2.inf new file mode 100644 index 0000000000..7ab37b9d7d --- /dev/null +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/src/main/resources/p2.inf @@ -0,0 +1 @@ +instructions.configure = \ \ No newline at end of file diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/pom.xml b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/pom.xml new file mode 100644 index 0000000000..dc0811d68e --- /dev/null +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/pom.xml @@ -0,0 +1,106 @@ + + + + + + + org.wso2.carbon.devicemgt + device-mgt-extensions-feature + 1.1.0-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature + pom + 1.1.0-SNAPSHOT + WSO2 Carbon - XMPP Based Push Notification Provider Feature + http://wso2.org + WSO2 Carbon - XMPP Based Push Notification Provider Feature + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp + + + + + + + maven-resources-plugin + 2.6 + + + copy-resources + generate-resources + + copy-resources + + + src/main/resources + + + resources + + build.properties + p2.inf + + + + + + + + + org.wso2.maven + carbon-p2-plugin + ${carbon.p2.plugin.version} + + + p2-feature-generation + package + + p2-feature-gen + + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp + ../../../features/etc/feature.properties + + + org.wso2.carbon.p2.category.type:server + org.eclipse.equinox.p2.type.group:false + + + + + org.wso2.carbon.devicemgt:org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp:${carbon.device.mgt.version} + + + + org.wso2.carbon.core.server:${carbon.kernel.version} + org.wso2.carbon.device.mgt.server:${carbon.device.mgt.version} + + + + + + + + diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/src/main/resources/build.properties b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/src/main/resources/build.properties new file mode 100644 index 0000000000..9c86577d76 --- /dev/null +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/src/main/resources/build.properties @@ -0,0 +1 @@ +custom = true diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/src/main/resources/p2.inf b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/src/main/resources/p2.inf new file mode 100644 index 0000000000..7ab37b9d7d --- /dev/null +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/src/main/resources/p2.inf @@ -0,0 +1 @@ +instructions.configure = \ \ No newline at end of file diff --git a/features/device-mgt-extensions/pom.xml b/features/device-mgt-extensions/pom.xml new file mode 100644 index 0000000000..2631efbebe --- /dev/null +++ b/features/device-mgt-extensions/pom.xml @@ -0,0 +1,41 @@ + + + + + + + org.wso2.carbon.devicemgt + carbon-devicemgt + 1.1.0-SNAPSHOT + ../../pom.xml + + + 4.0.0 + device-mgt-extensions-feature + pom + WSO2 Carbon - Device Management Extensions Feature + http://wso2.org + + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.feature + org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature + + + diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml index cd5ae9c577..449736b1bd 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/conf/cdm-config.xml @@ -25,6 +25,10 @@ + + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm.GCMBasedPushNotificationProvider + org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.MQTTBasedPushNotificationProvider + https://localhost:9443 admin diff --git a/pom.xml b/pom.xml index 54e1346008..772bcecc45 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,8 @@ ~ under the License. --> - + 4.0.0 org.wso2.carbon.devicemgt @@ -36,12 +37,13 @@ components/device-mgt + components/device-mgt-extensions components/apimgt-extensions components/policy-mgt components/certificate-mgt components/webapp-authenticator-framework components/identity-extensions - components/email-sender + components/email-sender features/device-mgt features/apimgt-extensions features/policy-mgt @@ -49,8 +51,9 @@ features/certificate-mgt features/dynamic-client-registration features/oauth-extensions - features/email-sender + features/email-sender features/jwt-client + features/device-mgt-extensions @@ -1472,6 +1475,28 @@ servlet-api ${servlet-api.version} + + + org.wso2.carbon.analytics-common + org.wso2.carbon.event.output.adapter.core + ${carbon.analytics.common.version} + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.extensions.push.notification.provider.gcm + ${carbon.device.mgt.version} + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt + ${carbon.device.mgt.version} + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp + ${carbon.device.mgt.version} +