KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > shiftone > cache > config > ConfigurationInternals


1 package org.shiftone.cache.config;
2
3
4
5 import org.shiftone.cache.CacheFactory;
6 import org.shiftone.cache.ConfigurationException;
7 import org.shiftone.cache.policy.zero.ZeroCacheFactory;
8 import org.shiftone.cache.util.Log;
9
10 import java.util.*;
11
12
13 /**
14  * @version $Revision: 1.9 $
15  * @author <a HREF="mailto:jeff@shiftone.org">Jeff Drost</a>
16  */

17 public class ConfigurationInternals
18 {
19
20     private static final Log LOG = new Log(ConfigurationInternals.class);
21     private Map factories = new Hashtable();
22     Node rootNode;
23
24     public ConfigurationInternals(Properties properties) throws ConfigurationException
25     {
26
27         PropertiesTree tree = new PropertiesTree(properties);
28
29         rootNode = tree.getRoot();
30
31         Node factoryNode = rootNode.getRequiredNode("factory");
32         Node titleNode = rootNode.getRequiredNode("title");
33         Node versionNode = rootNode.getRequiredNode("version");
34         List factoryList = new ArrayList(factoryNode.getChildren());
35
36         LOG.info(titleNode.getValue() + " v" + versionNode.getValue());
37         rootNode.print();
38
39         // pass one (create stage)
40
for (int i = 0; i < factoryList.size(); i++)
41         {
42             addFactory((Node) factoryList.get(i));
43         }
44
45         // pass two - set property stage
46
for (int i = 0; i < factoryList.size(); i++)
47         {
48             setFactoryProperties((Node) factoryList.get(i));
49         }
50     }
51
52
53     public String JavaDoc getConfiguredCacheProperty(String JavaDoc property, String JavaDoc cacheName) throws ConfigurationException
54     {
55
56         String JavaDoc[] cacheNameTokens = PropertiesTree.tokenize(cacheName);
57         Node node = rootNode.getRequiredNode("cache").getRequiredNode(property);
58         String JavaDoc value = node.getValue();
59
60         for (int i = 0; i < cacheNameTokens.length; i++)
61         {
62             LOG.debug(i + " => " + cacheNameTokens[i]);
63
64             if (node.hasNode(cacheNameTokens[i]))
65             {
66                 node = node.getNode(cacheNameTokens[i]);
67
68                 if (node.getValue() != null)
69                 {
70                     value = node.getValue();
71                 }
72             }
73             else
74             {
75                 break;
76             }
77         }
78
79         return value;
80     }
81
82
83     private void addFactory(Node factoryNode) throws ConfigurationException
84     {
85
86         String JavaDoc name = factoryNode.getKey();
87         String JavaDoc factoryClassName = factoryNode.getValue();
88         Class JavaDoc factoryClass;
89         CacheFactory cacheFactory;
90
91         try
92         {
93             factoryClass = Class.forName(factoryClassName);
94             cacheFactory = (CacheFactory) factoryClass.newInstance();
95
96             factories.put(name, cacheFactory);
97         }
98         catch (Exception JavaDoc e)
99         {
100             throw new ConfigurationException("unable to create factory : " + name + "=" + factoryClassName, e);
101         }
102     }
103
104
105     private void setFactoryProperties(Node factoryNode) throws ConfigurationException
106     {
107
108         String JavaDoc name = factoryNode.getKey();
109         CacheFactory cacheFactory = getFactory(name);
110         BeanWrapper wrapper = new BeanWrapper(cacheFactory);
111         Iterator iterator = factoryNode.getChildren().iterator();
112         Node node;
113
114         while (iterator.hasNext())
115         {
116             node = (Node) iterator.next();
117
118             setFactoryProperty(name, wrapper, node.getKey(), node.getValue());
119         }
120
121         LOG.debug(name + " => " + cacheFactory);
122     }
123
124
125     private void setFactoryProperty(String JavaDoc cacheName, BeanWrapper factoryWrapper, String JavaDoc name, String JavaDoc value) throws ConfigurationException
126     {
127
128         CacheFactory factory;
129
130         try
131         {
132             Class JavaDoc type = factoryWrapper.getType(name);
133
134             if (CacheFactory.class.isAssignableFrom(type))
135             {
136                 factory = getFactory(value);
137
138                 if (factory == null)
139                 {
140                     LOG.warn("factory '" + value + "' is not defined. Property '" + name + "' can not be set on '" + cacheName + "'. Setting zero cache factory instead.");
141
142                     factory = ZeroCacheFactory.NULL_CACHE_FACTORY;
143                 }
144
145                 factoryWrapper.setProperty(name, factory);
146             }
147             else
148             {
149                 factoryWrapper.setProperty(name, value);
150             }
151         }
152         catch (Exception JavaDoc e)
153         {
154             throw new ConfigurationException(e);
155         }
156     }
157
158
159     public CacheFactory getFactory(String JavaDoc name)
160     {
161         return (CacheFactory) factories.get(name);
162     }
163 }
164
Popular Tags