KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > codehaus > loom > classman > builder > LoaderBuilder


1 /*
2  * Copyright (C) The Spice Group. All rights reserved.
3  *
4  * This software is published under the terms of the Spice
5  * Software License version 1.1, a copy of which has been included
6  * with this distribution in the LICENSE.txt file.
7  */

8 package org.codehaus.loom.classman.builder;
9
10 import java.net.URL JavaDoc;
11 import java.util.ArrayList JavaDoc;
12 import java.util.HashMap JavaDoc;
13 import java.util.Map JavaDoc;
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 /**
22  * This class is responsible for building the set of actual {@link
23  * java.lang.ClassLoader}s out of the {@link ClassLoaderSetMetaData} objects.
24  *
25  * @author Peter Donald
26  * @version $Revision: 1.1 $ $Date: 2004/04/19 22:19:25 $
27  */

28 public class LoaderBuilder
29 {
30     /**
31      * Build a map of all the classloaders defined by the metadata.
32      *
33      * @param metadata the metadata
34      * @param resolver the reoslver to use to resolve files/urls etc
35      * @param predefined the map containing all the predefined classloaders.
36      * @return the map of created classloaders
37      * @throws Exception if unable to create some classloaders
38      */

39     public Map JavaDoc buildClassLoaders( final ClassLoaderSetMetaData metadata,
40                                   final LoaderResolver resolver,
41                                   final Map JavaDoc predefined )
42         throws Exception JavaDoc
43     {
44         final HashMap JavaDoc classLoaders = new HashMap JavaDoc();
45
46         addPredefined( metadata.getPredefined(), predefined, classLoaders );
47         addAllClassLoaders( metadata, resolver, classLoaders );
48         addAllJoins( metadata, resolver, classLoaders );
49
50         return classLoaders;
51     }
52
53     /**
54      * Add all the classloaders to the result metaData.
55      *
56      * @param metaData the metadata
57      * @param resolver the resolver to use
58      * @param classLoaders the result map of classloaders
59      * @throws Exception if unable to create the classloaders
60      */

61     private void addAllClassLoaders( final ClassLoaderSetMetaData metaData,
62                                      final LoaderResolver resolver,
63                                      final Map JavaDoc classLoaders )
64         throws Exception JavaDoc
65     {
66         final ClassLoaderMetaData[] classLoaderDefs = metaData.getClassLoaders();
67         for( int i = 0; i < classLoaderDefs.length; i++ )
68         {
69             final String JavaDoc name = classLoaderDefs[ i ].getName();
70             processClassLoader( name, metaData, resolver, classLoaders );
71         }
72     }
73
74     /**
75      * Add all the classloaders to the result metaData.
76      *
77      * @param metaData the metadata
78      * @param resolver the resolver to use
79      * @param classLoaders the result map of classloaders
80      * @throws Exception if unable to create the classloaders
81      */

82     private void addAllJoins( final ClassLoaderSetMetaData metaData,
83                               final LoaderResolver resolver,
84                               final Map JavaDoc classLoaders )
85         throws Exception JavaDoc
86     {
87         final JoinMetaData[] joins = metaData.getJoins();
88         for( int i = 0; i < joins.length; i++ )
89         {
90             final String JavaDoc name = joins[ i ].getName();
91             processClassLoader( name, metaData, resolver, classLoaders );
92         }
93     }
94
95     /**
96      * Process a ClassLoader entry, create ClassLoader and add it to result
97      * map.
98      *
99      * @param name the name of classloader
100      * @param set the set of metatadata
101      * @param resolver the resolver for construction
102      * @param classLoaders the result map of classloaders
103      * @throws Exception if unable to process classloader
104      */

105     private void processClassLoader( final String JavaDoc name,
106                                      final ClassLoaderSetMetaData set,
107                                      final LoaderResolver resolver,
108                                      final Map JavaDoc classLoaders )
109         throws Exception JavaDoc
110     {
111         if( classLoaders.containsKey( name ) )
112         {
113             return;
114         }
115
116         final ClassLoaderMetaData regular = set.getClassLoader( name );
117         if( null != regular )
118         {
119             //Make sure parent classloader is built
120
processClassLoader( regular.getParent(),
121                                 set,
122                                 resolver,
123                                 classLoaders );
124
125             final ClassLoader JavaDoc 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 JavaDoc message = "Unknown classloader " + name;
135                 throw new Exception JavaDoc( message );
136             }
137             //Make sure all our dependencies are processed
138
final String JavaDoc[] names = join.getClassloaders();
139             for( int i = 0; i < names.length; i++ )
140             {
141                 processClassLoader( names[ i ], set, resolver, classLoaders );
142             }
143             final ClassLoader JavaDoc classLoader =
144                 buildJoinClassLoader( join, resolver, classLoaders );
145             classLoaders.put( name, classLoader );
146         }
147     }
148
149     /**
150      * Create a Join ClassLoader.
151      *
152      * @param join the metadata
153      * @param resolver the resolver to use to resolve URLs etc
154      * @param classLoaders the already created ClassLoaders
155      * @return the created JoinClassLoader
156      */

