001: /* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
002: *
003: * ***** BEGIN LICENSE BLOCK *****
004: * Version: MPL 1.1/GPL 2.0
005: *
006: * The contents of this file are subject to the Mozilla Public License Version
007: * 1.1 (the "License"); you may not use this file except in compliance with
008: * the License. You may obtain a copy of the License at
009: * http://www.mozilla.org/MPL/
010: *
011: * Software distributed under the License is distributed on an "AS IS" basis,
012: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
013: * for the specific language governing rights and limitations under the
014: * License.
015: *
016: * The Original Code is Rhino code, released
017: * May 6, 1999.
018: *
019: * The Initial Developer of the Original Code is
020: * Netscape Communications Corporation.
021: * Portions created by the Initial Developer are Copyright (C) 1997-1999
022: * the Initial Developer. All Rights Reserved.
023: *
024: * Contributor(s):
025: * Norris Boyd
026: * Ethan Hugg
027: * Terry Lucas
028: * Milen Nankov
029: *
030: * Alternatively, the contents of this file may be used under the terms of
031: * the GNU General Public License Version 2 or later (the "GPL"), in which
032: * case the provisions of the GPL are applicable instead of those above. If
033: * you wish to allow use of your version of this file only under the terms of
034: * the GPL and not to allow others to use your version of this file under the
035: * MPL, indicate your decision by deleting the provisions above and replacing
036: * them with the notice and other provisions required by the GPL. If you do
037: * not delete the provisions above, a recipient may use your version of this
038: * file under either the MPL or the GPL.
039: *
040: * ***** END LICENSE BLOCK ***** */
041:
042: package org.mozilla.javascript.xml.impl.xmlbeans;
043:
044: import org.mozilla.javascript.*;
045: import org.mozilla.javascript.xml.*;
046:
047: final class XMLWithScope extends NativeWith {
048: private static final long serialVersionUID = -696429282095170887L;
049:
050: private XMLLibImpl lib;
051: private int _currIndex;
052: private XMLList _xmlList;
053: private XMLObject _dqPrototype;
054:
055: XMLWithScope(XMLLibImpl lib, Scriptable parent, XMLObject prototype) {
056: super (parent, prototype);
057: this .lib = lib;
058: }
059:
060: void initAsDotQuery() {
061: XMLObject prototype = (XMLObject) getPrototype();
062: // XMLWithScope also handles the .(xxx) DotQuery for XML
063: // basically DotQuery is a for/in/with statement and in
064: // the following 3 statements we setup to signal it's
065: // DotQuery,
066: // the index and the object being looped over. The
067: // xws.setPrototype is the scope of the object which is
068: // is a element of the lhs (XMLList).
069: _currIndex = 0;
070: _dqPrototype = prototype;
071: if (prototype instanceof XMLList) {
072: XMLList xl = (XMLList) prototype;
073: if (xl.length() > 0) {
074: setPrototype((Scriptable) (xl.get(0, null)));
075: }
076: }
077: // Always return the outer-most type of XML lValue of
078: // XML to left of dotQuery.
079: _xmlList = new XMLList(lib);
080: }
081:
082: protected Object updateDotQuery(boolean value) {
083: // Return null to continue looping
084:
085: XMLObject seed = _dqPrototype;
086: XMLList xmlL = _xmlList;
087:
088: if (seed instanceof XMLList) {
089: // We're a list so keep testing each element of the list if the
090: // result on the top of stack is true then that element is added
091: // to our result list. If false, we try the next element.
092: XMLList orgXmlL = (XMLList) seed;
093:
094: int idx = _currIndex;
095:
096: if (value) {
097: xmlL.addToList(orgXmlL.get(idx, null));
098: }
099:
100: // More elements to test?
101: if (++idx < orgXmlL.length()) {
102: // Yes, set our new index, get the next element and
103: // reset the expression to run with this object as
104: // the WITH selector.
105: _currIndex = idx;
106: setPrototype((Scriptable) (orgXmlL.get(idx, null)));
107:
108: // continue looping
109: return null;
110: }
111: } else {
112: // If we're not a XMLList then there's no looping
113: // just return DQPrototype if the result is true.
114: if (value) {
115: xmlL.addToList(seed);
116: }
117: }
118:
119: return xmlL;
120: }
121: }
|