diff --git a/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java b/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java
index 40a12a21..5114a21b 100644
--- a/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java
+++ b/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java
@@ -460,7 +460,7 @@ private void reset()
// System.out.println("reset() called");
location = null;
lineNumber = 1;
- columnNumber = 0;
+ columnNumber = 1;
seenRoot = false;
reachedEnd = false;
eventType = START_DOCUMENT;
@@ -3082,7 +3082,11 @@ else if ( !seenInnerTag )
{
// seenPITarget && !seenQ
throw new XmlPullParserException( "processing instruction started on line " + curLine
- + " and column " + curColumn + " was not closed", this, null );
+ + " and column " + (curColumn -2) + " was not closed", this, null );
+ }
+ else
+ {
+ seenInnerTag = false;
}
}
else if ( ch == '<' )
diff --git a/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java b/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java
index 0cb9c061..6ba6f042 100644
--- a/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java
+++ b/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java
@@ -286,6 +286,35 @@ public void testValidCharacterReferenceDecimal()
}
}
+ @Test
+ public void testParserPosition()
+ throws Exception
+ {
+ String input = " \n \tnnn\n";
+
+ MXParser parser = new MXParser();
+ parser.setInput( new StringReader( input ) );
+
+ assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
+ assertPosition( 1, 39, parser );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertPosition( 1, 49, parser );
+ assertEquals( XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken() );
+ assertPosition( 2, 3, parser ); // end when next token starts
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertPosition( 2, 12, parser );
+ assertEquals( XmlPullParser.START_TAG, parser.nextToken() );
+ assertPosition( 2, 18, parser );
+ assertEquals( XmlPullParser.TEXT, parser.nextToken() );
+ assertPosition( 2, 23, parser ); // end when next token starts
+ assertEquals( XmlPullParser.END_TAG, parser.nextToken() );
+ assertPosition( 2, 29, parser );
+ assertEquals( XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken() );
+ assertPosition( 3, 2, parser ); // end when next token starts
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertPosition( 4, 6, parser );
+ }
+
@Test
public void testProcessingInstruction()
throws Exception
@@ -326,6 +355,37 @@ public void testProcessingInstructionsContainingXml()
assertEquals( XmlPullParser.END_TAG, parser.nextToken() );
}
+ @Test
+ public void testMalformedProcessingInstructionsContainingXmlNoClosingQuestionMark()
+ throws Exception
+ {
+ StringBuffer sb = new StringBuffer();
+ sb.append( "\n" );
+ sb.append( "\n" );
+ sb.append( "\n" );
+ sb.append( " >\n" );
+
+ MXParser parser = new MXParser();
+ parser.setInput( new StringReader( sb.toString() ) );
+
+ try
+ {
+ assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
+ assertEquals( XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken() );
+ assertEquals( XmlPullParser.START_TAG, parser.nextToken() );
+ assertEquals( XmlPullParser.END_TAG, parser.nextToken() );
+ assertEquals( XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken() );
+ assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
+
+ fail( "Should fail since it has invalid PI" );
+ }
+ catch ( XmlPullParserException ex )
+ {
+ assertTrue( ex.getMessage().contains( "processing instruction started on line 3 and column 1 was not closed" ) );
+ }
+ }
+
@Test
public void testSubsequentProcessingInstructionShort()
throws Exception
@@ -517,7 +577,7 @@ public void testMalformedProcessingInstructionNoClosingQuestionMark()
}
catch ( XmlPullParserException ex )
{
- assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 2 was not closed" ) );
+ assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 1 was not closed" ) );
}
}
@@ -545,7 +605,7 @@ public void testSubsequentMalformedProcessingInstructionNoClosingQuestionMark()
}
catch ( XmlPullParserException ex )
{
- assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 13 was not closed" ) );
+ assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 12 was not closed" ) );
}
}
@@ -661,4 +721,8 @@ public void testMalformedXMLRootElement5()
}
}
+ private static void assertPosition(int row, int col, MXParser parser) {
+ assertEquals("Current line", row, parser.getLineNumber());
+ assertEquals("Current column", col, parser.getColumnNumber());
+ }
}