157     private ClassLoader JavaDoc buildJoinClassLoader( final JoinMetaData join,
158                                               final LoaderResolver resolver,
159                                               final Map JavaDoc classLoaders )
160         throws Exception JavaDoc
161     {
162         final ArrayList JavaDoc list = new ArrayList JavaDoc();
163         final String JavaDoc[] 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 JavaDoc[] elements =
170             (ClassLoader JavaDoc[])list.toArray( new ClassLoader JavaDoc[ list.size() ] );
171
172         return resolver.createJoinClassLoader( elements );
173     }
174
175     /**
176      * Build a regular classloader with entries, extensions and filesets fully
177      * resolved.
178      *
179      * @param metaData the classloader definition
180      * @param resolver the resolver to use when creating URLs/Extensions etc
181      * @param classLoaders the already created ClassLoaders
182      * @return the created ClassLoader
183      * @throws Exception if unable to create ClassLoader
184      */

185     private ClassLoader JavaDoc buildRegularClassLoader(
186         final ClassLoaderMetaData metaData,
187         final LoaderResolver resolver,
188         final Map JavaDoc classLoaders )
189         throws Exception JavaDoc
190     {
191         final ClassLoader JavaDoc parent =
192             (ClassLoader JavaDoc)classLoaders.get( metaData.getParent() );
193         final ArrayList JavaDoc urlSet = new ArrayList JavaDoc();
194
195         final String JavaDoc[] entrys = metaData.getEntrys();
196         for( int i = 0; i < entrys.length; i++ )
197         {
198             final URL JavaDoc url = resolver.resolveURL( entrys[ i ] );
199             urlSet.add( url );
200         }
201
202         //Add all filesets defined for classloader
203
final FileSetMetaData[] filesets = metaData.getFilesets();
204         for( int i = 0; i < filesets.length; i++ )
205         {
206             final FileSetMetaData fileset = filesets[ i ];
207             final String JavaDoc baseDirectory = fileset.getBaseDirectory();
208             final String JavaDoc[] includes = fileset.getIncludes();
209             final String JavaDoc[] excludes = fileset.getExcludes();
210             final URL JavaDoc[] 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 JavaDoc url = resolver.resolveExtension( extensions[ i ] );
224             urlSet.add( url );
225         }
226
227         final URL JavaDoc[] urls = (URL JavaDoc[])urlSet.toArray( new URL JavaDoc[ urlSet.size() ] );
228         return resolver.createClassLoader( parent, urls );
229     }
230
231     /**
232      * Add all the predefined classloaders to the set of available
233      * ClassLoaders.
234      *
235      * @param entrys the names of predefined classloaders
236      * @param predefined the map containg predefined classloaders
237      * @param classLoaders the destination map of classloaders
238      */

239     private void addPredefined( final String JavaDoc[] entrys,
240                                 final Map JavaDoc predefined,
241                                 final HashMap JavaDoc classLoaders )
242     {
243         for( int i = 0; i < entrys.length; i++ )
244         {
245             final String JavaDoc name = entrys[ i ];
246             final ClassLoader JavaDoc classLoader =
247                 (ClassLoader JavaDoc)predefined.get( name );
248             if( null == classLoader )
249             {
250                 final String JavaDoc message =
251                     "Missing predefined ClassLoader " + name;
252                 throw new IllegalArgumentException JavaDoc( message );
253             }
254             classLoaders.put( name, classLoader );
255         }
256     }
257 }
Popular Tags