1   /* ====================================================================
2    * License: 
3    * 
4    * Redistribution and use in source and binary forms, with or without
5    * modification, are permitted provided that the following conditions
6    * are met:
7    *
8    * 1. Redistributions of source code must retain the above copyright
9    *    notice, this list of conditions and the following disclaimer.
10   *
11   * 2. Redistributions in binary form must reproduce the above copyright
12   *    notice, this list of conditions and the following disclaimer in
13   *    the documentation and/or other materials provided with the
14   *    distribution.
15   *
16   * 3. The end-user documentation included with the redistribution,
17   *    if any, must include the following acknowledgment:
18   *       "This product includes software developed by 
19   *        Robert Half International (http://www.rhi.com/)."
20   *    Alternately, this acknowledgment may appear in the software itself,
21   *    if and wherever such third-party acknowledgments normally appear.
22   *
23   * 4. The names "Parc", "RHI", and "Robert Half International" must
24   *    not be used to endorse or promote products derived from this
25   *    software without prior written permission. For written
26   *    permission, please contact pete.mckinstry@rhi.com.
27   *
28   * 5. Products derived from this software may not be called "PARC",
29   *    nor may "PARC" appear in their name, without prior written
30   *    permission of Robert Half International.
31   *
32   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
33   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
34   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
35   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
36   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
37   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
38   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
39   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
40   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
41   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
42   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43   * SUCH DAMAGE.
44   * ====================================================================
45   *
46   */
47  package com.rhi.architecture.resource;
48  
49  
50  import java.util.ArrayList;
51  import java.util.Collections;
52  import java.util.Enumeration;
53  import java.util.List;
54  import java.util.Properties;
55  import java.util.StringTokenizer;
56  
57  /***
58   * ResourceParserImpl.java
59   * 
60   * @author <a href="mailto:pete_mckinstry@yahoo.com">Pete McKinstry</a>
61   * @copyright 2002, Robert Half Interational, All rights reserved.
62   * 
63   * @version 1.0
64   */
65  public class ResourceParserImpl implements ResourceParser {
66  
67     /***
68      * separator between resource entries in the config data
69      */
70     public static final String SEP = ".";
71  
72     /***
73      * Constructor
74      * 
75      * @see java.lang.Object#Object()
76      */
77     public ResourceParserImpl() {
78         super();
79     }
80  
81     /***
82      * Find Resource configuration entries and sort them into whatever 
83      * order the ResouceContext should use for loading.
84      * 
85      * @param p
86      * @return List
87      * @throws InitializationException
88      */
89     public List getResources(Properties p) throws InitializationException {
90        ArrayList list = new ArrayList();
91  
92        Enumeration enum = p.propertyNames();
93  
94        while (enum.hasMoreElements()) {
95           String resourceName = (String) enum.nextElement();
96           // Skip non-resources
97           if (!resourceName.startsWith("Resource.")) {
98              continue;
99           }
100 
101          ResourceEntry resource = null;
102 
103          try {
104             int firstSep = resourceName.indexOf(SEP);
105             char significantDigit = resourceName.charAt(firstSep + 1);
106             if (Character.isDigit(significantDigit) == false) {
107                resource = buildDefaultPriorityResource(resourceName, p);
108             }
109             else {
110                resource = buildResource(resourceName, p);
111             }
112          }
113          catch (IndexOutOfBoundsException e) {
114             throw new InitializationException(e);
115          }
116 
117          if (resource != null) {
118             list.add(resource);
119          }
120       }
121 
122       // sort into correct order.
123       Collections.sort(list);
124 
125       return list;
126    }
127 
128    /***
129     * Build entries that follow the new naming standard of 
130     * Resource.<priority>.<name>
131     * 
132     * @param resourceName
133     * @param env
134     * @return ResourceEntry
135     * @throws InitializationException
136     */
137    private ResourceEntry buildResource(
138       String resourceName,
139       Properties env)
140       throws InitializationException {
141       ResourceEntry resource = new ResourceEntry();
142 
143       // format is Resource.<priority>.<name>
144       StringTokenizer tokenizer = new StringTokenizer(resourceName, SEP);
145       if (tokenizer.countTokens() != 3) {
146          throw new InitializationException(
147             "Invalid Resource Entry = " + resourceName);
148       }
149       String firstPart = tokenizer.nextToken();
150       String priorityString = tokenizer.nextToken();
151       int priority = Integer.parseInt(priorityString);
152       String secondPart = tokenizer.nextToken();
153       resource.setKey(firstPart + SEP + secondPart);
154       resource.setPriority(priority);
155       resource.setType(env.getProperty(resourceName).trim());
156       return resource;
157    }
158 
159    /***
160     * Supports old model for backward compatibility. If no priority is 
161     * specified, it will use 0 & load w/ other 0's...
162     * 
163     * @param resourceName
164     * @param env
165     * @return ResourceEntry
166     */
167    private ResourceEntry buildDefaultPriorityResource(
168       String resourceName,
169       Properties env) {
170       // old format is Resource.<name>
171       // priority is defaulted to 0.
172       ResourceEntry resource = new ResourceEntry();
173       resource.setKey(resourceName);
174       resource.setType(env.getProperty(resourceName).trim());
175       return resource;
176    }
177 
178 }
This page was automatically generated by Maven