You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2006/08/02 21:53:42 UTC
svn commit: r428120 - in
/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa:
kernel/StateManagerImpl.java meta/FieldMetaData.java
Author: ppoddar
Date: Wed Aug 2 12:53:42 2006
New Revision: 428120
URL: http://svn.apache.org/viewvc?rev=428120&view=rev
Log:
Added load-fetch-group to FieldMetaData and StateManager loading
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java?rev=428120&r1=428119&r2=428120&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java Wed Aug 2 12:53:42 2006
@@ -2751,13 +2751,20 @@
return ret;
}
+ protected void loadField(int field, int lockLevel, boolean forWrite,
+ boolean fgs) {
+ loadField (field, lockLevel, forWrite, fgs, null);
+ }
+
/**
* Load the given field's fetch group; the field itself may already be
* loaded if it is being set by the user.
*/
protected void loadField(int field, int lockLevel, boolean forWrite,
- boolean fgs) {
- FetchConfiguration fetch = _broker.getFetchConfiguration();
+ boolean fgs, FetchConfiguration fetch) {
+ if (fetch == null)
+ fetch = _broker.getFetchConfiguration();
+ boolean isLoadFetchGroupAdded = false;
FieldMetaData fmd = _meta.getField(field);
BitSet fields = null;
// if this is a dfg field or we need to load our dfg, do so
@@ -2768,17 +2775,23 @@
// if not a dfg field, use first custom fetch group as load group
//### need to use metadata load-fetch-group
if (!fmd.isInDefaultFetchGroup()) {
- if (fmd.getCustomFetchGroups().length > 0) {
- String fg = fmd.getCustomFetchGroups()[0];
+ String lfg = fmd.getLoadFetchGroup();
+ if (lfg != null) {
FieldMetaData[] fmds = _meta.getFields();
for (int i = 0; i < fmds.length; i++) {
if (!_loaded.get(i) && (i == field
- || fmds[i].isInFetchGroup(fg))) {
+ || fmds[i].isInFetchGroup(lfg))) {
if (fields == null)
fields = new BitSet(fmds.length);
fields.set(i);
}
}
+ // relation field is loaded with the load-fetch-group
+ // but this addition must be reverted once the load is over
+ if (isRelation(fmd) && !fetch.hasFetchGroup(lfg)) {
+ fetch.addFetchGroup(fmd.getLoadFetchGroup());
+ isLoadFetchGroupAdded = true;
+ }
} else if (!_loaded.get(fmd.getIndex())) {
if (fields == null)
fields = new BitSet();
@@ -2790,6 +2803,16 @@
// takes care of things like loading version info and setting PC
// flags
loadFields(fields, fetch, lockLevel, null, forWrite);
+
+ // remove the load fetch group
+ if (isLoadFetchGroupAdded)
+ fetch.removeFetchGroup(fmd.getLoadFetchGroup());
+ }
+
+ private static boolean isRelation(FieldMetaData fm) {
+ return fm.isDeclaredTypePC()
+ || fm.getElement().isDeclaredTypePC()
+ || fm.getKey().isDeclaredTypePC();
}
/**
@@ -2863,19 +2886,22 @@
if (field != -1) {
FieldMetaData fmd = _meta.getField (field);
if (fmd.isInDefaultFetchGroup()
- && postLoad(_meta.getFetchGroup(FetchGroup.NAME_DEFAULT)))
- return;
+ && postLoad(_meta.getFetchGroup(FetchGroup.NAME_DEFAULT), fetch))
+ return;
String[] fgs = fmd.getCustomFetchGroups();
for (int i = 0; i < fgs.length; i++)
- if (postLoad(_meta.getFetchGroup(fgs[i])))
+ if (postLoad(_meta.getFetchGroup(fgs[i]), fetch))
return;
} else {
- if (postLoad(_meta.getFetchGroup(FetchGroup.NAME_DEFAULT)))
+ if (postLoad(_meta.getFetchGroup(FetchGroup.NAME_DEFAULT), fetch))
return;
- FetchGroup[] fgs = _meta.getCustomFetchGroups();
- for (int i = 0; i < fgs.length; i++)
- if (postLoad(fgs[i]))
+
+ Iterator fgs = fetch.getFetchGroups().iterator();
+ for (;fgs.hasNext();) {
+ FetchGroup fg = _meta.getFetchGroup(fgs.next().toString());
+ if (fg != null && postLoad(fg, fetch))
return;
+ }
}
}
@@ -2883,16 +2909,18 @@
* Perform post-load actions if the given fetch group is a post-load group
* and is fully loaded.
*/
- private boolean postLoad(FetchGroup fg) {
+ private boolean postLoad(FetchGroup fg, FetchConfiguration fetch) {
if (!fg.isPostLoad())
return false;
FieldMetaData[] fmds = _meta.getFields();
for (int i = 0; i < fmds.length; i++)
- if (!_loaded.get(i) && fmds[i].isInFetchGroup(fg.getName()))
- return false;
+ if (fmds[i].isInFetchGroup(fg.getName()))
+ if (!_loaded.get(i))
+ return false;
_flags |= FLAG_LOADED;
- fireLifecycleEvent(LifecycleEvent.AFTER_LOAD);
+ _broker.fireLifecycleEvent(getManagedInstance(), fetch, _meta,
+ LifecycleEvent.AFTER_LOAD);
return true;
}
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java?rev=428120&r1=428119&r2=428120&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java Wed Aug 2 12:53:42 2006
@@ -152,6 +152,7 @@
private int _dfg = 0;
private Set _fgSet = null;
private String[] _fgs = null;
+ private String _lfg = null;
private Boolean _lrs = null;
private String _extName = null;
private Method _extMethod = DEFAULT_METHOD;
@@ -574,6 +575,16 @@
}
/**
+ * Gets the fetch group that is to be loaded when this receiver is loaded.
+ *
+ * @return name of the load fetch group. Can be null, if not explicitly
+ * set.
+ */
+ public String getLoadFetchGroup () {
+ return _lfg;
+ }
+
+ /**
* Whether this field is in the given fetch group.
*/
public boolean isInFetchGroup(String fg) {
@@ -610,6 +621,12 @@
_fgs = null;
}
+ public void setLoadFetchGroup (String lfg) {
+ if (StringUtils.isEmpty(lfg))
+ throw new MetaDataException(_loc.get("empty-fg-name"),this);
+ _lfg = lfg;
+ }
+
/**
* How the data store should treat null values for this field:
* <ul>