Author: rfscholte Date: Sat May 7 16:50:44 2016 New Revision: 1742732 URL: http://svn.apache.org/viewvc?rev=1742732&view=rev Log: [MRELEASE-952] Replace JDom as XML transformer Introduce JDom implementation for extracting, transforming and loading the Model
Added: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETL.java Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java?rev=1742732&r1=1742731&r2=1742732&view=diff ============================================================================== --- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java (original) +++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java Sat May 7 16:50:44 2016 @@ -21,8 +21,6 @@ package org.apache.maven.shared.release. import java.io.File; import java.io.IOException; -import java.io.StringReader; -import java.io.StringWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Collection; @@ -30,8 +28,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.ArtifactUtils; @@ -61,20 +57,15 @@ import org.apache.maven.shared.release.s import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator; import org.apache.maven.shared.release.scm.ScmTranslator; import org.apache.maven.shared.release.transform.MavenCoordinate; -import org.apache.maven.shared.release.transform.jdom.JDomModel; +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.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; @@ -187,74 +178,12 @@ public abstract class AbstractRewritePom boolean simulate, ReleaseResult result ) throws ReleaseExecutionException, ReleaseFailureException { - Document document; - String intro = null; - String outtro = null; - try - { - String content = ReleaseUtil.readXmlFile( ReleaseUtil.getStandardPom( project ), ls ); - // we need to eliminate any extra whitespace inside elements, as JDOM will nuke it - content = content.replaceAll( "<([^!][^>]*?)\\s{2,}([^>]*?)>", "<$1 $2>" ); - content = content.replaceAll( "(\\s{2,}|[^\\s])/>", "$1 />" ); - - SAXBuilder builder = new SAXBuilder(); - document = builder.build( new StringReader( content ) ); - - // Normalize line endings to platform's style (XML processors like JDOM normalize line endings to "\n" as - // per section 2.11 of the XML spec) - normaliseLineEndings( document ); - - // rewrite DOM as a string to find differences, since text outside the root element is not tracked - StringWriter w = new StringWriter(); - Format format = Format.getRawFormat(); - format.setLineSeparator( ls ); - XMLOutputter out = new XMLOutputter( format ); - out.output( document.getRootElement(), w ); - - int index = content.indexOf( w.toString() ); - if ( index >= 0 ) - { - intro = content.substring( 0, index ); - outtro = content.substring( index + w.toString().length() ); - } - else - { - /* - * NOTE: Due to whitespace, attribute reordering or entity expansion the above indexOf test can easily - * fail. So let's try harder. Maybe some day, when JDOM offers a StaxBuilder and this builder employes - * XMLInputFactory2.P_REPORT_PROLOG_WHITESPACE, this whole mess can be avoided. - */ - // CHECKSTYLE_OFF: LocalFinalVariableName - final String SPACE = "\\s++"; - final String XML = "<\\?(?:(?:[^\"'>]++)|(?:\"[^\"]*+\")|(?:'[^\']*+'))*+>"; - final String INTSUB = "\\[(?:(?:[^\"'\\]]++)|(?:\"[^\"]*+\")|(?:'[^\']*+'))*+\\]"; - final String DOCTYPE = - "<!DOCTYPE(?:(?:[^\"'\\[>]++)|(?:\"[^\"]*+\")|(?:'[^\']*+')|(?:" + INTSUB + "))*+>"; - final String PI = XML; - final String COMMENT = "<!--(?:[^-]|(?:-[^-]))*+-->"; - - final String INTRO = - "(?:(?:" + SPACE + ")|(?:" + XML + ")|(?:" + DOCTYPE + ")|(?:" + COMMENT + ")|(?:" + PI + "))*"; - final String OUTRO = "(?:(?:" + SPACE + ")|(?:" + COMMENT + ")|(?:" + PI + "))*"; - final String POM = "(?s)(" + INTRO + ")(.*?)(" + OUTRO + ")"; - // CHECKSTYLE_ON: LocalFinalVariableName - - Matcher matcher = Pattern.compile( POM ).matcher( content ); - if ( matcher.matches() ) - { - intro = matcher.group( 1 ); - outtro = matcher.group( matcher.groupCount() ); - } - } - } - catch ( JDOMException e ) - { - throw new ReleaseExecutionException( "Error reading POM: " + e.getMessage(), e ); - } - catch ( IOException e ) - { - throw new ReleaseExecutionException( "Error reading POM: " + e.getMessage(), e ); - } + File pomFile = ReleaseUtil.getStandardPom( project ); + + JDomModelETL etl = new JDomModelETL(); + etl.setLs( ls ); + + etl.extract( pomFile ); ScmRepository scmRepository = null; ScmProvider provider = null; @@ -278,11 +207,13 @@ public abstract class AbstractRewritePom } } - transformDocument( project, new JDomModel( document ), releaseDescriptor, reactorProjects, scmRepository, + transformDocument( project, etl.getModel(), releaseDescriptor, reactorProjects, scmRepository, result, simulate ); - File pomFile = ReleaseUtil.getStandardPom( project ); - + Document document = etl.getDocument(); + String intro = etl.getIntro(); + String outtro = etl.getOuttro(); + if ( simulate ) { File outputFile = new File( pomFile.getParentFile(), pomFile.getName() + "." + pomSuffix ); @@ -295,20 +226,6 @@ public abstract class AbstractRewritePom } } - private void normaliseLineEndings( Document document ) - { - for ( Iterator<?> i = document.getDescendants( new ContentFilter( ContentFilter.COMMENT ) ); i.hasNext(); ) - { - Comment c = (Comment) i.next(); - c.setText( ReleaseUtil.normalizeLineEndings( c.getText(), ls ) ); - } - for ( Iterator<?> i = document.getDescendants( new ContentFilter( ContentFilter.CDATA ) ); i.hasNext(); ) - { - CDATA c = (CDATA) i.next(); - c.setText( ReleaseUtil.normalizeLineEndings( c.getText(), ls ) ); - } - } - private void transformDocument( MavenProject project, Model modelTarget, ReleaseDescriptor releaseDescriptor, List<MavenProject> reactorProjects, ScmRepository scmRepository, ReleaseResult result, boolean simulate ) Added: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETL.java URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETL.java?rev=1742732&view=auto ============================================================================== --- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETL.java (added) +++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom/JDomModelETL.java Sat May 7 16:50:44 2016 @@ -0,0 +1,179 @@ +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 java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.Iterator; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.maven.model.Model; +import org.apache.maven.shared.release.ReleaseExecutionException; +import org.apache.maven.shared.release.util.ReleaseUtil; +import org.jdom.CDATA; +import org.jdom.Comment; +import org.jdom.Document; +import org.jdom.JDOMException; +import org.jdom.filter.ContentFilter; +import org.jdom.input.SAXBuilder; +import org.jdom.output.Format; +import org.jdom.output.XMLOutputter; + +/** + * JDom implementation for extracting, transform, loading the Model (pom.xml) + * + * @author Robert Scholte + * @since 3.0 + */ +public class JDomModelETL +{ + private Document document; + + private String intro = null; + private String outtro = null; + + private String ls = ReleaseUtil.LS; + + public void setLs( String ls ) + { + this.ls = ls; + } + + public void extract( File pomFile ) throws ReleaseExecutionException + { + try + { + String content = ReleaseUtil.readXmlFile( pomFile, ls ); + // we need to eliminate any extra whitespace inside elements, as JDOM will nuke it + content = content.replaceAll( "<([^!][^>]*?)\\s{2,}([^>]*?)>", "<$1 $2>" ); + content = content.replaceAll( "(\\s{2,}|[^\\s])/>", "$1 />" ); + + SAXBuilder builder = new SAXBuilder(); + document = builder.build( new StringReader( content ) ); + + // Normalize line endings to platform's style (XML processors like JDOM normalize line endings to "\n" as + // per section 2.11 of the XML spec) + normaliseLineEndings( document ); + + // rewrite DOM as a string to find differences, since text outside the root element is not tracked + StringWriter w = new StringWriter(); + Format format = Format.getRawFormat(); + format.setLineSeparator( ls ); + XMLOutputter out = new XMLOutputter( format ); + out.output( document.getRootElement(), w ); + + int index = content.indexOf( w.toString() ); + if ( index >= 0 ) + { + intro = content.substring( 0, index ); + outtro = content.substring( index + w.toString().length() ); + } + else + { + /* + * NOTE: Due to whitespace, attribute reordering or entity expansion the above indexOf test can easily + * fail. So let's try harder. Maybe some day, when JDOM offers a StaxBuilder and this builder employes + * XMLInputFactory2.P_REPORT_PROLOG_WHITESPACE, this whole mess can be avoided. + */ + // CHECKSTYLE_OFF: LocalFinalVariableName + final String SPACE = "\\s++"; + final String XML = "<\\?(?:(?:[^\"'>]++)|(?:\"[^\"]*+\")|(?:'[^\']*+'))*+>"; + final String INTSUB = "\\[(?:(?:[^\"'\\]]++)|(?:\"[^\"]*+\")|(?:'[^\']*+'))*+\\]"; + final String DOCTYPE = + "<!DOCTYPE(?:(?:[^\"'\\[>]++)|(?:\"[^\"]*+\")|(?:'[^\']*+')|(?:" + INTSUB + "))*+>"; + final String PI = XML; + final String COMMENT = "<!--(?:[^-]|(?:-[^-]))*+-->"; + + final String INTRO = + "(?:(?:" + SPACE + ")|(?:" + XML + ")|(?:" + DOCTYPE + ")|(?:" + COMMENT + ")|(?:" + PI + "))*"; + final String OUTRO = "(?:(?:" + SPACE + ")|(?:" + COMMENT + ")|(?:" + PI + "))*"; + final String POM = "(?s)(" + INTRO + ")(.*?)(" + OUTRO + ")"; + // CHECKSTYLE_ON: LocalFinalVariableName + + Matcher matcher = Pattern.compile( POM ).matcher( content ); + if ( matcher.matches() ) + { + intro = matcher.group( 1 ); + outtro = matcher.group( matcher.groupCount() ); + } + } + } + catch ( JDOMException e ) + { + throw new ReleaseExecutionException( "Error reading POM: " + e.getMessage(), e ); + } + catch ( IOException e ) + { + throw new ReleaseExecutionException( "Error reading POM: " + e.getMessage(), e ); + } + } + + public void transform() + { + + } + + public void load() + { + + } + + // will be removed once transform() is implemented + public Model getModel() + { + 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(); ) + { + Comment c = (Comment) i.next(); + c.setText( ReleaseUtil.normalizeLineEndings( c.getText(), ls ) ); + } + for ( Iterator<?> i = document.getDescendants( new ContentFilter( ContentFilter.CDATA ) ); i.hasNext(); ) + { + CDATA c = (CDATA) i.next(); + c.setText( ReleaseUtil.normalizeLineEndings( c.getText(), ls ) ); + } + } + +}