[MRELEASE-952] Replace JDom as XML transformer
Implement loading of ETL, Phases are now free from org.jdom classes

git-svn-id: https://svn.apache.org/repos/asf/maven/release/trunk@1742759 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
index d3bc436..1b3f24d 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
@@ -21,10 +21,8 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -59,15 +57,7 @@
 import org.apache.maven.shared.release.transform.MavenCoordinate;
 import org.apache.maven.shared.release.transform.jdom.JDomModelETL;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.StringUtils;
-import org.codehaus.plexus.util.WriterFactory;
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.Namespace;
-import org.jdom.filter.ElementFilter;
-import org.jdom.output.Format;
-import org.jdom.output.XMLOutputter;
 
 /**
  * Base class for rewriting phases.
@@ -182,6 +172,8 @@
         
         JDomModelETL etl = new JDomModelETL();
         etl.setLs( ls );
+        etl.setProject( project );
+        etl.setReleaseDescriptor( releaseDescriptor );
         
         etl.extract( pomFile );
 
@@ -210,20 +202,18 @@
         transformDocument( project, etl.getModel(), releaseDescriptor, reactorProjects, scmRepository,
                            result, simulate );
 
-        Document document = etl.getDocument();
-        String intro = etl.getIntro();
-        String outtro = etl.getOuttro();
-        
+        File outputFile;
         if ( simulate )
         {
-            File outputFile = new File( pomFile.getParentFile(), pomFile.getName() + "." + pomSuffix );
-            writePom( outputFile, document, releaseDescriptor, project.getModelVersion(), intro, outtro );
+            outputFile = new File( pomFile.getParentFile(), pomFile.getName() + "." + pomSuffix );
         }
         else
         {
-            writePom( pomFile, document, releaseDescriptor, project.getModelVersion(), intro, outtro, scmRepository,
-                      provider );
+            outputFile = pomFile;
+            prepareScm( pomFile, releaseDescriptor, scmRepository, provider );
         }
+        etl.load( outputFile );
+    
     }
 
     private void transformDocument( MavenProject project, Model modelTarget, ReleaseDescriptor releaseDescriptor,
@@ -547,8 +537,8 @@
         }
     }
 
-    private void writePom( File pomFile, Document document, ReleaseDescriptor releaseDescriptor, String modelVersion,
-                           String intro, String outtro, ScmRepository repository, ScmProvider provider )
+    private void prepareScm( File pomFile, ReleaseDescriptor releaseDescriptor, ScmRepository repository,
+                           ScmProvider provider )
         throws ReleaseExecutionException, ReleaseScmCommandException
     {
         try
@@ -568,67 +558,9 @@
         {
             throw new ReleaseExecutionException( "An error occurred enabling edit mode: " + e.getMessage(), e );
         }
-
-        writePom( pomFile, document, releaseDescriptor, modelVersion, intro, outtro );
     }
 
-    private void writePom( File pomFile, Document document, ReleaseDescriptor releaseDescriptor, String modelVersion,
-                           String intro, String outtro )
-        throws ReleaseExecutionException
-    {
-        Element rootElement = document.getRootElement();
-
-        if ( releaseDescriptor.isAddSchema() )
-        {
-            Namespace pomNamespace = Namespace.getNamespace( "", "http://maven.apache.org/POM/" + modelVersion );
-            rootElement.setNamespace( pomNamespace );
-            Namespace xsiNamespace = Namespace.getNamespace( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
-            rootElement.addNamespaceDeclaration( xsiNamespace );
-
-            if ( rootElement.getAttribute( "schemaLocation", xsiNamespace ) == null )
-            {
-                rootElement.setAttribute( "schemaLocation", "http://maven.apache.org/POM/" + modelVersion
-                    + " http://maven.apache.org/maven-v" + modelVersion.replace( '.', '_' ) + ".xsd", xsiNamespace );
-            }
-
-            // the empty namespace is considered equal to the POM namespace, so match them up to avoid extra xmlns=""
-            ElementFilter elementFilter = new ElementFilter( Namespace.getNamespace( "" ) );
-            for ( Iterator<?> i = rootElement.getDescendants( elementFilter ); i.hasNext(); )
-            {
-                Element e = (Element) i.next();
-                e.setNamespace( pomNamespace );
-            }
-        }
-
-        Writer writer = null;
-        try
-        {
-            writer = WriterFactory.newXmlWriter( pomFile );
-
-            if ( intro != null )
-            {
-                writer.write( intro );
-            }
-
-            Format format = Format.getRawFormat();
-            format.setLineSeparator( ls );
-            XMLOutputter out = new XMLOutputter( format );
-            out.output( document.getRootElement(), writer );
-
-            if ( outtro != null )
-            {
-                writer.write( outtro );
-            }
-        }
-        catch ( IOException e )
-        {
-            throw new ReleaseExecutionException( "Error writing POM: " + e.getMessage(), e );
-        }
-        finally
-        {
-            IOUtil.close( writer );
-        }
-    }
+    
     protected abstract String getResolvedSnapshotVersion( String artifactVersionlessKey,
                                                           Map<String, Map<String, String>> resolvedSnapshots );
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETL.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETL.java
index 2c45007..a65326c 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETL.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETL.java
@@ -23,18 +23,26 @@
 import java.io.IOException;

 import java.io.StringReader;

 import java.io.StringWriter;

+import java.io.Writer;

 import java.util.Iterator;

 import java.util.regex.Matcher;

 import java.util.regex.Pattern;

 

 import org.apache.maven.model.Model;

+import org.apache.maven.project.MavenProject;

 import org.apache.maven.shared.release.ReleaseExecutionException;

+import org.apache.maven.shared.release.config.ReleaseDescriptor;

 import org.apache.maven.shared.release.util.ReleaseUtil;

+import org.codehaus.plexus.util.IOUtil;

+import org.codehaus.plexus.util.WriterFactory;

 import org.jdom.CDATA;

 import org.jdom.Comment;

 import org.jdom.Document;

+import org.jdom.Element;

 import org.jdom.JDOMException;

+import org.jdom.Namespace;

 import org.jdom.filter.ContentFilter;

+import org.jdom.filter.ElementFilter;

 import org.jdom.input.SAXBuilder;

 import org.jdom.output.Format;

 import org.jdom.output.XMLOutputter;

@@ -47,6 +55,10 @@
  */

 public class JDomModelETL

 {

+    private ReleaseDescriptor releaseDescriptor;

+    

+    private MavenProject project;

+    

     private Document document;

     

     private String intro = null;

@@ -59,6 +71,16 @@
         this.ls = ls;

     }

     

