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