diff --git a/maven-plugins/maven-release-plugin/pom.xml b/maven-plugins/maven-release-plugin/pom.xml
index 4d05b87782..ec37165259 100644
--- a/maven-plugins/maven-release-plugin/pom.xml
+++ b/maven-plugins/maven-release-plugin/pom.xml
@@ -30,5 +30,15 @@
maven-scm-provider-svn
1.0-alpha-1-SNAPSHOT
+
+ dom4j
+ dom4j
+ 1.4-dev-8
+
+
+ jaxen
+ jaxen
+ 1.0-FCS
+
diff --git a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/AbstractReleaseMojo.java b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/AbstractReleaseMojo.java
index eafe666fcf..be6cfec98f 100644
--- a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/AbstractReleaseMojo.java
+++ b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/AbstractReleaseMojo.java
@@ -92,6 +92,11 @@ public abstract class AbstractReleaseMojo
return scmManager;
}
+ public String getTag()
+ {
+ return tag;
+ }
+
protected ScmBean getScm()
{
ScmBean scm = new ScmBean();
diff --git a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PrepareReleaseMojo.java b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PrepareReleaseMojo.java
index b0eaf38393..a5280c35be 100644
--- a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PrepareReleaseMojo.java
+++ b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/release/PrepareReleaseMojo.java
@@ -23,17 +23,16 @@ import org.apache.maven.model.Plugin;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.scm.ScmBean;
+import org.apache.maven.plugin.transformer.PomTransformer;
+import org.apache.maven.plugin.transformer.VersionTransformer;
import org.apache.maven.project.MavenProject;
import org.apache.maven.scm.ScmException;
import org.apache.maven.scm.ScmFile;
-import java.io.IOException;
-import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
-import java.util.Set;
/**
* @goal prepare
@@ -73,7 +72,7 @@ public class PrepareReleaseMojo
transformPom();
- //checkin();
+ checkin();
tag();
}
@@ -228,16 +227,18 @@ public class PrepareReleaseMojo
}
}
+ //Write pom
MavenXpp3Writer modelWriter = new MavenXpp3Writer();
try
{
- //TODO: Write in pom file
- //TODO: Write only necessary informations
- StringWriter writer = new StringWriter();
- modelWriter.write( writer, model );
- getLog().info( writer.toString() );
+ PomTransformer transformer = new VersionTransformer();
+ transformer.setOutputFile( project.getFile() );
+ transformer.setProject( project.getFile() );
+ transformer.setUpdatedModel ( model );
+ transformer.transformNodes();
+ transformer.write();
}
- catch ( IOException e )
+ catch ( Exception e )
{
throw new MojoExecutionException( "Can't update pom.", e );
}
diff --git a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/AbstractPomTransformer.java b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/AbstractPomTransformer.java
new file mode 100644
index 0000000000..400e8e37f0
--- /dev/null
+++ b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/AbstractPomTransformer.java
@@ -0,0 +1,349 @@
+package org.apache.maven.plugin.transformer;
+
+/* ====================================================================
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+import org.apache.maven.model.Model;
+import org.codehaus.plexus.util.FileUtils;
+import org.dom4j.Document;
+import org.dom4j.Node;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
+import org.jaxen.XPath;
+import org.jaxen.dom4j.Dom4jXPath;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This is the base class for any tool that attempts to transform fields
+ * in the POM. Currently we are using the XML form of the POM and using Jaxen
+ * but eventually we will be able to perform the same transformations on
+ * POM beans. Jaxen needs to be modified and some serious cleanup needs to
+ * go on in Maven internally, but this will serve as a start. An attempt is
+ * made to make this tool GUI friendly.
+ *
+ * @author Jason van Zyl
+ *
+ * @version $Id: AbstractPomTransformer.java 115932 2004-08-06 22:43:03Z carlos $
+ */
+public abstract class AbstractPomTransformer
+ implements PomTransformer
+{
+ /** POM document */
+ private File project;
+
+ /** Dom4j document. */
+ private Document document;
+
+ /** Output file. */
+ private File outputFile;
+
+ /** Properties used in transformNode */
+ private Map variables;
+
+ /** Nodes selected for transformation using xpath. */
+ private List selectedNodes;
+
+ /** Updated model obtain from MavenProject. */
+ private Model updatedModel;
+
+ private List transformations;
+
+ // -------------------------------------------------------------------------
+ // Accessors
+ // -------------------------------------------------------------------------
+
+ /**
+ *
+ * @param updatedModel
+ */
+ public Model getUpdatedModel()
+ {
+ return updatedModel;
+ }
+
+ /**
+ *
+ * @param updatedModel
+ */
+ public void setUpdatedModel( Model updatedModel )
+ {
+ this.updatedModel = updatedModel;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public Map getVariables()
+ {
+ return variables;
+ }
+
+ /**
+ *
+ * @param variables
+ */
+ public void setVariables( Map variables )
+ {
+ this.variables = variables;
+ }
+
+ /**
+ *
+ * @param project
+ */
+ public void setProject( File project )
+ {
+ this.project = project;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public File getProject()
+ {
+ return project;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public Document getDocument()
+ {
+ return document;
+ }
+
+ /**
+ *
+ * @param document
+ */
+ public void setDocument( Document document )
+ {
+ this.document = document;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public File getOutputFile()
+ {
+ return outputFile;
+ }
+
+ /**
+ *
+ * @param outputFile
+ */
+ public void setOutputFile( File outputFile )
+ {
+ this.outputFile = outputFile;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public List getSelectedNodes()
+ {
+ if ( selectedNodes == null )
+ {
+ try
+ {
+ selectNodes();
+ }
+ catch ( Exception e )
+ {
+ // do nothing.
+ }
+ }
+ return selectedNodes;
+ }
+
+ /**
+ *
+ * @param selectedNodes
+ */
+ public void setSelectedNodes( List selectedNodes )
+ {
+ this.selectedNodes = selectedNodes;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public int getSelectedNodeCount()
+ {
+ return getSelectedNodes().size();
+ }
+
+ /**
+ *
+ * @return
+ */
+ public List getTransformations()
+ {
+ if ( transformations == null )
+ {
+ createTransformations();
+ }
+
+ return transformations;
+ }
+
+ /**
+ *
+ */
+ public void createTransformations()
+ {
+ transformations = new ArrayList();
+
+ for ( Iterator i = getSelectedNodes().iterator(); i.hasNext(); )
+ {
+ Object o = i.next();
+
+ if ( o instanceof Node )
+ {
+ Transformation transformation = new Transformation( this );
+ transformation.setNode( (Node) o );
+ transformations.add( transformation );
+ }
+ }
+ }
+
+ /**
+ * This is the automated way of transforming the nodes if there is
+ * no user interaction involved.
+ *
+ * @throws Exception If an error occurs while transforming the nodes.
+ */
+ public void transformNodes()
+ throws Exception
+ {
+ for ( Iterator i = getSelectedNodes().iterator(); i.hasNext(); )
+ {
+ Object o = i.next();
+
+ if ( o instanceof Node )
+ {
+ transformNode( (Node) o );
+ }
+ }
+ }
+
+ // ----------------------------------------------------------------------
+ // Implementation
+ // ----------------------------------------------------------------------
+
+ /**
+ *
+ * @return
+ */
+ public abstract String selectProjectNodeXPathExpression();
+
+ /**
+ *
+ * @return
+ */
+ public abstract String selectDependenciesNodesXPathExpression();
+
+ /**
+ *
+ * @return
+ */
+ public abstract String selectPluginsNodesXPathExpression();
+
+ /**
+ *
+ * @param node
+ * @throws Exception
+ */
+ public abstract void transformNode( Node node )
+ throws Exception;
+
+ /**
+ * Update the snapshot version identifiers with actual timestamp versions
+ * and write out the POM in its updated form.
+ *
+ * @throws Exception
+ */
+ public void selectNodes()
+ throws Exception
+ {
+ SAXReader reader = new SAXReader();
+ setDocument( reader.read( getProject() ) );
+
+ // The selecting nodes with the xpath expression will give us a list
+ // of dependencies elements where the version element is equal to 'SNAPSHOT'.
+ // So we can get any information we need, and alter anything we need to before writing
+ // the dom4j document back out.
+ XPath pomXpath = new Dom4jXPath( selectProjectNodeXPathExpression() );
+ XPath dependenciesXpath = new Dom4jXPath( selectDependenciesNodesXPathExpression() );
+ XPath pluginsXpath = new Dom4jXPath( selectPluginsNodesXPathExpression() );
+ List nodes = new ArrayList();
+ nodes.addAll( pomXpath.selectNodes( getDocument() ) );
+ nodes.addAll( dependenciesXpath.selectNodes( getDocument() ) );
+ nodes.addAll( pluginsXpath.selectNodes( getDocument() ) );
+ setSelectedNodes( nodes );
+ }
+
+ /**
+ *
+ * @throws Exception
+ */
+ public void write()
+ throws Exception
+ {
+ OutputStream os = null;
+
+ if ( getOutputFile() != null )
+ {
+ // Backup the original first.
+ FileUtils.copyFile( getOutputFile(), new File( getOutputFile() + ".backup" ) );
+
+ // Now hand of the os.
+ os = new FileOutputStream( getOutputFile() );
+ }
+ else
+ {
+ os = new PrintStream( System.out );
+ }
+
+ OutputFormat format = new OutputFormat();
+ format.setIndentSize( 2 );
+ format.setNewlines( true );
+ format.setTrimText( true );
+
+ XMLWriter writer = new XMLWriter( format );
+ writer.setOutputStream( os );
+ writer.write( getDocument() );
+ writer.flush();
+ writer.close();
+ }
+}
diff --git a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/PomTransformer.java b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/PomTransformer.java
new file mode 100644
index 0000000000..fc400cd0fe
--- /dev/null
+++ b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/PomTransformer.java
@@ -0,0 +1,56 @@
+package org.apache.maven.plugin.transformer;
+
+/* ====================================================================
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+import java.io.File;
+
+import org.apache.maven.model.Model;
+
+import org.dom4j.Node;
+
+/**
+ * @author Jason van Zyl
+ *
+ * @version $Id: PomTransformer.java 114783 2004-03-02 15:37:56Z evenisse $
+ */
+public interface PomTransformer
+{
+ File getProject();
+
+ void setProject( File project );
+
+ void transformNodes()
+ throws Exception;
+
+ void transformNode( Node node )
+ throws Exception;
+
+ Node getTransformedNode( Node node )
+ throws Exception;
+
+ void write()
+ throws Exception;
+
+ Model getUpdatedModel();
+
+ void setUpdatedModel( Model updatedModel );
+
+ File getOutputFile();
+
+ void setOutputFile( File outputFile );
+}
diff --git a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/Transformation.java b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/Transformation.java
new file mode 100644
index 0000000000..27f6bc8749
--- /dev/null
+++ b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/Transformation.java
@@ -0,0 +1,95 @@
+package org.apache.maven.plugin.transformer;
+
+/* ====================================================================
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+import org.dom4j.Node;
+
+/**
+ *
+ *
+ * @author Jason van Zyl
+ *
+ * @version $Id: Transformation.java 114783 2004-03-02 15:37:56Z evenisse $
+ */
+public class Transformation
+{
+ /** Pom Transformer associated with this transformation. */
+ private PomTransformer pomTransformer;
+
+ /** Node to transform. */
+ private Node node;
+
+ public Transformation( PomTransformer pomTransformer )
+ {
+ this.pomTransformer = pomTransformer;
+ }
+
+ // ----------------------------------------------------------------------
+ // Accessors
+ // ----------------------------------------------------------------------
+
+ /**
+ *
+ * @return
+ */
+ public Node getNode()
+ {
+ return node;
+ }
+
+ /**
+ *
+ * @param node
+ */
+ public void setNode( Node node )
+ {
+ this.node = node;
+ }
+
+ /**
+ *
+ * @throws Exception
+ */
+ public void transform()
+ throws Exception
+ {
+ pomTransformer.transformNode( node );
+ }
+
+ /**
+ *
+ * @return
+ * @throws Exception
+ */
+ public String getBeforeTransformation()
+ throws Exception
+ {
+ return getNode().asXML();
+ }
+
+ /**
+ *
+ * @return
+ * @throws Exception
+ */
+ public String getAfterTransformation()
+ throws Exception
+ {
+ return pomTransformer.getTransformedNode( getNode() ).asXML();
+ }
+}
diff --git a/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/VersionTransformer.java b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/VersionTransformer.java
new file mode 100644
index 0000000000..69065e26fc
--- /dev/null
+++ b/maven-plugins/maven-release-plugin/src/main/java/org/apache/maven/plugin/transformer/VersionTransformer.java
@@ -0,0 +1,160 @@
+package org.apache.maven.plugin.transformer;
+
+/* ====================================================================
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+import java.util.Iterator;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Plugin;
+import org.dom4j.Element;
+import org.dom4j.Node;
+
+/**
+ *
+ *
+ * @author Brett Porter
+ *
+ * @version $Id: VersionTransformer.java 115421 2004-06-01 02:20:18Z dion $
+ */
+public class VersionTransformer
+ extends AbstractPomTransformer
+{
+ // -------------------------------------------------------------------------
+ // Accessors
+ // -------------------------------------------------------------------------
+
+ public String selectProjectNodeXPathExpression()
+ {
+ return "/project";
+ }
+
+ public String selectDependenciesNodesXPathExpression()
+ {
+ return "/project/dependencies/dependency";
+ }
+
+ public String selectPluginsNodesXPathExpression()
+ {
+ return "/project/build/plugins/plugin";
+ }
+
+ public void transformNode( Node node )
+ throws Exception
+ {
+ if ( selectProjectNodeXPathExpression().equals( node.getPath() ) )
+ {
+ Element project = (Element) node;
+
+ Node version = node.selectSingleNode( "version" );
+ if ( version != null )
+ {
+ version.setText( getUpdatedModel().getVersion() );
+ }
+ else
+ {
+ project.addElement( "version" ).addText( getUpdatedModel().getVersion() );
+ }
+ }
+ else if ( selectDependenciesNodesXPathExpression().equals( node.getPath() ) )
+ {
+ Element dependency = (Element) node;
+ Node groupId = node.selectSingleNode( "groupId" );
+ Node artifactId = node.selectSingleNode( "artifactId" );
+ Node type = node.selectSingleNode( "type" );
+ String typeText = "jar";
+ if ( type != null )
+ {
+ typeText = type.getText();
+ }
+ Node version = node.selectSingleNode( "version" );
+ if ( version != null )
+ {
+ version.setText( getDependency( groupId.getText(), artifactId.getText(), typeText ).getVersion() );
+ }
+ else
+ {
+ dependency.addElement( "version" ).addText( getDependency( groupId.getText(), artifactId.getText(),
+ type.getText() ).getVersion() );
+ }
+ }
+ else
+ {
+ Element plugin = (Element) node;
+ Node groupId = node.selectSingleNode( "groupId" );
+ String groupIdText = "org.apache.maven.plugins";
+ if ( groupId != null )
+ {
+ groupIdText = groupId.getText();
+ }
+ Node artifactId = node.selectSingleNode( "artifactId" );
+ Node version = node.selectSingleNode( "version" );
+ Plugin p = getPlugin( groupIdText, artifactId.getText() );
+ if ( groupId != null )
+ {
+ groupId.setText( p.getGroupId() );
+ }
+ else
+ {
+ plugin.addElement( "groupId" ).addText( p.getGroupId() );
+ }
+ if ( version != null )
+ {
+ version.setText( p.getVersion() );
+ }
+ else
+ {
+ plugin.addElement( "version" ).addText( p.getVersion() );
+ }
+ }
+ }
+
+ private Dependency getDependency( String groupId, String artifactId, String type )
+ {
+ for ( Iterator i = getUpdatedModel().getDependencies().iterator(); i.hasNext(); )
+ {
+ Dependency dependency = (Dependency) i.next();
+ if ( dependency.getGroupId().equals( groupId ) && dependency.getArtifactId().equals( artifactId )
+ && dependency.getType().equals( type ) )
+ {
+ return dependency;
+ }
+ }
+
+ return null;
+ }
+
+ private Plugin getPlugin( String groupId, String artifactId )
+ {
+ for ( Iterator i = getUpdatedModel().getBuild().getPlugins().iterator(); i.hasNext(); )
+ {
+ Plugin plugin = (Plugin) i.next();
+ if ( plugin.getGroupId().equals( groupId ) && plugin.getArtifactId().equals( artifactId ) )
+ {
+ return plugin;
+ }
+ }
+
+ return null;
+ }
+
+ public Node getTransformedNode( Node node )
+ throws Exception
+ {
+ throw new UnsupportedOperationException( "getTransformedNode not implemented" );
+ }
+}