001/**
002 * Copyright 2005-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package edu.samplu.common;
017
018import java.io.IOException;
019import java.io.InputStream;
020import java.util.ArrayList;
021import java.util.Enumeration;
022import java.util.HashMap;
023import java.util.Iterator;
024import java.util.LinkedList;
025import java.util.List;
026import java.util.Map;
027import java.util.Properties;
028
029/**
030 * @author Kuali Rice Team (rice.collab@kuali.org)
031 */
032
033public class PropertiesUtils {
034
035
036    public static Properties loadPropertiesWithSystemOverrides(InputStream inputStream) throws IOException {
037        Properties props = PropertiesUtils.loadProperties(inputStream);
038        PropertiesUtils.systemPropertiesOverride(props);
039        return props;
040    }
041
042    public static Properties loadPropertiesWithSystemOverridesAndNumberedPropertiesToList(InputStream inputStream) throws IOException {
043        Properties props = PropertiesUtils.loadProperties(inputStream);
044        PropertiesUtils.systemPropertiesOverride(props);
045        PropertiesUtils.transformNumberedPropertiesToList(props);
046        return props;
047    }
048
049    public static Properties loadProperties(InputStream inputStream) throws IOException {
050        Properties props = new Properties();
051
052        if(inputStream != null) {
053            props.load(inputStream);
054        }
055
056        return props;
057    }
058
059    public static String removeNumber(final String numberedKey) {
060        String unnumberedKey = numberedKey;
061        int firstNumberIndex = unnumberedKey.length() - 1;
062        while (Character.isDigit(unnumberedKey.charAt(firstNumberIndex))) {
063            firstNumberIndex--;
064        }
065        unnumberedKey = unnumberedKey.substring(0, firstNumberIndex + 1);
066
067        return unnumberedKey;
068    }
069
070    public static void systemPropertiesOverride(Properties props) {
071        PropertiesUtils.systemPropertiesOverride(props, null);
072    }
073
074    /**
075     * -Dkey.propertyname= to override the property value for propertyname.
076     * @param props properties to update with System.getProperty overrides.
077     * @param key optional value that the property names will be appended to.
078     */
079    public static void systemPropertiesOverride(Properties props, String key) {
080        Enumeration<?> names = props.propertyNames();
081        Object nameObject;
082        String name;
083        while (names.hasMoreElements()) {
084
085            nameObject = names.nextElement();
086            if (nameObject instanceof String) {
087
088                name = (String)nameObject;
089                if (key == null || key.isEmpty()) {
090                    props.setProperty(name, System.getProperty(name, props.getProperty(name)));
091                } else {
092                    props.setProperty(name, System.getProperty(key + "." + name, props.getProperty(name)));
093                }
094            }
095        }
096    }
097
098    public static void transformNumberedPropertiesToList(Properties props) {
099        String key = null;
100        String unnumberedKey = null;
101        List<String> keyList = null;
102        List<String> removeKeys = new LinkedList<String>();
103
104        // unnumber keys and place their values in a list
105        Iterator keys = props.keySet().iterator();
106        Map<String, List<String>> keysLists = new HashMap<String, List<String>>();
107        while (keys.hasNext()) {
108            key = (String)keys.next();
109            if (Character.isDigit(key.charAt(key.length()-1))) {
110                unnumberedKey = removeNumber(key);
111                if (keysLists.get(unnumberedKey) == null) {
112                    keyList = new ArrayList<String>();
113                    keyList.add(props.getProperty(key));
114                    keysLists.put(unnumberedKey, keyList);
115                    removeKeys.add(key);
116                } else {
117                    keyList = keysLists.get(unnumberedKey);
118                    keyList.add(props.getProperty(key));
119                    keysLists.put(unnumberedKey, keyList);
120                    removeKeys.add(key);
121                }
122            }
123        }
124
125        // remove keys that where unnumbered
126        Iterator removeKey = removeKeys.iterator();
127        while (removeKey.hasNext()) {
128            key = (String)removeKey.next();
129            props.remove(key);
130        }
131
132        // put new unnumbered key values mapped by unnumber key with an s appended to it.
133        Iterator newKeys = keysLists.keySet().iterator();
134        String newKey = null;
135        while (newKeys.hasNext()) {
136            newKey = (String)newKeys.next();
137            props.put(newKey + "s", keysLists.get(newKey));
138        }
139    }
140}