package org.codehaus.mojo.versions;
/*
* 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 junit.framework.TestCase;
import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader;
import org.codehaus.stax2.XMLInputFactory2;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Stack;
/**
* Basic tests for rewriting XML with a StAX (JSR-173) implementation.
*
* @author Stephen Connolly
*/
public class RewriteWithStAXTest
extends TestCase
{
public void testBasic()
throws Exception
{
String input = "<?xml version='1.0' encoding='utf-8'?>\n" + "<project>\n\r\n\r\n\r\n\r" + " <parent>\r\n" +
" <groupId xmlns='foo'>org.codehaus.mojo</groupId>\n" +
" <artifactId>mojo-&sandbox-parent</artifactId>\n" + " <version>5-SNAPSHOT</version>\r" +
" </parent>\r" + "<build/></project>";
byte[] rawInput = input.getBytes( "utf-8" );
ByteArrayInputStream source = new ByteArrayInputStream( rawInput );
ByteArrayOutputStream dest = new ByteArrayOutputStream();
XMLInputFactory inputFactory = XMLInputFactory2.newInstance();
inputFactory.setProperty( XMLInputFactory2.P_PRESERVE_LOCATION, Boolean.TRUE );
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
XMLEventReader eventReader = inputFactory.createXMLEventReader( source );
XMLEventWriter eventWriter = outputFactory.createXMLEventWriter( dest, "utf-8" );
while ( eventReader.hasNext() )
{
eventWriter.add( eventReader.nextEvent() );
}
String output = new String( dest.toByteArray(), "utf-8" );
assertFalse( "StAX implementation is not good enough", input.equals( output ) );
}
public void testReplace()
throws Exception
{
String input = "<?xml version='1.0' encoding='utf-8'?>\n" + "<project>\n\r\n\r\n\r\n\r" + " <parent>\r\n" +
" <groupId xmlns='foo'>org.codehaus.mojo</groupId>\n" +
" <artifactId>mojo-&sandbox-parent</artifactId>\n" + " <version>5-SNAPSHOT</version>\r" +
" </parent>\r" + "<build/></project>";
String expected = "<?xml version='1.0' encoding='utf-8'?>\n" + "<project>\n\r\n\r\n\r\n\r" + " <parent>\r\n" +
" <groupId xmlns='foo'>org.codehaus.mojo</groupId>\n" + " <artifactId>my-artifact</artifactId>\n" +
" <version>5-SNAPSHOT</version>\r" + " </parent>\r" + "<build/></project>";
StringBuffer output = new StringBuffer( input );
XMLInputFactory inputFactory = XMLInputFactory2.newInstance();
inputFactory.setProperty( XMLInputFactory2.P_PRESERVE_LOCATION, Boolean.TRUE );
ModifiedPomXMLEventReader eventReader = new ModifiedPomXMLEventReader( output, inputFactory );
while ( eventReader.hasNext() )
{
XMLEvent event = eventReader.nextEvent();
if ( event instanceof StartElement &&
event.asStartElement().getName().getLocalPart().equals( "artifactId" ) )
{
eventReader.mark( 0 );
}
if ( event instanceof EndElement && event.asEndElement().getName().getLocalPart().equals( "artifactId" ) )
{
eventReader.mark( 1 );
if ( eventReader.hasMark( 0 ) )
{
eventReader.replaceBetween( 0, 1, "my-artifact" );
}
}
}
assertEquals( expected, output.toString() );
}
public void testReplaceFancy()
throws Exception
{
String input =
"<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n" +
" <modelVersion>4.0.0</modelVersion>\n" + "\n" + " <parent>\n" +
" <groupId>org.codehaus.mojo</groupId>\n" + " <artifactId>mojo-sandbox-parent</artifactId>\n" +
" <version>5-SNAPSHOT</version>\n" + " </parent>\n" + "\n" +
" <groupId>org.codehaus.mojo</groupId>\n" + " <artifactId>versions-maven-plugin</artifactId>\n" +
" <version>1.0.0-alpha-1-SNAPSHOT</version>\n" + " <packaging>maven-plugin</packaging>\n" + "\n" +
" <name>Versions Maven Plugin</name>\n" + " <description>\n" +
" Versions plugin for Maven 2. The versions plugin updates the versions of components in the pom.\n" +
" </description>\n" + " <inceptionYear>2008</inceptionYear>\n" + " <licenses>\n" +
" <license>\n" + " <name>The Apache Software License, Version 2.0</name>\n" +
" <url>http://www.apache.org/licenses/LICENSE-2.0</url>\n" +
" <distribution>repo</distribution>\n" + " </license>\n" + " </licenses>\n" + "\n" +
" <scm>\n" +
" <connection>scm:svn:http://svn.codehaus.org/mojo/trunk/sandbox/versions-maven-plugin</connection>\n" +
" <developerConnection>scm:svn:https://svn.codehaus.org/mojo/trunk/sandbox/versions-maven-plugin</developerConnection>\n" +
" <url>http://svn.codehaus.org/mojo/trunk/sandbox/versions-maven-plugin</url>\n" + " </scm>\n" +
"\n" + " <developers>\n" + " <developer>\n" + " <name>Stephen Connolly</name>\n" +
" <email>stephen.alan.connolly@gmail.com</email>\n" + " <roles>\n" +
" <role>Java Developer</role>\n" + " </roles>\n" + " <timezone>0</timezone>\n" +
" </developer>\n" + " </developers>\n" + "\n" + " <prerequisites>\n" +
" <maven>2.0.6</maven>\n" + " </prerequisites>\n" + "\n" + " <dependencies>\n" +
" <dependency>\n" + " <groupId>junit</groupId>\n" + " <artifactId>junit</artifactId>\n" +
" <version>3.8.1</version>\n" + " <scope>test</scope>\n" + " </dependency>\n" +
" <dependency>\n" + " <groupId>org.apache.maven</groupId>\n" +
" <artifactId>maven-project</artifactId>\n" + " <version>2.0</version>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>org.apache.maven</groupId>\n" +
" <artifactId>maven-settings</artifactId>\n" + " <version>2.0</version>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>org.apache.maven</groupId>\n" +
" <artifactId>maven-plugin-api</artifactId>\n" + " <version>2.0</version>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>org.codehaus.plexus</groupId>\n" +
" <artifactId>plexus-utils</artifactId>\n" + " <version>1.3</version>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>org.codehaus.plexus</groupId>\n" +
" <artifactId>plexus-interactivity-api</artifactId>\n" + " <version>1.0-alpha-6</version>\n" +
" <exclusions>\n" + " <exclusion>\n" + " <artifactId>plexus-utils</artifactId>\n" +
" <groupId>plexus</groupId>\n" + " </exclusion>\n" + " </exclusions>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>javax.xml.stream</groupId>\n" +
" <artifactId>stax-api</artifactId>\n" + " <version>1.0-2</version>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>stax</groupId>\n" +
" <artifactId>stax</artifactId>\n" + " <version>1.1.1-dev</version>\n" +
" </dependency>\n" + " </dependencies>\n" + "\n" + " <build>\n" + " <plugins>\n" +
" <plugin>\n" + " <artifactId>maven-plugin-plugin</artifactId>\n" +
" <version>2.3</version>\n" + " <configuration>\n" +
" <goalPrefix>versions</goalPrefix>\n" + " </configuration>\n" + " </plugin>\n" +
" </plugins>\n" + " </build>\n" + "\n" + "</project>";
String expected =
"<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n" +
" <modelVersion>4.0.0</modelVersion>\n" + "\n" + " <parent>\n" +
" <groupId>org.codehaus.mojo</groupId>\n" + " <artifactId>mojo-sandbox-parent</artifactId>\n" +
" <version>4</version>\n" + " </parent>\n" + "\n" + " <groupId>org.codehaus.mojo</groupId>\n" +
" <artifactId>versions-maven-plugin</artifactId>\n" + " <version>1.0.0-alpha-1-SNAPSHOT</version>\n" +
" <packaging>maven-plugin</packaging>\n" + "\n" + " <name>Versions Maven Plugin</name>\n" +
" <description>\n" +
" Versions plugin for Maven 2. The versions plugin updates the versions of components in the pom.\n" +
" </description>\n" + " <inceptionYear>2008</inceptionYear>\n" + " <licenses>\n" +
" <license>\n" + " <name>The Apache Software License, Version 2.0</name>\n" +
" <url>http://www.apache.org/licenses/LICENSE-2.0</url>\n" +
" <distribution>repo</distribution>\n" + " </license>\n" + " </licenses>\n" + "\n" +
" <scm>\n" +
" <connection>scm:svn:http://svn.codehaus.org/mojo/trunk/sandbox/versions-maven-plugin</connection>\n" +
" <developerConnection>scm:svn:https://svn.codehaus.org/mojo/trunk/sandbox/versions-maven-plugin</developerConnection>\n" +
" <url>http://svn.codehaus.org/mojo/trunk/sandbox/versions-maven-plugin</url>\n" + " </scm>\n" +
"\n" + " <developers>\n" + " <developer>\n" + " <name>Stephen Connolly</name>\n" +
" <email>stephen.alan.connolly@gmail.com</email>\n" + " <roles>\n" +
" <role>Java Developer</role>\n" + " </roles>\n" + " <timezone>0</timezone>\n" +
" </developer>\n" + " </developers>\n" + "\n" + " <prerequisites>\n" +
" <maven>2.0.6</maven>\n" + " </prerequisites>\n" + "\n" + " <dependencies>\n" +
" <dependency>\n" + " <groupId>junit</groupId>\n" + " <artifactId>junit</artifactId>\n" +
" <version>3.8.2</version>\n" + " <scope>test</scope>\n" + " </dependency>\n" +
" <dependency>\n" + " <groupId>org.apache.maven</groupId>\n" +
" <artifactId>maven-project</artifactId>\n" + " <version>2.0</version>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>org.apache.maven</groupId>\n" +
" <artifactId>maven-settings</artifactId>\n" + " <version>2.0</version>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>org.apache.maven</groupId>\n" +
" <artifactId>maven-plugin-api</artifactId>\n" + " <version>2.0</version>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>org.codehaus.plexus</groupId>\n" +
" <artifactId>plexus-utils</artifactId>\n" + " <version>1.3</version>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>org.codehaus.plexus</groupId>\n" +
" <artifactId>plexus-interactivity-api</artifactId>\n" + " <version>1.0-alpha-6</version>\n" +
" <exclusions>\n" + " <exclusion>\n" + " <artifactId>plexus-utils</artifactId>\n" +
" <groupId>plexus</groupId>\n" + " </exclusion>\n" + " </exclusions>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>javax.xml.stream</groupId>\n" +
" <artifactId>stax-api</artifactId>\n" + " <version>1.0-2</version>\n" +
" </dependency>\n" + " <dependency>\n" + " <groupId>stax</groupId>\n" +
" <artifactId>stax</artifactId>\n" + " <version>1.1.1-dev</version>\n" +
" </dependency>\n" + " </dependencies>\n" + "\n" + " <build>\n" + " <plugins>\n" +
" <plugin>\n" + " <artifactId>maven-plugin-plugin</artifactId>\n" +
" <version>2.3</version>\n" + " <configuration>\n" +
" <goalPrefix>versions</goalPrefix>\n" + " </configuration>\n" + " </plugin>\n" +
" </plugins>\n" + " </build>\n" + "\n" + "</project>";
StringBuffer output = new StringBuffer( input );
XMLInputFactory inputFactory = XMLInputFactory2.newInstance();
inputFactory.setProperty( XMLInputFactory2.P_PRESERVE_LOCATION, Boolean.TRUE );
ModifiedPomXMLEventReader eventReader = new ModifiedPomXMLEventReader( output, inputFactory );
Stack stack = new Stack();
String path = "";
while ( eventReader.hasNext() )
{
XMLEvent event = eventReader.nextEvent();
if ( event.isStartElement() )
{
stack.push( path );
path += "/" + event.asStartElement().getName().getLocalPart();
if ( "/project/parent/version".equals( path ) )
{
eventReader.mark( 0 );
}
}
if ( event.isEndElement() )
{
if ( "/project/parent/version".equals( path ) )
{
eventReader.mark( 1 );
if ( eventReader.hasMark( 0 ) )
{
eventReader.replaceBetween( 0, 1, "4" );
}
}
path = (String) stack.pop();
}
}
boolean inDependency = false;
boolean groupIdMatches = false;
boolean artifactIdMatches = false;
eventReader.rewind();
while ( eventReader.hasNext() )
{
XMLEvent event = eventReader.nextEvent();
if ( event.isStartElement() )
{
String name = event.asStartElement().getName().getLocalPart();
if ( inDependency )
{
if ( "groupId".equals( name ) )
{
groupIdMatches = "junit".equals( eventReader.getElementText() );
}
else if ( "artifactId".equals( name ) )
{
artifactIdMatches = "junit".equals( eventReader.getElementText() );
}
else if ( "version".equals( name ) )
{
eventReader.mark( 1 );
}
}
else if ( "dependency".equals( name ) )
{
inDependency = true;
groupIdMatches = false;
artifactIdMatches = false;
}
}
if ( event.isEndElement() )
{
String name = event.asEndElement().getName().getLocalPart();
if ( inDependency )
{
if ( "version".equals( name ) )
{
eventReader.mark( 2 );
}
else if ( "dependency".equals( name ) )
{
if ( groupIdMatches && artifactIdMatches && eventReader.hasMark( 1 ) &&
eventReader.hasMark( 2 ) )
{
eventReader.replaceBetween( 1, 2, "3.8.2" );
}
inDependency = false;
}
}
}
}
assertEquals( expected, output.toString() );
}
}