1 8 package org.codehaus.loom.classman.builder; 9 10 import java.net.URL ; 11 import java.util.ArrayList ; 12 import java.util.HashMap ; 13 import java.util.Map ; 14 15 import org.codehaus.loom.classman.metadata.ClassLoaderMetaData; 16 import org.codehaus.loom.classman.metadata.ClassLoaderSetMetaData; 17 import org.codehaus.loom.classman.metadata.FileSetMetaData; 18 import org.codehaus.loom.classman.metadata.JoinMetaData; 19 import org.codehaus.loom.extension.Extension; 20 21 28 public class LoaderBuilder 29 { 30 39 public Map buildClassLoaders( final ClassLoaderSetMetaData metadata, 40 final LoaderResolver resolver, 41 final Map predefined ) 42 throws Exception 43 { 44 final HashMap classLoaders = new HashMap (); 45 46 addPredefined( metadata.getPredefined(), predefined, classLoaders ); 47 addAllClassLoaders( metadata, resolver, classLoaders ); 48 addAllJoins( metadata, resolver, classLoaders ); 49 50 return classLoaders; 51 } 52 53 61 private void addAllClassLoaders( final ClassLoaderSetMetaData metaData, 62 final LoaderResolver resolver, 63 final Map classLoaders ) 64 throws Exception 65 { 66 final ClassLoaderMetaData[] classLoaderDefs = metaData.getClassLoaders(); 67 for( int i = 0; i < classLoaderDefs.length; i++ ) 68 { 69 final String name = classLoaderDefs[ i ].getName(); 70 processClassLoader( name, metaData, resolver, classLoaders ); 71 } 72 } 73 74 82 private void addAllJoins( final ClassLoaderSetMetaData metaData, 83 final LoaderResolver resolver, 84 final Map classLoaders ) 85 throws Exception 86 { 87 final JoinMetaData[] joins = metaData.getJoins(); 88 for( int i = 0; i < joins.length; i++ ) 89 { 90 final String name = joins[ i ].getName(); 91 processClassLoader( name, metaData, resolver, classLoaders ); 92 } 93 } 94 95 105 private void processClassLoader( final String name, 106 final ClassLoaderSetMetaData set, 107 final LoaderResolver resolver, 108 final Map classLoaders ) 109 throws Exception 110 { 111 if( classLoaders.containsKey( name ) ) 112 { 113 return; 114 } 115 116 final ClassLoaderMetaData regular = set.getClassLoader( name ); 117 if( null != regular ) 118 { 119 processClassLoader( regular.getParent(), 121 set, 122 resolver, 123 classLoaders ); 124 125 final ClassLoader classLoader = 126 buildRegularClassLoader( regular, resolver, classLoaders ); 127 classLoaders.put( name, classLoader ); 128 } 129 else 130 { 131 final JoinMetaData join = set.getJoin( name ); 132 if( null == join ) 133 { 134 final String message = "Unknown classloader " + name; 135 throw new Exception ( message ); 136 } 137 final String [] names = join.getClassloaders(); 139 for( int i = 0; i < names.length; i++ ) 140 { 141 processClassLoader( names[ i ], set, resolver, classLoaders ); 142 } 143 final ClassLoader classLoader = 144 buildJoinClassLoader( join, resolver, classLoaders ); 145 classLoaders.put( name, classLoader ); 146 } 147 } 148 149 157 private ClassLoader buildJoinClassLoader( final JoinMetaData join, 158 final LoaderResolver resolver, 159 final Map classLoaders ) 160 throws Exception 161 { 162 final ArrayList list = new ArrayList (); 163 final String [] names = join.getClassloaders(); 164 for( int i = 0; i < names.length; i++ ) 165 { 166 list.add( classLoaders.get( names[ i ] ) ); 167 } 168 169 final ClassLoader [] elements = 170 (ClassLoader [])list.toArray( new ClassLoader [ list.size() ] ); 171 172 return resolver.createJoinClassLoader( elements ); 173 } 174 175 185 private ClassLoader buildRegularClassLoader( 186 final ClassLoaderMetaData metaData, 187 final LoaderResolver resolver, 188 final Map classLoaders ) 189 throws Exception 190 { 191 final ClassLoader parent = 192 (ClassLoader )classLoaders.get( metaData.getParent() ); 193 final ArrayList urlSet = new ArrayList (); 194 195 final String [] entrys = metaData.getEntrys(); 196 for( int i = 0; i < entrys.length; i++ ) 197 { 198 final URL url = resolver.resolveURL( entrys[ i ] ); 199 urlSet.add( url ); 200 } 201 202 final FileSetMetaData[] filesets = metaData.getFilesets(); 204 for( int i = 0; i < filesets.length; i++ ) 205 { 206 final FileSetMetaData fileset = filesets[ i ]; 207 final String baseDirectory = fileset.getBaseDirectory(); 208 final String [] includes = fileset.getIncludes(); 209 final String [] excludes = fileset.getExcludes(); 210 final URL [] urls = 211 resolver.resolveFileSet( baseDirectory, 212 includes, 213 excludes ); 214 for( int j = 0; j < urls.length; j++ ) 215 { 216 urlSet.add( urls[ j ] ); 217 } 218 } 219 220 final Extension[] extensions = metaData.getExtensions(); 221 for( int i = 0; i < extensions.length; i++ ) 222 { 223 final URL url = resolver.resolveExtension( extensions[ i ] ); 224 urlSet.add( url ); 225 } 226 227 final URL [] urls = (URL [])urlSet.toArray( new URL [ urlSet.size() ] ); 228 return resolver.createClassLoader( parent, urls ); 229 } 230 231 239 private void addPredefined( final String [] entrys, 240 final Map predefined, 241 final HashMap classLoaders ) 242 { 243 for( int i = 0; i < entrys.length; i++ ) 244 { 245 final String name = entrys[ i ]; 246 final ClassLoader classLoader = 247 (ClassLoader )predefined.get( name ); 248 if( null == classLoader ) 249 { 250 final String message = 251 "Missing predefined ClassLoader " + name; 252 throw new IllegalArgumentException ( message ); 253 } 254 classLoaders.put( name, classLoader ); 255 } 256 } 257 } | Popular Tags |