1 87 package org.codehaus.loom.components.configuration; 88 89 import java.io.File ; 90 import java.io.FileOutputStream ; 91 import java.io.IOException ; 92 import java.util.HashMap ; 93 import java.util.Map ; 94 import javax.xml.transform.stream.StreamResult ; 95 96 import org.codehaus.loom.components.configuration.merger.ConfigurationMerger; 97 import org.codehaus.loom.components.util.ExtensionFileFilter; 98 import org.codehaus.loom.interfaces.ConfigurationInterceptor; 99 import org.codehaus.spice.salt.i18n.ResourceManager; 100 import org.codehaus.spice.salt.i18n.Resources; 101 import org.codehaus.spice.salt.io.FileUtil; 102 import org.codehaus.dna.AbstractLogEnabled; 103 import org.codehaus.dna.Active; 104 import org.codehaus.dna.Configurable; 105 import org.codehaus.dna.Configuration; 106 import org.codehaus.dna.ConfigurationException; 107 import org.codehaus.dna.impl.ConfigurationUtil; 108 import org.xml.sax.InputSource ; 109 110 119 public class FileSystemPersistentConfigurationInterceptor 120 extends AbstractLogEnabled 121 implements ConfigurationInterceptor, Configurable, Active 122 { 123 private static final Resources REZ = 124 ResourceManager.getPackageResources( 125 FileSystemPersistentConfigurationInterceptor.class ); 126 127 private final Map m_persistedConfigurations = new HashMap (); 128 129 private File m_storageDirectory; 130 private String m_debugPath; 131 132 public void configure( final Configuration configuration ) 133 throws ConfigurationException 134 { 135 final String path = 136 configuration.getChild( "storage-directory" ).getValue(); 137 m_storageDirectory = new File ( FileUtil.normalize( path ) ); 138 139 try 140 { 141 FileUtil.forceMkdir( m_storageDirectory ); 142 } 143 catch( IOException e ) 144 { 145 final String message = REZ.format( "config.error.dir.invalid", 146 m_storageDirectory ); 147 148 throw new ConfigurationException( message, e ); 149 } 150 151 m_debugPath = 152 configuration.getChild( "debug-output-path" ).getValue( null ); 153 } 154 155 public Configuration processConfiguration( final String application, 156 final String block, 157 final Configuration configuration ) 158 throws ConfigurationException 159 { 160 final Configuration processedConfiguration = 161 doProcessConfiguration( application, block, configuration ); 162 163 if( null != m_debugPath ) 164 { 165 writeDebugConfiguration( application, 166 block, 167 processedConfiguration ); 168 } 169 170 return processedConfiguration; 171 } 172 173 private Configuration doProcessConfiguration( final String application, 174 final String block, 175 final Configuration configuration ) 176 throws ConfigurationException 177 { 178 final Configuration persistedConfiguration = 179 (Configuration)m_persistedConfigurations.get( 180 genKey( application, block ) ); 181 182 if( null != persistedConfiguration ) 183 { 184 return ConfigurationMerger.merge( persistedConfiguration, 185 configuration ); 186 } 187 else 188 { 189 return configuration; 190 } 191 } 192 193 public void initialize() 194 throws Exception 195 { 196 loadConfigurations(); 197 198 if( null != m_debugPath ) 199 { 200 FileUtil.forceMkdir( new File ( m_debugPath ) ); 201 } 202 } 203 204 public void dispose() 205 throws Exception 206 { 207 } 208 209 private void loadConfigurations() 210 throws Exception 211 { 212 final File [] apps = m_storageDirectory.listFiles( 213 new ConfigurationDirectoryFilter() ); 214 for( int i = 0; i < apps.length; i++ ) 215 { 216 loadConfigurations( apps[ i ] ); 217 } 218 } 219 220 private void loadConfigurations( final File appPath ) 221 throws Exception 222 { 223 final String app = appPath.getName(); 224 final File [] blocks = appPath.listFiles( 225 new ExtensionFileFilter( ".xml" ) ); 226 227 for( int i = 0; i < blocks.length; i++ ) 228 { 229 final String block = 230 blocks[ i ].getName().substring( 0, 231 blocks[ i ].getName().indexOf( 232 ".xml" ) ); 233 234 final InputSource input = new InputSource ( 235 blocks[ i ].getAbsolutePath() ); 236 final Configuration configuration = 237 ConfigurationUtil.buildFromXML( input ); 238 m_persistedConfigurations.put( genKey( app, block ), 239 configuration ); 240 241 if( getLogger().isDebugEnabled() ) 242 { 243 getLogger().debug( "Loaded persistent configuration [app: " + 244 app 245 + ", block: " + block + "]" ); 246 } 247 } 248 } 249 250 private String genKey( final String app, final String block ) 251 { 252 return app + '-' + block; 253 } 254 255 private void writeDebugConfiguration( final String application, 256 final String block, 257 final Configuration configuration ) 258 { 259 try 260 { 261 final File temp = File.createTempFile( 262 application + "-" + block + "-", 263 ".xml", 264 new File ( m_debugPath ) ); 265 final StreamResult result = 266 new StreamResult ( new FileOutputStream ( temp ) ); 267 ConfigurationUtil.serializeToResult( result, configuration ); 268 269 if( getLogger().isDebugEnabled() ) 270 { 271 final String message = "Configuration written at: " + temp; 272 getLogger().debug( message ); 273 } 274 } 275 catch( final Exception e ) 276 { 277 final String message = "Unable to write debug output"; 278 getLogger().error( message, e ); 279 } 280 } 281 } 282 | Popular Tags |