diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/EmailMessageProperties.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/EmailMessageProperties.java new file mode 100644 index 0000000000..d4c9380333 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/EmailMessageProperties.java @@ -0,0 +1,68 @@ +/* + * 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.device.mgt.common; + + +public class EmailMessageProperties { + + private String messageBody; + private String[] mailTo; + private String[] ccList; + private String[] bccList; + private String subject; + + public String getMessageBody() { + return messageBody; + } + + public void setMessageBody(String messageBody) { + this.messageBody = messageBody; + } + + public String[] getMailTo() { + return mailTo; + } + + public void setMailTo(String[] mailTo) { + this.mailTo = mailTo; + } + + public String[] getCcList() { + return ccList; + } + + public void setCcList(String[] ccList) { + this.ccList = ccList; + } + + public String[] getBccList() { + return bccList; + } + + public void setBccList(String[] bccList) { + this.bccList = bccList; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/EmailServiceProviderImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/EmailServiceProviderImpl.java new file mode 100644 index 0000000000..a52706753c --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/EmailServiceProviderImpl.java @@ -0,0 +1,124 @@ +/* + * 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.device.mgt.core; + +import org.apache.axiom.om.OMAbstractFactory; +import org.apache.axiom.om.OMElement; +import org.apache.axis2.AxisFault; +import org.apache.axis2.Constants; +import org.apache.axis2.addressing.EndpointReference; +import org.apache.axis2.client.Options; +import org.apache.axis2.client.ServiceClient; +import org.apache.axis2.context.ConfigurationContext; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.transport.base.BaseConstants; +import org.apache.axis2.transport.mail.MailConstants; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.EmailMessageProperties; +import org.wso2.carbon.device.mgt.core.internal.EmailServiceDataHolder; +import org.wso2.carbon.device.mgt.core.service.EmailService; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public class EmailServiceProviderImpl implements EmailService { + + private static ThreadPoolExecutor threadPoolExecutor; + private static final int MIN_THREAD = 8; + private static final int MAX_THREAD = 100; + private static final long DEFAULT_KEEP_ALIVE_TIME = 20; + private static final String EMAIL_URI_SCHEME = "mailto:"; + + private static Log log = LogFactory.getLog(EmailServiceProviderImpl.class); + + public EmailServiceProviderImpl() { + init(); + } + + private void init() { + if (threadPoolExecutor == null) { + threadPoolExecutor = new ThreadPoolExecutor(MIN_THREAD, MAX_THREAD, DEFAULT_KEEP_ALIVE_TIME, + TimeUnit.SECONDS, new LinkedBlockingQueue(1000)); + } + } + + @Override + public void sendEmail(EmailMessageProperties emailMessageProperties) throws DeviceManagementException { + for(String toAddr:emailMessageProperties.getMailTo()) { + threadPoolExecutor + .submit(new EmailSender(toAddr, emailMessageProperties.getSubject(), + emailMessageProperties.getMessageBody())); + } + } + + class EmailSender implements Runnable { + + String to; + String subject; + String body; + + EmailSender(String to, String subject, String body) { + this.to = to; + this.subject = subject; + this.body = body; + } + + public void run() { + Map headerMap = new HashMap(); + headerMap.put(MailConstants.MAIL_HEADER_SUBJECT, subject); + OMElement payload = OMAbstractFactory.getOMFactory().createOMElement( + BaseConstants.DEFAULT_TEXT_WRAPPER, null); + payload.setText(body); + try { + ServiceClient serviceClient; + ConfigurationContext configContext = EmailServiceDataHolder.getInstance() + .getConfigurationContextService().getClientConfigContext(); + //Set configuration service client if available, else create new service client + if (configContext != null) { + serviceClient = new ServiceClient(configContext, null); + } else { + serviceClient = new ServiceClient(); + } + Options options = new Options(); + options.setProperty(Constants.Configuration.ENABLE_REST, Constants.VALUE_TRUE); + options.setProperty(MessageContext.TRANSPORT_HEADERS, headerMap); + options.setProperty(MailConstants.TRANSPORT_MAIL_FORMAT, + MailConstants.TRANSPORT_FORMAT_TEXT); + options.setTo(new EndpointReference(EMAIL_URI_SCHEME + to)); + serviceClient.setOptions(options); + serviceClient.fireAndForget(payload); + log.debug("Sending confirmation mail to " + to); + } catch (AxisFault e) { + String msg = "Error in delivering the message, " + + "subject: " + subject + ", to: " + to + "."; + log.error(msg); + } catch (Throwable t) { + String msg = "Error in delivering the message, " + + "subject: " + subject + ", to: " + to + "."; + log.error(msg); + log.error(t); + } + } + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/EmailServiceComponent.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/EmailServiceComponent.java new file mode 100644 index 0000000000..3e100d50e9 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/EmailServiceComponent.java @@ -0,0 +1,83 @@ +/* + * 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.device.mgt.core.internal; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.osgi.framework.BundleContext; +import org.osgi.service.component.ComponentContext; +import org.wso2.carbon.device.mgt.core.DeviceManagementRepository; +import org.wso2.carbon.device.mgt.core.EmailServiceProviderImpl; +import org.wso2.carbon.device.mgt.core.service.EmailService; +import org.wso2.carbon.device.mgt.core.service.EmailServiceImpl; +import org.wso2.carbon.utils.ConfigurationContextService; + +/** + * @scr.component component.name="org.wso2.carbon.device.emailmanager" immediate="true" + * @scr.reference name="configurationcontext.service" + * interface="org.wso2.carbon.utils.ConfigurationContextService" cardinality="1..1" + * policy="dynamic" bind="setConfigurationContextService" unbind="unsetConfigurationContextService" + */ +public class EmailServiceComponent { + + private static Log log = LogFactory.getLog(EmailServiceComponent.class); + + /** + * initialize the email service here service here. + * + * @param context + */ + protected void activate(ComponentContext context) { + try { + if (log.isDebugEnabled()) { + log.debug("Initializing email service bundle"); + } + + /* Initializing Email Service Configurations */ + + EmailService emailServiceProvider = new EmailServiceProviderImpl(); + EmailServiceDataHolder.getInstance().setEmailServiceProvider(emailServiceProvider); ; + + this.registerServices(context); + + if (log.isDebugEnabled()) { + log.debug("Email management core bundle has been successfully initialized"); + } + } catch (Throwable e) { + String msg = "Error occurred while initializing device management core bundle"; + log.error(msg, e); + } + } + protected void setConfigurationContextService(ConfigurationContextService configurationContextService) { + EmailServiceDataHolder.getInstance().setConfigurationContextService(configurationContextService); + } + protected void unsetConfigurationContextService(ConfigurationContextService configurationContextService) { + EmailServiceDataHolder.getInstance().setConfigurationContextService(null); + } + + private void registerServices(ComponentContext componentContext) { + if (log.isDebugEnabled()) { + log.debug("Registering OSGi service Email Service Impl"); + } + /* Registering Email Service */ + BundleContext bundleContext = componentContext.getBundleContext(); + bundleContext.registerService(EmailService.class.getName(), + new EmailServiceImpl(), null); + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/EmailServiceDataHolder.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/EmailServiceDataHolder.java new file mode 100644 index 0000000000..0093ff6bdb --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/internal/EmailServiceDataHolder.java @@ -0,0 +1,58 @@ +/* + * 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.device.mgt.core.internal; + +import org.wso2.carbon.device.mgt.core.service.EmailService; +import org.wso2.carbon.utils.ConfigurationContextService; + +public class EmailServiceDataHolder { + + private static EmailServiceDataHolder thisInstance = new EmailServiceDataHolder(); + private ConfigurationContextService configurationContextService; + private EmailService emailServiceProvider; + + public static EmailServiceDataHolder getThisInstance() { + return thisInstance; + } + + public static void setThisInstance(EmailServiceDataHolder thisInstance) { + EmailServiceDataHolder.thisInstance = thisInstance; + } + + private EmailServiceDataHolder() { + } + + public static EmailServiceDataHolder getInstance() { + return thisInstance; + } + + public ConfigurationContextService getConfigurationContextService() { + return configurationContextService; + } + + public void setConfigurationContextService(ConfigurationContextService configurationContextService) { + this.configurationContextService = configurationContextService; + } + public EmailService getEmailServiceProvider() { + return emailServiceProvider; + } + + public void setEmailServiceProvider(EmailService emailServiceProvider) { + this.emailServiceProvider = emailServiceProvider; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/EmailService.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/EmailService.java new file mode 100644 index 0000000000..d53ddca970 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/EmailService.java @@ -0,0 +1,26 @@ +/* + * 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.device.mgt.core.service; + +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.EmailMessageProperties; + +public interface EmailService { + + public void sendEmail(EmailMessageProperties emailMessageProperties) throws DeviceManagementException; +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/EmailServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/EmailServiceImpl.java new file mode 100644 index 0000000000..807c511659 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/EmailServiceImpl.java @@ -0,0 +1,31 @@ +/* + * 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.device.mgt.core.service; + +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.EmailMessageProperties; +import org.wso2.carbon.device.mgt.core.internal.EmailServiceDataHolder; + +public class EmailServiceImpl implements EmailService{ + + @Override + public void sendEmail(EmailMessageProperties emailMessageProperties) throws DeviceManagementException { + EmailServiceDataHolder.getInstance().getEmailServiceProvider().sendEmail(emailMessageProperties); + } +}