mirror of
https://github.com/apache/openjpa.git
synced 2025-02-08 02:59:42 +00:00
Enable caching of embedded instances by datacache. Fix bugs in
DataCachePCDataGenerator. git-svn-id: https://svn.apache.org/repos/asf/incubator/openjpa/trunk@453066 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d0bca27ecd
commit
69d8dd3da9
@ -24,6 +24,8 @@ import java.util.Set;
|
|||||||
import org.apache.openjpa.conf.OpenJPAConfiguration;
|
import org.apache.openjpa.conf.OpenJPAConfiguration;
|
||||||
import org.apache.openjpa.enhance.PCDataGenerator;
|
import org.apache.openjpa.enhance.PCDataGenerator;
|
||||||
import org.apache.openjpa.kernel.AbstractPCData;
|
import org.apache.openjpa.kernel.AbstractPCData;
|
||||||
|
import org.apache.openjpa.kernel.OpenJPAStateManager;
|
||||||
|
import org.apache.openjpa.kernel.StoreContext;
|
||||||
import org.apache.openjpa.meta.ClassMetaData;
|
import org.apache.openjpa.meta.ClassMetaData;
|
||||||
import org.apache.openjpa.meta.FieldMetaData;
|
import org.apache.openjpa.meta.FieldMetaData;
|
||||||
import org.apache.openjpa.meta.JavaTypes;
|
import org.apache.openjpa.meta.JavaTypes;
|
||||||
@ -72,14 +74,15 @@ public class DataCachePCDataGenerator extends PCDataGenerator {
|
|||||||
protected void decorate(BCClass bc, ClassMetaData meta) {
|
protected void decorate(BCClass bc, ClassMetaData meta) {
|
||||||
enhanceToData(bc);
|
enhanceToData(bc);
|
||||||
enhanceToNestedData(bc);
|
enhanceToNestedData(bc);
|
||||||
replaceToEmbeddedData(bc);
|
replaceNewEmbeddedPCData(bc);
|
||||||
addSynchronization(bc);
|
addSynchronization(bc);
|
||||||
addTimeout(bc);
|
addTimeout(bc);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enhanceToData(BCClass bc) {
|
private void enhanceToData(BCClass bc) {
|
||||||
BCMethod meth = bc.declareMethod("toData", Object.class,
|
BCMethod meth = bc.declareMethod("toData", Object.class,
|
||||||
new Class []{ FieldMetaData.class, Object.class });
|
new Class []{ FieldMetaData.class, Object.class,
|
||||||
|
StoreContext.class });
|
||||||
Code code = meth.getCode(true);
|
Code code = meth.getCode(true);
|
||||||
// if (fmd.isLRS ()))
|
// if (fmd.isLRS ()))
|
||||||
// return NULL;
|
// return NULL;
|
||||||
@ -89,12 +92,14 @@ public class DataCachePCDataGenerator extends PCDataGenerator {
|
|||||||
JumpInstruction ifins = code.ifeq();
|
JumpInstruction ifins = code.ifeq();
|
||||||
code.getstatic().setField(AbstractPCData.class, "NULL", Object.class);
|
code.getstatic().setField(AbstractPCData.class, "NULL", Object.class);
|
||||||
code.areturn();
|
code.areturn();
|
||||||
// super.toData (fmd, val);
|
// super.toData (fmd, val, ctx);
|
||||||
ifins.setTarget(code.aload().setThis());
|
ifins.setTarget(code.aload().setThis());
|
||||||
code.aload().setParam(0);
|
code.aload().setParam(0);
|
||||||
code.aload().setParam(1);
|
code.aload().setParam(1);
|
||||||
|
code.aload().setParam(2);
|
||||||
code.invokespecial().setMethod(AbstractPCData.class, "toData",
|
code.invokespecial().setMethod(AbstractPCData.class, "toData",
|
||||||
Object.class, new Class[]{ FieldMetaData.class, Object.class });
|
Object.class, new Class[]{ FieldMetaData.class, Object.class,
|
||||||
|
StoreContext.class });
|
||||||
code.areturn();
|
code.areturn();
|
||||||
code.calculateMaxStack();
|
code.calculateMaxStack();
|
||||||
code.calculateMaxLocals();
|
code.calculateMaxLocals();
|
||||||
@ -102,7 +107,8 @@ public class DataCachePCDataGenerator extends PCDataGenerator {
|
|||||||
|
|
||||||
private void enhanceToNestedData(BCClass bc) {
|
private void enhanceToNestedData(BCClass bc) {
|
||||||
BCMethod meth = bc.declareMethod("toNestedData", Object.class,
|
BCMethod meth = bc.declareMethod("toNestedData", Object.class,
|
||||||
new Class []{ ValueMetaData.class, Object.class });
|
new Class []{ ValueMetaData.class, Object.class,
|
||||||
|
StoreContext.class });
|
||||||
Code code = meth.getCode(true);
|
Code code = meth.getCode(true);
|
||||||
|
|
||||||
// if (val == null)
|
// if (val == null)
|
||||||
@ -122,7 +128,7 @@ public class DataCachePCDataGenerator extends PCDataGenerator {
|
|||||||
// if (type != JavaTypes.COLLECTION &&
|
// if (type != JavaTypes.COLLECTION &&
|
||||||
// type != JavaTypes.MAP &&
|
// type != JavaTypes.MAP &&
|
||||||
// type != JavaTypes.ARRAY)
|
// type != JavaTypes.ARRAY)
|
||||||
// return super.toNestedData (type, val, embedded);
|
// return super.toNestedData(type, val, ctx);
|
||||||
// else
|
// else
|
||||||
// return NULL;
|
// return NULL;
|
||||||
Collection jumps = new ArrayList(3);
|
Collection jumps = new ArrayList(3);
|
||||||
@ -138,8 +144,10 @@ public class DataCachePCDataGenerator extends PCDataGenerator {
|
|||||||
code.aload().setThis();
|
code.aload().setThis();
|
||||||
code.aload().setParam(0);
|
code.aload().setParam(0);
|
||||||
code.aload().setParam(1);
|
code.aload().setParam(1);
|
||||||
|
code.aload().setParam(2);
|
||||||
code.invokespecial().setMethod(AbstractPCData.class, "toNestedData",
|
code.invokespecial().setMethod(AbstractPCData.class, "toNestedData",
|
||||||
Object.class, new Class[]{ ValueMetaData.class, Object.class });
|
Object.class, new Class[]{ ValueMetaData.class, Object.class,
|
||||||
|
StoreContext.class });
|
||||||
code.areturn();
|
code.areturn();
|
||||||
setTarget(code.getstatic().setField
|
setTarget(code.getstatic().setField
|
||||||
(AbstractPCData.class, "NULL", Object.class), jumps);
|
(AbstractPCData.class, "NULL", Object.class), jumps);
|
||||||
@ -148,12 +156,24 @@ public class DataCachePCDataGenerator extends PCDataGenerator {
|
|||||||
code.calculateMaxLocals();
|
code.calculateMaxLocals();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void replaceToEmbeddedData(BCClass bc) {
|
private void replaceNewEmbeddedPCData(BCClass bc) {
|
||||||
BCMethod meth = bc.declareMethod("toEmbeddedData", Object.class,
|
BCMethod meth = bc.declareMethod("newEmbeddedPCData",
|
||||||
new Class[]{ Object.class });
|
AbstractPCData.class, new Class[]{ OpenJPAStateManager.class });
|
||||||
Code code = meth.getCode(true);
|
Code code = meth.getCode(true);
|
||||||
code.getstatic().setField(AbstractPCData.class, "NULL", Object.class);
|
|
||||||
|
// return new DataCachePCDataImpl(sm.getObjectId(), sm.getMetaData());
|
||||||
|
code.anew().setType(DataCachePCDataImpl.class);
|
||||||
|
code.dup();
|
||||||
|
code.aload().setParam(0);
|
||||||
|
code.invokeinterface().setMethod(OpenJPAStateManager.class, "getId",
|
||||||
|
Object.class, null);
|
||||||
|
code.aload().setParam(0);
|
||||||
|
code.invokeinterface().setMethod(OpenJPAStateManager.class,
|
||||||
|
"getMetaData", ClassMetaData.class, null);
|
||||||
|
code.invokespecial().setMethod(DataCachePCDataImpl.class, "<init>",
|
||||||
|
void.class, new Class[] { Object.class, ClassMetaData.class });
|
||||||
code.areturn();
|
code.areturn();
|
||||||
|
|
||||||
code.calculateMaxLocals();
|
code.calculateMaxLocals();
|
||||||
code.calculateMaxStack();
|
code.calculateMaxStack();
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ package org.apache.openjpa.datacache;
|
|||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
|
||||||
import org.apache.openjpa.kernel.OpenJPAStateManager;
|
import org.apache.openjpa.kernel.OpenJPAStateManager;
|
||||||
|
import org.apache.openjpa.kernel.AbstractPCData;
|
||||||
import org.apache.openjpa.kernel.PCData;
|
import org.apache.openjpa.kernel.PCData;
|
||||||
import org.apache.openjpa.kernel.PCDataImpl;
|
import org.apache.openjpa.kernel.PCDataImpl;
|
||||||
import org.apache.openjpa.kernel.StoreContext;
|
import org.apache.openjpa.kernel.StoreContext;
|
||||||
@ -138,8 +139,7 @@ public class DataCachePCDataImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Object toEmbeddedData(Object val) {
|
public AbstractPCData newEmbeddedPCData(OpenJPAStateManager sm) {
|
||||||
// don't try to cache embedded pcs until we do some testing
|
return new DataCachePCDataImpl(sm.getId(), sm.getMetaData());
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,5 +100,5 @@ public interface PCData
|
|||||||
/**
|
/**
|
||||||
* Whether the given field index has stored data.
|
* Whether the given field index has stored data.
|
||||||
*/
|
*/
|
||||||
public boolean isLoaded (int i);
|
public boolean isLoaded(int i);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user