+    public void setReleaseDescriptor( ReleaseDescriptor releaseDescriptor )

+    {

+        this.releaseDescriptor = releaseDescriptor;

+    }

+    

+    public void setProject( MavenProject project )

+    {

+        this.project = project;

+    }

+    

     public void extract( File pomFile ) throws ReleaseExecutionException

     {

         try

@@ -133,9 +155,9 @@
         

     }

     

-    public void load()

+    public void load( File targetFile ) throws ReleaseExecutionException

     {

-        

+        writePom( targetFile, document, releaseDescriptor, project.getModelVersion(), intro, outtro );

     }

     

     // will be removed once transform() is implemented

@@ -144,24 +166,6 @@
         return new JDomModel( document );

     }

     

-    // will be removed once load() is implemented

-    public Document getDocument()

-    {

-        return document;

-    }

-    

-    // will be removed once load() is implemented

-    public String getIntro()

-    {

-        return intro;

-    }

-    

-    // will be removed once load() is implemented

-    public String getOuttro()

-    {

-        return outtro;

-    }

-    

     private void normaliseLineEndings( Document document )

     {

         for ( Iterator<?> i = document.getDescendants( new ContentFilter( ContentFilter.COMMENT ) ); i.hasNext(); )

@@ -175,5 +179,63 @@
             c.setText( ReleaseUtil.normalizeLineEndings( c.getText(), ls ) );

         }

     }

+    

+    private void writePom( File pomFile, Document document, ReleaseDescriptor releaseDescriptor, String modelVersion,

+                           String intro, String outtro )

+        throws ReleaseExecutionException

+    {

+        Element rootElement = document.getRootElement();

+

+        if ( releaseDescriptor.isAddSchema() )

+        {

+            Namespace pomNamespace = Namespace.getNamespace( "", "http://maven.apache.org/POM/" + modelVersion );

+            rootElement.setNamespace( pomNamespace );

+            Namespace xsiNamespace = Namespace.getNamespace( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );

+            rootElement.addNamespaceDeclaration( xsiNamespace );

+

+            if ( rootElement.getAttribute( "schemaLocation", xsiNamespace ) == null )

+            {

+                rootElement.setAttribute( "schemaLocation", "http://maven.apache.org/POM/" + modelVersion

+                    + " http://maven.apache.org/maven-v" + modelVersion.replace( '.', '_' ) + ".xsd", xsiNamespace );

+            }

+

+            // the empty namespace is considered equal to the POM namespace, so match them up to avoid extra xmlns=""

+            ElementFilter elementFilter = new ElementFilter( Namespace.getNamespace( "" ) );

+            for ( Iterator<?> i = rootElement.getDescendants( elementFilter ); i.hasNext(); )

+            {

+                Element e = (Element) i.next();

+                e.setNamespace( pomNamespace );

+            }

+        }

+

+        Writer writer = null;

+        try

+        {

+            writer = WriterFactory.newXmlWriter( pomFile );

+

+            if ( intro != null )

+            {

+                writer.write( intro );

+            }

+

+            Format format = Format.getRawFormat();

+            format.setLineSeparator( ls );

+            XMLOutputter out = new XMLOutputter( format );

+            out.output( document.getRootElement(), writer );

+

+            if ( outtro != null )

+            {

+                writer.write( outtro );

+            }

+        }

+        catch ( IOException e )

+        {

+            throw new ReleaseExecutionException( "Error writing POM: " + e.getMessage(), e );

+        }

+        finally

+        {

+            IOUtil.close( writer );

+        }

+    }

 

 }