Was this commit for OPENJPA-358 or OPENJPA-357, or both? :-) We need to remember to include the tag in the commit message so that we get the SVN changes in the JIRA Issues. Thanks!
Kevin On 9/7/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > > Author: ppoddar > Date: Fri Sep 7 16:08:02 2007 > New Revision: 573750 > > URL: http://svn.apache.org/viewvc?rev=573750&view=rev > Log: > Fix for FetchGroup inclusion and recursion depth calculation. > > Modified: > > > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java > > > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FetchGroup.java > > > openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java > > Modified: > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java > URL: > http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java?rev=573750&r1=573749&r2=573750&view=diff > > ============================================================================== > --- > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java > (original) > +++ > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java > Fri Sep 7 16:08:02 2007 > @@ -604,6 +604,8 @@ > int cur; > for (int i = 0; max != FetchGroup.DEPTH_INFINITE > && i < groups.length; i++) { > + // ignore custom groups that are inactive in this > configuration > + if (!this.hasFetchGroup(groups[i])) continue; > cur = meta.getFetchGroup(groups[i]).getRecursionDepth(fm); > if (cur == FetchGroup.DEPTH_INFINITE || cur > max) > max = cur; > @@ -625,7 +627,7 @@ > return avail; > return Math.min(max, avail); > } > - > + > /** > * Return the relation type of the given field. > */ > > Modified: > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FetchGroup.java > URL: > http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FetchGroup.java?rev=573750&r1=573749&r2=573750&view=diff > > ============================================================================== > --- > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FetchGroup.java > (original) > +++ > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FetchGroup.java > Fri Sep 7 16:08:02 2007 > @@ -21,9 +21,11 @@ > import java.io.Serializable; > import java.util.ArrayList; > import java.util.HashMap; > +import java.util.HashSet; > import java.util.Iterator; > import java.util.List; > import java.util.Map; > +import java.util.Set; > > import org.apache.commons.lang.StringUtils; > import org.apache.commons.lang.ObjectUtils; > @@ -74,6 +76,7 @@ > private final ClassMetaData _meta; > private final boolean _readOnly; > private List _includes; > + private Set _containedBy; > private Map _depths; > private Boolean _postLoad; > > @@ -171,6 +174,32 @@ > } > } > return false; > + } > + > + /** > + * Sets this receiver as one of the included fetch groups of the > given > + * parent. > + * The parent fecth grop must include this receiver before this call. > + * > + * @see #includes(String, boolean) > + * @see #addDeclaredInclude(String) > + */ > + public boolean setContainedBy(FetchGroup parent) { > + parent.addDeclaredInclude(this.getName()); > + if (_containedBy==null) > + _containedBy = new HashSet(); > + return _containedBy.add(parent.getName()); > + } > + > + /** > + * Gets the name of the fetch groups in which this receiver has been > + * included. > + * > + * @see #setContainedBy(FetchGroup) > + */ > + public String[] getContainedBy() { > + return (_containedBy == null) ? new String[0] > + : (String[]) _containedBy.toArray(new > String[_containedBy.size()]); > } > > /** > > Modified: > openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java > URL: > http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java?rev=573750&r1=573749&r2=573750&view=diff > > ============================================================================== > --- > openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java > (original) > +++ > openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java > Fri Sep 7 16:08:02 2007 > @@ -875,6 +875,14 @@ > > /** > * Create fetch groups. > + * If FetchGroup A includes FetchGroup B, then a bi-link is set > between > + * A and B. Both A and B must be declared in the same Class. > + * <br> > + * Call [EMAIL PROTECTED] #parseFetchAttribute(ClassMetaData, > + * org.apache.openjpa.meta.FetchGroup, FetchAttribute) only after the > + * bi-links have been established, because a field f will not only > add the > + * fetch group A which explictly includes f to its custom fetch > groups but > + * also will also add any fetch group B that includes A. > */ > private void parseFetchGroups(ClassMetaData meta, FetchGroup... > groups) { > org.apache.openjpa.meta.FetchGroup fg; > @@ -885,12 +893,25 @@ > fg = meta.addDeclaredFetchGroup(group.name()); > if (group.postLoad()) > fg.setPostLoad(true); > - for (String s : group.fetchGroups()) > + for (String s : group.fetchGroups()) { > fg.addDeclaredInclude(s); > + } > + } > + > + for (FetchGroup group:groups) { > + fg = meta.getFetchGroup(group.name()); > + String[] includedFetchGropNames = fg.getDeclaredIncludes > (); > + for (String > includedFectchGroupName:includedFetchGropNames) > + meta.getFetchGroup > (includedFectchGroupName).setContainedBy(fg); > + } > + > + for (FetchGroup group : groups) { > + fg = meta.getFetchGroup(group.name()); > for (FetchAttribute attr : group.attributes()) > parseFetchAttribute(meta, fg, attr); > } > } > + > > /** > * Set a field's fetch group. > @@ -904,6 +925,9 @@ > meta, attr.name())); > > field.setInFetchGroup(fg.getName(), true); > + String[] parentFetchGroups = fg.getContainedBy(); > + for (String parentFetchGroup:parentFetchGroups) > + field.setInFetchGroup(parentFetchGroup, true); > if (attr.recursionDepth() != Integer.MIN_VALUE) > fg.setRecursionDepth(field, attr.recursionDepth()); > } > > >