You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2009/11/12 21:26:26 UTC

svn commit: r835530 - in /incubator/pivot/trunk: core/src/org/apache/pivot/xml/ tools/src/org/apache/pivot/tools/xml/ wtk/src/org/apache/pivot/wtk/content/ wtk/src/org/apache/pivot/wtk/skin/terra/ wtk/src/org/apache/pivot/wtkx/

Author: gbrown
Date: Thu Nov 12 20:26:26 2009
New Revision: 835530

URL: http://svn.apache.org/viewvc?rev=835530&view=rev
Log:
Add output support to XMLSerializer.

Modified:
    incubator/pivot/trunk/core/src/org/apache/pivot/xml/XMLSerializer.java
    incubator/pivot/trunk/tools/src/org/apache/pivot/tools/xml/XMLViewer.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeBranch.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtkx/WTKXSerializer.java

Modified: incubator/pivot/trunk/core/src/org/apache/pivot/xml/XMLSerializer.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/core/src/org/apache/pivot/xml/XMLSerializer.java?rev=835530&r1=835529&r2=835530&view=diff
==============================================================================
--- incubator/pivot/trunk/core/src/org/apache/pivot/xml/XMLSerializer.java (original)
+++ incubator/pivot/trunk/core/src/org/apache/pivot/xml/XMLSerializer.java Thu Nov 12 20:26:26 2009
@@ -28,9 +28,11 @@
 import java.nio.charset.Charset;
 
 import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.pivot.serialization.SerializationException;
 import org.apache.pivot.serialization.Serializer;
@@ -40,9 +42,6 @@
  */
 public class XMLSerializer implements Serializer<Element> {
     private Charset charset = null;
-    private XMLInputFactory xmlInputFactory;
-
-    private Element element = null;
 
     public static final String XMLNS_ATTRIBUTE_PREFIX = "xmlns";
 
@@ -64,9 +63,6 @@
         }
 
         this.charset = charset;
-
-        xmlInputFactory = XMLInputFactory.newInstance();
-        xmlInputFactory.setProperty("javax.xml.stream.isCoalescing", false);
     }
 
     public Charset getCharset() {
@@ -74,7 +70,8 @@
     }
 
     @Override
