You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by bl...@apache.org on 2003/04/08 03:06:55 UTC

cvs commit: avalon-excalibur/fortress/src/tools/org/apache/avalon/fortress/tools ComponentMetaInfoCollector.java ServiceCollector.java

bloritsch    2003/04/07 18:06:54

  Modified:    fortress build.xml
               fortress/src/tools/org/apache/avalon/fortress/tools
                        ComponentMetaInfoCollector.java
  Removed:     fortress/src/tools/org/apache/avalon/fortress/tools
                        ServiceCollector.java
  Log:
  optimized the meta info generation into one ANT task, and made sure all generated files had content
  
  Revision  Changes    Path
  1.84      +1 -14     avalon-excalibur/fortress/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/avalon-excalibur/fortress/build.xml,v
  retrieving revision 1.83
  retrieving revision 1.84
  diff -u -r1.83 -r1.84
  --- build.xml	7 Apr 2003 21:38:26 -0000	1.83
  +++ build.xml	8 Apr 2003 01:06:54 -0000	1.84
  @@ -216,20 +216,7 @@
                   <exclude name="**/*.java"/>
                   <exclude name="**/package.html"/>
               </fileset>
  -        </copy>
  -        
  -        <jar jarfile="${build.tests}/test-${jar.name}"
  -            basedir="${build.testclasses}"
  -            compress="${build.compress}"/>
  -
  -        <taskdef name="collect-services"
  -                classname="org.apache.avalon.fortress.tools.ServiceCollector">
  -          <classpath refid="test.class.path"/>
  -        </taskdef>
  -
  -        <collect-services inputjar="${build.tests}/test-${jar.name}"
  -                          outputjar="${build.lib}/test-${jar.name}"/>    
  -
  +        </copy>        
       </target>
   
       <!-- Copies and filters the license. Used by jar and dist -->
  
  
  
  1.8       +147 -5    avalon-excalibur/fortress/src/tools/org/apache/avalon/fortress/tools/ComponentMetaInfoCollector.java
  
  Index: ComponentMetaInfoCollector.java
  ===================================================================
  RCS file: /home/cvs/avalon-excalibur/fortress/src/tools/org/apache/avalon/fortress/tools/ComponentMetaInfoCollector.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ComponentMetaInfoCollector.java	7 Apr 2003 20:49:20 -0000	1.7
  +++ ComponentMetaInfoCollector.java	8 Apr 2003 01:06:54 -0000	1.8
  @@ -54,11 +54,17 @@
    */
   package org.apache.avalon.fortress.tools;
   
  +import java.io.BufferedReader;
   import java.io.File;
   import java.io.FileOutputStream;
   import java.io.FileWriter;
   import java.io.IOException;
  +import java.io.InputStreamReader;
   import java.io.PrintWriter;
  +import java.net.MalformedURLException;
  +import java.net.URL;
  +import java.net.URLClassLoader;
  +import java.util.Enumeration;
   import java.util.HashSet;
   import java.util.Iterator;
   import java.util.Properties;
  @@ -72,6 +78,7 @@
   import org.apache.avalon.framework.thread.SingleThreaded;
   import org.apache.avalon.framework.thread.ThreadSafe;
   import org.apache.tools.ant.BuildException;
  +import org.apache.tools.ant.Project;
   
   import com.thoughtworks.qdox.ant.AbstractQdoxTask;
   import com.thoughtworks.qdox.model.DocletTag;
  @@ -92,6 +99,11 @@
       private Set m_services = new HashSet();
       
       /**
  +     * The components to write the meta info for.
  +     */
  +    private Set m_components = new HashSet();
  +    
  +    /**
        * The destination directory for metadata files.
        */
       private File m_destDir;
  @@ -114,25 +126,35 @@
       {
           validate();
   
  -        final String message =
  -            "Writing Info descriptors as property files (.meta).";
  -        log( message );
  +        log( "Writing Info descriptors as property files (.meta)." );
   
           super.execute();
   
           try
           {
               writeInfoMetaData();
  +            ClassLoader loader = getClassLoader();
               
               PrintWriter writer = new PrintWriter( new FileWriter( m_serviceFile ) );
  +            int numServices = 0;
               
               Iterator it = m_services.iterator();
               while (it.hasNext())
               {
                   writer.println(it.next());
  +                numServices++;
               }
               
               writer.close();
  +            
  +            if (numServices == 0)
  +            {
  +                m_serviceFile.delete();
  +            }
  +
  +            log( "Collecting service information." );
  +            collectClassLoaderServices( loader );
  +            collectServices( loader );
           }
           catch( final Exception e )
           {
  @@ -140,7 +162,7 @@
           }
       }
   
  -    /**
  +	/**
        * Validate that the parameters are valid.
        */
       private void validate()
  @@ -200,8 +222,9 @@
                   tag = javaClass.getTagByName( "avalon.component" );
                   if( null != tag )
                   {
  +                    m_components.add(javaClass.getFullyQualifiedName());
  +
                       Properties meta = new Properties();
  -                    
                       prepareMetaInfo(meta, javaClass);
                       
                       File metaFile = getOutputFileForClass(javaClass.getFullyQualifiedName());
  @@ -277,5 +300,124 @@
           
           filename += ".meta";
           return new File( m_destDir, filename ).getCanonicalFile();
  +    }
  +
  +    /**
  +     * Return the classloader used to determine the services info.
  +     * 
  +     * @return URLClassLoader
  +     */
  +    private ClassLoader getClassLoader() throws MalformedURLException {
  +        final URL[] urls = new URL[] {m_destDir.toURL()};
  +        return new URLClassLoader(urls, getClass().getClassLoader());
  +    }
  +    
  +    /**
  +     * Collect all the services and write out the implementations.
  +     */
  +    private void collectServices( final ClassLoader loader ) throws MalformedURLException
  +    {
  +        final File baseDir = new File(m_destDir, "META-INF/services/");
  +        final Iterator services = m_services.iterator();
  +        baseDir.mkdirs();
  +        
  +        while(services.hasNext())
  +        {
  +            String service = (String)services.next();
  +            log("Processing service " + service, Project.MSG_VERBOSE);
  +            try
  +            {
  +                Class role = loader.loadClass(service);
  +                    
  +                if ( role.isInterface() )
  +                {
  +                    File serviceFile = new File(baseDir, service);
  +                    collectComponents(serviceFile, role);
  +                }
  +                else
  +                {
  +                    log(service + " is not an interface", Project.MSG_WARN);
  +                }
  +            }
  +            catch(Exception e)
  +            {
  +                log(service + " could not be found", Project.MSG_WARN);
  +            }
  +        }
  +    }
  +
  +    /**
  +	 * 
  +	 */
  +	private void collectClassLoaderServices(ClassLoader loader)
  +        throws IOException
  +    {
  +		Enumeration enum = loader.getResources("services.list");
  +        while (enum.hasMoreElements())
  +        {
  +            URL entry = (URL)enum.nextElement();
  +            BufferedReader reader = new BufferedReader(
  +                 new InputStreamReader( entry.openStream() ) );
  +            String line;
  +                 
  +            while ( (line = reader.readLine()) != null )
  +            {
  +                if (line.trim().length() > 0)
  +                {
  +                    m_services.add(line);
  +                }
  +            }
  +        }
  +	}
  +
  +	/**
  +     * Output all the components that implement the service.
  +     * 
  +     * @param serviceFile
  +     * @param role
  +     * @throws IOException
  +     */
  +    private void collectComponents(final File serviceFile, Class role)
  +        throws IOException
  +    {
  +        final ClassLoader loader = role.getClassLoader();
  +        int numComponents = 0;
  +        log("Opening file: " + serviceFile.getAbsolutePath(), Project.MSG_DEBUG);
  +        PrintWriter writer = new PrintWriter( new FileWriter( serviceFile ) );
  +            
  +        final Iterator components = m_components.iterator();
  +        while( components.hasNext() )
  +        {
  +            String comp = (String)components.next();
  +            
  +            try
  +            {
  +                Class component = loader.loadClass(comp);
  +                if ( role.isAssignableFrom(component) )
  +                {
  +                    log(comp + " is a(n) " + role.getName(), Project.MSG_DEBUG);
  +                    writer.println(comp);
  +                    numComponents++;
  +                }
  +                else
  +                {
  +                    log(comp + " is not a(n) " + role.getName(), Project.MSG_DEBUG);
  +                }
  +            }
  +            catch (Exception e)
  +            {
  +                log(comp + " could not be found", Project.MSG_WARN);
  +            }
  +        }
  +        
  +        writer.close();
  +        log("Closing file: " + serviceFile.getAbsolutePath(), Project.MSG_DEBUG);
  +        log("Had " + numComponents + " components", Project.MSG_DEBUG);
  +        
  +        if ( numComponents == 0 )
  +        {
  +            log("No components for role " + role.getName() + ", deleting service entry.", Project.MSG_VERBOSE);
  +            serviceFile.delete();
  +        }
       }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org