1 21 package oracle.toplink.essentials.descriptors.changetracking; 23 24 import java.util.*; 25 import oracle.toplink.essentials.internal.sessions.ObjectChangeSet; 26 import oracle.toplink.essentials.queryframework.*; 27 import oracle.toplink.essentials.internal.descriptors.*; 28 import oracle.toplink.essentials.internal.sessions.MergeManager; 29 import oracle.toplink.essentials.descriptors.ClassDescriptor; 30 import oracle.toplink.essentials.mappings.*; 31 import oracle.toplink.essentials.descriptors.DescriptorEvent; 32 import oracle.toplink.essentials.descriptors.DescriptorEventManager; 33 import oracle.toplink.essentials.internal.sessions.AbstractSession; 34 import oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl; 35 import oracle.toplink.essentials.internal.helper.IdentityHashtable; 36 37 45 public class DeferredChangeDetectionPolicy implements ObjectChangePolicy, java.io.Serializable { 46 47 60 public ObjectChangeSet calculateChanges(Object clone, Object backUp, oracle.toplink.essentials.internal.sessions.UnitOfWorkChangeSet changeSet, AbstractSession session, ClassDescriptor descriptor, boolean shouldRiseEvent) { 61 boolean isNew = ((backUp == null) || ((((UnitOfWorkImpl)session).isObjectNew(clone)) && (!descriptor.isAggregateDescriptor()))); 62 63 if (descriptor.getEventManager().hasAnyEventListeners() && shouldRiseEvent) { 65 WriteObjectQuery writeQuery = new WriteObjectQuery(clone.getClass()); 67 writeQuery.setObject(clone); 68 writeQuery.setBackupClone(backUp); 69 writeQuery.setSession(session); 70 writeQuery.setDescriptor(descriptor); 71 72 descriptor.getEventManager().executeEvent(new DescriptorEvent(DescriptorEventManager.PreWriteEvent, writeQuery)); 73 74 if (isNew) { 75 descriptor.getEventManager().executeEvent(new DescriptorEvent(DescriptorEventManager.PreInsertEvent, writeQuery)); 76 } else { 77 descriptor.getEventManager().executeEvent(new DescriptorEvent(DescriptorEventManager.PreUpdateEvent, writeQuery)); 78 } 79 } 80 81 ObjectChangeSet changes = createObjectChangeSet(clone, backUp, changeSet, isNew, session, descriptor); 82 83 changes.setShouldModifyVersionField((Boolean )((UnitOfWorkImpl)session).getOptimisticReadLockObjects().get(clone)); 84 85 if (changes.hasChanges() || changes.hasForcedChanges()) { 86 return changes; 87 } 88 return null; 89 } 90 91 95 public void clearChanges(Object object, UnitOfWorkImpl uow, ClassDescriptor descriptor) { 96 } 97 98 102 public ObjectChangeSet createObjectChangeSet(Object clone, Object backUp, oracle.toplink.essentials.internal.sessions.UnitOfWorkChangeSet changeSet, boolean isNew, AbstractSession session, ClassDescriptor descriptor) { 103 return this.createObjectChangeSetThroughComparison(clone, backUp, changeSet, isNew, session, descriptor); 104 } 105 106 110 public ObjectChangeSet createObjectChangeSetThroughComparison(Object clone, Object backUp, oracle.toplink.essentials.internal.sessions.UnitOfWorkChangeSet changeSet, boolean isNew, AbstractSession session, ClassDescriptor descriptor) { 111 ObjectBuilder builder = descriptor.getObjectBuilder(); 112 ObjectChangeSet changes = builder.createObjectChangeSet(clone, changeSet, isNew, session); 113 114 if ((descriptor.usesOptimisticLocking()) && (changes.getPrimaryKeys() != null)) { 116 changes.setOptimisticLockingPolicyAndInitialWriteLockValue(descriptor.getOptimisticLockingPolicy(), session); 117 } 118 119 Vector mappings = descriptor.getMappings(); 121 int mappingsSize = mappings.size(); 122 for (int index = 0; index < mappingsSize; index++) { 123 DatabaseMapping mapping = (DatabaseMapping)mappings.get(index); 124 changes.addChange(mapping.compareForChange(clone, backUp, changes, session)); 125 } 126 127 return changes; 128 } 129 130 134 public void dissableEventProcessing(Object changeTracker){ 135 } 137 138 142 public void enableEventProcessing(Object changeTracker){ 143 } 145 146 154 public boolean shouldCompareForChange(Object object, UnitOfWorkImpl unitOfWork, ClassDescriptor descriptor) { 155 return true; 156 } 157 158 162 public Object buildBackupClone(Object clone, ObjectBuilder builder, UnitOfWorkImpl uow) { 163 return builder.buildBackupClone(clone, uow); 164 } 165 166 170 public void setAggregateChangeListener(Object parent, Object aggregate, UnitOfWorkImpl uow, ClassDescriptor descriptor, String mappingAttribute){ 171 } 173 174 178 public void setChangeListener(Object clone, UnitOfWorkImpl uow, ClassDescriptor descriptor) { 179 } 181 182 186 public void setChangeSetOnListener(ObjectChangeSet objectChangeSet, Object clone){ 187 } 189 190 194 public void updateWithChanges(Object clone, ObjectChangeSet objectChangeSet, UnitOfWorkImpl uow, ClassDescriptor descriptor) { 195 if (objectChangeSet == null) { 196 return; 197 } 198 Object backupClone = uow.getCloneMapping().get(clone); 199 if (backupClone != null) { 200 MergeManager mergeManager = new MergeManager(uow); 201 mergeManager.setCascadePolicy(MergeManager.NO_CASCADE); 202 descriptor.getObjectBuilder().mergeChangesIntoObject(backupClone, objectChangeSet, clone, mergeManager); 203 } 204 clearChanges(clone, uow, descriptor); 205 } 206 207 212 public void raiseInternalPropertyChangeEvent(Object source, String propertyName, Object oldValue, Object newValue){ 213 } 215 216 221 public void revertChanges(Object clone, ClassDescriptor descriptor, UnitOfWorkImpl uow, IdentityHashtable cloneMapping) { 222 cloneMapping.put(clone, buildBackupClone(clone, descriptor.getObjectBuilder(), uow)); 223 clearChanges(clone, uow, descriptor); 224 } 225 226 230 public void initialize(AbstractSession session, ClassDescriptor descriptor) { 231 } 233 234 237 public boolean isDeferredChangeDetectionPolicy(){ 238 return true; 239 } 240 241 244 public boolean isObjectChangeTrackingPolicy(){ 245 return false; 246 } 247 248 251 public boolean isAttributeChangeTrackingPolicy(){ 252 return false; 253 } 254 } 255 | Popular Tags |