001 /**
002 * Copyright 2010 The Kuali Foundation Licensed under the
003 * Educational Community License, Version 2.0 (the "License"); you may
004 * not use this file except in compliance with the License. You may
005 * obtain a copy of the License at
006 *
007 * http://www.osedu.org/licenses/ECL-2.0
008 *
009 * Unless required by applicable law or agreed to in writing,
010 * software distributed under the License is distributed on an "AS IS"
011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
012 * or implied. See the License for the specific language governing
013 * permissions and limitations under the License.
014 */
015
016 package org.kuali.student.common.util;
017
018 import java.io.File;
019 import java.io.FileInputStream;
020 import java.io.FileNotFoundException;
021 import java.io.IOException;
022 import java.io.InputStream;
023 import java.net.URL;
024 import java.util.HashMap;
025 import java.util.Map;
026 import java.util.Properties;
027
028 /**
029 * A really freaking simple properties filter that returns a properties map for a subset of a properties file. Give this
030 * method the file name of the properties file, and then give it the prefix to filter on. The prefix gets a "." appended to
031 * it on filtering.
032 * <p>
033 * For example, if the properties are:
034 * <ul>
035 * <li>prop1.test1.value1</li>
036 * <li>prop1.test2.value2</li>
037 * <li>prop2.test1.value1</li>
038 * <li>prop1butnottherealprop1.test3.value3</li>
039 * </ul>
040 * Then filtering on "prop1" returns a map with values:
041 * <ul>
042 * <li>test1.value1</li>
043 * <li>test2.value2</li>
044 * </ul>
045 * </p>
046 *
047 * @author Kuali Student Team (ks.team2@kuali.org)
048 */
049 public class PropertiesFactory {
050
051 Properties properties = new Properties();
052
053 /**
054 * This constructs a PropertiesFactory.
055 *
056 * @param filename
057 * the filename of the properties file as determined by {@link ClassLoader#getSystemResource(String)}.
058 * @throws IOException
059 */
060 public PropertiesFactory(String filename) throws IOException {
061 this(ClassLoader.getSystemResource(filename).openStream());
062 }
063
064 /**
065 * This constructs a PropertiesFactory.
066 *
067 * @param file
068 * the properties file
069 * @throws FileNotFoundException
070 * @throws IOException
071 */
072 public PropertiesFactory(File file) throws FileNotFoundException, IOException {
073 this(new FileInputStream(file));
074 }
075
076 /**
077 * This constructs a PropertiesFactory.
078 *
079 * @param in
080 * an InputStream to read the properties from
081 * @throws IOException
082 */
083 public PropertiesFactory(InputStream in) throws IOException {
084 try {
085 properties.load(in);
086 } finally {
087 if (in != null) {
088 try {
089 in.close();
090 } catch (IOException e) {}
091 }
092 }
093 }
094
095 /**
096 * This method filters the properties based on the prefix given as described above. The prefix will be appended with a
097 * "." delimiter and the returned values will not have either the prefix or the delimiter.
098 *
099 * @param prefix
100 * the prefix to filter on
101 * @return a map of the properties minus their prefix. This list is really String,Object, oh well.
102 */
103 public Map<Object, Object> getProperties(String prefix) {
104 Map<Object, Object> map = new HashMap<Object, Object>();
105 for (Object key : properties.keySet()) {
106 String realPrefix = prefix + ".";
107 String keyString = key.toString();
108 if (keyString.startsWith(realPrefix)) {
109 map.put(keyString.substring(realPrefix.length()), properties.get(key));
110 }
111 }
112
113 return map;
114 }
115
116 /**
117 * A static version of the properties filter. <code><pre>
118 * <bean id="test" class="org.kuali.student.common.util.PropertiesFactory" factory-method="getProperties" >
119 * <constructor-arg value="file.properties"/>
120 * <constructor-arg value="prefix1"/>
121 * </bean>
122 * </pre></code>
123 *
124 * @param filename
125 * @param prefix
126 * the prefix to filter on
127 * @return a map of the properties minus their prefix. This list is really String,Object, oh well.
128 * @throws IOException
129 */
130 public static Map<Object, Object> getProperties(String filename, String prefix) throws IOException {
131 Properties props = new Properties();
132 InputStream in = null;
133 URL propFile = ClassLoader.getSystemResource(filename);
134 // System.out.println("\t===PROPFACT: "+propFile);
135 try {
136 props.load(in = propFile.openStream());
137 } finally {
138 if (in != null) {
139 try {
140 in.close();
141 } catch (IOException e) {}
142 }
143 }
144
145 Map<Object, Object> map = new HashMap<Object, Object>();
146 for (Object key : props.keySet()) {
147 String realPrefix = prefix + ".";
148 String keyString = key.toString();
149 if (keyString.startsWith(realPrefix)) {
150 map.put(keyString.substring(realPrefix.length()), props.get(key));
151 }
152 }
153
154 return map;
155 }
156
157 }