1 87 package org.codehaus.loom.components.classloader; 88 89 import java.io.File ; 90 import java.net.URL ; 91 import java.security.Policy ; 92 import java.util.Collections ; 93 import java.util.HashMap ; 94 import java.util.Map ; 95 96 import org.codehaus.loom.classman.builder.LoaderBuilder; 97 import org.codehaus.loom.classman.builder.LoaderResolver; 98 import org.codehaus.loom.classman.metadata.ClassLoaderMetaData; 99 import org.codehaus.loom.classman.metadata.ClassLoaderSetMetaData; 100 import org.codehaus.loom.classman.metadata.FileSetMetaData; 101 import org.codehaus.loom.classman.metadata.JoinMetaData; 102 import org.codehaus.loom.classman.reader.ClassLoaderSetReader; 103 import org.codehaus.loom.classman.verifier.ClassLoaderVerifier; 104 import org.codehaus.loom.components.extensions.pkgmgr.ExtensionManager; 105 import org.codehaus.loom.components.extensions.pkgmgr.PackageManager; 106 import org.codehaus.loom.extension.Extension; 107 import org.codehaus.loom.interfaces.ClassLoaderManager; 108 import org.codehaus.loom.interfaces.ClassLoaderSet; 109 import org.codehaus.loom.xmlpolicy.builder.PolicyBuilder; 110 import org.codehaus.loom.xmlpolicy.metadata.PolicyMetaData; 111 import org.codehaus.loom.xmlpolicy.reader.PolicyReader; 112 import org.codehaus.spice.configkit.PropertyExpander; 113 import org.codehaus.dna.AbstractLogEnabled; 114 import org.codehaus.dna.Active; 115 import org.codehaus.dna.Composable; 116 import org.codehaus.dna.Configuration; 117 import org.codehaus.dna.ConfigurationException; 118 import org.codehaus.dna.MissingResourceException; 119 import org.codehaus.dna.ResourceLocator; 120 import org.codehaus.dna.impl.ConfigurationUtil; 121 import org.w3c.dom.Element ; 122 123 137 public class DefaultClassLoaderManager 138 extends AbstractLogEnabled 139 implements ClassLoaderManager, Composable, Active 140 { 141 145 private static final String CLASSLOADERS_ELEMENT = "classloaders"; 146 147 151 private PackageManager m_packageManager; 152 153 156 private ClassLoader m_commonClassLoader; 157 158 161 private final ClassLoaderVerifier m_verifier = new ClassLoaderVerifier(); 162 163 166 private final LoaderBuilder m_builder = new LoaderBuilder(); 167 168 172 private final ClassLoaderSetReader m_reader = new ClassLoaderSetReader(); 173 174 178 private Map m_predefinedLoaders; 179 180 183 private final Map m_data = new HashMap (); 184 185 189 private final PropertyExpander m_expander = new PropertyExpander(); 190 191 195 public void compose( final ResourceLocator locator ) 196 throws MissingResourceException 197 { 198 final ExtensionManager extensionManager = (ExtensionManager) locator.lookup( 199 ExtensionManager.class.getName() ); 200 m_packageManager = new PackageManager( extensionManager ); 201 m_commonClassLoader = (ClassLoader ) locator.lookup( 202 ClassLoader .class.getName() + "/common" ); 203 } 204 205 210 public void initialize() throws Exception 211 { 212 m_data.putAll( System.getProperties() ); 213 214 final Map defined = new HashMap (); 215 defined.put( "*system*", ClassLoader.getSystemClassLoader() ); 216 defined.put( "*common*", m_commonClassLoader ); 217 defined.put( "*shared*", m_commonClassLoader ); 218 m_predefinedLoaders = Collections.unmodifiableMap( defined ); 219 } 220 221 public void dispose() throws Exception 222 { 223 } 224 225 236 public ClassLoaderSet createClassLoaderSet( 237 final Configuration environment, 238 final Map data, 239 final File homeDirectory, 240 final File workDirectory ) throws Exception 241 { 242 final Configuration policyConfig = environment.getChild( "policy" ); 244 final Policy policy = configurePolicy( policyConfig, 245 data, 246 homeDirectory, 247 workDirectory ); 248 249 final ClassLoaderSetMetaData metaData = getLoaderMetaData( environment ); 250 251 m_verifier.verifyClassLoaderSet( metaData ); 252 253 final LoaderResolver resolver = new SarLoaderResolver( 254 m_packageManager, policy, homeDirectory, workDirectory ); 255 setupLogger( resolver ); 256 final Map map = m_builder.buildClassLoaders( metaData, 257 resolver, 258 m_predefinedLoaders ); 259 final ClassLoader defaultClassLoader = (ClassLoader ) map.get( 260 metaData.getDefault() ); 261 return new ClassLoaderSet( defaultClassLoader, map ); 262 } 263 264 272 private ClassLoaderSetMetaData getLoaderMetaData( 273 final Configuration environment ) throws Exception 274 { 275 final boolean loaderDefined = isClassLoaderDefined( environment ); 276 if( !loaderDefined ) 277 { 278 return createDefaultLoaderMetaData(); 279 } 280 else 281 { 282 final Configuration loaderConfig = environment.getChild( 283 CLASSLOADERS_ELEMENT ); 284 final Element element = ConfigurationUtil.toElement( loaderConfig ); 285 return m_reader.build( element ); 286 } 287 } 288 289 296 private ClassLoaderSetMetaData createDefaultLoaderMetaData() 297 { 298 final String [] includes = new String []{"SAR-INF/lib/*.jar"}; 299 final String [] excludes = new String [ 0 ]; 300 final FileSetMetaData fileSet = new FileSetMetaData( ".", 301 includes, 302 excludes ); 303 final String name = "default"; 304 final String parent = "*system*"; 305 final String [] entrys = new String []{"SAR-INF/classes/"}; 306 final Extension[] extensions = new Extension[ 0 ]; 307 final FileSetMetaData[] filesets = new FileSetMetaData[]{fileSet}; 308 final ClassLoaderMetaData loader = new ClassLoaderMetaData( name, 309 parent, 310 entrys, 311 extensions, 312 filesets ); 313 final String [] predefined = new String []{parent}; 314 final ClassLoaderMetaData[] classLoaders = new ClassLoaderMetaData[]{ 315 loader}; 316 final JoinMetaData[] joins = new JoinMetaData[ 0 ]; 317 return new ClassLoaderSetMetaData( name, 318 predefined, 319 classLoaders, 320 joins ); 321 } 322 323 331 private boolean isClassLoaderDefined( final Configuration environment ) 332 { 333 return null != environment.getChild( CLASSLOADERS_ELEMENT, false ); 334 } 335 336 344 private Policy configurePolicy( final Configuration configuration, 345 final Map data, 346 final File baseDirectory, 347 final File workDirectory ) 348 throws Exception 349 { 350 final SarPolicyResolver resolver = new SarPolicyResolver( 351 baseDirectory, workDirectory ); 352 setupLogger( resolver ); 353 final PolicyBuilder builder = new PolicyBuilder(); 354 final PolicyReader reader = new PolicyReader(); 355 final SarPolicyVerifier verifier = new SarPolicyVerifier(); 356 setupLogger( verifier ); 357 358 final Element element = ConfigurationUtil.toElement( configuration ); 359 final HashMap newData = new HashMap (); 360 newData.putAll( m_data ); 361 newData.putAll( data ); 362 newData.put( "/", File.separator ); 363 364 m_expander.expandValues( element, newData ); 365 366 element.setAttribute( "version", "1.0" ); 367 try 368 { 369 final PolicyMetaData policy = reader.readPolicy( element ); 370 verifier.verifyPolicy( policy ); 371 return builder.buildPolicy( policy, resolver ); 372 } 373 catch( final Exception e ) 374 { 375 throw new ConfigurationException( e.getMessage(), e ); 376 } 377 } 378 } 379 | Popular Tags |