org.wso2.carbon.identity.event.internal.EventUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.identity.event.internal.EventUtils.java

Source

/*
 * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.wso2.carbon.identity.event.internal;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import java.util.Properties;

/**
 * Util functionality for MessageSending Components.
 */
@SuppressWarnings("unused")
public class EventUtils {

    private static final Logger logger = LoggerFactory.getLogger(EventUtils.class);

    private EventUtils() {
    }

    /**
     * Returns a set of properties which has keys starting with the given prefix.
     *
     * @param prefix     prefix of the property key
     * @param properties Set of properties which needs be filtered for the given prefix
     * @return A set of properties which has keys starting with given prefix
     */
    public static Properties getPropertiesWithPrefix(String prefix, Properties properties) {

        if (StringUtils.isEmpty(prefix) || properties == null) {
            throw new IllegalArgumentException(
                    "Prefix and properties should not be null to extract properties with " + "certain prefix");
        }

        Properties subProperties = new Properties();
        Enumeration propertyNames = properties.propertyNames();

        while (propertyNames.hasMoreElements()) {
            String key = (String) propertyNames.nextElement();
            if (key.startsWith(prefix)) {
                // Remove from original properties to hold property schema. ie need to get the set of properties which
                // remains after consuming all required specific properties
                subProperties.setProperty(key, (String) properties.remove(key));
            }
        }
        return subProperties;
    }

    /**
     * Returns a sub set of properties which has the given prefix key. ie properties which has numbers at the end
     *
     * @param prefix     Prefix of the key
     * @param properties Set of properties which needs be filtered for the given prefix
     * @return Set of sub properties which has keys starting with given prefix
     */
    public static Properties getSubProperties(String prefix, Properties properties) {

        // Stop proceeding if required arguments are not present
        if (StringUtils.isEmpty(prefix) || properties == null) {
            throw new IllegalArgumentException("Prefix and Properties should not be null to get sub properties");
        }

        int i = 1;
        Properties subProperties = new Properties();
        while (properties.getProperty(prefix + "." + i) != null) {
            // Remove from original properties to hold property schema. ie need to get the set of properties which
            // remains after consuming all required specific properties
            subProperties.put(prefix + "." + i, properties.remove(prefix + "." + i++));
        }
        return subProperties;
    }

    /**
     * @param prefix                 Prefix of the property key
     * @param propertiesWithFullKeys Set of properties which needs to be converted to single word key properties
     * @return Set of properties which has keys containing single word.
     */
    public static Properties buildSingleWordKeyProperties(String prefix, Properties propertiesWithFullKeys) {

        // Stop proceeding if required arguments are not present
        if (StringUtils.isEmpty(prefix) || propertiesWithFullKeys == null) {
            throw new IllegalArgumentException(
                    "Prefix and properties should not be null to get  properties with " + "single word keys.");
        }

        propertiesWithFullKeys = EventUtils.getPropertiesWithPrefix(prefix, propertiesWithFullKeys);
        Properties properties = new Properties();
        Enumeration propertyNames = propertiesWithFullKeys.propertyNames();

        while (propertyNames.hasMoreElements()) {
            String key = (String) propertyNames.nextElement();
            String newKey = key.substring(key.lastIndexOf(".") + 1, key.length());
            if (!newKey.trim().isEmpty()) {
                // Remove from original properties to hold property schema. ie need to get the set of properties which
                // remains after consuming all required specific properties
                properties.put(newKey, propertiesWithFullKeys.remove(key));
            }
        }
        return properties;
    }

    /**
     * Replace place holders in the given string with properties.
     *
     * @param content                Original content of the message which has place holders
     * @param replaceRegexStartsWith Placeholders starting regex
     * @param replaceRegexEndsWith   Placeholders ending regex
     * @param properties             Set of properties which are to be used for replacing
     * @return New content, place holders are replaced
     */
    public static String replacePlaceHolders(String content, String replaceRegexStartsWith,
            String replaceRegexEndsWith, Properties properties) {

        // Stop proceeding if required arguments are not present
        if (properties == null || StringUtils.isEmpty(content) || StringUtils.isEmpty(replaceRegexEndsWith)
                || StringUtils.isEmpty(replaceRegexStartsWith)) {
            throw new IllegalArgumentException("Missing required arguments for replacing place holders");
        }

        if (logger.isDebugEnabled()) {
            logger.debug("Place holders starting regex : " + replaceRegexStartsWith + ". End regex with : "
                    + replaceRegexEndsWith);
            logger.debug("Replacing place holders of String " + content);
        }
        // For each property check whether there is a place holder and replace the place
        // holders exist.
        for (String key : properties.stringPropertyNames()) {
            if (logger.isDebugEnabled()) {
                logger.debug("Replacing place holder with property key :" + key + " from value :"
                        + properties.getProperty(key));
            }
            content = content.replaceAll(replaceRegexStartsWith + key + replaceRegexEndsWith,
                    properties.getProperty(key));
        }
        if (logger.isDebugEnabled()) {
            logger.debug("Place holders replaced String " + content);
        }
        return content;
    }

    /**
     * Read the file which is in given path and build the message template.
     *
     * @param filePath Path of the message template file
     * @return String which contains message template
     */
    public static String readMessageTemplate(String filePath) {

        BufferedReader bufferedReader = null;
        String template = null;
        // Stop proceeding if required arguments are not present
        if (StringUtils.isEmpty(filePath)) {
            throw new IllegalArgumentException("File path should not be empty");
        }

        // Reading the content of the file
        if (logger.isDebugEnabled()) {
            logger.debug("Reading template file in " + filePath);
        }
        try {
            String currentLine;
            bufferedReader = new BufferedReader(
                    new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8));
            StringBuilder templateBuilder = new StringBuilder();

            while ((currentLine = bufferedReader.readLine()) != null) {
                templateBuilder.append(currentLine);
                templateBuilder.append(System.getProperty("line.separator"));
            }
            template = templateBuilder.toString();

        } catch (IOException e) {
            logger.error("Error while reading email template from location " + filePath, e);

        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                logger.error("Error while closing buffered reader after reading file " + filePath, e);
            }
        }
        return template;
    }
}