001: /*
002: * Jacareto Copyright (c) 2002-2005
003: * Applied Computer Science Research Group, Darmstadt University of
004: * Technology, Institute of Mathematics & Computer Science,
005: * Ludwigsburg University of Education, and Computer Based
006: * Learning Research Group, Aachen University. All rights reserved.
007: *
008: * Jacareto is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU General Public
010: * License as published by the Free Software Foundation; either
011: * version 2 of the License, or (at your option) any later version.
012: *
013: * Jacareto is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
016: * General Public License for more details.
017: *
018: * You should have received a copy of the GNU General Public
019: * License along with Jacareto; if not, write to the Free
020: * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
021: *
022: */
023:
024: package jacareto.record;
025:
026: import jacareto.struct.event.StructureElementEvent;
027: import jacareto.struct.event.StructureElementListener;
028: import jacareto.system.Environment;
029:
030: import java.util.Iterator;
031:
032: /**
033: * This abstract class represents a record which offers methods to read the record.
034: *
035: * <p>
036: * Subclasses should add themselves as RecordableChangeListeners to all recordables which have been
037: * recorded.
038: * </p>
039: *
040: * @author <a href="mailto:cspannagel@web.de">Christian Spannagel</a>
041: * @version 1.01
042: */
043: public abstract class ReadAccessRecord extends Record implements
044: StructureElementListener {
045: /**
046: * The constructor.
047: *
048: * @param env the environment
049: */
050: public ReadAccessRecord(Environment env) {
051: super (env);
052: }
053:
054: /**
055: * Returns an iterator on the recorded elements. Should throw a {@link RecordException} if the
056: * record is not open, for example.
057: *
058: * @return an iterator
059: *
060: * @throws RecordException if an error has occurred
061: */
062: public abstract Iterator iterator() throws RecordException;
063:
064: /**
065: * Returns the record element at position <code>i</code>.
066: *
067: * @param i the index
068: *
069: * @return the recordable at index <code>i</code>
070: *
071: * @throws RecordException if <code>i</code> is out of range, or the record is not opened
072: */
073: public abstract Recordable get(int i) throws RecordException;
074:
075: /**
076: * Returns the index of a specified recordable. Subclasses should overwrite this method if
077: * there is a more efficient implementation in their context.
078: *
079: * @param recordable the recordable
080: *
081: * @return the index of the recordable, or -1 if it is not contained
082: *
083: * @throws RecordException if an error has occured
084: */
085: public int getIndex(Recordable recordable) throws RecordException {
086: int result = -1;
087: Iterator it = iterator();
088: boolean found = false;
089:
090: while (it.hasNext() && !found) {
091: result++;
092: found = (it.next() == recordable);
093: }
094:
095: if (!found) {
096: result = -1;
097: }
098:
099: return result;
100: }
101:
102: /**
103: * Returns an array with all recordables. Subclasses should overwrite this method if there is a
104: * more efficient implementation in their context.
105: *
106: * @return DOCUMENT ME!
107: *
108: * @throws RecordException if an error has occured
109: */
110: public Recordable[] toArray() throws RecordException {
111: Recordable[] result = new Recordable[size()];
112: Iterator iterator = iterator();
113: int i = 0;
114:
115: while (iterator.hasNext()) {
116: result[i++] = (Recordable) iterator.next();
117: }
118:
119: return result;
120: }
121:
122: /**
123: * Called when a structure element event has occured (a recordable has changed its values).
124: * This method fires a RecordChangeEvent to all RecordChangeEventListeners
125: * (RECORDABLES_CHANGED).
126: *
127: * @param event the dispatched event
128: */
129: public void structureElementChanged(StructureElementEvent event) {
130: try {
131: if (event.getChildren() != null) {
132: Recordable changedRecordable = (Recordable) (event
133: .getChildren())[0];
134: Recordable[] changedRecordables = new Recordable[1];
135: changedRecordables[0] = changedRecordable;
136:
137: int[] changedIndices = new int[1];
138: changedIndices[0] = getIndex(changedRecordable);
139: fireRecordChange(new RecordChangeEvent(
140: RecordChangeEvent.RECORDABLES_CHANGED,
141: changedRecordables, changedIndices));
142: } else if (event.getSource() instanceof Recordable) {
143: Recordable[] changedRecordables = new Recordable[1];
144: changedRecordables[0] = (Recordable) event.getSource();
145: int[] changedIndices = new int[0];
146: fireRecordChange(new RecordChangeEvent(
147: RecordChangeEvent.RECORDABLES_CHANGED,
148: changedRecordables, changedIndices));
149: }
150:
151: } catch (RecordException r) {
152: logger.error(r);
153: }
154: }
155: }
|