org/objectweb/proactive/core/xml/io/DOMAdaptor.java

00001 /* 
00002  * ################################################################
00003  * 
00004  * ProActive: The Java(TM) library for Parallel, Distributed, 
00005  *            Concurrent computing with Security and Mobility
00006  * 
00007  * Copyright (C) 1997-2007 INRIA/University of Nice-Sophia Antipolis
00008  * Contact: proactive@objectweb.org
00009  * 
00010  * This library is free software; you can redistribute it and/or
00011  * modify it under the terms of the GNU Lesser General Public
00012  * License as published by the Free Software Foundation; either
00013  * version 2.1 of the License, or any later version.
00014  *  
00015  * This library is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018  * Lesser General Public License for more details.
00019  * 
00020  * You should have received a copy of the GNU Lesser General Public
00021  * License along with this library; if not, write to the Free Software
00022  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
00023  * USA
00024  *  
00025  *  Initial developer(s):               The ProActive Team
00026  *                        http://www.inria.fr/oasis/ProActive/contacts.html
00027  *  Contributor(s): 
00028  * 
00029  * ################################################################
00030  */ 
00031 package org.objectweb.proactive.core.xml.io;
00032 
00033 import org.w3c.dom.Element;
00034 import org.w3c.dom.NamedNodeMap;
00035 import org.w3c.dom.Node;
00036 
00037 
00046 public class DOMAdaptor {
00047     private XMLHandler targetHandler;
00048 
00049     public DOMAdaptor(XMLHandler targetHandler) {
00050         this.targetHandler = targetHandler;
00051     }
00052 
00053     //
00054     // -- PUBLIC METHOD ------------------------------------------------------
00055     //
00056     public void read(Element rootElement) throws java.io.IOException {
00057         try {
00058             domWalker(rootElement);
00059         } catch (org.xml.sax.SAXException e) {
00060             throw new java.io.IOException(e.getMessage());
00061         }
00062     }
00063 
00064     //
00065     // -- PRIVATE METHODS ------------------------------------------------------
00066     //
00067     private void domWalker(Node node) throws org.xml.sax.SAXException {
00068         String localName = node.getNodeName();
00069         NamedNodeMap nodeMap = node.getAttributes();
00070         java.util.Vector prefixes = null;
00071         if (nodeMap == null) {
00072             targetHandler.startElement(localName, new EmptyAttributesImpl());
00073         } else {
00074             prefixes = notifyStartPrefixMapping(nodeMap);
00075             targetHandler.startElement(localName, new AttributesImpl(nodeMap));
00076         }
00077         processChilds(node);
00078         targetHandler.endElement(localName);
00079         if (prefixes != null) {
00080             notifyEndPrefixMapping(prefixes);
00081         }
00082     }
00083 
00084     private void processChilds(Node node) throws org.xml.sax.SAXException {
00085         StringBuilder sb = null;
00086         Node child = node.getFirstChild();
00087         while (child != null) {
00088             switch (child.getNodeType()) {
00089             case Node.TEXT_NODE:
00090             case Node.CDATA_SECTION_NODE:
00091                 if (sb == null) {
00092                     sb = new StringBuilder();
00093                 }
00094                 sb.append(((org.w3c.dom.CharacterData) child).getData());
00095                 break;
00096             default:
00097                 domWalker(child);
00098                 break;
00099             }
00100             child = child.getNextSibling();
00101         }
00102         if (sb != null) {
00103             targetHandler.readValue(sb.toString());
00104         }
00105     }
00106 
00107     private java.util.Vector notifyStartPrefixMapping(NamedNodeMap nodeMap)
00108         throws org.xml.sax.SAXException {
00109         java.util.Vector prefixes = null;
00110         int n = nodeMap.getLength();
00111         for (int i = 0; i < n; i++) {
00112             Node attributeNode = nodeMap.item(i);
00113             String attributeName = attributeNode.getNodeName();
00114             if (attributeName.startsWith("xmlns:")) {
00115                 // found a namespace attribute
00116                 if (prefixes == null) {
00117                     prefixes = new java.util.Vector();
00118                 }
00119                 String prefix = attributeName.substring(6);
00120                 String URI = attributeNode.getNodeValue();
00121                 prefixes.addElement(prefix);
00122                 targetHandler.startPrefixMapping(prefix, URI);
00123             }
00124         }
00125         return prefixes;
00126     }
00127 
00128     private void notifyEndPrefixMapping(java.util.Vector prefixes)
00129         throws org.xml.sax.SAXException {
00130         int n = prefixes.size();
00131         for (int i = 0; i < n; i++) {
00132             targetHandler.endPrefixMapping((String) prefixes.elementAt(i));
00133         }
00134     }
00135 
00136     //
00137     // -- INNER CLASSES ------------------------------------------------------
00138     //
00139     private class AttributesImpl implements Attributes {
00140         private NamedNodeMap attributes;
00141 
00142         AttributesImpl(NamedNodeMap attributes) {
00143             this.attributes = attributes;
00144         }
00145 
00146         public String getValue(int index) {
00147             Node node = attributes.item(index);
00148             if (node == null) {
00149                 return null;
00150             }
00151             return node.getNodeValue();
00152         }
00153 
00154         public String getValue(String qName) {
00155             Node node = attributes.getNamedItem(qName);
00156             if (node == null) {
00157                 return null;
00158             }
00159             return node.getNodeValue();
00160         }
00161 
00162         public String getValue(String uri, String localPart) {
00163             Node node = attributes.getNamedItemNS(uri, localPart);
00164             if (node == null) {
00165                 return null;
00166             }
00167             return node.getNodeValue();
00168         }
00169 
00170         public int getLength() {
00171             return attributes.getLength();
00172         }
00173     }
00174 
00175     protected class EmptyAttributesImpl implements Attributes {
00176         EmptyAttributesImpl() {
00177         }
00178 
00179         public String getValue(int index) {
00180             return null;
00181         }
00182 
00183         public String getValue(String qName) {
00184             return null;
00185         }
00186 
00187         public String getValue(String uri, String localPart) {
00188             return null;
00189         }
00190 
00191         public int getLength() {
00192             return 0;
00193         }
00194     }
00195 }

Generated on Mon Jan 22 15:16:10 2007 for ProActive by  doxygen 1.5.1