KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > openlaszlo > iv > flash > xml > jaxen > XMLContextImpl


1 /*
2  * $Id: XMLContextImpl.java,v 1.2 2002/06/06 15:02:07 valis Exp $
3  *
4  * ===========================================================================
5  *
6  * The JGenerator Software License, Version 1.0
7  *
8  * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if
22  * any, must include the following acknowlegement:
23  * "This product includes software developed by Dmitry Skavish
24  * (skavish@usa.net, http://www.flashgap.com/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The name "The JGenerator" must not be used to endorse or promote
29  * products derived from this software without prior written permission.
30  * For written permission, please contact skavish@usa.net.
31  *
32  * 5. Products derived from this software may not be called "The JGenerator"
33  * nor may "The JGenerator" appear in their names without prior written
34  * permission of Dmitry Skavish.
35  *
36  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39  * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
40  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47  * SUCH DAMAGE.
48  *
49  */

50
51 package org.openlaszlo.iv.flash.xml.jaxen;
52
53 import org.openlaszlo.iv.flash.context.Context;
54 import org.openlaszlo.iv.flash.context.XMLContext;
55 import java.util.ArrayList JavaDoc;
56 import java.util.Iterator JavaDoc;
57 import java.util.List JavaDoc;
58 import org.jaxen.JaxenException;
59 import org.jaxen.dom.DOMXPath;
60 import org.jaxen.dom.DOMXPath;
61 import org.w3c.dom.DOMException JavaDoc;
62 import org.w3c.dom.Node JavaDoc;
63
64
65 /**
66  * Jaxen XML context
67  * <P>
68  * Represents one xml node
69  *
70  * @author Andrew Wason
71  */

72 public class XMLContextImpl extends XMLContext {
73
74     /**
75      * Creates xml context with specified parent and xml node.
76      *
77      * @param parent parent context
78      * @param node xml node represented by this context
79      */

80     public XMLContextImpl(Context parent, Node JavaDoc node) {
81         super(parent, node);
82     }
83
84     /**
85      * Evaluates the specified path (as XPath) in this context or nearest
86      * xml parent.
87      *
88      * @param path containing XPath expression
89      * @return String representation of result of xpath execution or empty string
90      */

91     public String JavaDoc getValue(String JavaDoc path) {
92         try {
93             DOMXPath xpath = new DOMXPath(path);
94             Object JavaDoc value = xpath.evaluate(node);
95             if (value != null) {
96                 if (value instanceof List JavaDoc) {
97                     List JavaDoc values = (List JavaDoc)value;
98                     if (values.size() == 0) {
99                         // Fall through
100
}
101                     else if (values.size() == 1) {
102                         return getNodeData((Node JavaDoc)values.get(0));
103                     }
104                     else {
105                         Iterator JavaDoc iter = values.iterator();
106                         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
107                         while (iter.hasNext())
108                             sb.append(getNodeData((Node JavaDoc)iter.next()));
109                         return sb.toString();
110                     }
111                 }
112                 else
113                     return value.toString();
114             }
115         } catch (DOMException JavaDoc e) {
116         } catch (JaxenException e) {
117         }
118
119         return getValueFromParent(path);
120     }
121
122     private String JavaDoc getNodeData(Node JavaDoc node) {
123         switch (node.getNodeType()) {
124             case Node.DOCUMENT_FRAGMENT_NODE:
125             case Node.DOCUMENT_NODE: {
126                 Node JavaDoc child = node.getFirstChild();
127                 if (child != null)
128                     return getNodeData(child);
129             }
130             break;
131             case Node.ELEMENT_NODE: {
132                 StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
133                 for (Node JavaDoc child = node.getFirstChild(); child != null; child = child.getNextSibling())
134                     sb.append(getNodeData(child));
135                 return sb.toString();
136             }
137             case Node.TEXT_NODE:
138             case Node.CDATA_SECTION_NODE:
139             case Node.ATTRIBUTE_NODE:
140             case Node.PROCESSING_INSTRUCTION_NODE :
141                 return node.getNodeValue();
142             default:
143                 break;
144         }
145         return "";
146     }
147
148     /**
149      * Evaluates the specified path (as XPath) in this context or nearest
150      * xml parent. If the path evaluates to a nodeset, a list of contexts for
151      * the nodes in that nodeset is returned, otherwise null
152      *
153      * @param path String containing XPath expression
154      * @return List of contexts or null
155      */

156     public List JavaDoc getValueList(String JavaDoc path) {
157         try {
158             DOMXPath xpath = new DOMXPath(path);
159             List JavaDoc nodes = xpath.selectNodes(node);
160
161             int size = nodes.size();
162             if (size > 0) {
163                 ArrayList JavaDoc contexts = new ArrayList JavaDoc(size);
164                 for (int i = 0; i < size; i++)
165                     contexts.add(new XMLContextImpl(this, (Node JavaDoc)nodes.get(i)));
166                 return contexts;
167             }
168         } catch (JaxenException e) {
169         }
170
171         return getValueListFromParent(path);
172     }
173 }
174
Popular Tags