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/08/31 23:48:07 UTC

svn commit: r571610 - in /labs/vysper/src: main/java/org/apache/vysper/xmpp/delivery/ main/java/org/apache/vysper/xmpp/stanza/ main/java/org/apache/vysper/xmpp/xmlfragment/ test/java/org/apache/vysper/xmpp/xmlfragment/

Author: berndf
Date: Fri Aug 31 14:48:07 2007
New Revision: 571610

URL: http://svn.apache.org/viewvc?rev=571610&view=rev
Log:
[vysper] message stanza and xml processing

Added:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/MessageStanzaType.java
      - copied, changed from r542950, labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/IQStanzaType.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLSemanticError.java
    labs/vysper/src/test/java/org/apache/vysper/xmpp/xmlfragment/
    labs/vysper/src/test/java/org/apache/vysper/xmpp/xmlfragment/XMLElementTestCase.java
Removed:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaRelayImpl.java
Modified:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/MessageStanza.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/XMPPCoreStanza.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLElement.java

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/MessageStanza.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/MessageStanza.java?rev=571610&r1=571609&r2=571610&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/MessageStanza.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/MessageStanza.java Fri Aug 31 14:48:07 2007
@@ -17,6 +17,11 @@
 
 package org.apache.vysper.xmpp.stanza;
 
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
+
+import java.util.Map;
+
 /**
  * message stanza (push)
  */
@@ -36,4 +41,64 @@
     public String getName() {
         return NAME;
     }
+    
+    public MessageStanzaType getIQType() {
+        String type = getType();
+        if (type == null) return null;
+        return MessageStanzaType.valueOfWithDefault(type);
+    }
+
+    /**
+     * 
+     * @param lang
+     * @return
+     * @throws XMLSemanticError - if language attribtues are not unqiue RFC3921.2.1.2.1
+     */
+    public String getSubject(String lang) throws XMLSemanticError {
+        XMLElement element = getSubjects().get(lang);
+        if (element == null) return null;
+        return element.getSingleInnerText().getText();
+    }
+
+    /**
+     * @return all subject elements, keyed by their lang attribute
+     * @throws XMLSemanticError
+     */
+    public Map<String, XMLElement> getSubjects() throws XMLSemanticError {
+        return getInnerElementsByXMLLangNamed("subject");
+    }
+
+    /**
+     * 
+     * @param lang
+     * @return
+     * @throws XMLSemanticError - if langauge attributes are not unique, RFC3921.2.1.2.2
+     */
+    public String getBody(String lang) throws XMLSemanticError {
+        XMLElement element = getBodies().get(lang);
+        if (element == null) return null;
+        return element.getSingleInnerText().getText();
+    }
+
+    /**
+     * @return all body elements, keyed by their lang attribute
+     * @throws XMLSemanticError
+     */
+    public Map<String, XMLElement> getBodies() throws XMLSemanticError {
+        return getInnerElementsByXMLLangNamed("body");
+    }
+
+    /**
+     * 
+     * @return thread identifier, or NULL, if not given
+     * @throws XMLSemanticError - if thread element is not unique, or no unqiue inner text
+     * is given, RFC3921 2.1.2.3
+     */
+    public String getThread() throws XMLSemanticError {
+        XMLElement element = getSingleInnerElementsNamed("thread");
+        if (element == null) return null; // thread is optional, see RFC3921.2.1.2.3
+        return element.getSingleInnerText().getText();
+    } 
+    
+    
 }

Copied: labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/MessageStanzaType.java (from r542950, labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/IQStanzaType.java)
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/MessageStanzaType.java?p2=labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/MessageStanzaType.java&p1=labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/IQStanzaType.java&r1=542950&r2=571610&rev=571610&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/IQStanzaType.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/MessageStanzaType.java Fri Aug 31 14:48:07 2007
@@ -19,25 +19,29 @@
 
 /**
  */
-public enum IQStanzaType {
+public enum MessageStanzaType {
 
-    GET ("get"),
-    SET ("set"),
-    RESULT ("result"),
-    ERROR ("error");
+    CHAT ("chat"),
+    ERROR ("error"),
+    GROUPCHAT ("groupchat"),
+    HEADLINE ("headline"),
+    NORMAL ("normal");
 
     private final String value;
 
-    public static IQStanzaType valueOfOrNull(String value) {
+    /**
+     * RFC3921.2.1.1: type is NORMAL per default, if no (valid) value is
+     * given
+     */
+    public static MessageStanzaType valueOfWithDefault(String value) {
         try {
-            return valueOf(value.toUpperCase());
+            return MessageStanzaType.valueOf(value.toUpperCase());
         } catch (IllegalArgumentException e) {
-            return null;
+            return NORMAL;
         }
     }
 
-
-    IQStanzaType(String value) {
+    MessageStanzaType(String value) {
         this.value = value;
     }
 
@@ -45,4 +49,4 @@
         return value;
     }
 
-}
+}
\ No newline at end of file

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/XMPPCoreStanza.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/XMPPCoreStanza.java?rev=571610&r1=571609&r2=571610&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/XMPPCoreStanza.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/stanza/XMPPCoreStanza.java Fri Aug 31 14:48:07 2007
@@ -66,10 +66,6 @@
         return getEntity("from");
     }
 
