001: /*
002: * $Id: XMLContextImpl.java,v 1.2 2002/06/06 15:02:07 valis Exp $
003: *
004: * ===========================================================================
005: *
006: * The JGenerator Software License, Version 1.0
007: *
008: * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
009: *
010: * Redistribution and use in source and binary forms, with or without
011: * modification, are permitted provided that the following conditions are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution, if
022: * any, must include the following acknowlegement:
023: * "This product includes software developed by Dmitry Skavish
024: * (skavish@usa.net, http://www.flashgap.com/)."
025: * Alternately, this acknowlegement may appear in the software itself,
026: * if and wherever such third-party acknowlegements normally appear.
027: *
028: * 4. The name "The JGenerator" must not be used to endorse or promote
029: * products derived from this software without prior written permission.
030: * For written permission, please contact skavish@usa.net.
031: *
032: * 5. Products derived from this software may not be called "The JGenerator"
033: * nor may "The JGenerator" appear in their names without prior written
034: * permission of Dmitry Skavish.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: */
050:
051: package org.openlaszlo.iv.flash.xml.jaxen;
052:
053: import org.openlaszlo.iv.flash.context.Context;
054: import org.openlaszlo.iv.flash.context.XMLContext;
055: import java.util.ArrayList;
056: import java.util.Iterator;
057: import java.util.List;
058: import org.jaxen.JaxenException;
059: import org.jaxen.dom.DOMXPath;
060: import org.jaxen.dom.DOMXPath;
061: import org.w3c.dom.DOMException;
062: import org.w3c.dom.Node;
063:
064: /**
065: * Jaxen XML context
066: * <P>
067: * Represents one xml node
068: *
069: * @author Andrew Wason
070: */
071: public class XMLContextImpl extends XMLContext {
072:
073: /**
074: * Creates xml context with specified parent and xml node.
075: *
076: * @param parent parent context
077: * @param node xml node represented by this context
078: */
079: public XMLContextImpl(Context parent, Node node) {
080: super (parent, node);
081: }
082:
083: /**
084: * Evaluates the specified path (as XPath) in this context or nearest
085: * xml parent.
086: *
087: * @param path containing XPath expression
088: * @return String representation of result of xpath execution or empty string
089: */
090: public String getValue(String path) {
091: try {
092: DOMXPath xpath = new DOMXPath(path);
093: Object value = xpath.evaluate(node);
094: if (value != null) {
095: if (value instanceof List) {
096: List values = (List) value;
097: if (values.size() == 0) {
098: // Fall through
099: } else if (values.size() == 1) {
100: return getNodeData((Node) values.get(0));
101: } else {
102: Iterator iter = values.iterator();
103: StringBuffer sb = new StringBuffer();
104: while (iter.hasNext())
105: sb.append(getNodeData((Node) iter.next()));
106: return sb.toString();
107: }
108: } else
109: return value.toString();
110: }
111: } catch (DOMException e) {
112: } catch (JaxenException e) {
113: }
114:
115: return getValueFromParent(path);
116: }
117:
118: private String getNodeData(Node node) {
119: switch (node.getNodeType()) {
120: case Node.DOCUMENT_FRAGMENT_NODE:
121: case Node.DOCUMENT_NODE: {
122: Node child = node.getFirstChild();
123: if (child != null)
124: return getNodeData(child);
125: }
126: break;
127: case Node.ELEMENT_NODE: {
128: StringBuffer sb = new StringBuffer();
129: for (Node child = node.getFirstChild(); child != null; child = child
130: .getNextSibling())
131: sb.append(getNodeData(child));
132: return sb.toString();
133: }
134: case Node.TEXT_NODE:
135: case Node.CDATA_SECTION_NODE:
136: case Node.ATTRIBUTE_NODE:
137: case Node.PROCESSING_INSTRUCTION_NODE:
138: return node.getNodeValue();
139: default:
140: break;
141: }
142: return "";
143: }
144:
145: /**
146: * Evaluates the specified path (as XPath) in this context or nearest
147: * xml parent. If the path evaluates to a nodeset, a list of contexts for
148: * the nodes in that nodeset is returned, otherwise null
149: *
150: * @param path String containing XPath expression
151: * @return List of contexts or null
152: */
153: public List getValueList(String path) {
154: try {
155: DOMXPath xpath = new DOMXPath(path);
156: List nodes = xpath.selectNodes(node);
157:
158: int size = nodes.size();
159: if (size > 0) {
160: ArrayList contexts = new ArrayList(size);
161: for (int i = 0; i < size; i++)
162: contexts.add(new XMLContextImpl(this , (Node) nodes
163: .get(i)));
164: return contexts;
165: }
166: } catch (JaxenException e) {
167: }
168:
169: return getValueListFromParent(path);
170: }
171: }
|