org.wso2.carbon.identity.notification.mgt.json.bean.JsonSubscription.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.identity.notification.mgt.json.bean.JsonSubscription.java

Source

/*
 * 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.json.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.json.JsonModuleConstants;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;

/**
 * Event class is a bean class for a registered event. ie registered events for JSON message sending module. All
 * event related data are stored in this class
 */
@SuppressWarnings("unused")
public class JsonSubscription extends Subscription {

    private static final Log log = LogFactory.getLog(JsonSubscription.class);
    /**
     * Template of the json as defined in the configuration or given at the run time
     */
    private String jsonContent;
    /**
     * List of endpoints which this event should fire notifications.
     */
    private List<JsonEndpointInfo> endpointInfoList;

    /**
     * Passes a generic subscription object and this builds specific json subscription object
     *
     * @param subscription A generic type subscription object
     */
    public JsonSubscription(Subscription subscription) throws NotificationManagementException {

        super(subscription.getSubscriptionName(), subscription.getSubscriptionProperties());
        endpointInfoList = new ArrayList<JsonEndpointInfo>();
        // Build the json subscription object with parsed properties from management component
        build(getSubscriptionName(), getSubscriptionProperties());
        setSubscriptionProperties(NotificationManagementUtils.buildSingleWordKeyProperties(
                JsonModuleConstants.Config.SUBSCRIPTION_NS + "." + getSubscriptionName(),
                getSubscriptionProperties()));
    }

    /**
     * Takes all properties which has json.subscribe.eventName as key prefix and build an event out of it
     *
     * @param eventName              name of the event.
     * @param subscriptionProperties properties which has json.subscribe.eventName as prefix
     * @throws NotificationManagementException
     */
    private void build(String eventName, Properties subscriptionProperties) throws NotificationManagementException {
        // Subscription properties will never be null, Therefore no need to check
        if (StringUtils.isEmpty(eventName)) {
            throw new NotificationManagementException(
                    "No valid event name found. Cannot proceed with event building");
        }
        String eventKey = JsonModuleConstants.Config.SUBSCRIPTION_NS + "." + eventName;

        if (log.isDebugEnabled()) {
            log.debug("Building Event object for event " + eventName + " from json notification sending module");
        }

        // Reading json template for event
        String templatePath = (String) subscriptionProperties
                .remove(eventKey + "." + JsonModuleConstants.Config.JSON_CONTENT_QNAME);
        if (templatePath != null) {
            String template = NotificationManagementUtils.readMessageTemplate(templatePath);
            this.setJsonContent(template);
        } else {
            log.warn("No default json template found for event " + eventName);
        }

        // Sets endpoint information for the event
        String endpointKey = eventKey + "." + JsonModuleConstants.Config.ENDPOINT_QNAME;
        setEndpoints(endpointKey,
                NotificationManagementUtils.getPropertiesWithPrefix(endpointKey, subscriptionProperties));
    }

    /**
     * Set endpoints to the json subscription object
     *
     * @param prefix              Prefix of the endpoint properties key. ie json.subscribe.eventName.endpoint.endpointName
     * @param endpointsProperties Properties which are relevant to endpoint.
     */
    private void setEndpoints(String prefix, Properties endpointsProperties) {

        Properties endpointNames = NotificationManagementUtils.getSubProperties(prefix, endpointsProperties);
        Enumeration endpointNameSet = endpointNames.propertyNames();

        while (endpointNameSet.hasMoreElements()) {
            String key = (String) endpointNameSet.nextElement();
            String endpointName = (String) endpointNames.remove(key);

            String endpointKey = prefix + "." + endpointName;
            Properties endpointProperties = NotificationManagementUtils.getPropertiesWithPrefix(endpointKey,
                    endpointsProperties);

            try {
                endpointInfoList.add(buildEndpoint(endpointKey, endpointProperties));
            } catch (NotificationManagementException e) {
                log.error("Error while building endpoint object with key " + endpointKey, e);
            }
        }
    }

