You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by be...@apache.org on 2007/11/05 07:24:55 UTC
svn commit: r591891 - in /labs/vysper/src:
main/java/org/apache/vysper/mina/codec/
main/java/org/apache/vysper/xmpp/xmldecoder/
test/java/org/apache/vysper/mina/codec/
test/java/org/apache/vysper/xmpp/xmldecoder/
Author: berndf
Date: Sun Nov 4 22:24:54 2007
New Revision: 591891
URL: http://svn.apache.org/viewvc?rev=591891&view=rev
Log:
[vysper] refine nightmare-ish element name parsing and add more tests
Modified:
labs/vysper/src/main/java/org/apache/vysper/mina/codec/XMLStreamTokenizer.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/xmldecoder/ParticleDecoder.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/xmldecoder/XMLParticle.java
labs/vysper/src/test/java/org/apache/vysper/mina/codec/XMLStreamTokenizerTestCase.java
labs/vysper/src/test/java/org/apache/vysper/xmpp/xmldecoder/XMLParticleTestCase.java
labs/vysper/src/test/java/org/apache/vysper/xmpp/xmldecoder/XMLRawToFragementConverterConvertErrorTestCase.java
Modified: labs/vysper/src/main/java/org/apache/vysper/mina/codec/XMLStreamTokenizer.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/mina/codec/XMLStreamTokenizer.java?rev=591891&r1=591890&r2=591891&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/mina/codec/XMLStreamTokenizer.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/mina/codec/XMLStreamTokenizer.java Sun Nov 4 22:24:54 2007
@@ -23,6 +23,7 @@
import org.apache.vysper.xmpp.xmldecoder.ParticleDecoder;
import org.apache.vysper.xmpp.xmldecoder.XMLParticle;
import org.apache.vysper.xmpp.xmldecoder.XMLRawToFragementConverter;
+import org.apache.vysper.xmpp.xmldecoder.DecodingException;
import org.apache.vysper.xmpp.xmlfragment.XMLElement;
import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
import org.apache.vysper.xmpp.xmlfragment.XMLText;
@@ -45,7 +46,6 @@
if (xmlParticle != null) {
// new particle is completed
-
// get current list from session
List<XMLParticle> particles = (List<XMLParticle>) ioSession.getAttribute(SESSION_ATTRIBUTE_NAME);
if (particles == null) {
@@ -57,22 +57,26 @@
particles.add(xmlParticle);
// only if the list is balanced, a new stanza is completed
- if (CONVERTER.isBalanced(particles)) {
- // reset session list
- ioSession.setAttribute(SESSION_ATTRIBUTE_NAME, new ArrayList<XMLParticle>());
-
- XMLFragment xmlFragment = CONVERTER.convert(particles);
-
- if (xmlFragment instanceof XMLElement) {
- // propagate element
-
- protocolDecoderOutput.write((XMLElement)xmlFragment);
- } else {
- // TODO handle text elements properly might be only whitespaces/newlines
- protocolDecoderOutput.write((XMLText)xmlFragment);
- }
+ try {
+ if (CONVERTER.isBalanced(particles)) {
+ // reset session list
+ ioSession.setAttribute(SESSION_ATTRIBUTE_NAME, new ArrayList<XMLParticle>());
+
+ XMLFragment xmlFragment = CONVERTER.convert(particles);
+
+ if (xmlFragment instanceof XMLElement) {
+ // propagate element
+
+ protocolDecoderOutput.write((XMLElement)xmlFragment);
+ } else {
+ // TODO handle text elements properly might be only whitespaces/newlines
+ protocolDecoderOutput.write((XMLText)xmlFragment);
+ }
+ }
+ } catch (DecodingException e) {
+ throw e; // rethrow
}
-
+
}
return xmlParticle != null;
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/xmldecoder/ParticleDecoder.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/xmldecoder/ParticleDecoder.java?rev=591891&r1=591890&r2=591891&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/xmldecoder/ParticleDecoder.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/xmldecoder/ParticleDecoder.java Sun Nov 4 22:24:54 2007
@@ -34,21 +34,6 @@
public static XMLParticle decodeParticle(ByteBuffer byteBuffer, CharsetDecoder charsetDecoder) throws Exception {
int startPosition = byteBuffer.position();
- // OUTDATED
- // TODO this section is outdated. remove, if ISE-error is never thrown at the end
- // skip all leading zeros
- int leadingGarbage = 0;
- while (byteBuffer.remaining() > 0) {
- byte b = byteBuffer.get();
- if (b == 0) {
- leadingGarbage++;
- } else break;
- }
- startPosition += leadingGarbage;
- byteBuffer.position(startPosition);
- if (leadingGarbage > 0) throw new IllegalStateException("garbage detected!");
- // OUTDATED
-
//String DEBUG_VORDERBAND = byteBuffer.duplicate().getString(charsetDecoder);
if (!byteBuffer.hasRemaining()) return null;
@@ -81,7 +66,8 @@
}
//String DEBUG_HINTERBAND = stanzaBuffer.duplicate().getString(charsetDecoder);
//String DEBUG_REMAINS = byteBuffer.duplicate().getString(charsetDecoder);
- return new XMLParticle(stanzaBuffer.getString(charsetDecoder));
+ String content = stanzaBuffer.getString(charsetDecoder);
+ return new XMLParticle(content);
}
}
// no complete stanza found. prepare next read
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/xmldecoder/XMLParticle.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/xmldecoder/XMLParticle.java?rev=591891&r1=591890&r2=591891&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/xmldecoder/XMLParticle.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/xmldecoder/XMLParticle.java Sun Nov 4 22:24:54 2007
@@ -34,7 +34,7 @@
public static final String ELEMENT_START_CLOSING = "</";
public static final String ELEMENT_END_START_AND_END = "/>";
public static final Pattern PATTERN_NAME_FROM_CLOSINGONLY_ELEMENT = Pattern.compile("\\<[\\!\\?\\/]?\\W*([-:\\w]*)\\W*[\\!\\?\\/]?\\>");
- public static final Pattern PATTERN_NAME_FROM_OPENING_ELEMENT = Pattern.compile("\\<[\\!\\?]?([-\\:\\w]+)\\W+.*");
+ public static final Pattern PATTERN_NAME_FROM_OPENING_ELEMENT = Pattern.compile("\\<[\\!\\?]?(\\w[\\-\\:\\w]*)\\W+.*");
public XMLParticle(String content) {
this.content = content;
@@ -104,7 +104,8 @@
if (!matcher.matches()) throw new DecodingException("closing element name could not be determined by parser for " + content);
} else if (isOpeningElement()) {
matcher = PATTERN_NAME_FROM_OPENING_ELEMENT.matcher(content);
- if (!matcher.matches()) throw new DecodingException("opening element name could not be determined by parser for " + content);
+ boolean matches = matcher.matches();
+ if (!matches) throw new DecodingException("opening element name could not be determined by parser for " + content);
} else throw new IllegalStateException("element must be opening or closing (or both)");
elementName = matcher.group(1);
return elementName;
Modified: labs/vysper/src/test/java/org/apache/vysper/mina/codec/XMLStreamTokenizerTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/mina/codec/XMLStreamTokenizerTestCase.java?rev=591891&r1=591890&r2=591891&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/mina/codec/XMLStreamTokenizerTestCase.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/mina/codec/XMLStreamTokenizerTestCase.java Sun Nov 4 22:24:54 2007
@@ -94,11 +94,38 @@
assertEquals(3, protocolDecoderOutput.size());
}
+ public void testCRLFInElement() throws Exception {
+ XMLStreamTokenizer decoder = new XMLStreamTokenizer();
+ MockIoSession session = new MockIoSession();
+ ByteBuffer byteBuffer = createByteBuffer();
+
+ String stanza =
+ "<stream:stream\n" +
+ " from='juliet@example.com'\n" +
+ " to='example.com'\n" +
+ " version='1.0'\n" +
+ " xml:lang='en'\n" +
+ " xmlns='jabber:client'\n" +
+ " xmlns:stream='http://etherx.jabber.org/streams'>";
+
+ MockProtocolDecoderOutput protocolDecoderOutput = new MockProtocolDecoderOutput();
+
+ byteBuffer.putString(stanza, CHARSET_ENCODER_UTF8).flip();
+ try {
+ decoder.decode(session, byteBuffer, protocolDecoderOutput);
+ } catch(Throwable th) {
+ int lkjl = 0;
+ }
+ assertEquals(1, protocolDecoderOutput.size());
+ String content = ((XMLText)protocolDecoderOutput.get(1)).getText();
+ assertEquals("\n\r", content);
+ }
+
private ByteBuffer createByteBuffer() {
return ByteBuffer.allocate(0, false).setAutoExpand(true).clear();
}
- private static class MockProtocolDecoderOutput implements ProtocolDecoderOutput
+ protected class MockProtocolDecoderOutput implements ProtocolDecoderOutput
{
private List<XMLFragment> result = new ArrayList<XMLFragment>();
Modified: labs/vysper/src/test/java/org/apache/vysper/xmpp/xmldecoder/XMLParticleTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/xmldecoder/XMLParticleTestCase.java?rev=591891&r1=591890&r2=591891&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/xmldecoder/XMLParticleTestCase.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/xmldecoder/XMLParticleTestCase.java Sun Nov 4 22:24:54 2007
@@ -24,7 +24,7 @@
*/
public class XMLParticleTestCase extends TestCase {
- public void testPattern() {
+ public void testOpeningElementName() {
assertOpeningElementName("<stream>", "stream");
assertOpeningElementName("<!stream>", "stream");
assertOpeningElementName("<stream!>", "stream");
@@ -35,11 +35,30 @@
assertOpeningElementName("<stream:stream x=\"x\" />", "stream:stream");
assertOpeningElementName("<stream:stream x=\'x\' />", "stream:stream");
}
+
+ public void testWrongOpeningElementName() {
+ assertFailureOpeningElementName("<>");
+ assertFailureOpeningElementName("<&()ยค$%/>");
+ assertFailureOpeningElementName("< space-prefixed />");
+ assertFailureOpeningElementName("<:colon-prefixed>");
+ assertFailureOpeningElementName("<-prefixed>");
+ }
+
+ public void testMoreWrongOpeningElementName() {
+ assertFailureOpeningElementName("<wrong#separator>");
+ assertFailureOpeningElementName("<wrong.separator>");
+ assertFailureOpeningElementName("<wrong_separator>");
+ }
private void assertOpeningElementName(String input, String expected) {
Matcher matcher = XMLParticle.PATTERN_NAME_FROM_OPENING_ELEMENT.matcher(input);
assertTrue(matcher.matches());
String match = matcher.group(1);
assertEquals(expected, match);
+ }
+
+ private void assertFailureOpeningElementName(String input) {
+ Matcher matcher = XMLParticle.PATTERN_NAME_FROM_OPENING_ELEMENT.matcher(input);
+ assertFalse(matcher.matches());
}
}
Modified: labs/vysper/src/test/java/org/apache/vysper/xmpp/xmldecoder/XMLRawToFragementConverterConvertErrorTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/xmldecoder/XMLRawToFragementConverterConvertErrorTestCase.java?rev=591891&r1=591890&r2=591891&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/xmldecoder/XMLRawToFragementConverterConvertErrorTestCase.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/xmldecoder/XMLRawToFragementConverterConvertErrorTestCase.java Sun Nov 4 22:24:54 2007
@@ -159,14 +159,10 @@
}
public void testElementNameColon_Only() throws DecodingException {
- List<XMLParticle> particles = new ArrayList<XMLParticle>();
XMLParticle particle = new XMLParticle("<: />");
- String name = particle.getElementName();
- assertEquals(":", name);
- particles.add(particle);
try {
- xmlRawToFragementConverter.convert(particles);
+ String name = particle.getElementName();
fail("illegal element name ':'");
} catch (DecodingException e) {
// test succeded
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org