/* * 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; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Enumeration; import java.util.Properties; /** * Util functionality for MessageSending Components */ @SuppressWarnings("unused") public class NotificationManagementUtils { private static final Log log = LogFactory.getLog(NotificationMgtConfigBuilder.class); private NotificationManagementUtils() { } /** * 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 = NotificationManagementUtils.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 (log.isDebugEnabled()) { log.debug("Place holders starting regex : " + replaceRegexStartsWith + ". End regex with : " + replaceRegexEndsWith); log.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 (log.isDebugEnabled()) { log.debug("Replacing place holder with property key :" + key + " from value :" + properties .getProperty(key)); } content = content.replaceAll(replaceRegexStartsWith + key + replaceRegexEndsWith, properties.getProperty(key)); } if (log.isDebugEnabled()) { log.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 (log.isDebugEnabled()) { log.debug("Reading template file in " + filePath); } try { String currentLine; bufferedReader = new BufferedReader(new FileReader(filePath)); StringBuilder templateBuilder = new StringBuilder(); while ((currentLine = bufferedReader.readLine()) != null) { templateBuilder.append(currentLine); templateBuilder.append(System.getProperty("line.separator")); } template = templateBuilder.toString(); } catch (IOException e) { log.error("Error while reading email template from location " + filePath, e); } finally { try { if (bufferedReader != null) { bufferedReader.close(); } } catch (IOException e) { log.error("Error while closing buffered reader after reading file " + filePath, e); } } return template; } }