/** * INTERNAL: * Register the working copy of a new object and its original. * The user must edit the working copy and the original is used to merge into the parent. * This mapping is kept both ways because lookup is required in both directions. */ protected void registerNewObjectClone(Object clone, Object original, ClassDescriptor descriptor) { // Check if the new objects should be cached. registerNewObjectInIdentityMap(clone, original, descriptor); getNewObjectsCloneToOriginal().put(clone, original); if (original != null) { getNewObjectsOriginalToClone().put(original, clone); } // run prePersist callbacks if any if (descriptor.getEventManager().hasAnyEventListeners()) { DescriptorEvent event = new DescriptorEvent(clone); event.setEventCode(DescriptorEventManager.PrePersistEvent); event.setSession(this); descriptor.getEventManager().executeEvent(event); } }
/** * INTERNAL: * Register the working copy of a new object and its original. * The user must edit the working copy and the original is used to merge into the parent. * This mapping is kept both ways because lookup is required in both directions. */ protected void registerNewObjectClone(Object clone, Object original, ClassDescriptor descriptor) { // Check if the new objects should be cached. registerNewObjectInIdentityMap(clone, original, descriptor); getNewObjectsCloneToOriginal().put(clone, original); if (original != null) { getNewObjectsOriginalToClone().put(original, clone); } // run prePersist callbacks if any if (descriptor.getEventManager().hasAnyEventListeners()) { DescriptorEvent event = new DescriptorEvent(clone); event.setEventCode(DescriptorEventManager.PrePersistEvent); event.setSession(this); descriptor.getEventManager().executeEvent(event); } }
/** * INTERNAL: * Register the working copy of a new object and its original. * The user must edit the working copy and the original is used to merge into the parent. * This mapping is kept both ways because lookup is required in both directions. */ protected void registerNewObjectClone(Object clone, Object original, ClassDescriptor descriptor) { // Check if the new objects should be cached. registerNewObjectInIdentityMap(clone, original, descriptor); getNewObjectsCloneToOriginal().put(clone, original); if (original != null) { getNewObjectsOriginalToClone().put(original, clone); } // run prePersist callbacks if any if (descriptor.getEventManager().hasAnyEventListeners()) { DescriptorEvent event = new DescriptorEvent(clone); event.setEventCode(DescriptorEventManager.PrePersistEvent); event.setSession(this); descriptor.getEventManager().executeEvent(event); } }
protected void postBuildAttributesIntoWorkingCopyCloneEvent(Object clone, AbstractRecord databaseRow, ObjectBuildingQuery query, UnitOfWorkImpl unitOfWork, boolean forRefresh) { // Need to run post build or refresh selector, currently check with the query for this, // I'm not sure which should be called it case of refresh building a new object, currently refresh is used... DescriptorEvent event = new DescriptorEvent(clone); event.setQuery(query); event.setSession(unitOfWork); event.setDescriptor(this.descriptor); event.setRecord(databaseRow); if (forRefresh) { event.setEventCode(DescriptorEventManager.PostRefreshEvent); } else { event.setEventCode(DescriptorEventManager.PostBuildEvent); //fire a postBuildEvent then the postCloneEvent unitOfWork.deferEvent(event); event = new DescriptorEvent(clone); event.setQuery(query); event.setSession(unitOfWork); event.setDescriptor(this.descriptor); event.setRecord(databaseRow); //bug 259404: ensure postClone is called for objects built directly into the UnitOfWork //in this case, the original is the clone event.setOriginalObject(clone); event.setEventCode(DescriptorEventManager.PostCloneEvent); } unitOfWork.deferEvent(event); }
/** * INTERNAL: * Merge the contents of one object into another, this merge algorithm is dependent on the merge manager. * This merge also prevents the extra step of calculating the changes when it is not required. * If 'cascadeOnly' is true, only foreign reference mappings are merged. * If 'isTargetCloneOfOriginal' then the target was create through a shallow clone of the source, so merge basics is not required. */ public void mergeIntoObject(Object target, boolean isUnInitialized, Object source, MergeManager mergeManager, boolean cascadeOnly, boolean isTargetCloneOfOriginal) { // cascadeOnly is introduced to optimize merge // for GF#1139 Cascade merge operations to relationship mappings even if already registered // PERF: Avoid synchronized enumerator as is concurrency bottleneck. List mappings = this.descriptor.getMappings(); for (int index = 0; index < mappings.size(); index++) { DatabaseMapping mapping = (DatabaseMapping)mappings.get(index); if ((!cascadeOnly && !isTargetCloneOfOriginal) || (cascadeOnly && mapping.isForeignReferenceMapping()) || (isTargetCloneOfOriginal && mapping.isCloningRequired())) { mapping.mergeIntoObject(target, isUnInitialized, source, mergeManager); } } // PERF: Avoid events if no listeners. if (this.descriptor.getEventManager().hasAnyEventListeners()) { org.eclipse.persistence.descriptors.DescriptorEvent event = new org.eclipse.persistence.descriptors.DescriptorEvent(target); event.setSession(mergeManager.getSession()); event.setOriginalObject(source); event.setEventCode(DescriptorEventManager.PostMergeEvent); this.descriptor.getEventManager().executeEvent(event); } }
protected void postBuildAttributesIntoWorkingCopyCloneEvent(Object clone, AbstractRecord databaseRow, ObjectBuildingQuery query, UnitOfWorkImpl unitOfWork, boolean forRefresh) { // Need to run post build or refresh selector, currently check with the query for this, // I'm not sure which should be called it case of refresh building a new object, currently refresh is used... DescriptorEvent event = new DescriptorEvent(clone); event.setQuery(query); event.setSession(unitOfWork); event.setDescriptor(this.descriptor); event.setRecord(databaseRow); if (forRefresh) { event.setEventCode(DescriptorEventManager.PostRefreshEvent); } else { event.setEventCode(DescriptorEventManager.PostBuildEvent); //fire a postBuildEvent then the postCloneEvent unitOfWork.deferEvent(event); event = new DescriptorEvent(clone); event.setQuery(query); event.setSession(unitOfWork); event.setDescriptor(this.descriptor); event.setRecord(databaseRow); //bug 259404: ensure postClone is called for objects built directly into the UnitOfWork //in this case, the original is the clone event.setOriginalObject(clone); event.setEventCode(DescriptorEventManager.PostCloneEvent); } unitOfWork.deferEvent(event); }
/** * Clones the attributes of the specified object. This is called only from unit of work. * The domainObject sent as parameter is always a copy from the parent of unit of work. */ public void populateAttributesForClone(Object original, Object clone, UnitOfWorkImpl unitOfWork) { List mappings = getCloningMappings(); int size = mappings.size(); if (this.descriptor.hasFetchGroupManager() && this.descriptor.getFetchGroupManager().isPartialObject(original)) { FetchGroupManager fetchGroupManager = this.descriptor.getFetchGroupManager(); for (int index = 0; index < size; index++) { DatabaseMapping mapping = (DatabaseMapping)mappings.get(index); if (fetchGroupManager.isAttributeFetched(original, mapping.getAttributeName())) { mapping.buildClone(original, clone, unitOfWork); } } } else { for (int index = 0; index < size; index++) { ((DatabaseMapping)mappings.get(index)).buildClone(original, clone, unitOfWork); } } // PERF: Avoid events if no listeners. if (this.descriptor.getEventManager().hasAnyEventListeners()) { DescriptorEvent event = new DescriptorEvent(clone); event.setSession(unitOfWork); event.setOriginalObject(original); event.setEventCode(DescriptorEventManager.PostCloneEvent); this.descriptor.getEventManager().executeEvent(event); } }
event.setSession(cloningSession); event.setOriginalObject(original); event.setDescriptor(descriptor);
/** * Clones the attributes of the specified object. This is called only from unit of work. * The domainObject sent as parameter is always a copy from the parent of unit of work. */ public void populateAttributesForClone(Object original, CacheKey cacheKey, Object clone, Integer refreshCascade, AbstractSession cloningSession) { List mappings = getCloningMappings(); int size = mappings.size(); if (this.descriptor.hasFetchGroupManager() && this.descriptor.getFetchGroupManager().isPartialObject(original)) { FetchGroupManager fetchGroupManager = this.descriptor.getFetchGroupManager(); for (int index = 0; index < size; index++) { DatabaseMapping mapping = (DatabaseMapping)mappings.get(index); if (fetchGroupManager.isAttributeFetched(original, mapping.getAttributeName())) { mapping.buildClone(original, cacheKey, clone, refreshCascade, cloningSession); } } } else { for (int index = 0; index < size; index++) { ((DatabaseMapping)mappings.get(index)).buildClone(original, cacheKey, clone, refreshCascade, cloningSession); } } // PERF: Avoid events if no listeners. if (this.descriptor.getEventManager().hasAnyEventListeners()) { DescriptorEvent event = new DescriptorEvent(clone); event.setSession(cloningSession); event.setOriginalObject(original); event.setDescriptor(descriptor); event.setEventCode(DescriptorEventManager.PostCloneEvent); cloningSession.deferEvent(event); } }
protected void postBuildAttributesIntoObjectEvent(Object domainObject, AbstractRecord databaseRow, ObjectBuildingQuery query, boolean forRefresh) { DescriptorEventManager descriptorEventManager = this.descriptor.getDescriptorEventManager(); if(descriptorEventManager.hasAnyEventListeners()) { // Need to run post build or refresh selector, currently check with the query for this, // I'm not sure which should be called it case of refresh building a new object, currently refresh is used... org.eclipse.persistence.descriptors.DescriptorEvent event = new DescriptorEvent(domainObject); event.setQuery(query); event.setSession(query.getSession()); event.setRecord(databaseRow); if (forRefresh) { //this method can be called from different places within TopLink. We may be //executing refresh query but building the object not refreshing so we must //throw the appropriate event. //bug 3325315 event.setEventCode(DescriptorEventManager.PostRefreshEvent); } else { event.setEventCode(DescriptorEventManager.PostBuildEvent); } descriptorEventManager.executeEvent(event); } }
protected void postBuildAttributesIntoObjectEvent(Object domainObject, AbstractRecord databaseRow, ObjectBuildingQuery query, boolean forRefresh) { DescriptorEventManager descriptorEventManager = this.descriptor.getDescriptorEventManager(); if(descriptorEventManager.hasAnyEventListeners()) { // Need to run post build or refresh selector, currently check with the query for this, // I'm not sure which should be called it case of refresh building a new object, currently refresh is used... org.eclipse.persistence.descriptors.DescriptorEvent event = new DescriptorEvent(domainObject); event.setQuery(query); event.setSession(query.getSession()); event.setRecord(databaseRow); if (forRefresh) { //this method can be called from different places within TopLink. We may be //executing refresh query but building the object not refreshing so we must //throw the appropriate event. //bug 3325315 event.setEventCode(DescriptorEventManager.PostRefreshEvent); } else { event.setEventCode(DescriptorEventManager.PostBuildEvent); } descriptorEventManager.executeEvent(event); } }
/** * INTERNAL: * Merge changes between the objects, this merge algorithm is dependent on the merge manager. */ public void mergeChangesIntoObject(Object target, ObjectChangeSet changeSet, Object source, MergeManager mergeManager, boolean isTargetCloneOfOriginal) { // PERF: Just merge the object for new objects, as the change set is not populated. if ((source != null) && changeSet.isNew() && (!this.descriptor.shouldUseFullChangeSetsForNewObjects())) { mergeIntoObject(target, true, source, mergeManager, false, isTargetCloneOfOriginal); } else { List changes = changeSet.getChanges(); int size = changes.size(); for (int index = 0; index < size; index++) { ChangeRecord record = (ChangeRecord)changes.get(index); //cr 4236, use ObjectBuilder getMappingForAttributeName not the Descriptor one because the // ObjectBuilder method is much more efficient. DatabaseMapping mapping = getMappingForAttributeName(record.getAttribute()); mapping.mergeChangesIntoObject(target, record, source, mergeManager); } } // PERF: Avoid events if no listeners. if (this.descriptor.getEventManager().hasAnyEventListeners()) { org.eclipse.persistence.descriptors.DescriptorEvent event = new org.eclipse.persistence.descriptors.DescriptorEvent(target); event.setSession(mergeManager.getSession()); event.setOriginalObject(source); event.setChangeSet(changeSet); event.setEventCode(DescriptorEventManager.PostMergeEvent); this.descriptor.getEventManager().executeEvent(event); } }
org.eclipse.persistence.descriptors.DescriptorEvent event = new org.eclipse.persistence.descriptors.DescriptorEvent(toBeDeleted); event.setEventCode(DescriptorEventManager.PreRemoveEvent); event.setSession(this); descriptor.getEventManager().executeEvent(event);
org.eclipse.persistence.descriptors.DescriptorEvent event = new org.eclipse.persistence.descriptors.DescriptorEvent(toBeDeleted); event.setEventCode(DescriptorEventManager.PreRemoveEvent); event.setSession(this); descriptor.getEventManager().executeEvent(event);
event.setSession(query.getSession()); event.setRecord(databaseRow); if (forRefresh) {
event.setSession(mergeManager.getSession()); event.setOriginalObject(source); event.setChangeSet(changeSet);
event.setSession(unitOfWork); event.setRecord(databaseRow); if (forRefresh) {
event.setSession(mergeManager.getSession()); event.setOriginalObject(source); event.setChangeSet(changeSet);
event.setSession(mergeManager.getSession()); event.setOriginalObject(source); event.setChangeSet(changeSet);
event.setSession(mergeManager.getSession()); event.setOriginalObject(source); event.setChangeSet(changeSet);