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