001 package data.ooimpl;
002
003 import data.*;
004
005 import log.*;
006
007 import java.io.Serializable;
008
009 /**
010 * Basic simple implementation of the DataBasketEntry interface.
011 * DataBasketEntries may be coalesced, meaning that two separate operations may
012 * be expressed by one DataBasketEntry, if this is possible. Applications that
013 * inspect DataBasketEntries directly should not make assumptions about whether
014 * or not they have been coalesced.
015 *
016 * @author Steffen Zschaler
017 * @version 14/06/1999
018 * @since v2.0
019 */
020 public class DataBasketEntryImpl extends Object implements DataBasketEntry, Loggable, Serializable {
021
022 /**
023 * The source of the operation.
024 *
025 * @serial
026 */
027 protected DataBasketEntrySource m_dbesSource;
028
029 /**
030 * The destination of the operation.
031 *
032 * @serial
033 */
034 protected DataBasketEntryDestination m_dbedDest;
035
036 /**
037 * The object moved by the operation.
038 *
039 * @serial
040 */
041 protected Object m_oValue;
042
043 /**
044 * The entry's main key.
045 *
046 * @serial
047 */
048 protected String m_sMainKey;
049
050 /**
051 * The entry's secondary key.
052 *
053 * @serial
054 */
055 protected String m_sSecondaryKey;
056
057 /**
058 * true if the entry was commited or rolled back completely.
059 *
060 * @serial
061 */
062 protected boolean m_fHandled = false;
063
064 /**
065 * The DataBasket owning this entry..
066 *
067 * @serial
068 */
069 protected DataBasketImpl m_dbiOwner;
070
071 /**
072 * Create a new DataBasketEntryImpl.
073 *
074 * @param sMainKey the entry's main key.
075 * @param sSecondaryKey the entry's secondary key.
076 * @param dbesSource the operation's source. Assumed to be a {@link SelfManagingDBESource}.
077 * @param dbedDest the operation's destination. Assumed to be a {@link SelfManagingDBEDestination}.
078 * @param oValue the object moved by the operation.
079 */
080 public DataBasketEntryImpl(String sMainKey, String sSecondaryKey, DataBasketEntrySource dbesSource,
081 DataBasketEntryDestination dbedDest, Object oValue) {
082 super();
083
084 m_sMainKey = sMainKey;
085 m_sSecondaryKey = sSecondaryKey;
086 m_dbesSource = dbesSource;
087 m_dbedDest = dbedDest;
088 m_oValue = oValue;
089 }
090
091 /**
092 * Rollback the operation. This is done by first calling {@link SelfManagingDBEDestination#rollbackAdd} in
093 * the destination and then {@link SelfManagingDBESource#rollbackRemove} in the source of the entry.
094 *
095 * @override Never
096 */
097 public void rollback() {
098 if (!isHandled()) {
099 m_fHandled = true;
100
101 m_dbiOwner.log(DataBasketImpl.ROLLBACK_ACTION, this);
102
103 SelfManagingDBEDestination smdbedDest = (SelfManagingDBEDestination)getDestination();
104 if (smdbedDest != null) {
105 smdbedDest.rollbackAdd(m_dbiOwner, this);
106 }
107
108 SelfManagingDBESource smdbesSource = (SelfManagingDBESource)getSource();
109 if (smdbesSource != null) {
110 smdbesSource.rollbackRemove(m_dbiOwner, this);
111 }
112 }
113 }
114
115 /**
116 * Commit the operation. This is done by first calling {@link SelfManagingDBESource#commitRemove} in the
117 * source and then {@link SelfManagingDBEDestination#commitAdd} in the destination of the entry.
118 *
119 * @override Never
120 */
121 public void commit() {
122 if (!isHandled()) {
123 m_fHandled = true;
124
125 m_dbiOwner.log(DataBasketImpl.COMMIT_ACTION, this);
126
127 SelfManagingDBESource smdbesSource = (SelfManagingDBESource)getSource();
128 if (smdbesSource != null) {
129 smdbesSource.commitRemove(m_dbiOwner, this);
130 }
131
132 SelfManagingDBEDestination smdbedDest = (SelfManagingDBEDestination)getDestination();
133 if (smdbedDest != null) {
134 smdbedDest.commitAdd(m_dbiOwner, this);
135 }
136 }
137 }
138
139 /**
140 * Set the DataBasket owning this DataBasketEntry.
141 *
142 * <p>This method is public as an implementation detail and must not be called directly.</p>
143 *
144 * @override Never
145 */
146 public void setOwner(DataBasket dbOwner) {
147 m_dbiOwner = (DataBasketImpl)dbOwner;
148 }
149
150 /**
151 * Return the DataBasket containing this DataBasketEntry. Initially <code>null</code>. Once
152 * {@link #setOwner} has been called, always returns the last value of the <code>dbOwner</code>
153 * parameter passed to <code>setOwner</code>.
154 *
155 * @return the DataBasket containing this DataBasketEntry.
156 */
157 public DataBasket getOwner() {
158 return m_dbiOwner;
159 }
160
161 /**
162 * Get the entry's source.
163 *
164 * @override Never
165 */
166 public DataBasketEntrySource getSource() {
167 return m_dbesSource;
168 }
169
170 /**
171 * Get the entry's destination.
172 *
173 * @override Never
174 */
175 public DataBasketEntryDestination getDestination() {
176 return m_dbedDest;
177 }
178
179 /**
180 * Get the entry's value, i.e. the object that was moved by the operation.
181 *
182 * @override Never
183 */
184 public Object getValue() {
185 return m_oValue;
186 }
187
188 /**
189 * Get the entry's main key.
190 *
191 * @override Never
192 */
193 public String getMainKey() {
194 return m_sMainKey;
195 }
196
197 /**
198 * Get the entry's secondary key.
199 *
200 * @override Never
201 */
202 public String getSecondaryKey() {
203 return m_sSecondaryKey;
204 }
205
206 /**
207 * Return true, if the entry has been either completely commited or rolled back.
208 *
209 * @override Never
210 */
211 public boolean isHandled() {
212 return m_fHandled;
213 }
214
215 // Loggable interface method
216 /**
217 * Return a LogEntry that describes this DataBasketEntry.
218 *
219 * @override Always The default implementation is generic and therefore usually not optimal for a subclass
220 * implementation.
221 */
222 public LogEntry getLogData() {
223 final String sMainKey = getMainKey();
224 final String sSecondaryKey = getSecondaryKey();
225 final String sSource = "" + getSource();
226 final String sDest = "" + getDestination();
227 final String sValue = "" + getValue();
228
229 return new LogEntry() {
230 public String toString() {
231 return "DataBasketEntry: \"" + sMainKey + "\"/\"" + sSecondaryKey + "\": " + "\"" + sValue +
232 "\" (\"" + sSource + "\" -> \"" + sDest + "\")";
233 }
234 };
235 }
236 }