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.core.blackboard;
028:
029: import java.io.Serializable;
030: import java.util.AbstractList;
031: import java.util.AbstractSet;
032: import java.util.Iterator;
033: import java.util.List;
034: import java.util.NoSuchElementException;
035: import java.util.RandomAccess;
036: import java.util.Set;
037:
038: /**
039: * A change report for an anonymous (unspecified) change.
040: * <p>
041: * This is used whenever a subscriber does:<pre>
042: * - publishChange(o)
043: * or
044: * - publishChange(o, null)
045: * or
046: * - publishChange(o, an-empty-collection)</pre>
047: * <p>
048: * Subscribers should watch for the "AnonymousChangeReport.SET".
049: */
050: public final class AnonymousChangeReport implements ChangeReport {
051:
052: // singleton instance
053: public static final AnonymousChangeReport INSTANCE = new AnonymousChangeReport();
054:
055: // a list containing the singleton
056: public static final List LIST = new AnonList();
057:
058: // a set containing the singleton
059: public static final Set SET = new AnonSet();
060:
061: private AnonymousChangeReport() {
062: }
063:
064: private Object readResolve() {
065: return INSTANCE;
066: }
067:
068: public String toString() {
069: return "anonymous";
070: }
071:
072: static final long serialVersionUID = 1209837181010093282L;
073:
074: // singleton LIST with singleton-friendly "readResolve()":
075: private static class AnonList extends AbstractList implements
076: RandomAccess, Serializable {
077: private AnonList() {
078: }
079:
080: public int size() {
081: return 1;
082: }
083:
084: public boolean contains(Object obj) {
085: return (obj == INSTANCE);
086: }
087:
088: public Object get(int index) {
089: if (index != 0)
090: throw new IndexOutOfBoundsException("Index: " + index
091: + ", Size: 1");
092: return INSTANCE;
093: }
094:
095: private Object readResolve() {
096: return LIST;
097: }
098:
099: static final long serialVersionUID = 3190948102986892191L;
100: }
101:
102: // singleton SET with singleton-friendly "readResolve()":
103: private static class AnonSet extends AbstractSet implements
104: Serializable {
105: private AnonSet() {
106: }
107:
108: public Iterator iterator() {
109: return new Iterator() {
110: private boolean hasNext = true;
111:
112: public boolean hasNext() {
113: return hasNext;
114: }
115:
116: public Object next() {
117: if (hasNext) {
118: hasNext = false;
119: return INSTANCE;
120: }
121: throw new NoSuchElementException();
122: }
123:
124: public void remove() {
125: throw new UnsupportedOperationException();
126: }
127: };
128: }
129:
130: public int size() {
131: return 1;
132: }
133:
134: public boolean contains(Object obj) {
135: return (obj == INSTANCE);
136: }
137:
138: private Object readResolve() {
139: return SET;
140: }
141:
142: private static final long serialVersionUID = 409580998934879938L;
143: }
144:
145: }
|