/*
* 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.identity.notification.mgt.email.bean;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.identity.notification.mgt.NotificationManagementException;
import org.wso2.carbon.identity.notification.mgt.NotificationManagementUtils;
import org.wso2.carbon.identity.notification.mgt.bean.Subscription;
import org.wso2.carbon.identity.notification.mgt.email.EmailModuleConstants;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
/**
* A bean class which keeps information about Subscriptions which are registered in the email message sending module.
* This is built using a generic Subscription object which is being passed from Notification Mgt component.
*/
@SuppressWarnings("unused")
public class EmailSubscription extends Subscription {
private static final Log log = LogFactory.getLog(EmailSubscription.class);
/**
* Subscription level template.
*/
private String mailTemplate;
/**
* List of email endpoints which is registered with the subscription.
*/
private List<EmailEndpointInfo> emailEndpointInfoList;
/**
* Constructor of EmailSubscription. Will initiate lists and build specific type subscription object out of
* generic Subscription object
*
* @param subscription A subscription passed from Notification Mgt component
*/
public EmailSubscription(Subscription subscription) {
super(subscription.getSubscriptionName(), subscription.getSubscriptionProperties());
emailEndpointInfoList = new ArrayList<EmailEndpointInfo>();
// Build specific subscription objects out of generic subscription objects
buildEmailSubscription();
setSubscriptionProperties(NotificationManagementUtils.buildSingleWordKeyProperties( EmailModuleConstants
.Config.SUBSCRIPTION_NS + "." + getSubscriptionName(), getSubscriptionProperties()));
}
/**
* Builds an EmailSubscription object from general Subscription properties which are passed
* from Notification Mgt component.
*/
private void buildEmailSubscription() {
// Constructing subscription key. eg - email.subscription.subscriptionName
String subscriptionKey = EmailModuleConstants.Config.SUBSCRIPTION_NS + "." + getSubscriptionName();
// Reading email template for event
String templatePath = (String) getSubscriptionProperties().remove(subscriptionKey + "." +
EmailModuleConstants.Config.MAIL_TEMPLATE_QNAME);
if (StringUtils.isNotEmpty(templatePath)) {
String template = NotificationManagementUtils.readMessageTemplate(templatePath);
this.setMailTemplate(template);
} else {
log.warn("No default email template found for event " + getSubscriptionName());
}
//Sets endpoint information for the event
String endpointKey = subscriptionKey + "." + EmailModuleConstants.Config.ENDPOINT_QNAME;
setEndpoints(endpointKey, NotificationManagementUtils.getPropertiesWithPrefix(endpointKey,
getSubscriptionProperties()));
}
/**
* Set endpoints to the email subscription
*
* @param prefix prefix of the subscription
* @param endpointsProperties Properties which are related to endpoints
*/
private void setEndpoints(String prefix, Properties endpointsProperties) {
Properties endpointNames = NotificationManagementUtils.getSubProperties(prefix, endpointsProperties);
Enumeration endpointNameSet = endpointNames.propertyNames();
// Build all the endpoints by iterating through properties
while (endpointNameSet.hasMoreElements()) {
String key = (String) endpointNameSet.nextElement();
String endpointName = (String) endpointNames.remove(key);
// Build endpoint key using endpoint name
String endpointKey = prefix + "." + endpointName;
Properties endpointProperties = NotificationManagementUtils.getPropertiesWithPrefix(endpointKey,
endpointsProperties);
// Build and add email endpoint object to subscription
try {
emailEndpointInfoList.add(buildEndpoint(endpointKey, endpointProperties));
} catch (NotificationManagementException e) {
// If the particular endpoint building fails, An error message will be printed at the startup time.
// And continue with building other endpoints
log.error("Error while building endpoint object for endpoint with key " + endpointKey, e);
}
}
}
/**
* Build EmailEndpointInfo from the properties relevant to endpoints
*
* @param prefix Prefix of the endpoint. Eg email.subscription.subscriptionName.endpoint
* @param endpointProperties Properties which are specific to endpoint. eg email.subscription
* .subscriptionName.endpoint.property
* @return EmailEndpointInfo object which consists of email endpoint information
* @throws NotificationManagementException
*/
private EmailEndpointInfo buildEndpoint(String prefix, Properties endpointProperties) throws
NotificationManagementException {
EmailEndpointInfo emailEndpointInfo = new EmailEndpointInfo();
String emailAddress = (String) endpointProperties.remove(prefix + "." + EmailModuleConstants.Config.
ADDRESS_QNAME);
// If no configured email address is found, check in event properties for an email address.
if (StringUtils.isEmpty(emailAddress)) {
emailAddress = (String) endpointProperties.remove(EmailModuleConstants.Config.ADDRESS_QNAME);
}
// If there is no configured email address, stop building endpoint, throw an exception
if (StringUtils.isNotEmpty(emailAddress)) {
emailAddress = emailAddress.trim();
if (log.isDebugEnabled()) {
log.debug("Registering email endpoint with address " + emailAddress);
}
emailEndpointInfo.setEmailAddress(emailAddress);
}else{
if(log.isDebugEnabled()){
log.debug("Registering email endpoint with prefix " + prefix + " without address. Expecting the email " +
"address at event time");
}
}
String template = (String) endpointProperties.remove(prefix + "." + EmailModuleConstants.Config.
MAIL_TEMPLATE_QNAME);
if (template != null) {
//Set the email template configured for endpoint.
emailEndpointInfo.setTemplate(NotificationManagementUtils.readMessageTemplate(template.trim()));
} else {
// If template is null, event level template will be used
if (log.isDebugEnabled()) {
log.debug("No template configured for endpoint" + emailAddress);
}
}
// Set endpoint specific properties
emailEndpointInfo.setProperties(NotificationManagementUtils.buildSingleWordKeyProperties(prefix,
endpointProperties));
return emailEndpointInfo;
}
public String getMailTemplate() {
return mailTemplate;
}
public void setMailTemplate(String mailTemplate) {
this.mailTemplate = mailTemplate;
}
public List<EmailEndpointInfo> getEmailEndpointInfoList() {
return emailEndpointInfoList;
}
public void setEmailEndpointInfoList(List<EmailEndpointInfo> emailEndpointInfoList) {
this.emailEndpointInfoList = emailEndpointInfoList;
}
}