001: /* *****************************************************************************
002: * JS2Doc.java
003: * ****************************************************************************/
004:
005: /* J_LZ_COPYRIGHT_BEGIN *******************************************************
006: * Copyright 2006-2007 Laszlo Systems, Inc. All Rights Reserved. *
007: * Use is subject to license terms. *
008: * J_LZ_COPYRIGHT_END *********************************************************/
009:
010: package org.openlaszlo.js2doc;
011:
012: import java.util.*;
013: import java.util.logging.*;
014:
015: /**
016:
017: */
018: class ConditionalState {
019:
020: static private Logger logger = Logger
021: .getLogger("org.openlaszlo.js2doc");
022:
023: public static final int indeterminateValue = 0;
024: public static final int falseValue = 1;
025: public static final int trueValue = 2;
026: public int inferredValue;
027:
028: public HashSet trueCases;
029: public HashSet falseCases;
030: public Set exclusiveOptions;
031: public List independentOptions;
032:
033: public ConditionalState(int value, Set exclusiveOptions,
034: List independentOptions) {
035: this .inferredValue = value;
036: this .trueCases = new HashSet();
037: this .falseCases = new HashSet();
038: this .exclusiveOptions = exclusiveOptions;
039: this .independentOptions = independentOptions;
040: }
041:
042: public ConditionalState(ConditionalState origState) {
043: this (falseValue, origState.exclusiveOptions,
044: origState.independentOptions);
045: if (origState != null) {
046: this .inferredValue = origState.inferredValue;
047: this .trueCases.addAll(origState.trueCases);
048: this .falseCases.addAll(origState.falseCases);
049: }
050: }
051:
052: public void addTrueCase(String option) {
053: this .inferredValue = ConditionalState.indeterminateValue;
054: this .trueCases.add(option);
055: this .falseCases.remove(option);
056: }
057:
058: public void addFalseCase(String option) {
059: this .inferredValue = ConditionalState.indeterminateValue;
060: this .trueCases.remove(option);
061: this .falseCases.add(option);
062: }
063:
064: public ConditionalState or(ConditionalState operand) {
065: ConditionalState newState = new ConditionalState(falseValue,
066: this .exclusiveOptions, this .independentOptions);
067: switch (this .inferredValue) {
068: case indeterminateValue:
069: switch (operand.inferredValue) {
070: case indeterminateValue:
071: newState.inferredValue = indeterminateValue;
072: newState.trueCases.addAll(this .trueCases);
073: newState.trueCases.addAll(operand.trueCases);
074: newState.falseCases.addAll(this .falseCases);
075: newState.falseCases.addAll(operand.falseCases);
076: break;
077: case trueValue:
078: newState.inferredValue = trueValue;
079: break;
080: case falseValue:
081: newState.inferredValue = indeterminateValue;
082: newState.trueCases.addAll(this .trueCases);
083: newState.falseCases.addAll(this .falseCases);
084: break;
085: }
086: break;
087: case trueValue:
088: newState.inferredValue = trueValue;
089: break;
090: case falseValue:
091: switch (operand.inferredValue) {
092: case indeterminateValue:
093: newState.inferredValue = indeterminateValue;
094: newState.trueCases.addAll(operand.trueCases);
095: newState.falseCases.addAll(operand.falseCases);
096: break;
097: case trueValue:
098: newState.inferredValue = trueValue;
099: break;
100: case falseValue:
101: newState.inferredValue = falseValue;
102: break;
103: }
104: break;
105: }
106: return newState;
107: }
108:
109: public ConditionalState and(ConditionalState operand) {
110: ConditionalState newState = new ConditionalState(falseValue,
111: this .exclusiveOptions, this .independentOptions);
112: switch (this .inferredValue) {
113: case indeterminateValue:
114: switch (operand.inferredValue) {
115: case indeterminateValue:
116: newState.inferredValue = indeterminateValue;
117: newState.trueCases.addAll(this .trueCases);
118: newState.trueCases.addAll(operand.trueCases);
119: newState.falseCases.addAll(this .falseCases);
120: newState.falseCases.addAll(operand.falseCases);
121: // TO DO [jgrandy 11/07/2006]: handle logical inconsistency:
122: // trueCases intersect falseCases != {}
123: break;
124: case trueValue:
125: newState.inferredValue = indeterminateValue;
126: newState.trueCases.addAll(this .trueCases);
127: newState.falseCases.addAll(this .falseCases);
128: break;
129: case falseValue:
130: newState.inferredValue = falseValue;
131: break;
132: }
133: break;
134: case trueValue:
135: switch (operand.inferredValue) {
136: case indeterminateValue:
137: newState.inferredValue = indeterminateValue;
138: newState.trueCases.addAll(operand.trueCases);
139: newState.falseCases.addAll(operand.falseCases);
140: break;
141: case trueValue:
142: newState.inferredValue = trueValue;
143: break;
144: case falseValue:
145: newState.inferredValue = falseValue;
146: break;
147: }
148: break;
149: case falseValue:
150: newState.inferredValue = falseValue;
151: break;
152: }
153: return newState;
154: }
155:
156: public ConditionalState not() {
157: ConditionalState newState = new ConditionalState(falseValue,
158: this .exclusiveOptions, this .independentOptions);
159: switch (this .inferredValue) {
160: case indeterminateValue:
161: newState.inferredValue = indeterminateValue;
162: newState.trueCases.addAll(this .falseCases);
163: newState.falseCases.addAll(this .trueCases);
164: break;
165: case trueValue:
166: newState.inferredValue = falseValue;
167: break;
168: case falseValue:
169: newState.inferredValue = trueValue;
170: break;
171: }
172: return newState;
173: }
174:
175: public void describeExclusiveConditions(Set includeSet) {
176: if (this .inferredValue == indeterminateValue) {
177: if (this .trueCases.isEmpty()) {
178: includeSet.addAll(this .exclusiveOptions);
179: includeSet.removeAll(this .falseCases);
180: } else {
181: includeSet.addAll(this .exclusiveOptions);
182: includeSet.retainAll(this .trueCases);
183: }
184: }
185: }
186:
187: public void describeIndependentConditions(Set includeSet,
188: Set excludeSet) {
189: if (this .inferredValue == indeterminateValue) {
190: includeSet.addAll(this .independentOptions);
191: includeSet.retainAll(this .trueCases);
192: excludeSet.addAll(this .independentOptions);
193: excludeSet.retainAll(this .falseCases);
194: }
195: }
196:
197: public String toString() {
198: if (this .inferredValue == indeterminateValue) {
199: List stateElements = new ArrayList();
200:
201: Set includes = new HashSet();
202: Set excludes = new HashSet();
203:
204: this .describeExclusiveConditions(includes);
205:
206: Iterator iter;
207: for (iter = includes.iterator(); iter.hasNext();)
208: stateElements.add("+" + (String) iter.next());
209:
210: includes.clear();
211:
212: this .describeIndependentConditions(includes, excludes);
213:
214: for (iter = includes.iterator(); iter.hasNext();)
215: stateElements.add("+" + (String) iter.next());
216:
217: for (iter = excludes.iterator(); iter.hasNext();)
218: stateElements.add("-" + (String) iter.next());
219:
220: Collections.sort(stateElements);
221:
222: String s = "";
223: for (iter = stateElements.iterator(); iter.hasNext();) {
224: s += (String) iter.next();
225: }
226:
227: return s;
228:
229: } else
230: return (this .inferredValue == trueValue) ? "true" : "false";
231: }
232: }
|