Author: mcconnell
Date: Mon Jun 28 00:06:55 2004
New Revision: 22230

Modified:
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Definition.java
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/ElementHelper.java
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Home.java
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Resource.java
   
avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/XMLDefinitionBuilder.java
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/InstallTask.java
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/JavadocTask.java
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/ReactorTask.java
Log:
Updates to the Resource and Defintion classes to enable improvements to the handling 
of transative dependencies when dealing with imported resources

Modified: 
avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Definition.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Definition.java    
 (original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Definition.java    
 Mon Jun 28 00:06:55 2004
@@ -18,11 +18,8 @@
 package org.apache.avalon.tools.model;

 

 import org.apache.tools.ant.Project;

-import org.apache.tools.ant.types.Path;

 

 import java.io.File;

-import java.util.ArrayList;

-import java.util.List;

 

 /**

  * Defintion of a project. 

@@ -32,7 +29,6 @@
  */

 public class Definition extends Resource

 {

-    private ResourceRef[] m_resources;

     private ResourceRef[] m_plugins;

     private File m_basedir;

 

@@ -40,94 +36,22 @@
       final Home home, final String key, final File basedir, final Info info,

       final ResourceRef[] resources, final ResourceRef[] plugins )

     {

-        super( home, key, info );

+        super( home, key, info, resources );

 

         m_basedir = basedir;

-        m_resources = resources;

         m_plugins = plugins;

     }

 

-    public File getBasedir()

+    public File getBaseDir()

     {

         return m_basedir;

     }

 

-    public ResourceRef[] getResourceRefs()

-    {

-        return m_resources;

-    }

-

-    public ResourceRef[] getResourceRefs( final int mode, final int tag, final 
boolean flag )

-    {

-        final ArrayList list = new ArrayList();

-        getResourceRefs( list, mode, tag, flag );

-        return (ResourceRef[]) list.toArray( new ResourceRef[0] );

-    }

-

-    protected void getResourceRefs( final List list, final int mode, final int tag, 
final boolean flag )

-    {

-        final ResourceRef[] refs = getResourceRefs();

-        for( int i=0; i<refs.length; i++ )

-        {

-            final ResourceRef ref = refs[i];

-            if( !list.contains( ref ) )

-            {

-                final Policy policy = ref.getPolicy();

-                if( policy.matches( mode ) && ref.matches( tag ) )

-                {

-                    list.add( ref );

-                    if( flag && getHome().isaDefinition( ref ) )

-                    {

-                        final Definition def = getHome().getDefinition( ref );

-                        def.getResourceRefs( list, mode, ResourceRef.ANY, flag );

-                    }

-                }

-            }

-        }

-    }

-

     public ResourceRef[] getPluginRefs()

     {

         return m_plugins;

     }

 

-    public Path getPath( final Project project, final int mode )

-    {

-        if( null == project )

-        {

-            throw new NullPointerException( "project" );

-        }

-

-        final Path path = new Path( project );

-        final ResourceRef[] refs = getResourceRefs( mode, ResourceRef.ANY, true );

-        for( int i=0; i<refs.length; i++ )

-        {

-            final ResourceRef ref = refs[i];

-            final Resource resource = getHome().getResource( ref );

-            final File file = resource.getArtifact( project );

-            path.createPathElement().setLocation( file );

-        }

-        

-        return path;

-    }

-

-    public ResourceRef[] getQualifiedRefs( final List visited, final int category )

-    {

-        final ArrayList list = new ArrayList();

-        final ResourceRef[] refs =

-          getResourceRefs( Policy.RUNTIME, category, true );

-        for( int i=0; i<refs.length; i++ )

-        {

-            final ResourceRef ref = refs[i];

-            if( !visited.contains(  ref ) )

-            {

-                list.add( ref );

-                visited.add( ref );

-            }

-        }

-        return (ResourceRef[]) list.toArray( new ResourceRef[0] );

-    }

-

     public File getDocDirectory()

     {

         final File cache = getHome().getDocsRepository().getCacheDirectory();

@@ -145,12 +69,6 @@
         if( super.equals( other ) && ( other instanceof Definition ))

         {

             final Definition def = (Definition) other;

-            final ResourceRef[] refs = getResourceRefs();

-            final ResourceRef[] references = def.getResourceRefs();

-            for( int i=0; i<refs.length; i++ )

-            {

-                if( !refs[i].equals( references[i] ) ) return false;

-            }

 

             final ResourceRef[] plugins = getPluginRefs();

             final ResourceRef[] plugins2 = def.getPluginRefs();


Modified: 
avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/ElementHelper.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/ElementHelper.java 
 (original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/ElementHelper.java 
 Mon Jun 28 00:06:55 2004
@@ -29,6 +29,7 @@
 import java.io.File;

 import java.io.FileNotFoundException;

 import java.io.IOException;

+import java.io.InputStream;

 import java.util.ArrayList;

 

 /**

@@ -74,6 +75,31 @@
                 throw new BuildException( sxe.getException() );

             }

             throw new BuildException( sxe );

+        }

+        catch( ParserConfigurationException pce ) 

+        {

+            // Parser with specified options can't be built

+            throw new BuildException( pce );

+        }

+        catch( IOException ioe ) 

+        {

+            // I/O error

+            throw new BuildException(ioe);

+        }

+    }

+

+    public static Element getRootElement( final InputStream input )

+      throws Exception

+    {

+        try

+        {

+            final DocumentBuilderFactory factory =

+              DocumentBuilderFactory.newInstance();

+            factory.setValidating( false );

+            factory.setNamespaceAware( false );

+            final Document document =

+              factory.newDocumentBuilder().parse( input );

+            return document.getDocumentElement();

         }

         catch( ParserConfigurationException pce ) 

         {


Modified: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Home.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Home.java   
(original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Home.java   Mon 
Jun 28 00:06:55 2004
@@ -20,14 +20,20 @@
 import org.apache.tools.ant.BuildException;

 import org.apache.tools.ant.BuildListener;

 import org.apache.tools.ant.Task;

+import org.apache.tools.ant.Location;

 import org.apache.tools.ant.Project;

 import org.apache.tools.ant.taskdefs.Get;

 import org.apache.tools.ant.taskdefs.Property;

 import org.apache.tools.ant.types.DataType;

 import org.w3c.dom.Element;

+import org.xml.sax.SAXException;

+import org.xml.sax.SAXParseException;

 

 import java.io.File;

 import java.io.IOException;

+import java.io.InputStream;

+import java.io.FileNotFoundException;

+import java.io.FileInputStream;

 import java.net.URL;

 import java.util.ArrayList;

 import java.util.Hashtable;

@@ -71,7 +77,7 @@
         project.log( "index: " + index );

         m_index = index;

         m_system = system;

-        buildList( index, false );

+        buildList( index );

     }

 

     //-------------------------------------------------------------

@@ -193,6 +199,194 @@
     // internal

     //-------------------------------------------------------------

 

+    private void buildList( final File index )

+    {

+        if( null == index ) 

+        {

+            throw new NullPointerException( "index" );

+        }

+

+        if( !index.exists() ) 

+        {

+            throw new BuildException( 

+              new FileNotFoundException( index.toString() ) );

+        }

+

+        File source = resolveIndex( index );

+

+        try

+        {

+            final Element root = ElementHelper.getRootElement( source );

+            final Element[] elements = ElementHelper.getChildren( root );

+            final File anchor = source.getParentFile();

+            buildLocalList( anchor, elements );

+        }

+        catch( Throwable e )

+        {

+            throw new BuildException( e, new Location( index.toString() ) );

+        }

+    }

+

+    private File resolveIndex( File file )

+    {

+        if( file.isDirectory() )

+        {

+            return new File( file, "index.xml" );

+        }

+        else

+        {

+            return file;

+        }

+    }

+

+    private void buildLocalList( 

+      final File anchor, final Element[] children )

+    {

+        log( "entries: " + children.length, Project.MSG_VERBOSE );

+        for( int i=0; i<children.length; i++ )

+        {

+            final Element element = children[i];

+            final String tag = element.getTagName();

+            if( isaResource( tag ) )

+            {

+                final Resource resource = createResource( element, anchor );

+                final String key = resource.getKey();

+                m_resources.put( key, resource );

+                log( 

+                  "resource: " + resource 

+                  + " key=" + key, Project.MSG_VERBOSE );

+            }

+            else if( "import".equals( element.getTagName() ) )

+            {

+                final String filename = element.getAttribute( "index" );

+                final String path = element.getAttribute( "href" );

+

+                if(( null != filename ) && ( !"".equals( filename )))

+                {

+                    final File index = Context.getFile( anchor, filename );

+                    if( !m_includes.contains( index.toString() ) )

+                    {

+                        m_includes.add( index );

+                        log( "import: " + index );

+                        buildList( index );

+                    }

+                }

+                else if(( null != path ) && ( !"".equals( path )))

+                {

+                    // switch to remote

+                    if( !m_includes.contains( path ) )

+                    {

+                        m_includes.add( path );

+                        buildRemoteList( path );

+                    }

+                }

+                else

+                {

+                    final String error = 

+                      "Invalid import statement. No href or index attribute.";

+                    throw new BuildException( error );

+                }

+            }

+            else

+            {

+                final String error =

+                  "Unrecognized element type \"" + tag + "\" found in index.";

+                throw new BuildException( error );

+            }

+        }

+    }

+

+    private void buildRemoteList( String path )

+    {

+        log( "import: " + path );

+        final URL url = createURL( path );

+        InputStream input = null;

+        try

+        {

+            input = url.openStream();

+            final Element root = ElementHelper.getRootElement( input );

+            final Element[] elements = ElementHelper.getChildren( root );

+            buildRemoteList( path, elements );

+        }

+        catch( SAXParseException e )

+        {

+            int line = e.getLineNumber();

+            int column = e.getColumnNumber();

+            throw new BuildException( e, new Location( path, line, column ) );

+        }

+        catch( SAXException e )

+        {

+            if( e.getException() != null) 

+            {

+                throw new BuildException( 

+                  e.getException(), new Location( path ) );

+            }

+            throw new BuildException( e, new Location( path ) );

+        }

+        catch( Throwable e )

+        {

+            throw new BuildException( e, new Location( path ) );

+        }

+        finally

+        {

+            if( null != input )

+            {

+                try

+                {

+                    input.close();

+                }

+                catch( IOException ioe )

+                {

+                    // ignore

+                }

+            }

+        }

+    }

+

+    private void buildRemoteList( final String source, final Element[] children )

+    {

+        log( "entries: " + children.length, Project.MSG_VERBOSE );

+        for( int i=0; i<children.length; i++ )

+        {

+            final Element element = children[i];

+            final String tag = element.getTagName();

+            if( isaResource( tag ) )

+            {

+                final Resource resource = createResource( element );

+                final String key = resource.getKey();

+                m_resources.put( key, resource );

+                log( 

+                  "resource: " + resource 

+                  + " key=" + key, Project.MSG_VERBOSE );

+            }

+            else if( "import".equals( element.getTagName() ) )

+            {

+                final String path = element.getAttribute( "href" );

+                if(( null != path ) && ( !"".equals( path )))

+                {

+                    if( !m_includes.contains( path ) )

+                    {

+                        m_includes.add( path );

+                        buildRemoteList( path );

+                    }

+                }

+                else

+                {

+                    final String error = 

+                      "Import statement in remote index does not contain an 'href' 
attribute.";

+                    throw new BuildException( error, new Location( source ) );

+                }

+            }

+            else

+            {

+                final String error =

+                  "Unrecognized element type \"" + tag + "\" found in remote index.";

+                throw new BuildException( error, new Location( source ) );

+            }

+        }

+    }

+

+    /*

     private void buildList( final File index, final boolean remote )

     {

         final Element root = ElementHelper.getRootElement( index );

@@ -200,7 +394,9 @@
         final File system = index.getParentFile();

         buildList( system, elements, remote );

     }

+    */

 

+    /*

     private void buildList( 

       final File system, final Element[] children, final boolean remote )

     {

@@ -222,6 +418,10 @@
             }

             else if( "import".equals( element.getTagName() ) )

             {

+                //

+                // things get interesting

+                //

+

                 final String path = element.getAttribute( "href" );

                 if(( null != path ) && ( !"".equals( path ) ))

                 {

@@ -281,6 +481,7 @@
             }

         }

     }

+    */

 

     private URL createURL( String path )

     {

@@ -307,16 +508,14 @@
     }

 

     private Resource createResource( 

-      final Element element, final File system, final boolean remote )

+      final Element element, final File anchor )

     {

-        if( remote )

-        {

-            return XMLDefinitionBuilder.createResource( this, element );

-        }

-        else

-        {

-            return XMLDefinitionBuilder.createResource( this, element, system );

-        }

+        return XMLDefinitionBuilder.createResource( this, element, anchor );

+    }

+

+    private Resource createResource( final Element element )

+    {

+        return XMLDefinitionBuilder.createResource( this, element );

     }

 

     private boolean isaResource( final String tag )


Modified: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Resource.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Resource.java      
 (original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/Resource.java      
 Mon Jun 28 00:06:55 2004
@@ -20,10 +20,13 @@
 import org.apache.tools.ant.BuildException;

 import org.apache.tools.ant.Project;

 import org.apache.tools.ant.taskdefs.Get;

+import org.apache.tools.ant.types.Path;

 

 import java.io.File;

 import java.io.FileNotFoundException;

 import java.net.URL;

+import java.util.ArrayList;

+import java.util.List;

 

 /**

  * Defintion of a resource. 

@@ -33,19 +36,24 @@
  */

 public class Resource 

 {

+    private static final ResourceRef[] EMPTY_REFS = new ResourceRef[0];

+

     private final String m_key;

     private Info m_info;

+    private ResourceRef[] m_resources;

     private Home m_home;

 

     public Resource( final Home home, final Info info )

     {

-        this( home, null, info );

+        this( home, null, info, EMPTY_REFS );

     }

 

-    public Resource( final Home home, final String key, final Info info )

+    public Resource( 

+      final Home home, final String key, final Info info, final ResourceRef[] 
resources )

     {

         m_key = key;

         m_info = info;

+        m_resources = resources;

         m_home = home;

     }

 

@@ -59,18 +67,91 @@
         return m_info;

     }

 

+    public ResourceRef[] getResourceRefs()

+    {

+        return m_resources;

+    }

+

     protected Home getHome()

     {

         return m_home;

     }

 

-    public File getArtifact( final Project project )

+    public ResourceRef[] getResourceRefs( final int mode, final int tag, final 
boolean flag )

+    {

+        final ArrayList list = new ArrayList();

+        getResourceRefs( list, mode, tag, flag );

+        return (ResourceRef[]) list.toArray( new ResourceRef[0] );

+    }

+

+    protected void getResourceRefs( 

+      final List list, final int mode, final int tag, final boolean flag )

+    {

+        final ResourceRef[] refs = getResourceRefs();

+        for( int i=0; i<refs.length; i++ )

+        {

+            final ResourceRef ref = refs[i];

+            if( !list.contains( ref ) )

+            {

+                final Policy policy = ref.getPolicy();

+                if( policy.matches( mode ) && ref.matches( tag ) )

+                {

+                    list.add( ref );

+                    if( flag )

+                    {

+                        final Resource def = getHome().getResource( ref );

+                        def.getResourceRefs( list, mode, ResourceRef.ANY, flag );

+                    }

+                }

+            }

+        }

+    }

+

+    public Path getPath( final Project project, final int mode )

+    {

+        if( null == project )

+        {

+            throw new NullPointerException( "project" );

+        }

+

+        final ArrayList visited = new ArrayList();

+        final Path path = new Path( project );

+        final ResourceRef[] refs = getResourceRefs( mode, ResourceRef.ANY, true );

+        for( int i=0; i<refs.length; i++ )

+        {

+            final ResourceRef ref = refs[i];

+            if( !visited.contains( ref ) )

+            {

+                final Resource resource = getHome().getResource( ref );

+                final File file = resource.getArtifact( project );

+                path.createPathElement().setLocation( file );

+                visited.add( ref );

+            }

+        }

+        

+        return path;

+    }

+

+    public ResourceRef[] getQualifiedRefs( final List visited, final int category )

     {

-        //

-        // TODO: add support for snapshot semantics

-        // based on a resource feature

-        //

+        final ArrayList list = new ArrayList();

+        final ResourceRef[] refs =

+          getResourceRefs( Policy.RUNTIME, category, true );

+        for( int i=0; i<refs.length; i++ )

+        {

+            final ResourceRef ref = refs[i];

+            if( !visited.contains( ref ) )

+            {

+                list.add( ref );

+                visited.add( ref );

+            }

+        }

+        return (ResourceRef[]) list.toArray( new ResourceRef[0] );

+    }

+

 

+    public File getArtifact( final Project project )

+    {

         final String path = getInfo().getPath();

         final File cache = getHome().getRepository().getCacheDirectory();

         final File target = new File( cache, path );

@@ -99,7 +180,7 @@
                 final Get get = (Get) project.createTask( "get" );

                 get.setSrc( source );

                 get.setDest( target );

-                get.setIgnoreErrors( true );

+                get.setIgnoreErrors( false );

                 get.setUseTimestamp( true );

                 get.setVerbose( false );

                 get.execute();

@@ -132,7 +213,6 @@
         }

     }

 

-

     public String toString()

     {

         return "[" + getInfo().toString() + "]";

@@ -144,6 +224,14 @@
         {

             final Resource def = (Resource) other;

             if( !getInfo().equals( def.getInfo() ) ) return false;

+

+            final ResourceRef[] refs = getResourceRefs();

+            final ResourceRef[] references = def.getResourceRefs();

+            for( int i=0; i<refs.length; i++ )

+            {

+                if( !refs[i].equals( references[i] ) ) return false;

+            }

+

             return true;

         }

         return false;


Modified: 
avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/XMLDefinitionBuilder.java
==============================================================================
--- 
avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/XMLDefinitionBuilder.java
   (original)
+++ 
avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/model/XMLDefinitionBuilder.java
   Mon Jun 28 00:06:55 2004
@@ -86,7 +86,12 @@
         final Info info =

           createInfo( ElementHelper.getChild( element, "info" ) );

         final String key = getDefinitionKey( element, info );

-        return new Resource( home, key, info );

+

+        final ResourceRef[] resources =

+          createResourceRefs( 

+            ElementHelper.getChild( element, "dependencies" ) );

+        

+        return new Resource( home, key, info, resources );

     }

 

     public static Definition createDefinition( final Home home, final Element 
element, final File anchor )


Modified: 
avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/InstallTask.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/InstallTask.java   
 (original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/InstallTask.java   
 Mon Jun 28 00:06:55 2004
@@ -62,7 +62,7 @@
 

     private void installDeliverables( final Definition definition )

     {

-        final File basedir = definition.getBasedir();

+        final File basedir = definition.getBaseDir();

         final File target = new File( basedir, Context.TARGET );

         final File deliverables = new File( target, Context.DELIVERABLES );

         if( deliverables.exists() )


Modified: 
avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/JavadocTask.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/JavadocTask.java   
 (original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/JavadocTask.java   
 Mon Jun 28 00:06:55 2004
@@ -255,7 +255,7 @@
             if( resource instanceof Definition )
             {
                 final Definition def = (Definition) resource;
-                final File base = def.getBasedir();
+                final File base = def.getBaseDir();
                 final File src = Context.getFile( base, "target/build/main" );
                 if( src.exists() )
                 {
@@ -275,7 +275,7 @@
 
         if( flag )
         {
-            final File basedir = definition.getBasedir();
+            final File basedir = definition.getBaseDir();
             final File local = new File( basedir, "target/build/main" );
             if( local.exists() )
             {

Modified: 
avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/ReactorTask.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/ReactorTask.java   
 (original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/ReactorTask.java   
 Mon Jun 28 00:06:55 2004
@@ -129,7 +129,7 @@
     public void execute( final Definition definition, final String target )

     {

         final Ant ant = (Ant) getProject().createTask( "ant" );

-        ant.setDir( definition.getBasedir() );

+        ant.setDir( definition.getBaseDir() );

         ant.setInheritRefs( false );

         ant.setInheritAll( false );

         if( null != target )

@@ -233,7 +233,7 @@
             for( int i=0; i<defs.length; i++ )

             {

                 final Definition def = defs[i];

-                final String base = def.getBasedir().getCanonicalPath();

+                final String base = def.getBaseDir().getCanonicalPath();

                 if( base.startsWith( path ) )

                 {

                     list.add( def );

@@ -276,7 +276,7 @@
             {

                 log( "Skipping dir: " 

                   + dir 

-                  + "due to missing build.properties file" );

+                  + " as it does not exist." );

             }

         }

         return list;


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to