-    public Element readObject(InputStream inputStream) throws IOException, SerializationException {
+    public Element readObject(InputStream inputStream)
+        throws IOException, SerializationException {
         if (inputStream == null) {
             throw new IllegalArgumentException("inputStream is null.");
         }
@@ -91,90 +88,99 @@
         }
 
         // Parse the XML stream
-        element = null;
+        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
+
+        Element document = null;
 
         try {
-            XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(reader);
+            XMLStreamReader xmlStreamReader = null;
 
-            while (xmlStreamReader.hasNext()) {
-                int event = xmlStreamReader.next();
+            try {
+                xmlStreamReader = xmlInputFactory.createXMLStreamReader(reader);
 
-                switch (event) {
-                    case XMLStreamConstants.CHARACTERS: {
-                        if (!xmlStreamReader.isWhiteSpace()) {
-                            String text = xmlStreamReader.getText();
-                            element.add(new TextNode(text));
-                        }
+                Element current = null;
 
-                        break;
-                    }
+                while (xmlStreamReader.hasNext()) {
+                    int event = xmlStreamReader.next();
 
-                    case XMLStreamConstants.START_ELEMENT: {
-                        // Create the element
-                        String prefix = xmlStreamReader.getPrefix();
-                        if (prefix != null
-                            && prefix.length() == 0) {
-                            prefix = null;
+                    switch (event) {
+                        case XMLStreamConstants.CHARACTERS: {
+                            if (!xmlStreamReader.isWhiteSpace()) {
+                                String text = xmlStreamReader.getText();
+                                current.add(new TextNode(text));
+                            }
+
+                            break;
                         }
 
-                        String localName = xmlStreamReader.getLocalName();
+                        case XMLStreamConstants.START_ELEMENT: {
+                            // Create the element
+                            String prefix = xmlStreamReader.getPrefix();
+                            if (prefix != null
+                                && prefix.length() == 0) {
+                                prefix = null;
+                            }
 
-                        Element element = new Element(prefix, localName);
+                            String localName = xmlStreamReader.getLocalName();
 
-                        // Get the element's namespaces
-                        for (int i = 0, n = xmlStreamReader.getNamespaceCount(); i < n; i++) {
-                            String namespacePrefix = xmlStreamReader.getNamespacePrefix(i);
-                            String namespaceURI = xmlStreamReader.getNamespaceURI(i);
+                            Element element = new Element(prefix, localName);
 
-                            if (namespacePrefix == null) {
-                                element.setDefaultNamespaceURI(namespaceURI);
-                            } else {
-                                element.getNamespaces().put(namespacePrefix, namespaceURI);
+                            // Get the element's namespaces
+                            for (int i = 0, n = xmlStreamReader.getNamespaceCount(); i < n; i++) {
+                                String namespacePrefix = xmlStreamReader.getNamespacePrefix(i);
+                                String namespaceURI = xmlStreamReader.getNamespaceURI(i);
+
+                                if (namespacePrefix == null) {
+                                    element.setDefaultNamespaceURI(namespaceURI);
+                                } else {
+                                    element.getNamespaces().put(namespacePrefix, namespaceURI);
+                                }
                             }
-                        }
 
-                        // Get the element's attributes
-                        for (int i = 0, n = xmlStreamReader.getAttributeCount(); i < n; i++) {
-                            String attributePrefix = xmlStreamReader.getAttributePrefix(i);
-                            if (attributePrefix != null
-                                && attributePrefix.length() == 0) {
-                                attributePrefix = null;
+                            // Get the element's attributes
+                            for (int i = 0, n = xmlStreamReader.getAttributeCount(); i < n; i++) {
+                                String attributePrefix = xmlStreamReader.getAttributePrefix(i);
+                                if (attributePrefix != null
+                                    && attributePrefix.length() == 0) {
+                                    attributePrefix = null;
+                                }
+
+                                String attributeLocalName = xmlStreamReader.getAttributeLocalName(i);
+                                String attributeValue = xmlStreamReader.getAttributeValue(i);
+
+                                element.getAttributes().add(new Element.Attribute(attributePrefix,
+                                    attributeLocalName, attributeValue));
                             }
 
-                            String attributeLocalName = xmlStreamReader.getAttributeLocalName(i);
-                            String attributeValue = xmlStreamReader.getAttributeValue(i);
+                            if (current == null) {
+                                document = element;
+                            } else {
+                                current.add(element);
+                            }
 
-                            element.getAttributes().add(new Element.Attribute(attributePrefix,
-                                attributeLocalName, attributeValue));
-                        }
+                            current = element;
 
-                        if (this.element != null) {
-                            this.element.add(element);
+                            break;
                         }
 
-                        this.element = element;
+                        case XMLStreamConstants.END_ELEMENT: {
+                            // Move up the stack
+                            current = current.getParent();
 
-                        break;
-                    }
-
-                    case XMLStreamConstants.END_ELEMENT: {
-                        // Move up the stack
-                        Element parent = element.getParent();
-                        if (parent != null) {
-                            element = parent;
+                            break;
                         }
-
-                        break;
                     }
                 }
+            } finally {
+                if (xmlStreamReader != null) {
+                    xmlStreamReader.close();
+                }
             }
-
-            xmlStreamReader.close();
         } catch (XMLStreamException exception) {
             throw new SerializationException(exception);
         }
 
-        return element;
+        return document;
     }
 
     @Override
@@ -189,7 +195,7 @@
         writeObject(element, writer);
     }
 
-    public void writeObject(Element element, Writer writer) {
+    public void writeObject(Element element, Writer writer) throws SerializationException {
         if (writer == null) {
             throw new IllegalArgumentException("writer is null.");
         }
@@ -198,10 +204,96 @@
             throw new IllegalArgumentException("element is null.");
         }
 
-        // TODO (note that we'll need to check for valid namespace prefixes here,
-        // since we don't do it in Element)
+        XMLOutputFactory output = XMLOutputFactory.newInstance();
+
+        try {
+            XMLStreamWriter xmlStreamWriter = null;
+
+            try {
+                xmlStreamWriter = output.createXMLStreamWriter(writer);
+
+                xmlStreamWriter.writeStartDocument();
+                writeElement(element, xmlStreamWriter);
+                xmlStreamWriter.writeEndDocument();
+            } finally {
+                if (xmlStreamWriter != null) {
+                    xmlStreamWriter.close();
+                }
+            }
+        } catch (XMLStreamException exception) {
+            throw new SerializationException(exception);
+        }
+    }
+
+    private void writeElement(Element element, XMLStreamWriter xmlStreamWriter)
+        throws XMLStreamException, SerializationException {
+        String namespacePrefix = element.getNamespacePrefix();
+        String localName = element.getLocalName();
+
+        if (namespacePrefix == null) {
+            if (element.getLength() == 0) {
+                xmlStreamWriter.writeEmptyElement(localName);
+            } else {
+                xmlStreamWriter.writeStartElement(localName);
+            }
+        } else {
+            String namespaceURI = element.getNamespaceURI(namespacePrefix);
+
+            if (element.getLength() == 0) {
+                xmlStreamWriter.writeEmptyElement(namespacePrefix, localName, namespaceURI);
+            } else {
+                xmlStreamWriter.writeStartElement(namespacePrefix, localName, namespaceURI);
+            }
+        }
+
+        // Write out the declared namespaces
+        String defaultNamespaceURI = element.getDefaultNamespaceURI();
+        if (defaultNamespaceURI != null) {
+            xmlStreamWriter.writeDefaultNamespace(defaultNamespaceURI);
+        }
+
+        Element.NamespaceDictionary namespaces = element.getNamespaces();
+        for (String declaredNamespacePrefix : namespaces) {
+            String declaredNamespaceURI = namespaces.get(declaredNamespacePrefix);
+            xmlStreamWriter.writeNamespace(declaredNamespacePrefix, declaredNamespaceURI);
+        }
+
+        // Write out the attributes
+        for (Element.Attribute attribute : element.getAttributes()) {
+            String attributeNamespacePrefix = attribute.getNamespacePrefix();
+            String attributeLocalName = attribute.getLocalName();
+            String attributeValue = attribute.getValue();
+
+            if (attributeNamespacePrefix == null) {
+                xmlStreamWriter.writeAttribute(attributeLocalName, attributeValue);
+            } else {
+                String attributeNamespaceURI = element.getNamespaceURI(attributeNamespacePrefix);
+
+                xmlStreamWriter.writeAttribute(attributeNamespacePrefix, attributeNamespaceURI,
+                    attributeLocalName, attributeValue);
+            }
+        }
+
+        // Write out the child nodes
+        for (Node node : element) {
+            if (node instanceof Element) {
+                writeElement((Element)node, xmlStreamWriter);
+            } else if (node instanceof TextNode) {
+                writeTextNode((TextNode)node, xmlStreamWriter);
+            } else {
+                throw new SerializationException("Unsupported node type: "
+                    + node.getClass().getName());
+            }
+        }
+
+        if (element.getLength() > 0) {
+            xmlStreamWriter.writeEndElement();
+        }
+    }
 
-        throw new UnsupportedOperationException();
+    private void writeTextNode(TextNode textNode, XMLStreamWriter xmlStreamWriter)
+        throws XMLStreamException {
+        xmlStreamWriter.writeCharacters(textNode.getText());
     }
 
     @Override

Modified: incubator/pivot/trunk/tools/src/org/apache/pivot/tools/xml/XMLViewer.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/tools/src/org/apache/pivot/tools/xml/XMLViewer.java?rev=835530&r1=835529&r2=835530&view=diff
==============================================================================
--- incubator/pivot/trunk/tools/src/org/apache/pivot/tools/xml/XMLViewer.java (original)
+++ incubator/pivot/trunk/tools/src/org/apache/pivot/tools/xml/XMLViewer.java Thu Nov 12 20:26:26 2009
@@ -213,6 +213,14 @@
         Sequence.Tree.Path path = new Sequence.Tree.Path(0);
         treeView.expandBranch(path);
         treeView.setSelectedPath(path);
+
+        XMLSerializer xmlSerializer = new XMLSerializer();
+
+        try {
+            xmlSerializer.writeObject(document, System.out);
+        } catch (Exception exception) {
+            System.err.println("\n" + exception);
+        }
     }
 
     public static void main(String[] args) {

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeBranch.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeBranch.java?rev=835530&r1=835529&r2=835530&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeBranch.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeBranch.java Thu Nov 12 20:26:26 2009
@@ -69,9 +69,8 @@
 
     @Override
     public int add(TreeNode treeNode) {
-        int index = getLength();
-        insert(treeNode, index);
-
+        int index = treeNodes.add(treeNode);
+        listListeners.itemInserted(this, index);
         return index;
     }
 

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java?rev=835530&r1=835529&r2=835530&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java Thu Nov 12 20:26:26 2009
@@ -136,14 +136,14 @@
         ListView listView = (ListView)getComponent();
         List<Object> listData = (List<Object>)listView.getListData();
         ListView.ItemRenderer itemRenderer = listView.getItemRenderer();
-        
+
         if (variableItemHeight) {
             int clientWidth = width;
             if (listView.getCheckmarksEnabled()) {
                 clientWidth = Math.max(clientWidth - (CHECKBOX.getWidth() + (checkboxPadding.left
                     + checkboxPadding.right)), 0);
             }
-            
+
             int index = 0;
             for (Object item : listData) {
                 itemRenderer.render(item, index++, listView, false, false, false, false);
@@ -208,7 +208,7 @@
             graphics.setPaint(backgroundColor);
             graphics.fillRect(0, 0, width, height);
         }
-        
+
         if (variableItemHeight) {
             paintVariableItemHeight(graphics);
             return;
@@ -298,7 +298,7 @@
 
         // Ensure that we only paint items that are visible
         Rectangle clipBounds = graphics.getClipBounds();
-        
+
         int checkboxHeight = 0;
         if (listView.getCheckmarksEnabled()) {
             checkboxHeight = CHECKBOX.getHeight() + (checkboxPadding.top
@@ -321,7 +321,7 @@
 
             int itemWidth = width;
             int itemX = 0;
-            
+
             boolean checked = false;
             if (listView.getCheckmarksEnabled()) {
                 checked = listView.isItemChecked(itemIndex);
@@ -329,13 +329,13 @@
                         + checkboxPadding.right);
                 itemWidth -= itemX;
             }
-            
+
             itemRenderer.render(item, itemIndex, listView, selected, checked, highlighted, disabled);
             int itemHeight = itemRenderer.getPreferredHeight(itemWidth);
             if (listView.getCheckmarksEnabled()) {
                 itemHeight = Math.max(itemHeight, checkboxHeight);
             }
-            
+
             boolean paintItem = true;
             if (clipBounds != null) {
                 paintItem = (itemY + itemHeight) >= clipBounds.y && itemY < (clipBounds.y + clipBounds.height);
@@ -376,7 +376,7 @@
                 itemRenderer.paint(rendererGraphics);
                 rendererGraphics.dispose();
             }
-            
+
             if (computeCache) {
                 variableItemHeightYCache.add(itemY);
                 variableItemLastHeight = itemHeight;
@@ -384,8 +384,8 @@
             itemY += itemHeight;
         }
     }
-    
-    
+
+
     // List view skin methods
     @Override
     @SuppressWarnings("unchecked")
@@ -401,7 +401,7 @@
             index = ArrayList.binarySearch(variableItemHeightYCache, y);
             if (index<0) {
                 index = -index-2;
-                
+
             }
         } else {
             index = (y / getFixedItemHeight());
@@ -425,7 +425,6 @@
             } else {
                 itemHeight = variableItemLastHeight;
             }
-            return new Bounds(0, itemY, getWidth(), itemHeight);
         } else {
             itemHeight = getFixedItemHeight();
             itemY = index * itemHeight;
@@ -737,7 +736,7 @@
         repaintComponent();
     }
 
-    
+
     @Override
     public boolean mouseMove(Component component, int x, int y) {
         boolean consumed = super.mouseMove(component, x, y);
@@ -789,7 +788,7 @@
 
         int itemIndex = getItemAt(y);
 
-        if (itemIndex != -1 
+        if (itemIndex != -1
             && itemIndex < listData.getLength()
             && !listView.isItemDisabled(itemIndex)) {
             int itemY = getItemBounds(itemIndex).y;

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtkx/WTKXSerializer.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtkx/WTKXSerializer.java?rev=835530&r1=835529&r2=835530&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtkx/WTKXSerializer.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtkx/WTKXSerializer.java Thu Nov 12 20:26:26 2009
@@ -322,7 +322,6 @@
         this.namedSerializers = namedSerializers;
 
         xmlInputFactory = XMLInputFactory.newInstance();
-        xmlInputFactory.setProperty("javax.xml.stream.isCoalescing", false);
 
         scriptEngineManager = new javax.script.ScriptEngineManager();
         scriptEngineManager.setBindings(new NamedObjectBindings());
@@ -407,35 +406,41 @@
 
         try {
             try {
-                XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inputStream);
+                XMLStreamReader xmlStreamReader = null;
 
-                while (xmlStreamReader.hasNext()) {
-                    int event = xmlStreamReader.next();
+                try {
+                    xmlStreamReader = xmlInputFactory.createXMLStreamReader(inputStream);
 
-                    switch (event) {
-                        case XMLStreamConstants.PROCESSING_INSTRUCTION: {
-                            processProcessingInstruction(xmlStreamReader);
-                            break;
-                        }
+                    while (xmlStreamReader.hasNext()) {
+                        int event = xmlStreamReader.next();
 
-                        case XMLStreamConstants.CHARACTERS: {
-                            processCharacters(xmlStreamReader);
-                            break;
-                        }
+                        switch (event) {
+                            case XMLStreamConstants.PROCESSING_INSTRUCTION: {
+                                processProcessingInstruction(xmlStreamReader);
+                                break;
+                            }
 
-                        case XMLStreamConstants.START_ELEMENT: {
-                            processStartElement(xmlStreamReader);
-                            break;
-                        }
+                            case XMLStreamConstants.CHARACTERS: {
+                                processCharacters(xmlStreamReader);
+                                break;
+                            }
 
-                        case XMLStreamConstants.END_ELEMENT: {
-                            processEndElement(xmlStreamReader);
-                            break;
+                            case XMLStreamConstants.START_ELEMENT: {
+                                processStartElement(xmlStreamReader);
+                                break;
+                            }
+
+                            case XMLStreamConstants.END_ELEMENT: {
+                                processEndElement(xmlStreamReader);
+                                break;
+                            }
                         }
                     }
+                } finally {
+                    if (xmlStreamReader != null) {
+                        xmlStreamReader.close();
+                    }
                 }
-
-                xmlStreamReader.close();
             } catch (XMLStreamException exception) {
                 throw new SerializationException(exception);
             }