-    public String getXMLLang() {
-        return getVerifier().attributePresent("xml:lang") ? getAttribute("xml:lang").getValue() : null;
-    }
-
     public String getType() {
         return getVerifier().attributePresent("type") ? getAttribute("type").getValue() : null;
     }

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLElement.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLElement.java?rev=571610&r1=571609&r2=571610&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLElement.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLElement.java Fri Aug 31 14:48:07 2007
@@ -17,8 +17,12 @@
 
 package org.apache.vysper.xmpp.xmlfragment;
 
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 /**
  * an immutable xml element specialized for XMPP.
@@ -71,6 +75,10 @@
         return null;
     }
 
+    public String getXMLLang() {
+        return getVerifier().attributePresent("xml:lang") ? getAttribute("xml:lang").getValue() : null;
+    }
+
     public List<XMLFragment> getInnerFragments() {
         return innerFragments;
     }
@@ -81,6 +89,85 @@
             if (xmlFragment instanceof XMLElement) return (XMLElement)xmlFragment;
         }
         return null;
+    }
+
+    public List<XMLElement> getInnerElements() {
+        List<XMLElement> innerElements = new ArrayList<XMLElement>();
+        if (innerFragments == null || innerFragments.size() < 1) return null;
+        for (XMLFragment xmlFragment : innerFragments) {
+            if (xmlFragment instanceof XMLElement) innerElements.add((XMLElement) xmlFragment);
+        }
+        return innerElements;
+    }
+
+    public List<XMLText> getInnerTexts() {
+        List<XMLText> innerTexts = new ArrayList<XMLText>();
+        if (innerFragments == null || innerFragments.size() < 1) return null;
+        for (XMLFragment xmlFragment : innerFragments) {
+            if (xmlFragment instanceof XMLText) innerTexts.add((XMLText) xmlFragment);
+        }
+        return innerTexts;
+    }
+
+    public XMLText getFirstInnerText() {
+        if (innerFragments == null || innerFragments.size() < 1) return null;
+        for (XMLFragment xmlFragment : innerFragments) {
+            if (xmlFragment instanceof XMLText) return (XMLText) xmlFragment;
+        }
+        return null;
+    }
+
+    public XMLText getSingleInnerText() throws XMLSemanticError {
+        List<XMLText> innerTexts = getInnerTexts();
+        if (innerTexts.isEmpty()) return null;
+        if (innerTexts.size() > 1) throw new XMLSemanticError("element has more than one inner text fragment");
+        return innerTexts.get(0);
+    }
+
+    /**
+     * collects all inner elements named as given parameter
+     * @param name - must not be NULL
+     */
+    public List<XMLElement> getInnerElementsNamed(String name) {
+        if (name == null) return null;
+        List<XMLElement> innerElements = getInnerElements();
+        Iterator<XMLElement> elementIterator = innerElements.iterator(); // this List will be modified now!
+        while (elementIterator.hasNext()) {
+            XMLElement xmlElement =  elementIterator.next();
+            if (!name.equals(xmlElement.getName())) elementIterator.remove();
+        }
+        return innerElements;
+    }
+
+    public XMLElement getSingleInnerElementsNamed(String name) throws XMLSemanticError {
+        List<XMLElement> innerElements = getInnerElementsNamed(name);
+        if (innerElements.isEmpty()) return null;
+        if (innerElements.size() > 1) throw new XMLSemanticError("element has more than one inner element named: " + name);
+        return innerElements.get(0);
+    }
+
+    /**
+     * collects all inner elements with given name and puts them in a map indexed by
+     * @param name
+     * @return Map<String language, XMLElement>
+     * @exception no language attribute may occur more than once for the same element
+     */
+    public Map<String, XMLElement> getInnerElementsByXMLLangNamed(String name) throws XMLSemanticError {
+        if (name == null) return null;
+
+        List<XMLElement> innerElements = getInnerElementsNamed(name);
+        Map<String, XMLElement> langMap = new HashMap<String, XMLElement>();
+
+        Iterator<XMLElement> elementIterator = innerElements.iterator(); // this List will be modified now!
+        while (elementIterator.hasNext()) {
+            XMLElement xmlElement =  elementIterator.next();
+            String xmlLang = xmlElement.getXMLLang();
+            if (langMap.containsKey(xmlLang)) {
+                throw new XMLSemanticError("two inner elements '" + name + "' with same language attribute " + xmlLang);
+            }
+            langMap.put(xmlLang, xmlElement);
+        }
+        return langMap;
     }
 
     public boolean equals(Object o) {

Added: labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLSemanticError.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLSemanticError.java?rev=571610&view=auto
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLSemanticError.java (added)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLSemanticError.java Fri Aug 31 14:48:07 2007
@@ -0,0 +1,39 @@
+/***********************************************************************
+ * Copyright (c) 2006-2007 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.                      *
+ ***********************************************************************/
+package org.apache.vysper.xmpp.xmlfragment;
+
+/**
+ * the XML was syntactically ok, but business logic applied on xml level revealed semantical problems
+ * (wrong attributes, doubled elements etc.)
+ */
+public class XMLSemanticError extends Exception {
+    public XMLSemanticError() {
+        super();
+    }
+
+    public XMLSemanticError(String s) {
+        super(s);
+    }
+
+    public XMLSemanticError(String s, Throwable throwable) {
+        super(s, throwable);
+    }
+
+    public XMLSemanticError(Throwable throwable) {
+        super(throwable);
+    }
+}

Added: labs/vysper/src/test/java/org/apache/vysper/xmpp/xmlfragment/XMLElementTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/xmlfragment/XMLElementTestCase.java?rev=571610&view=auto
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/xmlfragment/XMLElementTestCase.java (added)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/xmlfragment/XMLElementTestCase.java Fri Aug 31 14:48:07 2007
@@ -0,0 +1,130 @@
+/***********************************************************************
+ * Copyright (c) 2006-2007 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.                      *
+ ***********************************************************************/
+package org.apache.vysper.xmpp.xmlfragment;
+
+import junit.framework.TestCase;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+
+import java.util.List;
+
+/**
+ */
+public class XMLElementTestCase extends TestCase {
+
+    public void testBasicGetters() {
+        XMLElement xmlElement = new StanzaBuilder("message", "jabber:test").
+                addAttribute("lang", "de").
+                addAttribute("xml:lang", "cn").
+                addAttribute("xmllang", "en").
+        getFinalStanza();
+        
+        assertEquals("message", xmlElement.getName());
+        assertEquals("jabber:test", xmlElement.getNamespace());
+        assertEquals("cn", xmlElement.getXMLLang());
+        
+        assertNull(xmlElement.getInnerElements());
+        List<Attribute> list = xmlElement.getAttributes();
+        assertNotNull(list);
+        assertEquals(3, list.size());
+    }
+
+    public void testInnerTextGetters() {
+        
+        XMLElement xmlElement = new StanzaBuilder("message", "jabber:test").
+                addText("t1").
+                startInnerElement("i1").
+                endInnerElement().
+                addText("t2").
+                addText("t3").
+                startInnerElement("i2").
+                endInnerElement().
+                addText("t4").
+        getFinalStanza();
+
+        List<XMLText> list = xmlElement.getInnerTexts();
+        assertEquals(4, list.size());
+        assertEquals("t1", list.get(0).getText());
+        assertEquals("t2", list.get(1).getText());
+        assertEquals("t3", list.get(2).getText());
+        assertEquals("t4", list.get(3).getText());
+
+        assertEquals("t1", xmlElement.getFirstInnerText().getText());
+        try {
+            xmlElement.getSingleInnerText();
+            fail("must raise exception");
+        } catch (XMLSemanticError xmlSemanticError) {
+            // test succeeded
+        }
+
+        xmlElement = new StanzaBuilder("message", "jabber:test").
+                startInnerElement("i1").
+                endInnerElement().
+        getFinalStanza();
+        try {
+            assertNull(xmlElement.getSingleInnerText());
+        } catch (XMLSemanticError xmlSemanticError) {
+            fail("must not raise error");
+        }
+    }
+
+    public void testInnerElementGetters() {
+        
+        XMLElement xmlElement = new StanzaBuilder("message", "jabber:test").
+                addText("t1").
+                startInnerElement("i1").
+                endInnerElement().
+                startInnerElement("i2").
+                    addAttribute("order", "1").
+                endInnerElement().
+                startInnerElement("i2").
+                    addAttribute("order", "2").
+                endInnerElement().
+                addText("t2").
+                addText("t3").
+                startInnerElement("i3").
+                endInnerElement().
+                addText("t4").
+        getFinalStanza();
+
+        List<XMLElement> list = xmlElement.getInnerElements();
+        assertEquals(4, list.size());
+
+        assertEquals("i1", xmlElement.getFirstInnerElement().getName());
+        try {
+            xmlElement.getSingleInnerElementsNamed("i2");
+            fail("must raise exception");
+        } catch (XMLSemanticError xmlSemanticError) {
+            // test succeeded
+        }
+
+        try {
+            XMLElement xmlElement1 = xmlElement.getSingleInnerElementsNamed("i3");
+            assertEquals("i3", xmlElement1.getName());
+        } catch (XMLSemanticError xmlSemanticError) {
+            fail("must not raise exception");
+        }
+
+        xmlElement = new StanzaBuilder("message", "jabber:test").
+                addText("t1").
+        getFinalStanza();
+        try {
+            assertNull(xmlElement.getSingleInnerElementsNamed("none"));
+        } catch (XMLSemanticError xmlSemanticError) {
+            fail("must not raise error");
+        }
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org