    /**
     * Build JsonEndpointInfo  objects from properties which has the prefix json.subscribe.eventName.endpoint
     * .endpointName
     *
     * @param prefix             prefix of the endpoint properties key. ie json.subscribe.eventName
     *                           .endpoint.endpointName
     * @param endpointProperties properties which has key with prefix. json.subscribe.eventName
     *                           .endpoint.endpointName
     * @return JsonEndpointInfo object build out of properties
     * @throws NotificationManagementException
     */
    private JsonEndpointInfo buildEndpoint(String prefix, Properties endpointProperties)
            throws NotificationManagementException {

        JsonEndpointInfo jsonEndpointInfo = new JsonEndpointInfo();
        String url = (String) endpointProperties.remove(prefix + "." + JsonModuleConstants.Config.ADDRESS_QNAME);
        // If there is no configured json url address, stop building endpoint, throw an exception
        if (StringUtils.isNotEmpty(url)) {
            url = url.trim();
            if (log.isDebugEnabled()) {
                log.debug("Registering json endpoint with address " + url);
            }
            jsonEndpointInfo.setEndpoint(url);
        } else {
            if (log.isDebugEnabled()) {
                log.debug("Registering json endpoint with prefix " + prefix + " without url. Expecting the "
                        + "email url at event time");
            }
        }
        jsonEndpointInfo.setEndpoint(url);
        String template = (String) endpointProperties
                .remove(prefix + "." + JsonModuleConstants.Config.JSON_CONTENT_QNAME);

        if (template != null) {
            //Set the json template configured for endpoint.
            jsonEndpointInfo.setJsonConfigString(NotificationManagementUtils.readMessageTemplate(template.trim()));
        } else {
            // If template is null, subscription level template will be used on the time of
            // sending email
            if (log.isDebugEnabled()) {
                log.debug("No template configured for endpoint" + url);
            }
        }
        jsonEndpointInfo = setAuthenticationInfo(prefix, endpointProperties, jsonEndpointInfo);
        jsonEndpointInfo.setEndpointProperties(
                NotificationManagementUtils.buildSingleWordKeyProperties(prefix, endpointProperties));
        return jsonEndpointInfo;
    }

    /**
     * Sets authentication information to JsonEndpointInfo object
     *
     * @param prefix             json.subscribe.eventName.endpoint.endpointName
     * @param endpointProperties Set of properties which has keys with above prefix
     * @param endpointInfo       JsonEndpointInfo object which needs to be set the authentication
     *                           params
     * @return A JsonEndpointInfo object which has set relevant authentication information if
     * authentication is required
     * @throws NotificationManagementException
     */
    public JsonEndpointInfo setAuthenticationInfo(String prefix, Properties endpointProperties,
            JsonEndpointInfo endpointInfo) throws NotificationManagementException {

        String authenticationRequired = (String) endpointProperties
                .remove(prefix + "." + JsonModuleConstants.Config.AUTH_REQUIRED_QNAME);

        // If authentication required
        if (Boolean.parseBoolean(authenticationRequired)) {
            endpointInfo.setAuthenticationRequired(true);
            String username = (String) endpointProperties
                    .remove(prefix + "." + JsonModuleConstants.Config.USERNAME_QNAME);
            String password = (String) endpointProperties
                    .remove(prefix + "." + JsonModuleConstants.Config.PASSWORD_QNAME);

            if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
                throw new NotificationManagementException(
                        "No authentication information  found for authentication " + "required endpoint");
            }
            endpointInfo.setUsername(username);
            endpointInfo.setPassword(password.trim().toCharArray());
        } else {
            endpointInfo.setAuthenticationRequired(false);
        }
        return endpointInfo;
    }

    public String getJsonContent() {
        return jsonContent;
    }

    public void setJsonContent(String jsonContent) {
        this.jsonContent = jsonContent;
    }

    public List<JsonEndpointInfo> getEndpointInfoList() {
        return endpointInfoList;
    }

    public void setEndpointInfoList(List<JsonEndpointInfo> endpointInfoList) {
        this.endpointInfoList = endpointInfoList;
    }

}