[MRELEASE-952] Replace JDom as XML transformer
Introduce Factory

git-svn-id: https://svn.apache.org/repos/asf/maven/release/trunk@1744457 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/maven-release-manager/src/main/components-fragment.xml b/maven-release-manager/src/main/components-fragment.xml
index 23c614c..8a9758c 100644
--- a/maven-release-manager/src/main/components-fragment.xml
+++ b/maven-release-manager/src/main/components-fragment.xml
@@ -153,6 +153,10 @@
           <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
         </requirement>
         <requirement>
+          <role>org.apache.maven.shared.release.transform.ModelETLFactory</role>
+          <field-name>modelETLFactories</field-name>
+        </requirement>
+        <requirement>
           <role>org.apache.maven.shared.release.scm.ScmTranslator</role>
           <field-name>scmTranslators</field-name>
         </requirement>
@@ -210,6 +214,10 @@
           <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
         </requirement>
         <requirement>
+          <role>org.apache.maven.shared.release.transform.ModelETLFactory</role>
+          <field-name>modelETLFactories</field-name>
+        </requirement>
+        <requirement>
           <role>org.apache.maven.shared.release.scm.ScmTranslator</role>
           <field-name>scmTranslators</field-name>
         </requirement>
@@ -226,6 +234,10 @@
         <requirement>
           <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
         </requirement>
+        <requirement>
+          <role>org.apache.maven.shared.release.transform.ModelETLFactory</role>
+          <field-name>modelETLFactories</field-name>
+        </requirement>
       </requirements>
     </component>
     <component>
@@ -253,6 +265,10 @@
           <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
         </requirement>
         <requirement>
+          <role>org.apache.maven.shared.release.transform.ModelETLFactory</role>
+          <field-name>modelETLFactories</field-name>
+        </requirement>
+        <requirement>
           <role>org.apache.maven.shared.release.scm.ScmTranslator</role>
           <field-name>scmTranslators</field-name>
         </requirement>
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 1b3f24d..df24c8b 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
@@ -54,8 +54,11 @@
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ScmTranslator;
+import org.apache.maven.shared.release.transform.ModelETLRequest;
 import org.apache.maven.shared.release.transform.MavenCoordinate;
-import org.apache.maven.shared.release.transform.jdom.JDomModelETL;
+import org.apache.maven.shared.release.transform.ModelETL;
+import org.apache.maven.shared.release.transform.ModelETLFactory;
+import org.apache.maven.shared.release.transform.jdom.JDomModelETLFactory;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.codehaus.plexus.util.StringUtils;
 
@@ -71,6 +74,10 @@
      * Tool that gets a configured SCM repository from release configuration.
      */
     private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    
+    private Map<String, ModelETLFactory> modelETLFactories;
+    
+    private String defaultModelETLFactoryHint = JDomModelETLFactory.ROLE_HINT;
 
     /**
      * SCM URL translators mapped by provider name.
@@ -169,11 +176,13 @@
         throws ReleaseExecutionException, ReleaseFailureException
     {
         File pomFile = ReleaseUtil.getStandardPom( project );
+
+        ModelETLRequest request = new ModelETLRequest();
+        request.setLineSeparator( ls );
+        request.setProject( project );
+        request.setReleaseDescriptor( releaseDescriptor );
         
-        JDomModelETL etl = new JDomModelETL();
-        etl.setLs( ls );
-        etl.setProject( project );
-        etl.setReleaseDescriptor( releaseDescriptor );
+        ModelETL etl = modelETLFactories.get( defaultModelETLFactoryHint ).newInstance( request );
         
         etl.extract( pomFile );
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETL.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETL.java
new file mode 100644
index 0000000..465cf95
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETL.java
@@ -0,0 +1,43 @@
+package org.apache.maven.shared.release.transform;

+

+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you 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.apache.maven.shared.release.ReleaseExecutionException;

+

+/**

+ * 

+ * @author Robert Scholte

+ * @since 3.0

+ */

+public interface ModelETL

+{

+    void extract( File pomFile ) throws ReleaseExecutionException;

+    

+    void transform();

+    

+    void load( File pomFile ) throws ReleaseExecutionException;

+

+    // will be removed once transform() is implemented

+    @Deprecated

+    Model getModel();

+}

diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETLFactory.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETLFactory.java
new file mode 100644
index 0000000..9bce93d
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETLFactory.java
@@ -0,0 +1,30 @@
+package org.apache.maven.shared.release.transform;

+

+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you 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.

+ */

+

+/**

+ * 

+ * @author Robert Scholte

+ * @since 3.0

+ */

+public interface ModelETLFactory

+{

+    ModelETL newInstance( ModelETLRequest request );

+}

diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETLRequest.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETLRequest.java
new file mode 100644
index 0000000..6cc41c6
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETLRequest.java
@@ -0,0 +1,67 @@
+package org.apache.maven.shared.release.transform;

+

+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you 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.project.MavenProject;

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

+

+/**

+ * 

+ * @author Robert Scholte

+ * @since 3.0

+ */

+public class ModelETLRequest

+{

+    private String lineSeparator;

+

+    private MavenProject project;

+    

+    private ReleaseDescriptor releaseDescriptor;

+

+    public String getLineSeparator()

+    {

+        return lineSeparator;

+    }

+    

+    public void setLineSeparator( String lineSeparator )

+    {

+        this.lineSeparator = lineSeparator;

+    }

+    

+    public MavenProject getProject()

+    {

+        return project;

+    }

+

+    public void setProject( MavenProject project )

+    {

+        this.project = project;

+    }

+

+    public ReleaseDescriptor getReleaseDescriptor()

+    {

+        return releaseDescriptor;

+    }

+

+    public void setReleaseDescriptor( ReleaseDescriptor releaseDescriptor )

+    {

+        this.releaseDescriptor = releaseDescriptor;

+    }

+}
\ No newline at end of file
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 a65326c..988ec1f 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
@@ -32,6 +32,7 @@
 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.transform.ModelETL;

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

 import org.codehaus.plexus.util.IOUtil;

 import org.codehaus.plexus.util.WriterFactory;

@@ -53,7 +54,7 @@
  * @author Robert Scholte

  * @since 3.0

  */

-public class JDomModelETL

+public class JDomModelETL implements ModelETL

 {

     private ReleaseDescriptor releaseDescriptor;

     

@@ -160,7 +161,7 @@
         writePom( targetFile, document, releaseDescriptor, project.getModelVersion(), intro, outtro );

     }

     

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

+    @Override

     public Model getModel()

     {

         return new JDomModel( document );

diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETLFactory.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETLFactory.java
new file mode 100644
index 0000000..f3e41bb
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETLFactory.java
@@ -0,0 +1,46 @@
+package org.apache.maven.shared.release.transform.jdom;

+

+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you 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.shared.release.transform.ModelETLRequest;

+import org.apache.maven.shared.release.transform.ModelETLFactory;

+import org.codehaus.plexus.component.annotations.Component;

+

+/**

+ * @author Robert Scholte

+ * @since 3.0

+ */

+@Component( role = ModelETLFactory.class, hint = JDomModelETLFactory.ROLE_HINT )

+public class JDomModelETLFactory implements ModelETLFactory

+{

+    public static final String ROLE_HINT = "jdom-sax";

+    

+    @Override

+    public JDomModelETL newInstance( ModelETLRequest request )

+    {

+        JDomModelETL result = new JDomModelETL();

+        

+        result.setLs( request.getLineSeparator() );

+        result.setProject( request.getProject() );

+        result.setReleaseDescriptor( request.getReleaseDescriptor() );

+        

+        return result;

+    }

+}