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 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 for (int i = 0; i < factoryList.size(); i++) 41 { 42 addFactory((Node) factoryList.get(i)); 43 } 44 45 for (int i = 0; i < factoryList.size(); i++) 47 { 48 setFactoryProperties((Node) factoryList.get(i)); 49 } 50 } 51 52 53 public String getConfiguredCacheProperty(String property, String cacheName) throws ConfigurationException 54 { 55 56 String [] cacheNameTokens = PropertiesTree.tokenize(cacheName); 57 Node node = rootNode.getRequiredNode("cache").getRequiredNode(property); 58 String 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 name = factoryNode.getKey(); 87 String factoryClassName = factoryNode.getValue(); 88 Class 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 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 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 cacheName, BeanWrapper factoryWrapper, String name, String value) throws ConfigurationException 126 { 127 128 CacheFactory factory; 129 130 try 131 { 132 Class 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 e) 153 { 154 throw new ConfigurationException(e); 155 } 156 } 157 158 159 public CacheFactory getFactory(String name) 160 { 161 return (CacheFactory) factories.get(name); 162 } 163 } 164 | Popular Tags |