001: /*
002: * <copyright>
003: *
004: * Copyright 1997-2004 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026:
027: package org.cougaar.lib.contract.lang.op.list;
028:
029: import java.lang.reflect.Array;
030: import java.util.*;
031:
032: import org.cougaar.lib.contract.lang.*;
033: import org.cougaar.lib.contract.lang.op.OpCodes;
034:
035: /**
036: * "exists" <code>Op</code> -- returns true if any element of
037: * List matches the <code>Op</code>.
038: * <p>
039: * Doesn't return the matching entry, only a boolean. Could create
040: * "any" operator...
041: **/
042: public final class ExistsOp extends OpImpl {
043:
044: public Op u;
045:
046: public int expected_id;
047:
048: public ExistsOp() {
049: }
050:
051: public final int getID() {
052: return OpCodes.EXISTS_ID;
053: }
054:
055: public final Op parse(final OpParser p) throws ParseException {
056: TypeList origTypeList = p.cloneTypeList();
057:
058: // get expected list type
059: expected_id = TypeHelper.getExpectedId(p, true);
060: if (expected_id == TypeHelper.EXPECT_UNKNOWN) {
061: throw new ParseException("\"" + OpCodes.EXISTS_NAME
062: + "\" unable to determine Array/Collection "
063: + "type from " + origTypeList);
064: }
065:
066: Op u1 = p.nextOp();
067: if (u1 == null) {
068: throw new ParseException("\"" + OpCodes.EXISTS_NAME
069: + "\" expecting single Op argument");
070: } else if (!(u1.isReturnBoolean())) {
071: throw new ParseException("\"" + OpCodes.EXISTS_NAME
072: + "\" given invalid argument " + u1
073: + " with non-boolean return type of "
074: + u1.getReturnClass());
075: }
076:
077: Op u2 = p.nextOp();
078: if (u2 != null) {
079: throw new ParseException("\"" + OpCodes.EXISTS_NAME
080: + "\" expecting single Op argument, "
081: + "but given additional "
082: + u2.getClass().toString());
083: }
084:
085: // (exists u1)
086: this .u = u1;
087: p.setTypeList(origTypeList);
088: return this ;
089: }
090:
091: /**
092: * @param o A List, Enumeration, etc
093: * @return true if any element of o makes u.execute be true
094: */
095: public final boolean execute(final Object o) {
096: if (o == null) {
097: return false;
098: } else {
099: switch (expected_id) {
100: case TypeHelper.EXPECT_ARRAY: {
101: int lsize = Array.getLength(o);
102: for (int i = 0; i < lsize; i++) {
103: Object o2 = Array.get(o, i);
104: if (u.execute(o2)) {
105: return true;
106: }
107: }
108: return false;
109: }
110: case TypeHelper.EXPECT_LIST: {
111: List l = (List) o;
112: int lsize = l.size();
113: for (int i = 0; i < lsize; i++) {
114: Object o2 = l.get(i);
115: if (u.execute(o2)) {
116: return true;
117: }
118: }
119: return false;
120: }
121: case TypeHelper.EXPECT_COLLECTION: {
122: Iterator iter = ((Collection) o).iterator();
123: while (iter.hasNext()) {
124: Object o2 = iter.next();
125: if (u.execute(o2)) {
126: return true;
127: }
128: }
129: return false;
130: }
131: case TypeHelper.EXPECT_ITERATOR: {
132: Iterator iter = (Iterator) o;
133: while (iter.hasNext()) {
134: Object o2 = iter.next();
135: if (u.execute(o2)) {
136: return true;
137: }
138: }
139: return false;
140: }
141: case TypeHelper.EXPECT_ENUMERATION: {
142: Enumeration en = (Enumeration) o;
143: while (en.hasMoreElements()) {
144: Object o2 = en.nextElement();
145: if (u.execute(o2)) {
146: return true;
147: }
148: }
149: return false;
150: }
151: default:
152: throw new InternalError("\"" + OpCodes.ALL_NAME
153: + "\" invalid expected_id: " + expected_id);
154: }
155: }
156: }
157:
158: public final void setConst(final String key, final Object val) {
159: u.setConst(key, val);
160: }
161:
162: public final void accept(TreeVisitor visitor) {
163: // (exists op)
164: visitor.visitWord(OpCodes.EXISTS_NAME);
165: if (u != null) {
166: u.accept(visitor);
167: } else {
168: visitor.visitConstant(null, "?");
169: }
170: visitor.visitEnd();
171: }
172: }
|