View Javadoc

1   /**
2    * Copyright 2010 The Kuali Foundation Licensed under the
3    * Educational Community License, Version 2.0 (the "License"); you may
4    * not use this file except in compliance with the License. You may
5    * obtain a copy of the License at
6    *
7    * http://www.osedu.org/licenses/ECL-2.0
8    *
9    * Unless required by applicable law or agreed to in writing,
10   * software distributed under the License is distributed on an "AS IS"
11   * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing
13   * permissions and limitations under the License.
14   */
15  
16  package org.kuali.student.common.util;
17  
18  import java.io.File;
19  import java.io.FileInputStream;
20  import java.io.FileNotFoundException;
21  import java.io.IOException;
22  import java.io.InputStream;
23  import java.net.URL;
24  import java.util.HashMap;
25  import java.util.Map;
26  import java.util.Properties;
27  
28  /**
29   * A really freaking simple properties filter that returns a properties map for a subset of a properties file. Give this
30   * method the file name of the properties file, and then give it the prefix to filter on. The prefix gets a "." appended to
31   * it on filtering.
32   * <p>
33   * For example, if the properties are:
34   * <ul>
35   * <li>prop1.test1.value1</li>
36   * <li>prop1.test2.value2</li>
37   * <li>prop2.test1.value1</li>
38   * <li>prop1butnottherealprop1.test3.value3</li>
39   * </ul>
40   * Then filtering on "prop1" returns a map with values:
41   * <ul>
42   * <li>test1.value1</li>
43   * <li>test2.value2</li>
44   * </ul>
45   * </p>
46   * 
47   * @author Kuali Student Team (ks.team2@kuali.org)
48   */
49  public class PropertiesFactory {
50  
51      Properties properties = new Properties();
52  
53      /**
54       * This constructs a PropertiesFactory.
55       * 
56       * @param filename
57       *            the filename of the properties file as determined by {@link ClassLoader#getSystemResource(String)}.
58       * @throws IOException
59       */
60      public PropertiesFactory(String filename) throws IOException {
61          this(ClassLoader.getSystemResource(filename).openStream());
62      }
63  
64      /**
65       * This constructs a PropertiesFactory.
66       * 
67       * @param file
68       *            the properties file
69       * @throws FileNotFoundException
70       * @throws IOException
71       */
72      public PropertiesFactory(File file) throws FileNotFoundException, IOException {
73          this(new FileInputStream(file));
74      }
75  
76      /**
77       * This constructs a PropertiesFactory.
78       * 
79       * @param in
80       *            an InputStream to read the properties from
81       * @throws IOException
82       */
83      public PropertiesFactory(InputStream in) throws IOException {
84          try {
85              properties.load(in);
86          } finally {
87              if (in != null) {
88                  try {
89                      in.close();
90                  } catch (IOException e) {}
91              }
92          }
93      }
94  
95      /**
96       * This method filters the properties based on the prefix given as described above. The prefix will be appended with a
97       * "." delimiter and the returned values will not have either the prefix or the delimiter.
98       * 
99       * @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      *     &lt;bean id=&quot;test&quot; class=&quot;org.kuali.student.common.util.PropertiesFactory&quot; factory-method=&quot;getProperties&quot; &gt;
119      *         &lt;constructor-arg value=&quot;file.properties&quot;/&gt;
120      *         &lt;constructor-arg value=&quot;prefix1&quot;/&gt;
121      *     &lt;/bean&gt;
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 }