001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.xml.xpath.impl;
043:
044: import org.netbeans.modules.xml.xpath.LocationStep;
045: import org.netbeans.modules.xml.xpath.StepNodeTest;
046: import org.netbeans.modules.xml.xpath.StepNodeNameTest;
047: import org.netbeans.modules.xml.xpath.StepNodeTypeTest;
048: import org.netbeans.modules.xml.xpath.XPathPredicateExpression;
049: import org.netbeans.modules.xml.xpath.visitor.XPathVisitor;
050:
051: /**
052: * Represents a location path step.
053: *
054: * @author Enrico Lelina
055: * @version
056: */
057: public class LocationStepImpl extends XPathExpressionImpl implements
058: LocationStep {
059:
060: /** The axis. */
061: private int mAxis;
062:
063: /** The node test. */
064: private StepNodeTest mNodeTest;
065:
066: /** predicates */
067: private XPathPredicateExpression[] mPredicates = null;
068:
069: /** Constructor. */
070: public LocationStepImpl() {
071: this (0, null, null);
072: }
073:
074: /**
075: * Constructor.
076: * @param axis the axis
077: * @param nodeTest the node test
078: */
079: public LocationStepImpl(int axis, StepNodeTest nodeTest,
080: XPathPredicateExpression[] predicates) {
081: setAxis(axis);
082: setNodeTest(nodeTest);
083: setPredicates(predicates);
084: }
085:
086: /**
087: * Gets the axis.
088: * @return the axis
089: */
090: public int getAxis() {
091: return mAxis;
092: }
093:
094: /**
095: * Sets the axis.
096: * @param axis the axis
097: */
098: public void setAxis(int axis) {
099: mAxis = axis;
100: }
101:
102: /**
103: * Gets the node test.
104: * @return the node test
105: */
106: public StepNodeTest getNodeTest() {
107: return mNodeTest;
108: }
109:
110: /**
111: * Sets the node test.
112: * @param nodeTest the node test
113: */
114: public void setNodeTest(StepNodeTest nodeTest) {
115: mNodeTest = nodeTest;
116: }
117:
118: /**
119: * Gets the Predicates
120: * @return the predicates
121: */
122: public XPathPredicateExpression[] getPredicates() {
123: return mPredicates;
124: }
125:
126: /**
127: * Sets the Predicates
128: * @param predicates list of predicates
129: */
130: public void setPredicates(XPathPredicateExpression[] predicates) {
131: mPredicates = predicates;
132: }
133:
134: /**
135: * Gets the string representation.
136: * @return the string representation
137: */
138: public String getString() {
139: StringBuilder sb = new StringBuilder();
140: //
141: StepNodeTest nodeTest = getNodeTest();
142: if (nodeTest instanceof StepNodeNameTest) {
143: //
144: String axisText = null;
145: switch (getAxis()) {
146: case LocationStep.AXIS_SELF:
147: // Don't try using "." instead because of the dot is not an axis
148: // but rather the abbreviated location step
149: axisText = "self::"; // NOI18N
150: break;
151: case LocationStep.AXIS_CHILD:
152: // nothing to append
153: break;
154: case LocationStep.AXIS_PARENT:
155: // Don't try using ".." instead because of the double dot is not an axis
156: // but rather the abbreviated location step
157: axisText = "parent::"; // NOI18N
158: break;
159: case LocationStep.AXIS_ANCESTOR:
160: axisText = "ancestor::"; // NOI18N
161: break;
162: case LocationStep.AXIS_ATTRIBUTE:
163: axisText = "@"; // NOI18N
164: break;
165: case LocationStep.AXIS_NAMESPACE:
166: axisText = "namespace::"; // NOI18N
167: break;
168: case LocationStep.AXIS_PRECEDING:
169: axisText = "preceding::"; // NOI18N
170: break;
171: case LocationStep.AXIS_FOLLOWING:
172: axisText = "following::"; // NOI18N
173: break;
174: case LocationStep.AXIS_DESCENDANT:
175: axisText = "descendant::"; // NOI18N
176: break;
177: case LocationStep.AXIS_ANCESTOR_OR_SELF:
178: axisText = "ancestor-or-self::"; // NOI18N
179: break;
180: case LocationStep.AXIS_DESCENDANT_OR_SELF:
181: axisText = "descendant-or-self::"; // NOI18N
182: break;
183: case LocationStep.AXIS_FOLLOWING_SIBLING:
184: axisText = "following-sibling::"; // NOI18N
185: break;
186: case LocationStep.AXIS_PRECEDING_SIBLING:
187: axisText = "preceding-sibling::"; // NOI18N
188: break;
189: }
190: //
191: if (axisText != null && axisText.length() != 0) {
192: sb.append(axisText);
193: }
194: //
195: StepNodeNameTest snnt = (StepNodeNameTest) nodeTest;
196: if (snnt.isWildcard()) {
197: sb.append("*"); // NOI18N
198: } else {
199: sb.append(((StepNodeNameTest) nodeTest).getNodeName());
200: }
201: } else if (nodeTest instanceof StepNodeTypeTest) {
202: StepNodeTypeTest sntt = (StepNodeTypeTest) nodeTest;
203: switch (sntt.getNodeType()) {
204: case NODETYPE_NODE:
205: switch (getAxis()) {
206: case LocationStep.AXIS_CHILD: // it means that the location step is "node()"
207: sb.append(sntt.getNodeTypeString());
208: break;
209: case LocationStep.AXIS_SELF: // it means that the location step is abbreviated step "."
210: sb.append(".");
211: break;
212: case LocationStep.AXIS_PARENT: // it means that the location step is abbreviated step ".."
213: sb.append("..");
214: break;
215: case LocationStep.AXIS_DESCENDANT_OR_SELF: // it means that the location step is abbreviated step "//"
216: // It doesn't necessary to append anything here because
217: // the double slash "//" abbreviated step is a kind of "empty" step.
218: // It is a step without a content between two slashes.
219: break;
220: default:
221: // other axis are not supported here
222: }
223: break;
224: case NODETYPE_COMMENT:
225: case NODETYPE_PI:
226: case NODETYPE_TEXT:
227: sb.append(sntt.getNodeTypeString());
228: break;
229: }
230: }
231: //
232: return sb.toString();
233: }
234:
235: public void accept(XPathVisitor visitor) {
236: visitor.visit(this);
237: }
238:
239: }
|