protected void setTargetFetchGroupIfNull(Object target, FetchGroup sourceFetchGroup, AbstractSession targetSession) { this.descriptor.getFetchGroupManager().setObjectFetchGroup(target, sourceFetchGroup, targetSession); } //cuba end
/** * INTERNAL: * Return if the query has an non-default fetch group defined for itself. */ protected boolean hasNonDefaultFetchGroup() { return this.descriptor.hasFetchGroupManager() && ((this.fetchGroup != null) || (this.fetchGroupName != null) || (!this.shouldUseDefaultFetchGroup && (this.descriptor.getFetchGroupManager().getDefaultFetchGroup() != null))); } }
/** * INTERNAL: * Return if the query has an non-default fetch group defined for itself. */ protected boolean hasNonDefaultFetchGroup() { return this.descriptor.hasFetchGroupManager() && ((this.fetchGroup != null) || (this.fetchGroupName != null) || (!this.shouldUseDefaultFetchGroup && (this.descriptor.getFetchGroupManager().getDefaultFetchGroup() != null))); } }
/** * INTERNAL: * * Return the default fetch group on the descriptor. * All read object and read all queries will use the default fetch group if * no fetch group is explicitly defined for the query. */ public FetchGroup getDefaultFetchGroup() { if (!hasFetchGroupManager()) { //fetch group manager is not set, therefore no default fetch group. return null; } return getFetchGroupManager().getDefaultFetchGroup(); }
/** * INTERNAL: * * Return the default fetch group on the descriptor. * All read object and read all queries will use the default fetch group if * no fetch group is explicitly defined for the query. */ public FetchGroup getDefaultFetchGroup() { if (!hasFetchGroupManager()) { //fetch group manager is not set, therefore no default fetch group. return null; } return getFetchGroupManager().getDefaultFetchGroup(); }
/** * INTERNAL: * * Return the default fetch group on the descriptor. * All read object and read all queries will use the default fetch group if * no fetch group is explicitly defined for the query. */ public FetchGroup getDefaultFetchGroup() { if (!hasFetchGroupManager()) { //fetch group manager is not set, therefore no default fetch group. return null; } return getFetchGroupManager().getDefaultFetchGroup(); }
/** * Force instantiation to any eager mappings. */ public void instantiateEagerMappings(Object object, AbstractSession session) { // Force instantiation to eager mappings. if (!this.eagerMappings.isEmpty()) { FetchGroup fetchGroup = null; FetchGroupManager fetchGroupManager = this.descriptor.getFetchGroupManager(); if (fetchGroupManager != null) { fetchGroup = fetchGroupManager.getObjectFetchGroup(object); } int size = this.eagerMappings.size(); for (int index = 0; index < size; index++) { DatabaseMapping mapping = this.eagerMappings.get(index); if (fetchGroup == null || fetchGroup.containsAttributeInternal(mapping.getAttributeName())) { mapping.instantiateAttribute(object, session); } } } }
/** * Force instantiation to any eager mappings. */ public void instantiateEagerMappings(Object object, AbstractSession session) { // Force instantiation to eager mappings. if (!this.eagerMappings.isEmpty()) { FetchGroup fetchGroup = null; FetchGroupManager fetchGroupManager = this.descriptor.getFetchGroupManager(); if (fetchGroupManager != null) { fetchGroup = fetchGroupManager.getObjectFetchGroup(object); } int size = this.eagerMappings.size(); for (int index = 0; index < size; index++) { DatabaseMapping mapping = this.eagerMappings.get(index); if (fetchGroup == null || fetchGroup.containsAttributeInternal(mapping.getAttributeName())) { mapping.instantiateAttribute(object, session); } } } }
protected void addFetchGroupManagerLine(NonreflectiveMethodDefinition method, ClassDescriptor descriptor) { if (descriptor.getFetchGroupManager() == null) { return; } method.addLine("//Fetch groups"); method.addLine("descriptor.setFetchGroupManager(new FetchGroupManager());"); Map namedFetchGroups = descriptor.getFetchGroupManager().getFetchGroups(); if (descriptor.getFetchGroupManager().getDefaultFetchGroup() != null) { String defaultFetchGroupIdentifier = descriptor.getFetchGroupManager().getDefaultFetchGroup().getName() + "FetchGroup"; method.addLine(""); method.addLine("//Default fetch group -- " + defaultFetchGroupIdentifier); method.addLine("descriptor.getFetchGroupManager().setDefaultFetchGroup(" + defaultFetchGroupIdentifier + ");"); } if (namedFetchGroups.isEmpty()) { return; } for (Iterator namedFetchGroupIter = namedFetchGroups.values().iterator(); namedFetchGroupIter.hasNext();) { FetchGroup namedFetchGroup = (FetchGroup)namedFetchGroupIter.next(); String fetchGroupIdentifier = namedFetchGroup.getName() + "FetchGroup"; method.addLine(""); method.addLine("//Named fetch group -- " + fetchGroupIdentifier); addFetchGroupLines(method, namedFetchGroup, fetchGroupIdentifier); method.addLine("descriptor.getFetchGroupManager().addFetchGroup(" + fetchGroupIdentifier + ");"); } }
protected void addFetchGroupManagerLine(NonreflectiveMethodDefinition method, ClassDescriptor descriptor) { if (descriptor.getFetchGroupManager() == null) { return; } method.addLine("//Fetch groups"); method.addLine("descriptor.setFetchGroupManager(new FetchGroupManager());"); Map namedFetchGroups = descriptor.getFetchGroupManager().getFetchGroups(); if (descriptor.getFetchGroupManager().getDefaultFetchGroup() != null) { String defaultFetchGroupIdentifier = descriptor.getFetchGroupManager().getDefaultFetchGroup().getName() + "FetchGroup"; method.addLine(""); method.addLine("//Default fetch group -- " + defaultFetchGroupIdentifier); method.addLine("descriptor.getFetchGroupManager().setDefaultFetchGroup(" + defaultFetchGroupIdentifier + ");"); } if (namedFetchGroups.isEmpty()) { return; } for (Iterator namedFetchGroupIter = namedFetchGroups.values().iterator(); namedFetchGroupIter.hasNext();) { FetchGroup namedFetchGroup = (FetchGroup)namedFetchGroupIter.next(); String fetchGroupIdentifier = namedFetchGroup.getName() + "FetchGroup"; method.addLine(""); method.addLine("//Named fetch group -- " + fetchGroupIdentifier); addFetchGroupLines(method, namedFetchGroup, fetchGroupIdentifier); method.addLine("descriptor.getFetchGroupManager().addFetchGroup(" + fetchGroupIdentifier + ");"); } }
/** * INTERNAL: * Determines whether the query should use optimistic locking with the passed object. */ protected boolean shouldUseOptimisticLocking(Object object) { if (this.descriptor.usesOptimisticLocking()) { if (object != null) { FetchGroupManager fetchGroupManager = this.descriptor.getFetchGroupManager(); if (fetchGroupManager != null) { FetchGroup fetchGroup = fetchGroupManager.getObjectFetchGroup(object); if (fetchGroup == fetchGroupManager.getIdEntityFetchGroup()) { return false; } } } return true; } else { return false; } }
/** * INTERNAL: * Determines whether the query should use optimistic locking with the passed object. */ protected boolean shouldUseOptimisticLocking(Object object) { if (this.descriptor.usesOptimisticLocking()) { if (object != null) { FetchGroupManager fetchGroupManager = this.descriptor.getFetchGroupManager(); if (fetchGroupManager != null) { FetchGroup fetchGroup = fetchGroupManager.getObjectFetchGroup(object); if (fetchGroup == fetchGroupManager.getIdEntityFetchGroup()) { return false; } } } return true; } else { return false; } }
@Override public String toString() { String str = super.toString(); if(this.fetchGroup != null) { str += '\n' + this.fetchGroup.toString(); } else if(this.fetchGroupName != null) { str += '\n' + "FetchGroup(" + this.fetchGroupName + ")"; } else if(this.shouldUseDefaultFetchGroup) { if(this.descriptor != null && this.descriptor.hasFetchGroupManager()) { FetchGroup defaultFetchGroup = descriptor.getFetchGroupManager().getDefaultFetchGroup(); if(defaultFetchGroup != null) { str += '\n' + "Default " + defaultFetchGroup.toString(); } } } return str; }
@Override public String toString() { String str = super.toString(); if(this.fetchGroup != null) { str += '\n' + this.fetchGroup.toString(); } else if(this.fetchGroupName != null) { str += '\n' + "FetchGroup(" + this.fetchGroupName + ")"; } else if(this.shouldUseDefaultFetchGroup) { if(this.descriptor != null && this.descriptor.hasFetchGroupManager()) { FetchGroup defaultFetchGroup = descriptor.getFetchGroupManager().getDefaultFetchGroup(); if(defaultFetchGroup != null) { str += '\n' + "Default " + defaultFetchGroup.toString(); } } } return str; }
/** * Clean up the cached object data and only revert the fetch group data back to the cached object. */ private void revertFetchGroupData(Object domainObject, ClassDescriptor concreteDescriptor, CacheKey cacheKey, ObjectBuildingQuery query, JoinedAttributeManager joinManager, AbstractRecord databaseRow, AbstractSession session) { //the cached object is either invalidated, or staled as the version is newer, or a refresh is explicitly set on the query. //clean all data of the cache object. concreteDescriptor.getFetchGroupManager().reset(domainObject); //set fetch group reference to the cached object concreteDescriptor.getFetchGroupManager().setObjectFetchGroup(domainObject, query.getFetchGroup(), session); // Bug 276362 - set the CacheKey's read time (to re-validate the CacheKey) before buildAttributesIntoObject is called cacheKey.setReadTime(query.getExecutionTime()); //read in the fetch group data only concreteDescriptor.getObjectBuilder().buildAttributesIntoObject(domainObject, databaseRow, query, joinManager, false); //set refresh on fetch group concreteDescriptor.getFetchGroupManager().setRefreshOnFetchGroupToObject(domainObject, (query.shouldRefreshIdentityMapResult() || concreteDescriptor.shouldAlwaysRefreshCache())); //set query id to prevent infinite recursion on refresh object cascade all cacheKey.setLastUpdatedQueryId(query.getQueryId()); //register the object into the IM and set the write lock object if applied. if (concreteDescriptor.usesOptimisticLocking()) { OptimisticLockingPolicy policy = concreteDescriptor.getOptimisticLockingPolicy(); cacheKey.setWriteLockValue(policy.getValueToPutInCache(databaseRow, session)); } }
/** * INTERNAL: * Initialize fetch group */ public void initializeFetchGroup() { if (this.fetchGroup != null) { //fetch group already set. return; } //not explicitly set dynamically fetch group if (this.fetchGroupName != null) {//set pre-defined named group this.fetchGroup = getDescriptor().getFetchGroupManager().getFetchGroup(this.fetchGroupName); if (this.fetchGroup == null) { //named fetch group is not defined in the descriptor throw QueryException.fetchGroupNotDefinedInDescriptor(this.fetchGroupName); } } else {//not set fetch group at all //use the default fetch group if not explicitly turned off if (shouldUseDefaultFetchGroup()) { this.fetchGroup = getDescriptor().getDefaultFetchGroup(); } } }
/** * Ensure the change set is populated for cache coordination. * * @param session current database session * @param changeSet change set to populate * @param descriptor class (relational) descriptor related to the change set */ private void ensureChanges(final AbstractSession session, final ObjectChangeSet changeSet, final ClassDescriptor descriptor) { FetchGroup fetchGroup = null; if (descriptor.hasFetchGroupManager()) { fetchGroup = descriptor.getFetchGroupManager().getObjectFetchGroup(changeSet.cloneObject); } for (DatabaseMapping mapping : descriptor.getMappings()) { if (fetchGroup == null || fetchGroup.containsAttributeInternal(mapping.getAttributeName())) { changeSet.addChange(mapping.compareForChange(changeSet.cloneObject, changeSet.cloneObject, changeSet, session)); } } }
/** * INTERNAL: * Build and return a clone of the attribute. */ protected Object buildClonePart(Object attributeValue, Object clone, CacheKey parentCacheKey, Integer refreshCascade, AbstractSession cloningSession, boolean isNewObject) { if (attributeValue == null) { return null; } if (cloningSession.isUnitOfWork() && isNewObject) { // only true if cloningSession is UOW as this signature only exists in this mapping. ((UnitOfWorkImpl)cloningSession).addNewAggregate(attributeValue); } // Do not clone for read-only. if (cloningSession.isUnitOfWork() && cloningSession.isClassReadOnly(attributeValue.getClass())){ return attributeValue; } ObjectBuilder aggregateObjectBuilder = getObjectBuilder(attributeValue, cloningSession); // bug 2612602 as we are building the working copy make sure that we call to correct clone method. Object clonedAttributeValue = aggregateObjectBuilder.instantiateWorkingCopyClone(attributeValue, cloningSession); aggregateObjectBuilder.populateAttributesForClone(attributeValue, parentCacheKey, clonedAttributeValue, refreshCascade, cloningSession); //also clone the fetch group reference if applied if (aggregateObjectBuilder.getDescriptor().hasFetchGroupManager()) { aggregateObjectBuilder.getDescriptor().getFetchGroupManager().copyAggregateFetchGroupInto(attributeValue, clonedAttributeValue, clone, cloningSession); } return clonedAttributeValue; }
/** * Clean up the cached object data and only revert the fetch group data back to the cached object. */ private void revertFetchGroupData(Object domainObject, ClassDescriptor concreteDescriptor, CacheKey cacheKey, ObjectBuildingQuery query, JoinedAttributeManager joinManager, AbstractRecord databaseRow, AbstractSession session, boolean targetIsProtected) { FetchGroup fetchGroup = query.getExecutionFetchGroup(concreteDescriptor); FetchGroupManager fetchGroupManager = concreteDescriptor.getFetchGroupManager(); //the cached object is either invalidated, or staled as the version is newer, or a refresh is explicitly set on the query. //clean all data of the cache object. fetchGroupManager.reset(domainObject); //set fetch group reference to the cached object fetchGroupManager.setObjectFetchGroup(domainObject, fetchGroupManager.getEntityFetchGroup(fetchGroup), session); // Bug 276362 - set the CacheKey's read time (to re-validate the CacheKey) before buildAttributesIntoObject is called cacheKey.setReadTime(query.getExecutionTime()); //read in the fetch group data only concreteDescriptor.getObjectBuilder().buildAttributesIntoObject(domainObject, cacheKey, databaseRow, query, joinManager, fetchGroup, false, session); //set refresh on fetch group fetchGroupManager.setRefreshOnFetchGroupToObject(domainObject, (query.shouldRefreshIdentityMapResult() || concreteDescriptor.shouldAlwaysRefreshCache())); //set query id to prevent infinite recursion on refresh object cascade all cacheKey.setLastUpdatedQueryId(query.getQueryId()); //register the object into the IM and set the write lock object if applied. if (concreteDescriptor.usesOptimisticLocking()) { OptimisticLockingPolicy policy = concreteDescriptor.getOptimisticLockingPolicy(); cacheKey.setWriteLockValue(policy.getValueToPutInCache(databaseRow, session)); } }
/** * Clean up the cached object data and only revert the fetch group data back to the cached object. */ private void revertFetchGroupData(Object domainObject, ClassDescriptor concreteDescriptor, CacheKey cacheKey, ObjectBuildingQuery query, JoinedAttributeManager joinManager, AbstractRecord databaseRow, AbstractSession session, boolean targetIsProtected) { FetchGroup fetchGroup = query.getExecutionFetchGroup(concreteDescriptor); FetchGroupManager fetchGroupManager = concreteDescriptor.getFetchGroupManager(); //the cached object is either invalidated, or staled as the version is newer, or a refresh is explicitly set on the query. //clean all data of the cache object. fetchGroupManager.reset(domainObject); //set fetch group reference to the cached object fetchGroupManager.setObjectFetchGroup(domainObject, fetchGroupManager.getEntityFetchGroup(fetchGroup), session); // Bug 276362 - set the CacheKey's read time (to re-validate the CacheKey) before buildAttributesIntoObject is called cacheKey.setReadTime(query.getExecutionTime()); //read in the fetch group data only concreteDescriptor.getObjectBuilder().buildAttributesIntoObject(domainObject, cacheKey, databaseRow, query, joinManager, fetchGroup, false, session); //set refresh on fetch group fetchGroupManager.setRefreshOnFetchGroupToObject(domainObject, (query.shouldRefreshIdentityMapResult() || concreteDescriptor.shouldAlwaysRefreshCache())); //set query id to prevent infinite recursion on refresh object cascade all cacheKey.setLastUpdatedQueryId(query.getQueryId()); //register the object into the IM and set the write lock object if applied. if (concreteDescriptor.usesOptimisticLocking()) { OptimisticLockingPolicy policy = concreteDescriptor.getOptimisticLockingPolicy(); cacheKey.setWriteLockValue(policy.getValueToPutInCache(databaseRow, session)); } }