You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by do...@apache.org on 2001/06/12 15:47:00 UTC

cvs commit: jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/builder ProjectBuilder.java DefaultProjectBuilder.java

donaldp     01/06/12 06:46:59

  Modified:    proposal/myrmidon/src/java/org/apache/myrmidon/components/builder
                        ProjectBuilder.java DefaultProjectBuilder.java
  Log:
  Modify ProjectBuilder so that it uses a vanilla string. This is in preparation for alternate formats (ie URLs).
  
  Revision  Changes    Path
  1.6       +1 -1      jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/ProjectBuilder.java
  
  Index: ProjectBuilder.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/ProjectBuilder.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ProjectBuilder.java	2001/05/31 17:19:55	1.5
  +++ ProjectBuilder.java	2001/06/12 13:46:58	1.6
  @@ -30,6 +30,6 @@
        * @exception IOException if an error occurs
        * @exception AntException if an error occurs
        */
  -    Project build( File source )
  +    Project build( String source )
           throws Exception;
   }
  
  
  
  1.7       +178 -55   jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/DefaultProjectBuilder.java
  
  Index: DefaultProjectBuilder.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/DefaultProjectBuilder.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DefaultProjectBuilder.java	2001/06/05 07:49:34	1.6
  +++ DefaultProjectBuilder.java	2001/06/12 13:46:58	1.7
  @@ -9,6 +9,8 @@
   
   import java.io.File;
   import java.io.IOException;
  +import java.util.ArrayList;
  +import java.util.HashMap;
   import javax.xml.parsers.SAXParser;
   import javax.xml.parsers.SAXParserFactory;
   import org.apache.avalon.framework.ExceptionUtil;
  @@ -20,7 +22,7 @@
   import org.apache.myrmidon.api.TaskContext;
   import org.apache.myrmidon.components.model.Condition;
   import org.apache.myrmidon.components.model.DefaultProject;
  -import org.apache.myrmidon.components.model.DefaultTarget;
  +import org.apache.myrmidon.components.model.Import;
   import org.apache.myrmidon.components.model.Project;
   import org.apache.myrmidon.components.model.Target;
   import org.xml.sax.SAXException;
  @@ -35,6 +37,11 @@
       extends AbstractLoggable
       implements ProjectBuilder
   {
  +    private final static int    PROJECT_REFERENCES  = 0;
  +    private final static int    LIBRARY_IMPORTS     = 1;
  +    private final static int    IMPLICIT_TASKS      = 2;
  +    private final static int    TARGETS             = 3;
  +
       /**
        * build a project from file.
        *
  @@ -43,9 +50,24 @@
        * @exception IOException if an error occurs
        * @exception Exception if an error occurs
        */
  -    public Project build( final File projectFile )
  +    public Project build( final String source )
  +        throws Exception
  +    {
  +        final File file = new File( source );
  +        return build( file, new HashMap() );
  +    }
  +
  +    private Project build( final File file, final HashMap projects )
           throws Exception
       {
  +        final String systemID = file.toURL().toString();
  +
  +        Project result = (Project)projects.get( systemID );
  +        if( null != result )
  +        {
  +            return result;
  +        }
  +
           final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
           final SAXParser saxParser = saxParserFactory.newSAXParser();
           final XMLReader parser = saxParser.getXMLReader();
  @@ -57,24 +79,18 @@
           parser.setContentHandler( handler );
           parser.setErrorHandler( handler );
   
  -        final String location = projectFile.toURL().toString();
  -        parser.parse( location );
  +        parser.parse( systemID );
   
  -        return build( projectFile, handler.getConfiguration() );
  -    }
  -/*
  -    private final void dump( final Configuration configuration )
  -        throws Exception
  -    {
  -        System.out.println( "Configuration: "+ configuration.getName() + "/" + configuration.getLocation() );
  -        final Configuration[] children = configuration.getChildren();
  +        final Configuration configuration = handler.getConfiguration();
  +        final DefaultProject project = buildProject( file, configuration );
   
  -        for( int i = 0; i < children.length; i++ )
  -        {
  -            dump( children[ i ] );
  -        }
  +        projects.put( systemID, project );
  +
  +        //build using all top-level attributes
  +        buildTopLevelProject( project, configuration, projects );
  +
  +        return project;
       }
  -*/
   
       /**
        * build project from configuration.
  @@ -86,10 +102,11 @@
        * @exception Exception if an error occurs
        * @exception ConfigurationException if an error occurs
        */
  -    protected final Project build( final File file, final Configuration configuration )
  +    private DefaultProject buildProject( final File file, 
  +                                         final Configuration configuration )
           throws Exception
       {
  -        if( !configuration.getName().equals("project") )
  +        if( !configuration.getName().equals( "project" ) )
           {
               throw new Exception( "Project file must be enclosed in project element" );
           }
  @@ -111,9 +128,6 @@
           project.setBaseDirectory( baseDirectory );
           //project.setName( name );
   
  -        //build using all top-level attributes
  -        buildTopLevelProject( project, configuration );
  -
           return project;
       }
   
  @@ -124,26 +138,144 @@
        * @param configuration the Configuration
        * @exception Exception if an error occurs
        */
  -    protected void buildTopLevelProject( final DefaultProject project,
  -                                         final Configuration configuration )
  +    private void buildTopLevelProject( final DefaultProject project,
  +                                       final Configuration configuration,
  +                                       final HashMap projects )
           throws Exception
       {
  +        final ArrayList implicitTaskList = new ArrayList();
           final Configuration[] children = configuration.getChildren();
   
  +        int state = PROJECT_REFERENCES;
  +
           for( int i = 0; i < children.length; i++ )
           {
               final Configuration element = children[ i ];
               final String name = element.getName();
  +
  +            if( PROJECT_REFERENCES == state )
  +            {
  +                if( name.equals( "projectref" ) )
  +                {
  +                    buildProjectRef( project, element, projects );
  +                    continue;
  +                }
  +                else
  +                {
  +                    state = LIBRARY_IMPORTS;
  +                }
  +            }
  +
  +            if( LIBRARY_IMPORTS == state )
  +            {
  +                if( name.equals( "import" ) )
  +                {
  +                    buildImport( project, element );
  +                    continue;
  +                }
  +                else
  +                {
  +                    state = IMPLICIT_TASKS;
  +                }
  +            }
  +
  +            if( IMPLICIT_TASKS == state )
  +            {
  +                //Check for any implicit tasks here
  +                if( !name.equals( "target" ) )
  +                {
  +                    implicitTaskList.add( element );
  +                    continue;
  +                }
  +                else
  +                {
  +                    state = TARGETS;
  +                }
  +            }
   
  -            //handle individual elements
               if( name.equals( "target" ) ) buildTarget( project, element );
  -            else if( name.equals( "property" ) ) buildImplicitTask( project, element );
               else
               {
                   throw new Exception( "Unknown top-level element " + name +
  -                                        " at " + element.getLocation() );
  +                                     " at " + element.getLocation() +
  +                                     ". Expecting target" );
  +            }
  +        }
  +
  +        final Configuration[] implicitTasks =
  +            (Configuration[])implicitTaskList.toArray( new Configuration[ 0 ] );
  +
  +        final Target implicitTarget = new Target( null, implicitTasks, null );
  +        project.setImplicitTarget( implicitTarget );
  +    }
  +
  +    private void buildProjectRef( final DefaultProject project,
  +                                  final Configuration element,
  +                                  final HashMap projects )
  +        throws Exception
  +    {
  +        final String name = element.getAttribute( "name", null );
  +        final String location = element.getAttribute( "location", null );
  +
  +        if( null == name )
  +        {
  +            throw new Exception( "Malformed projectref without a name attribute at " +
  +                                 element.getLocation() );
  +        }
  +
  +        if( !validName( name ) )
  +        {
  +            throw new Exception( "Projectref with an invalid name attribute at " +
  +                                 element.getLocation() );           
  +        }
  +
  +        if( null == location )
  +        {
  +            throw new Exception( "Malformed projectref without a location attribute at " +
  +                                 element.getLocation() );
  +        }
  +
  +        final File baseDirectory = project.getBaseDirectory();
  +
  +        //TODO: standardize and migrate to Avalon-Excalibur.io
  +        final File file = new File( baseDirectory, location );
  +
  +        final String systemID = file.toURL().toString();
  +        Project other = (Project)projects.get( systemID );
  +
  +        if( null == other )
  +        {
  +            other = build( file, projects );
  +        }
  +
  +        project.addProject( name, other );
  +    }
  +
  +    private void buildImport( final DefaultProject project,
  +                              final Configuration element )
  +        throws Exception
  +    {
  +        final String library = element.getAttribute( "library", null );
  +        final String name = element.getAttribute( "name", null );
  +        final String type = element.getAttribute( "type", null );
  +
  +        if( null == library )
  +        {
  +            throw new Exception( "Malformed import without a library attribute at " +
  +                                 element.getLocation() );
  +        }
  +
  +        if( null == name || null == type )
  +        {
  +            if( null != name || null != type )
  +            {
  +                throw new Exception( "Malformed import at " + element.getLocation() +
  +                                     ". If name or type attribute is specified, both " +
  +                                     "attributes must be specified." );
               }
           }
  +
  +        project.addImport( new Import( library, type, name ) );
       }
   
       /**
  @@ -152,7 +284,7 @@
        * @param project the project
        * @param task the Configuration
        */
  -    protected void buildTarget( final DefaultProject project, final Configuration target )
  +    private void buildTarget( final DefaultProject project, final Configuration target )
           throws Exception
       {
           final String name = target.getAttribute( "name", null );
  @@ -163,7 +295,13 @@
           if( null == name )
           {
               throw new Exception( "Discovered un-named target at " +
  -                                    target.getLocation() );
  +                                 target.getLocation() );
  +        }
  +
  +        if( !validName( name ) )
  +        {
  +            throw new Exception( "Target with an invalid name at " +
  +                                 target.getLocation() );           
           }
   
           getLogger().debug( "Parsing target: " + name );
  @@ -187,12 +325,13 @@
               condition = new Condition( false, unlessCondition );
           }
   
  -        final DefaultTarget defaultTarget = new DefaultTarget( condition );
  +        String[] dependencies = null;
   
           //apply depends attribute
           if( null != depends )
           {
               final String[] elements = ExceptionUtil.splitString( depends, "," );
  +            final ArrayList dependsList = new ArrayList();
   
               for( int i = 0; i < elements.length; i++ )
               {
  @@ -205,39 +344,23 @@
                   }
   
                   getLogger().debug( "Target dependency: " + dependency );
  -                defaultTarget.addDependency( dependency );
  +                dependsList.add( dependency );
  +                //defaultTarget.addDependency( dependency );
               }
  -        }
   
  -        //add all the targets from element
  -        final Configuration[] tasks = target.getChildren();
  -        for( int i = 0; i < tasks.length; i++ )
  -        {
  -            getLogger().debug( "Parsed task: " + tasks[ i ].getName() );
  -            defaultTarget.addTask( tasks[ i ] );
  +            dependencies = (String[])dependsList.toArray( new String[ 0 ] );
           }
   
  +        final Target defaultTarget =
  +            new Target( condition, target.getChildren(), dependencies );
  +
           //add target to project
           project.addTarget( name, defaultTarget );
       }
   
  -    /**
  -     * Create an implict task from configuration
  -     *
  -     * @param project the project
  -     * @param task the configuration
  -     */
  -    protected void buildImplicitTask( final DefaultProject project, final Configuration task )
  +    protected boolean validName( final String name )
       {
  -        DefaultTarget target = (DefaultTarget)project.getImplicitTarget();
  -
  -        if( null == target )
  -        {
  -            target = new DefaultTarget();
  -            project.setImplicitTarget( target );
  -        }
  -
  -        getLogger().debug( "Parsed implicit task: " + task.getName() );
  -        target.addTask( task );
  +        if( -1 != name.indexOf( "->" ) ) return false;
  +        else return true;
       }
   }