001: //
002: // Copyright (C) 2005 United States Government as represented by the
003: // Administrator of the National Aeronautics and Space Administration
004: // (NASA). All Rights Reserved.
005: //
006: // This software is distributed under the NASA Open Source Agreement
007: // (NOSA), version 1.3. The NOSA has been approved by the Open Source
008: // Initiative. See the file NOSA-1.3-JPF at the top of the distribution
009: // directory tree for the complete NOSA document.
010: //
011: // THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY
012: // KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
013: // LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
014: // SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
015: // A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT
016: // THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT
017: // DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE.
018: //
019: package gov.nasa.jpf.search;
020:
021: import gov.nasa.jpf.Property;
022: import gov.nasa.jpf.VM;
023:
024: import java.io.PrintWriter;
025:
026: /**
027: * simple list abstracting a set of Properties. This version cannot deal with
028: * reporting multiple failures
029: */
030: public class PropertyMulticaster implements Property {
031: Property head, tail;
032: boolean headFailed, tailFailed;
033:
034: public static Property add(Property oldProperty,
035: Property newProperty) {
036: if (newProperty == null) {
037: return oldProperty;
038: }
039: if (oldProperty == null) {
040: return newProperty;
041: }
042:
043: // we store in the order of registration, multiple entries are allowed
044: // (but generally useless)
045: return new PropertyMulticaster(oldProperty, newProperty);
046: }
047:
048: public static Property remove(Property oldProperty,
049: Property removeProperty) {
050: if (oldProperty == removeProperty) {
051: return null;
052: }
053: if (oldProperty instanceof PropertyMulticaster) {
054: return ((PropertyMulticaster) oldProperty)
055: .remove(removeProperty);
056: }
057:
058: return oldProperty;
059: }
060:
061: protected Property remove(Property p) {
062: if (p == head) {
063: return tail;
064: }
065: if (p == tail) {
066: return head;
067: }
068:
069: if (head instanceof PropertyMulticaster) {
070: if (tail instanceof PropertyMulticaster) {
071: return new PropertyMulticaster(
072: ((PropertyMulticaster) head).remove(p),
073: ((PropertyMulticaster) tail).remove(p));
074: } else {
075: return new PropertyMulticaster(
076: ((PropertyMulticaster) head).remove(p), tail);
077: }
078: } else if (tail instanceof PropertyMulticaster) {
079: return new PropertyMulticaster(head,
080: ((PropertyMulticaster) tail).remove(p));
081: }
082:
083: return this ;
084: }
085:
086: public PropertyMulticaster(Property h, Property t) {
087: head = h;
088: tail = t;
089: }
090:
091: public boolean check(VM vm, Object arg) {
092: if (!head.check(vm, arg)) {
093: headFailed = true;
094: return false;
095: }
096: if (!tail.check(vm, arg)) {
097: tailFailed = true;
098: return false;
099: }
100:
101: return true;
102: }
103:
104: public String getErrorMessage() {
105: if (headFailed) {
106: return head.getErrorMessage();
107: } else if (tailFailed) {
108: return tail.getErrorMessage();
109: }
110:
111: return null;
112: }
113:
114: public void printOn(PrintWriter pw) {
115: if (headFailed) {
116: head.printOn(pw);
117: } else if (tailFailed) {
118: tail.printOn(pw);
119: }
120: }
121: }
|