You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by br...@apache.org on 2006/04/03 15:53:21 UTC

svn commit: r391046 - in /maven/archetype/trunk/maven-archetype-core: pom.xml src/main/java/org/apache/maven/archetype/DefaultArchetype.java src/test/java/org/apache/maven/archetype/ArchetypeTest.java

Author: brett
Date: Mon Apr  3 06:53:19 2006
New Revision: 391046

URL: http://svn.apache.org/viewcvs?rev=391046&view=rev
Log:
clean up rewriting of modules in parent POM

Modified:
    maven/archetype/trunk/maven-archetype-core/pom.xml
    maven/archetype/trunk/maven-archetype-core/src/main/java/org/apache/maven/archetype/DefaultArchetype.java
    maven/archetype/trunk/maven-archetype-core/src/test/java/org/apache/maven/archetype/ArchetypeTest.java

Modified: maven/archetype/trunk/maven-archetype-core/pom.xml
URL: http://svn.apache.org/viewcvs/maven/archetype/trunk/maven-archetype-core/pom.xml?rev=391046&r1=391045&r2=391046&view=diff
==============================================================================
--- maven/archetype/trunk/maven-archetype-core/pom.xml (original)
+++ maven/archetype/trunk/maven-archetype-core/pom.xml Mon Apr  3 06:53:19 2006
@@ -61,5 +61,10 @@
       <artifactId>plexus-container-default</artifactId>
       <version>1.0-alpha-9</version>
     </dependency>
+    <dependency>
+      <groupId>dom4j</groupId>
+      <artifactId>dom4j</artifactId>
+      <version>1.6.1</version>
+    </dependency>
   </dependencies>
 </project>

Modified: maven/archetype/trunk/maven-archetype-core/src/main/java/org/apache/maven/archetype/DefaultArchetype.java
URL: http://svn.apache.org/viewcvs/maven/archetype/trunk/maven-archetype-core/src/main/java/org/apache/maven/archetype/DefaultArchetype.java?rev=391046&r1=391045&r2=391046&view=diff
==============================================================================
--- maven/archetype/trunk/maven-archetype-core/src/main/java/org/apache/maven/archetype/DefaultArchetype.java (original)
+++ maven/archetype/trunk/maven-archetype-core/src/main/java/org/apache/maven/archetype/DefaultArchetype.java Mon Apr  3 06:53:19 2006
@@ -39,6 +39,12 @@
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 import org.codehaus.plexus.velocity.VelocityComponent;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -49,6 +55,8 @@
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.StringWriter;
 import java.io.Writer;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -116,7 +124,7 @@
         }
 
         // ---------------------------------------------------------------------
-        // Get Logger and display all parameters used 
+        // Get Logger and display all parameters used
         // ---------------------------------------------------------------------
         if ( getLogger().isInfoEnabled() )
         {
@@ -320,9 +328,11 @@
             Thread.currentThread().setContextClassLoader( old );
         }
 
-        // TODO: Reprocessing the parent should retain structure
         if ( parentModel != null )
         {
+/*
+        // TODO: would be nice to just write out with the xpp3 writer again, except that it loses a bunch of info and
+        // reformats, so the module is just baked in as a string instead.
             FileWriter fileWriter = null;
 
             try
@@ -340,6 +350,39 @@
             {
                 IOUtil.close( fileWriter );
             }
+*/
+            FileReader fileReader = null;
+            boolean added;
+            StringWriter w = new StringWriter();
+            try
+            {
+                fileReader = new FileReader( parentPomFile );
+                added = addModuleToParentPom( artifactId, fileReader, w );
+            }
+            catch ( IOException e )
+            {
+                throw new ArchetypeTemplateProcessingException( "Unable to rewrite parent POM", e );
+            }
+            catch ( DocumentException e )
+            {
+                throw new ArchetypeTemplateProcessingException( "Unable to rewrite parent POM", e );
+            }
+            finally
+            {
+                IOUtil.close( fileReader );
+            }
+
+            if ( added )
+            {
+                try
+                {
+                    FileUtils.fileWrite( parentPomFile.getAbsolutePath(), w.toString() );
+                }
+                catch ( IOException e )
+                {
+                    throw new ArchetypeTemplateProcessingException( "Unable to rewrite parent POM", e );
+                }
+            }
         }
 
         // ----------------------------------------------------------------------
@@ -350,6 +393,59 @@
             getLogger().info( "Archetype created in dir: " + outputDirectory );
         }
 
