1 17 18 package org.sape.carbon.core.config.cache; 19 20 import java.util.Collections ; 21 import java.util.HashMap ; 22 import java.util.Map ; 23 24 import org.sape.carbon.core.config.Configuration; 25 import org.sape.carbon.core.config.ConfigurationNotFoundException; 26 import org.sape.carbon.core.config.ConfigurationService; 27 import org.sape.carbon.core.config.format.ConfigurationFormatException; 28 import org.sape.carbon.core.config.node.ConfigurationDocument; 29 import org.sape.carbon.core.config.node.Node; 30 import org.sape.carbon.core.config.node.NodeIOException; 31 import org.sape.carbon.core.config.node.NodeNotFoundException; 32 import org.sape.carbon.core.config.node.event.NodeEventListener; 33 import org.sape.carbon.core.exception.ExceptionUtility; 34 35 import org.apache.commons.logging.Log; 36 import org.apache.commons.logging.LogFactory; 37 38 39 59 public class SynchronizedConfigurationCache 60 implements ConfigurationCache, NodeEventListener { 61 62 63 private Log log = LogFactory.getLog(this.getClass()); 64 65 66 private Map cache = Collections.synchronizedMap(new HashMap ()); 67 68 69 private ConfigurationService configService; 70 71 76 public SynchronizedConfigurationCache(ConfigurationService configService) { 77 this.configService = configService; 78 } 79 80 90 public Configuration getConfiguration(String name) { 91 Configuration config = (Configuration) this.cache.get(name); 92 if (config == null) { 93 config = loadConfiguration(name); 94 } 95 return config; 96 } 97 98 103 public void nodeChanged(Node changedNode) { 104 try { 105 this.cache.clear(); 106 this.cache.put( 107 changedNode.getAbsoluteName(), 108 ((ConfigurationDocument) changedNode).readConfiguration()); 109 110 } catch (NodeIOException nioe) { 111 if (log.isWarnEnabled()) { 112 log.warn("Could not read new configuration: " 113 + ExceptionUtility.printStackTracesToString(nioe)); 114 } 115 } catch (ConfigurationFormatException cfe) { 116 if (log.isWarnEnabled()) { 117 log.warn("Could not read new configuration: " 118 + ExceptionUtility.printStackTracesToString(cfe)); 119 } 120 } 121 } 122 123 128 public void nodeRemoved(String removedNodeName) { 129 this.cache.clear(); 130 } 131 132 141 private synchronized Configuration loadConfiguration(String name) { 142 Configuration config = (Configuration) this.cache.get(name); 147 if (config == null) { 148 try { 149 config = this.configService.fetchWritableConfiguration(name); 150 this.cache.put(name, config); 151 152 if (log.isTraceEnabled()) { 153 log.trace("Marking configuration [" 154 + name 155 + "] as read only"); 156 } 157 config.setConfigurationReadOnly(); 158 this.configService.addNodeListener(name, this); 159 } catch (NodeNotFoundException nnfe) { 160 throw new ConfigurationNotFoundException( 162 this.getClass(), 163 "The configuration [" + name 164 + "] was not found", nnfe); 165 } 166 } 167 return config; 168 } 169 170 } 171 | Popular Tags |