+    }
+
+    static boolean addModuleToParentPom( String artifactId, Reader fileReader, Writer fileWriter )
+        throws DocumentException, IOException
+    {
+        SAXReader reader = new SAXReader();
+        Document document = reader.read( fileReader );
+        Element project = document.getRootElement();
+        Element modules = project.element( "modules" );
+        if ( modules == null )
+        {
+            modules = project.addText( "  " ).addElement( "modules" );
+            modules.setText( "\n  " );
+            project.addText( "\n" );
+        }
+        boolean found = false;
+        for ( Iterator i = modules.elementIterator( "module" ); i.hasNext() && !found; )
+        {
+            Element module = (Element) i.next();
+            if ( module.getText().equals( artifactId ) )
+            {
+                found = true;
+            }
+        }
+        if ( !found )
+        {
+            Node lastTextNode = null;
+            for ( Iterator i = modules.nodeIterator(); i.hasNext(); )
+            {
+                Node node = (Node) i.next();
+                if ( node.getNodeType() == Node.ELEMENT_NODE )
+                {
+                    lastTextNode = null;
+                }
+                else if ( node.getNodeType() == Node.TEXT_NODE )
+                {
+                    lastTextNode = node;
+                }
+            }
+
+            if ( lastTextNode != null )
+            {
+                modules.remove( lastTextNode );
+            }
+
+            modules.addText( "\n    " );
+            modules.addElement( "module" ).setText( artifactId );
+            modules.addText( "\n  " );
+
+            XMLWriter writer = new XMLWriter( fileWriter );
+            writer.write( document );
+        }
+        return !found;
     }
 
     private void processTemplates( File pomFile, String outputDirectory, Context context,

Modified: maven/archetype/trunk/maven-archetype-core/src/test/java/org/apache/maven/archetype/ArchetypeTest.java
URL: http://svn.apache.org/viewcvs/maven/archetype/trunk/maven-archetype-core/src/test/java/org/apache/maven/archetype/ArchetypeTest.java?rev=391046&r1=391045&r2=391046&view=diff
==============================================================================
--- maven/archetype/trunk/maven-archetype-core/src/test/java/org/apache/maven/archetype/ArchetypeTest.java (original)
+++ maven/archetype/trunk/maven-archetype-core/src/test/java/org/apache/maven/archetype/ArchetypeTest.java Mon Apr  3 06:53:19 2006
@@ -32,6 +32,7 @@
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 import org.codehaus.plexus.velocity.VelocityComponent;
+import org.dom4j.DocumentException;
 
 import java.io.File;
 import java.io.FileReader;
@@ -53,13 +54,13 @@
 public class ArchetypeTest
     extends PlexusTestCase
 {
+    private Archetype archetype;
+
     public void testArchetype()
         throws Exception
     {
         FileUtils.deleteDirectory( getTestFile( "target/quickstart" ) );
 
-        Archetype archetype = (Archetype) lookup( Archetype.ROLE );
-
         Map parameters = new HashMap();
 
         parameters.put( "name", "jason" );
@@ -225,5 +226,61 @@
         }
 
         return archetypeJarLoader;
+    }
+
+    public void testAddModuleToParentPOM()
+        throws DocumentException, IOException
+    {
+        String pom = "<project>\n</project>";
+
+        StringWriter out = new StringWriter();
+        assertTrue( DefaultArchetype.addModuleToParentPom( "myArtifactId1", new StringReader( pom ), out ) );
+
+        assertEquals( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<project>\n" + "  <modules>\n" +
+            "    <module>myArtifactId1</module>\n" + "  </modules>\n" + "</project>", out.toString() );
+
+        pom = "<project>\n  <modelVersion>4.0.0</modelVersion>\n</project>";
+
+        out = new StringWriter();
+        assertTrue( DefaultArchetype.addModuleToParentPom( "myArtifactId2", new StringReader( pom ), out ) );
+
+        assertEquals( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<project>\n" +
+            "  <modelVersion>4.0.0</modelVersion>\n" + "  <modules>\n" + "    <module>myArtifactId2</module>\n" +
+            "  </modules>\n" + "</project>", out.toString() );
+
+        pom = "<project><modelVersion>4.0.0</modelVersion>\n" + "  <modules>\n" + "  </modules>\n" + "</project>";
+
+        out = new StringWriter();
+        assertTrue( DefaultArchetype.addModuleToParentPom( "myArtifactId3", new StringReader( pom ), out ) );
+
+        assertEquals( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project><modelVersion>4.0.0</modelVersion>\n" +
+            "  <modules>\n" + "    <module>myArtifactId3</module>\n" + "  </modules>\n" + "</project>",
+                      out.toString() );
+
+        pom = "<project><modelVersion>4.0.0</modelVersion>\n" + "  <modules>\n" +
+            "    <module>myArtifactId3</module>\n" + "  </modules>\n" + "</project>";
+
+        out = new StringWriter();
+        assertTrue( DefaultArchetype.addModuleToParentPom( "myArtifactId4", new StringReader( pom ), out ) );
+
+        assertEquals( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project><modelVersion>4.0.0</modelVersion>\n" +
+            "  <modules>\n" + "    <module>myArtifactId3</module>\n" + "    <module>myArtifactId4</module>\n" +
+            "  </modules>\n" + "</project>", out.toString() );
+
+        pom = "<project><modelVersion>4.0.0</modelVersion>\n" + "  <modules>\n" +
+            "    <module>myArtifactId3</module>\n" + "  </modules>\n" + "</project>";
+
+        out = new StringWriter();
+        assertFalse( DefaultArchetype.addModuleToParentPom( "myArtifactId3", new StringReader( pom ), out ) );
+
+        // empty means unchanged
+        assertEquals( "", out.toString() );
+    }
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        archetype = (Archetype) lookup( Archetype.ROLE );
     }
 }