You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ba...@apache.org on 2002/03/09 20:07:50 UTC
cvs commit: jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore TestPersistentClassType.java TestEnhancer.java TestSample.java storage.xml
baliuka 02/03/09 11:07:49
Modified: simplestore/src/java/org/apache/commons/simplestore/cache/impl
SoftRefMemoryCache.java
simplestore/src/java/org/apache/commons/simplestore/jdbc
DriverDataSource.java
simplestore/src/java/org/apache/commons/simplestore/persistence/impl
DBStorage.java MetaClassImpl.java
PersistentProxy.java
simplestore/src/java/org/apache/commons/simplestore/tools
Enhancer.java
simplestore/src/test/org/apache/commons/simplestore
TestEnhancer.java TestSample.java storage.xml
Added: simplestore/src/test/org/apache/commons/simplestore
TestPersistentClassType.java
Log:
Migrated form java.reflect.Proxy to BCEL
Revision Changes Path
1.3 +2 -2 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/cache/impl/SoftRefMemoryCache.java
Index: SoftRefMemoryCache.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/cache/impl/SoftRefMemoryCache.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- SoftRefMemoryCache.java 11 Feb 2002 20:31:22 -0000 1.2
+++ SoftRefMemoryCache.java 9 Mar 2002 19:07:49 -0000 1.3
@@ -65,11 +65,11 @@
* baliuka@mwm.lt</a>
*@author Gerhard Froehlich <a href="mailto:g-froehlich@gmx.de">
* g-froehlich@gmx.de</a>
- *@version $Id: SoftRefMemoryCache.java,v 1.2 2002/02/11 20:31:22 froehlich Exp $
+ *@version $Id: SoftRefMemoryCache.java,v 1.3 2002/03/09 19:07:49 baliuka Exp $
*/
public class SoftRefMemoryCache implements Cache {
- private static boolean DEBUG = true;
+ private static boolean DEBUG = System.getProperty("DEBUG") != null;
private int m_current = 0;
private int m_maxStrongRefCount;
1.6 +8 -8 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/jdbc/DriverDataSource.java
Index: DriverDataSource.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/jdbc/DriverDataSource.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- DriverDataSource.java 8 Mar 2002 20:23:01 -0000 1.5
+++ DriverDataSource.java 9 Mar 2002 19:07:49 -0000 1.6
@@ -75,7 +75,7 @@
/**
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: DriverDataSource.java,v 1.5 2002/03/08 20:23:01 baliuka Exp $
+ *@version $Id: DriverDataSource.java,v 1.6 2002/03/09 19:07:49 baliuka Exp $
*
*/
public class DriverDataSource implements DataSource {
@@ -295,25 +295,25 @@
this.ds = ds;
}
- public Object invoke(Object arg0,java.lang.reflect.Method arg1,Object[] arg2)
+ public Object invoke(Object object,java.lang.reflect.Method method,Object[] args)
throws Throwable{
- if( arg1.getName().equals("close") ) {
+ if( method.getName().equals("close") ) {
used = false;
synchronized( ds ){
ds.notifyAll();
}
return null;
- }else if (arg1.getName().equals("release")){
+ }else if (method.getName().equals("release")){
connection.close();
return null;
- }else if (arg1.getName().equals("isUsed")){
+ }else if (method.getName().equals("isUsed")){
return new Boolean(used);
- }else if (arg1.getName().equals("setUsed")){
- used = ((Boolean) arg2[0] ).booleanValue();
+ }else if (method.getName().equals("setUsed")){
+ used = ((Boolean) args[0] ).booleanValue();
return null;
- }else return arg1.invoke(connection,arg2) ;
+ }else return method.invoke(connection,args) ;
}
public static ConnectionWrapper create(Connection connection, javax.sql.DataSource ds){
return (ConnectionWrapper)
1.5 +3 -4 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/DBStorage.java
Index: DBStorage.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/DBStorage.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DBStorage.java 17 Feb 2002 14:09:04 -0000 1.4
+++ DBStorage.java 9 Mar 2002 19:07:49 -0000 1.5
@@ -85,11 +85,11 @@
/**
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: DBStorage.java,v 1.4 2002/02/17 14:09:04 baliuka Exp $
+ *@version $Id: DBStorage.java,v 1.5 2002/03/09 19:07:49 baliuka Exp $
*/
public class DBStorage extends AbstractStorage {
- private final static boolean DEBUG = true;
+ private final static boolean DEBUG = System.getProperty("DEBUG") != null;
private final static String CONNECTION = "org.apache.commons.simplestore.jdbc.DBStorage.connection";
private static Properties procedures = new Properties();
private DataSource ds;
@@ -250,8 +250,7 @@
if ( excecute( sql, new Object[]{id}, rsh) == 0 ) {
throw new ObjectNotFound(pc.getOID().toString(), null);
}
-
-
+
context.getCache().put(id, result);
return result;
1.5 +43 -8 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/MetaClassImpl.java
Index: MetaClassImpl.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/MetaClassImpl.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- MetaClassImpl.java 28 Feb 2002 18:28:41 -0000 1.4
+++ MetaClassImpl.java 9 Mar 2002 19:07:49 -0000 1.5
@@ -65,10 +65,12 @@
*
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: MetaClassImpl.java,v 1.4 2002/02/28 18:28:41 baliuka Exp $
+ *@version $Id: MetaClassImpl.java,v 1.5 2002/03/09 19:07:49 baliuka Exp $
*/
public class MetaClassImpl implements MetaClass {
-
+
+ private static final boolean DEBUG = System.getProperty("DEBUG") != null;
+
private static java.util.Map persitentClasses = new java.util.Hashtable();
private Class clasz;
private String sqlName;
@@ -208,7 +210,7 @@
public boolean isReference(java.lang.reflect.Member member) {
- return isReference( getPropertyIndex(member) );
+ return isReference( getPropertyIndex(member) );
}
public boolean isReference(int index) {
@@ -296,6 +298,40 @@
return clasz;
}
+ private void setDescriptors(){
+ try{
+ descriptors = java.beans.Introspector.getBeanInfo( clasz ).getPropertyDescriptors();
+ java.util.List abstractProps = new java.util.Vector();
+
+ for( int i = 0; i < descriptors.length; i++ ){
+
+ if( descriptors[i].getReadMethod() != null && descriptors[i].getWriteMethod() != null ) {
+
+ if( java.lang.reflect.Modifier.isAbstract( descriptors[i].getReadMethod().getModifiers() ) &&
+ java.lang.reflect.Modifier.isAbstract( descriptors[i].getWriteMethod().getModifiers() ) ){
+ abstractProps.add(descriptors[i]);
+ }
+ }else if ( descriptors[i].getReadMethod() != null &&
+ java.lang.reflect.Modifier.isAbstract( descriptors[i].getReadMethod().getModifiers() )){
+
+ abstractProps.add(descriptors[i]);
+
+ }else if ( descriptors[i].getWriteMethod() != null &&
+ java.lang.reflect.Modifier.isAbstract( descriptors[i].getWriteMethod().getModifiers() )){
+
+ abstractProps.add(descriptors[i]);
+ }
+
+ }
+
+
+ descriptors = (java.beans.PropertyDescriptor[])abstractProps.toArray(new java.beans.PropertyDescriptor[]{});
+
+ }catch( Exception e ){
+ e.printStackTrace();
+ throw new Error(e.getMessage());
+ }
+ }
private void indexMethodsFromMetaData(){
try{
@@ -324,8 +360,8 @@
private void indexMethods(){
try{
+ setDescriptors();
- descriptors = java.beans.Introspector.getBeanInfo( clasz ).getPropertyDescriptors();
for( int i = 0; i < descriptors.length; i++ ){
@@ -413,7 +449,7 @@
Integer index = (Integer)properties.get( field.toUpperCase() );
if( index == null )
- throw new java.lang.NoSuchFieldError( clasz.getName() + "." + field );
+ throw new java.lang.NoSuchFieldError( clasz.getName() + "." + field );
return index.intValue();
}
@@ -449,7 +485,7 @@
}
- public static final boolean DEBUG = true;
+ private static final boolean DEBUG = System.getProperty("DEBUG") != null;
public void setDocumentLocator(org.xml.sax.Locator locator ){}
@@ -519,8 +555,7 @@
currentClass.clasz = clasz;
persitentClasses.put(currentClass.clasz,currentClass);
}
-
- currentClass.descriptors = java.beans.Introspector.getBeanInfo( currentClass.clasz ).getPropertyDescriptors();
+ currentClass.setDescriptors();
currentClass.sqlName = meta.getValue("name");
currentClass.oidName = meta.getValue("oid");
1.10 +54 -7 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/PersistentProxy.java
Index: PersistentProxy.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/PersistentProxy.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- PersistentProxy.java 4 Mar 2002 22:11:40 -0000 1.9
+++ PersistentProxy.java 9 Mar 2002 19:07:49 -0000 1.10
@@ -59,6 +59,7 @@
import org.apache.commons.simplestore.persistence.Persistent;
import org.apache.commons.simplestore.persistence.Context;
import org.apache.commons.simplestore.persistence.TypeConverter;
+import org.apache.commons.simplestore.tools.*;
import java.io.Serializable;
@@ -74,10 +75,12 @@
* baliuka@mwm.lt</a>
*@author Gerhard Froehlich <a href="mailto:g-froehlich@gmx.de">
* g-froehlich@gmx.de</a>
- *@version $Id: PersistentProxy.java,v 1.9 2002/03/04 22:11:40 baliuka Exp $
+ *@version $Id: PersistentProxy.java,v 1.10 2002/03/09 19:07:49 baliuka Exp $
*/
public class PersistentProxy
-implements MetaObject, InvocationHandler, Cloneable, Serializable {
+implements MetaObject, /*InvocationHandler,*/ MethodInterceptor,Cloneable, Serializable {
+
+ private static final boolean DEBUG = System.getProperty("DEBUG") != null;
private static Map DEFAULTS = new Hashtable();
private static Method HASH_CODE;
@@ -117,13 +120,23 @@
Object oid,
boolean newCreated,
Context context ) {
-
+ try{
PersistentProxy handler = new PersistentProxy( persistent, oid,
newCreated, context );
- Persistent p = (Persistent) Proxy.newProxyInstance(
- Thread.currentThread().getContextClassLoader(),
- new Class[]{persistent, Persistent.class},
- handler );
+ Class[] interfaces;
+ if(persistent.isInterface()){
+ interfaces = new Class[]{persistent, Persistent.class} ;
+ persistent = null;
+ }else {
+ interfaces = new Class[]{ Persistent.class} ;
+ }
+ Persistent p = (Persistent)
+ Enhancer.enhance( persistent,interfaces,handler);
+
+ // Proxy.newProxyInstance(
+ // Thread.currentThread().getContextClassLoader(),
+ // new Class[]{persistent, Persistent.class},
+ // handler );
handler.m_object = p;
if ( newCreated ) {
@@ -133,6 +146,10 @@
}
return p;
+ }catch(Throwable t){
+ t.printStackTrace();
+ throw new Error(t.getLocalizedMessage());
+ }
}
@@ -215,7 +232,37 @@
return new Boolean(m_oid.equals(m_object.getOID()));
}
}
+ public Object afterReturn(Object obj,
+ Method method,
+ Object[] args,
+ Object retValFromBefore,
+ boolean invokedSuper,
+ Object retValFromSuper,
+ Throwable e)
+ throws Throwable{
+ if( DEBUG ){
+ System.out.println("Invoked: " + method);
+ }
+ if(e != null ){
+ if( DEBUG ){
+ e.printStackTrace();
+ }
+ throw e;
+ }
+ if( invokedSuper )return retValFromSuper;
+ return invoke(obj,method,args);
+
+ }
+ public boolean invokeSuper(Object obj,Method method,Object[] args,Object retValFromBefore) throws Throwable{
+ if(DEBUG){
+ System.out.println("Invoke super:" + method);
+ }
+ return true;
+ }
+ public Object beforeInvoke(Object obj,Method method,Object[] args) throws Throwable{
+ return null;
+ }
public Object invoke(Object obj, Method method, Object[] obj2) throws Throwable {
synchronized (this) {
if (GET_META_OBJECT.equals(method)) {
1.12 +626 -547 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/tools/Enhancer.java
Index: Enhancer.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/tools/Enhancer.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- Enhancer.java 7 Mar 2002 22:02:23 -0000 1.11
+++ Enhancer.java 9 Mar 2002 19:07:49 -0000 1.12
@@ -52,744 +52,823 @@
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
-
package org.apache.commons.simplestore.tools;
-
-import org.apache.bcel.classfile.*;
-import org.apache.bcel.generic.*;
-import org.apache.bcel.Repository;
-
-
+import org.apache.bcel.classfile.JavaClass;
+import org.apache.bcel.classfile.Method;
+import org.apache.bcel.generic.AASTORE;
+import org.apache.bcel.generic.ACONST_NULL;
+import org.apache.bcel.generic.ALOAD;
+import org.apache.bcel.generic.ANEWARRAY;
+import org.apache.bcel.generic.ARETURN;
+import org.apache.bcel.generic.ASTORE;
+import org.apache.bcel.generic.BIPUSH;
+import org.apache.bcel.generic.BasicType;
+import org.apache.bcel.generic.CHECKCAST;
+import org.apache.bcel.generic.ClassGen;
+import org.apache.bcel.generic.ConstantPoolGen;
+import org.apache.bcel.generic.DLOAD;
+import org.apache.bcel.generic.DRETURN;
+import org.apache.bcel.generic.DUP;
+import org.apache.bcel.generic.FLOAD;
+import org.apache.bcel.generic.FRETURN;
+import org.apache.bcel.generic.FieldGen;
+import org.apache.bcel.generic.GETFIELD;
+import org.apache.bcel.generic.GOTO;
+import org.apache.bcel.generic.ICONST;
+import org.apache.bcel.generic.IFEQ;
+import org.apache.bcel.generic.ILOAD;
+import org.apache.bcel.generic.INVOKEINTERFACE;
+import org.apache.bcel.generic.INVOKESPECIAL;
+import org.apache.bcel.generic.INVOKESTATIC;
+import org.apache.bcel.generic.INVOKEVIRTUAL;
+import org.apache.bcel.generic.IRETURN;
+import org.apache.bcel.generic.ISTORE;
+import org.apache.bcel.generic.Instruction;
+import org.apache.bcel.generic.InstructionFactory;
+import org.apache.bcel.generic.InstructionHandle;
+import org.apache.bcel.generic.InstructionList;
+import org.apache.bcel.generic.LLOAD;
+import org.apache.bcel.generic.LRETURN;
+import org.apache.bcel.generic.MethodGen;
+import org.apache.bcel.generic.NEW;
+import org.apache.bcel.generic.ObjectType;
+import org.apache.bcel.generic.PUTFIELD;
+import org.apache.bcel.generic.RETURN;
+import org.apache.bcel.generic.Type;
/**
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: Enhancer.java,v 1.11 2002/03/07 22:02:23 baliuka Exp $
+ *@version $Id: Enhancer.java,v 1.12 2002/03/09 19:07:49 baliuka Exp $
*/
-public class Enhancer implements org.apache.bcel.Constants{
-
- static boolean DEBUG = false;
-
+public class Enhancer implements org.apache.bcel.Constants {
+ static boolean DEBUG = System.getProperty("DEBUG") != null;
static final String INTERCEPTOR_CLASS = MethodInterceptor.class.getName();
-
- static final ObjectType BOOLEAN_OBJECT = new ObjectType(Boolean.class.getName());
- static final ObjectType INTEGER_OBJECT = new ObjectType(Integer.class.getName());
- static final ObjectType CHARACTER_OBJECT = new ObjectType(Character.class.getName());
- static final ObjectType BYTE_OBJECT = new ObjectType(Byte.class.getName());
- static final ObjectType SHORT_OBJECT = new ObjectType(Short.class.getName());
- static final ObjectType LONG_OBJECT = new ObjectType(Long.class.getName());
- static final ObjectType DOUBLE_OBJECT = new ObjectType(Double.class.getName());
- static final ObjectType FLOAT_OBJECT = new ObjectType(Float.class.getName() );
- static final ObjectType METHOD_OBJECT = new ObjectType(java.lang.reflect.Method.class.getName() );
- static final ObjectType NUMBER_OBJECT = new ObjectType(Number.class.getName());
- static final String CONSTRUCTOR_NAME = "<init>";
- static final String FIELD_NAME = "h";
- static final String SOURCE_FILE = "<generated>";
- static final String CLASS_SUFIX = "$$EnhancedBySimplestore$$";
- static final String CLASS_PREFIX = "org.apache.";
-
- private static int addAfterConstructionRef(ConstantPoolGen cp){
- return cp.addMethodref( Enhancer.class.getName() ,"handleConstruction",
- "(Ljava/lang/Object;[Ljava/lang/Object;)V");
-
- }
- private static int addAfterRef( ConstantPoolGen cp ){
- return cp.addInterfaceMethodref(INTERCEPTOR_CLASS,"afterReturn",
- "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;ZLjava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;" );
- }
- private static int addInvokeSupperRef( ConstantPoolGen cp ){
- return cp.addInterfaceMethodref(INTERCEPTOR_CLASS,"invokeSuper",
- "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;)Z");
- }
-
- private static int addBeforeRef(ConstantPoolGen cp){
- return cp.addInterfaceMethodref(INTERCEPTOR_CLASS,"beforeInvoke",
- "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
-
+ static final ObjectType BOOLEAN_OBJECT =
+ new ObjectType(Boolean.class.getName());
+ static final ObjectType INTEGER_OBJECT =
+ new ObjectType(Integer.class.getName());
+ static final ObjectType CHARACTER_OBJECT =
+ new ObjectType(Character.class.getName());
+ static final ObjectType BYTE_OBJECT = new ObjectType(Byte.class.getName());
+ static final ObjectType SHORT_OBJECT = new ObjectType(Short.class.getName());
+ static final ObjectType LONG_OBJECT = new ObjectType(Long.class.getName());
+ static final ObjectType DOUBLE_OBJECT = new ObjectType(Double.class.getName());
+ static final ObjectType FLOAT_OBJECT = new ObjectType(Float.class.getName());
+ static final ObjectType METHOD_OBJECT =
+ new ObjectType(java.lang.reflect.Method.class.getName());
+ static final ObjectType NUMBER_OBJECT = new ObjectType(Number.class.getName());
+ static final String CONSTRUCTOR_NAME = "<init>";
+ static final String FIELD_NAME = "h";
+ static final String SOURCE_FILE = "<generated>";
+ static final String CLASS_SUFIX = "$$EnhancedBySimplestore$$";
+ static final String CLASS_PREFIX = "org.apache.";
+ private static int addAfterConstructionRef(ConstantPoolGen cp) {
+ return cp.addMethodref(
+ Enhancer.class.getName(),
+ "handleConstruction",
+ "(Ljava/lang/Object;[Ljava/lang/Object;)V");
+ }
+ private static int addAfterRef(ConstantPoolGen cp) {
+ return cp.addInterfaceMethodref(
+ INTERCEPTOR_CLASS,
+ "afterReturn",
+ "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;ZLjava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;");
+ }
+ private static int addInvokeSupperRef(ConstantPoolGen cp) {
+ return cp.addInterfaceMethodref(
+ INTERCEPTOR_CLASS,
+ "invokeSuper",
+ "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;)Z");
+ }
+ private static int addBeforeRef(ConstantPoolGen cp) {
+ return cp.addInterfaceMethodref(
+ INTERCEPTOR_CLASS,
+ "beforeInvoke",
+ "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
}
-
private static java.util.List costructionHandlers = new java.util.Vector();
-
private static java.util.Map cache = new java.util.WeakHashMap();
-
/** Creates a new instance of Enchancer */
- protected Enhancer() {
- }
-
- public static void setMethodInterceptor(Object enhanced, MethodInterceptor ih)throws Throwable{
-
- enhanced.getClass().getField(FIELD_NAME).set(enhanced,ih);
-
+ protected Enhancer() {}
+ public static void setMethodInterceptor(Object enhanced, MethodInterceptor ih)
+ throws Throwable {
+ enhanced.getClass().getField(FIELD_NAME).set(enhanced, ih);
+ }
+ public static MethodInterceptor getMethodInterceptor(Object enhanced)
+ throws Throwable {
+ return (MethodInterceptor) enhanced.getClass().getField(FIELD_NAME).get(
+ enhanced);
}
-
- public static MethodInterceptor getMethodInterceptor(Object enhanced )throws Throwable{
-
- return (MethodInterceptor)enhanced.getClass().getField(FIELD_NAME).get(enhanced);
-
- }
-
- public static void addConstructionHandler(ConstructionHandler ch){
-
+ public static void addConstructionHandler(ConstructionHandler ch) {
costructionHandlers.add(ch);
-
}
-
- public static void removeConstructionHandler(ConstructionHandler ch){
-
+ public static void removeConstructionHandler(ConstructionHandler ch) {
costructionHandlers.remove(ch);
-
- }
-
- public static synchronized void handleConstruction(Object obj, Object args[])throws Throwable{
-
- for( java.util.Iterator i = costructionHandlers.iterator(); i.hasNext(); ){
- ((ConstructionHandler)i.next()).afterConstruction(obj,args);
- }
-
}
-
-
- public static Object enhance(Class cls,Class interfaces [] , MethodInterceptor ih) throws Throwable{
-
- return enhance(cls,null,interfaces,ih,Thread.currentThread().getContextClassLoader());
- }
-
-
- public synchronized static Object enhance(Class cls,String class_name,Class interfaces[], MethodInterceptor ih,ClassLoader loader)throws Throwable {
-
- if( cls == null ){
+ public static synchronized void handleConstruction(Object obj, Object args[])
+ throws Throwable {
+ for (java.util.Iterator i = costructionHandlers.iterator(); i.hasNext();) {
+ ((ConstructionHandler) i.next()).afterConstruction(obj, args);
+ }
+ }
+ public static Object enhance(
+ Class cls,
+ Class interfaces[],
+ MethodInterceptor ih)
+ throws Throwable {
+ return enhance(
+ cls,
+ null,
+ interfaces,
+ ih,
+ Thread.currentThread().getContextClassLoader());
+ }
+ public synchronized static Object enhance(
+ Class cls,
+ String class_name,
+ Class interfaces[],
+ MethodInterceptor ih,
+ ClassLoader loader)
+ throws Throwable {
+ if (cls == null) {
cls = Enhancer.class;
}
-
- if( class_name == null ){
+ if (class_name == null) {
class_name = cls.getName() + CLASS_SUFIX;
- if(class_name.startsWith("java")){
- class_name = CLASS_PREFIX + class_name;
+ if (class_name.startsWith("java")) {
+ class_name = CLASS_PREFIX + class_name;
}
}
-
- java.util.Map map = (java.util.Map)cache.get(loader);
-
- if( map == null){
+ java.util.Map map = (java.util.Map) cache.get(loader);
+ if (map == null) {
map = new java.util.HashMap();
- cache.put( loader, map );
-
+ cache.put(loader, map);
}
-
- Class result = (Class)map.get(cls);
-
- if(result == null){
+ Class result = (Class) map.get(cls);
+ if (result == null) {
java.util.HashMap methods = new java.util.HashMap();
- JavaClass clazz = enhance(cls, class_name, interfaces , methods);
- byte b [] = clazz.getBytes();
+ JavaClass clazz = enhance(cls, class_name, interfaces, methods);
+ byte b[] = clazz.getBytes();
java.lang.reflect.Method m =
- ClassLoader.class.getDeclaredMethod("defineClass",
- new Class[]{String.class,byte[].class,int.class,int.class}
- );
+ ClassLoader.class.getDeclaredMethod(
+ "defineClass",
+ new Class[] { String.class, byte[].class, int.class, int.class });
// protected method invocaton
boolean flag = m.isAccessible();
m.setAccessible(true);
- result = (Class)m.invoke(loader,new Object[]{clazz.getClassName(),b,new Integer(0),new Integer(b.length)});
+ result =
+ (Class) m.invoke(
+ loader,
+ new Object[] { clazz.getClassName(), b, new Integer(0), new Integer(b.length)});
m.setAccessible(flag);
- for( java.util.Iterator i = methods.keySet().iterator(); i.hasNext(); ){
- String name = (String)i.next();
- result.getField( name ).set(null,methods.get(name));
-
- }
- map.put(cls,result);
- }
- return result.getConstructor(new Class[]{Class.forName(
- MethodInterceptor.class.getName(),true,loader)} ).
- newInstance(new Object[]{ih});
- }
-
-
-
- private static void addConstructors(ClassGen cg, Class superClass )throws Throwable{
- addConstructor(cg);//default
+ for (java.util.Iterator i = methods.keySet().iterator(); i.hasNext();) {
+ String name = (String) i.next();
+ result.getField(name).set(null, methods.get(name));
+ }
+ map.put(cls, result);
+ }
+ return result
+ .getConstructor(
+ new Class[] { Class.forName(MethodInterceptor.class.getName(), true, loader)})
+ .newInstance(new Object[] { ih });
+ }
+ private static void addConstructors(ClassGen cg, Class superClass)
+ throws Throwable {
+ addConstructor(cg); //default
java.lang.reflect.Constructor constructors[] = superClass.getConstructors();
String parentClass = cg.getSuperclassName();
InstructionFactory factory = new InstructionFactory(cg);
ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool
- for ( int i = 0; i < constructors.length; i++ ){
+ for (int i = 0; i < constructors.length; i++) {
Class parmTypes[] = constructors[i].getParameterTypes();
- if( parmTypes.length == 1 &&
- parmTypes[0].equals(org.apache.commons.simplestore.tools.MethodInterceptor.class) ) {
+ if (parmTypes.length == 1
+ && parmTypes[0].equals(
+ org.apache.commons.simplestore.tools.MethodInterceptor.class)) {
continue;
}
InstructionList il = new InstructionList();
- MethodGen costructor = toMethodGen(constructors[i],cg.getClassName(), il, cp);
+ MethodGen costructor = toMethodGen(constructors[i], cg.getClassName(), il, cp);
Type argTypes[] = toType(parmTypes);
- invokeSuper( cg, costructor, argTypes );
-
- int argArray = createArgArray(il,factory,cp,argTypes);
- il.append( new ASTORE( argArray ));
- il.append( new ALOAD(0) );
- il.append(factory.createFieldAccess(cg.getClassName(),FIELD_NAME,new ObjectType(INTERCEPTOR_CLASS),GETFIELD));
- il.append( new ALOAD(0) );
- il.append( new ALOAD( argArray ) );
- il.append( new INVOKESTATIC( addAfterConstructionRef(cp) ));
-
- il.append( new RETURN() ) ;
-
+ invokeSuper(cg, costructor, argTypes);
+ int argArray = createArgArray(il, factory, cp, argTypes);
+ il.append(new ASTORE(argArray));
+ il.append(new ALOAD(0));
+ il.append(
+ factory.createFieldAccess(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ GETFIELD));
+ il.append(new ALOAD(0));
+ il.append(new ALOAD(argArray));
+ il.append(new INVOKESTATIC(addAfterConstructionRef(cp)));
+ il.append(new RETURN());
costructor.setMaxStack();
costructor.setMaxLocals();
- cg.addMethod( costructor.getMethod() );
+ cg.addMethod(costructor.getMethod());
}
}
-
- private static void addConstructor(ClassGen cg ){
-
+ private static void addConstructor(ClassGen cg) {
String parentClass = cg.getSuperclassName();
InstructionFactory factory = new InstructionFactory(cg);
ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool
InstructionList il = new InstructionList();
- MethodGen costructor = new MethodGen(ACC_PUBLIC,// access flags
- Type.VOID,// return type
- new Type[] { // argument types
- new ObjectType(INTERCEPTOR_CLASS)
- }, null, // arg names
+ MethodGen costructor = new MethodGen(ACC_PUBLIC, // access flags
+ Type.VOID, // return type
+ new Type[] { // argument types
+ new ObjectType(INTERCEPTOR_CLASS)}, null, // arg names
CONSTRUCTOR_NAME, cg.getClassName(), il, cp);
-
- il.append( new ALOAD(0));
- il.append( factory.createInvoke(parentClass,CONSTRUCTOR_NAME,Type.VOID ,new Type[]{}, INVOKESPECIAL ));
- il.append( new ALOAD(0));
- il.append( new ALOAD(1));
- il.append( factory.createFieldAccess(cg.getClassName(),FIELD_NAME,new ObjectType(INTERCEPTOR_CLASS),PUTFIELD));
- Type argTypes[] = new Type[]{ new ObjectType(INTERCEPTOR_CLASS) };
- int argArray = createArgArray(il,factory,cp,argTypes);
- il.append( new ASTORE( argArray ));
- il.append( new ALOAD(0) );
- il.append(factory.createFieldAccess(cg.getClassName(),FIELD_NAME,new ObjectType(INTERCEPTOR_CLASS),GETFIELD));
- il.append( new ALOAD(0) );
- il.append( new ALOAD( argArray ) );
- il.append( new INVOKESTATIC( addAfterConstructionRef(cp) ));
- il.append( new RETURN() );
-
- cg.addMethod( getMethod( costructor ) );
-
+ il.append(new ALOAD(0));
+ il.append(
+ factory.createInvoke(
+ parentClass,
+ CONSTRUCTOR_NAME,
+ Type.VOID,
+ new Type[] {},
+ INVOKESPECIAL));
+ il.append(new ALOAD(0));
+ il.append(new ALOAD(1));
+ il.append(
+ factory.createFieldAccess(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ PUTFIELD));
+ Type argTypes[] = new Type[] { new ObjectType(INTERCEPTOR_CLASS)};
+ int argArray = createArgArray(il, factory, cp, argTypes);
+ il.append(new ASTORE(argArray));
+ il.append(new ALOAD(0));
+ il.append(
+ factory.createFieldAccess(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ GETFIELD));
+ il.append(new ALOAD(0));
+ il.append(new ALOAD(argArray));
+ il.append(new INVOKESTATIC(addAfterConstructionRef(cp)));
+ il.append(new RETURN());
+ cg.addMethod(getMethod(costructor));
}
- private static void addHandlerField(ClassGen cg){
-
+ private static void addHandlerField(ClassGen cg) {
ConstantPoolGen cp = cg.getConstantPool();
- FieldGen fg = new FieldGen( ACC_PUBLIC ,
- new ObjectType(INTERCEPTOR_CLASS) ,
- FIELD_NAME , cp);
+ FieldGen fg =
+ new FieldGen(ACC_PUBLIC, new ObjectType(INTERCEPTOR_CLASS), FIELD_NAME, cp);
cg.addField(fg.getField());
-
}
-
- private static ClassGen getClassGen( String class_name, Class parentClass,Class [] interfaces){
-
- ClassGen gen = new ClassGen( class_name , parentClass.getName(),
- SOURCE_FILE, ACC_PUBLIC , null );
- if( interfaces != null ){
- for(int i = 0; i< interfaces.length; i++ ){
+ private static ClassGen getClassGen(
+ String class_name,
+ Class parentClass,
+ Class[] interfaces) {
+ ClassGen gen =
+ new ClassGen(class_name, parentClass.getName(), SOURCE_FILE, ACC_PUBLIC, null);
+ if (interfaces != null) {
+ for (int i = 0; i < interfaces.length; i++) {
gen.addInterface(interfaces[i].getName());
}
}
-
return gen;
}
-
- private static JavaClass enhance( Class parentClass,String class_name,Class interfaces [],java.util.HashMap methodTable ) throws Throwable {
-
- ClassGen cg = getClassGen(class_name,parentClass,interfaces);
+ private static JavaClass enhance(
+ Class parentClass,
+ String class_name,
+ Class interfaces[],
+ java.util.HashMap methodTable)
+ throws Throwable {
+ ClassGen cg = getClassGen(class_name, parentClass, interfaces);
ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool
addHandlerField(cg);
- addConstructors(cg,parentClass);
-
- int before = addBeforeRef(cp);
- int after = addAfterRef(cp);
- int invokeSuper = addInvokeSupperRef(cp);
+ addConstructors(cg, parentClass);
+ int before = addBeforeRef(cp);
+ int after = addAfterRef(cp);
+ int invokeSuper = addInvokeSupperRef(cp);
java.util.Set methodSet = new java.util.HashSet();
- for(int j = (interfaces == null ? 0 : interfaces.length); j == 0 ; j-- ) {
- java.lang.reflect.Method methods[];
- if( j == 0 ){
+ for (int j = (interfaces == null ? 0 : interfaces.length); j >= 0; j--) {
+ java.lang.reflect.Method methods[];
+ if (j == 0) {
methods = parentClass.getMethods();
- }else{
+ } else {
methods = interfaces[j - 1].getMethods();
}
- for( int i = 0 ; i < methods.length; i++ ){
+ for (int i = 0; i < methods.length; i++) {
int mod = methods[i].getModifiers();
- if( !java.lang.reflect.Modifier.isStatic(mod) &&
- !java.lang.reflect.Modifier.isFinal(mod) &&
- (java.lang.reflect.Modifier.isPublic(mod)||
- java.lang.reflect.Modifier.isProtected(mod)) ){
- methodSet.add( new MethodWrapper( methods[i] ) );
-
+ if (!java.lang.reflect.Modifier.isStatic(mod)
+ && !java.lang.reflect.Modifier.isFinal(mod)
+ && (java.lang.reflect.Modifier.isPublic(mod)
+ || java.lang.reflect.Modifier.isProtected(mod))) {
+
+ methodSet.add(new MethodWrapper(methods[i]));
+ if( DEBUG ){
+ System.out.println("added:" + methods[i]);
+ }
}
}
}
int cntr = 0;
- for( java.util.Iterator i = methodSet.iterator(); i.hasNext(); ){
- java.lang.reflect.Method method = ((MethodWrapper)i.next()).method;
+ for (java.util.Iterator i = methodSet.iterator(); i.hasNext();) {
+ java.lang.reflect.Method method = ((MethodWrapper) i.next()).method;
String fieldName = "METHOD_" + (cntr++);
- cg.addMethod( generateMethod( method,fieldName,cg, before,after,invokeSuper ) );
- methodTable.put(fieldName,method);
+ cg.addMethod(generateMethod(method, fieldName, cg, before, after, invokeSuper));
+ methodTable.put(fieldName, method);
}
JavaClass jcl = cg.getJavaClass();
- return jcl;
+ return jcl;
}
-
-
- private static void addMethodField(String fieldName, ClassGen cg ){
-
+ private static void addMethodField(String fieldName, ClassGen cg) {
ConstantPoolGen cp = cg.getConstantPool();
- FieldGen fg = new FieldGen( ACC_PUBLIC | ACC_STATIC , METHOD_OBJECT , fieldName , cp);
+ FieldGen fg =
+ new FieldGen(ACC_PUBLIC | ACC_STATIC, METHOD_OBJECT, fieldName, cp);
cg.addField(fg.getField());
-
}
-
- private static int createArgArray(InstructionList il, InstructionFactory factory, ConstantPoolGen cp, Type[] args ){
-
+ private static int createArgArray(
+ InstructionList il,
+ InstructionFactory factory,
+ ConstantPoolGen cp,
+ Type[] args) {
int argCount = args.length;
- if( argCount > 5 )
- il.append( new BIPUSH((byte)argCount) );
- else il.append( new ICONST((byte)argCount) );
- il.append( new ANEWARRAY( cp.addClass( Type.OBJECT )) );
+ if (argCount > 5)
+ il.append(new BIPUSH((byte) argCount));
+ else
+ il.append(new ICONST((byte) argCount));
+ il.append(new ANEWARRAY(cp.addClass(Type.OBJECT)));
int load = 1;
- for(int i = 0; i< argCount; i++) {
-
- il.append( new DUP() );
- if( i > 5 )
- il.append( new BIPUSH( (byte) i ) );
- else il.append( new ICONST( (byte) i ) );
- if ( args[i] instanceof BasicType ){
- if ( args[i].equals( Type.BOOLEAN ) ){
- il.append( new NEW( cp.addClass( BOOLEAN_OBJECT ) ) );
- il.append( new DUP() );
- il.append( new ILOAD( load++ ) );
- il.append( new INVOKESPECIAL(cp.addMethodref(Boolean.class.getName(),CONSTRUCTOR_NAME, "(Z)V")) );
- }else if ( args[i].equals( Type.INT ) ){
- il.append( new NEW( cp.addClass( INTEGER_OBJECT ) ) );
- il.append( new DUP() );
- il.append( new ILOAD( load++ ) );
- il.append( new INVOKESPECIAL(cp.addMethodref(Integer.class.getName(),CONSTRUCTOR_NAME, "(I)V")) );
- }else if ( args[i].equals( Type.CHAR ) ){
- il.append( new NEW( cp.addClass( CHARACTER_OBJECT ) ) );
- il.append( new DUP() );
- il.append( new ILOAD( load++ ) );
- il.append( new INVOKESPECIAL(cp.addMethodref(Character.class.getName(),CONSTRUCTOR_NAME, "(C)V")) );
- }else if ( args[i].equals( Type.BYTE ) ){
- il.append( new NEW( cp.addClass( BYTE_OBJECT ) ) );
- il.append( new DUP() );
- il.append( new ILOAD( load++ ) );
- il.append( new INVOKESPECIAL(cp.addMethodref(Byte.class.getName(),CONSTRUCTOR_NAME, "(B)V")) );
- }else if ( args[i].equals( Type.SHORT ) ){
- il.append( new NEW( cp.addClass( SHORT_OBJECT ) ));
- il.append( new DUP() );
- il.append( new ILOAD( load++ ) );
- il.append( new INVOKESPECIAL(cp.addMethodref(Short.class.getName(),CONSTRUCTOR_NAME, "(S)V")) );
- }else if ( args[i].equals( Type.LONG ) ){
- il.append( new NEW( cp.addClass( LONG_OBJECT ) ));
- il.append( new DUP() );
- il.append( new LLOAD( load ) );
+ for (int i = 0; i < argCount; i++) {
+ il.append(new DUP());
+ if (i > 5)
+ il.append(new BIPUSH((byte) i));
+ else
+ il.append(new ICONST((byte) i));
+ if (args[i] instanceof BasicType) {
+ if (args[i].equals(Type.BOOLEAN)) {
+ il.append(new NEW(cp.addClass(BOOLEAN_OBJECT)));
+ il.append(new DUP());
+ il.append(new ILOAD(load++));
+ il.append(
+ new INVOKESPECIAL(
+ cp.addMethodref(Boolean.class.getName(), CONSTRUCTOR_NAME, "(Z)V")));
+ } else if (args[i].equals(Type.INT)) {
+ il.append(new NEW(cp.addClass(INTEGER_OBJECT)));
+ il.append(new DUP());
+ il.append(new ILOAD(load++));
+ il.append(
+ new INVOKESPECIAL(
+ cp.addMethodref(Integer.class.getName(), CONSTRUCTOR_NAME, "(I)V")));
+ } else if (args[i].equals(Type.CHAR)) {
+ il.append(new NEW(cp.addClass(CHARACTER_OBJECT)));
+ il.append(new DUP());
+ il.append(new ILOAD(load++));
+ il.append(
+ new INVOKESPECIAL(
+ cp.addMethodref(Character.class.getName(), CONSTRUCTOR_NAME, "(C)V")));
+ } else if (args[i].equals(Type.BYTE)) {
+ il.append(new NEW(cp.addClass(BYTE_OBJECT)));
+ il.append(new DUP());
+ il.append(new ILOAD(load++));
+ il.append(
+ new INVOKESPECIAL(
+ cp.addMethodref(Byte.class.getName(), CONSTRUCTOR_NAME, "(B)V")));
+ } else if (args[i].equals(Type.SHORT)) {
+ il.append(new NEW(cp.addClass(SHORT_OBJECT)));
+ il.append(new DUP());
+ il.append(new ILOAD(load++));
+ il.append(
+ new INVOKESPECIAL(
+ cp.addMethodref(Short.class.getName(), CONSTRUCTOR_NAME, "(S)V")));
+ } else if (args[i].equals(Type.LONG)) {
+ il.append(new NEW(cp.addClass(LONG_OBJECT)));
+ il.append(new DUP());
+ il.append(new LLOAD(load));
load += 2;
- il.append( new INVOKESPECIAL(cp.addMethodref(Long.class.getName(),CONSTRUCTOR_NAME, "(J)V")) );
- }else if ( args[i].equals( Type.DOUBLE ) ){
- il.append( new NEW( cp.addClass( DOUBLE_OBJECT ) ) );
- il.append( new DUP() );
- il.append( new DLOAD( load ) );
+ il.append(
+ new INVOKESPECIAL(
+ cp.addMethodref(Long.class.getName(), CONSTRUCTOR_NAME, "(J)V")));
+ } else if (args[i].equals(Type.DOUBLE)) {
+ il.append(new NEW(cp.addClass(DOUBLE_OBJECT)));
+ il.append(new DUP());
+ il.append(new DLOAD(load));
load += 2;
- il.append( new INVOKESPECIAL(cp.addMethodref(Double.class.getName(),CONSTRUCTOR_NAME, "(D)V")) );
- }else if ( args[i].equals( Type.FLOAT ) ){
- il.append( new NEW( cp.addClass( FLOAT_OBJECT ) ));
- il.append( new DUP() );
- il.append( new FLOAD( load++ ) );
- il.append( new INVOKESPECIAL(cp.addMethodref(Float.class.getName(),CONSTRUCTOR_NAME, "(F)V")) );
+ il.append(
+ new INVOKESPECIAL(
+ cp.addMethodref(Double.class.getName(), CONSTRUCTOR_NAME, "(D)V")));
+ } else if (args[i].equals(Type.FLOAT)) {
+ il.append(new NEW(cp.addClass(FLOAT_OBJECT)));
+ il.append(new DUP());
+ il.append(new FLOAD(load++));
+ il.append(
+ new INVOKESPECIAL(
+ cp.addMethodref(Float.class.getName(), CONSTRUCTOR_NAME, "(F)V")));
}
-
- il.append( new AASTORE() );
-
- }else{
- il.append( new ALOAD( load++ ) );
- il.append( new AASTORE() );
+ il.append(new AASTORE());
+ } else {
+ il.append(new ALOAD(load++));
+ il.append(new AASTORE());
}
}
return load;
}
- private static Method getMethod(MethodGen mg){
+ private static Method getMethod(MethodGen mg) {
mg.stripAttributes(true);
mg.setMaxLocals();
mg.setMaxStack();
return mg.getMethod();
}
- private static InstructionHandle generateReturnValue( InstructionList il, InstructionFactory factory, ConstantPoolGen cp, Type returnType, int stack ){
-
- if( returnType.equals(Type.VOID)){
-
- return il.append( new RETURN() );
-
- }
- il.append( new ASTORE( stack ) );
- il.append( new ALOAD( stack ) );
- if( returnType instanceof ObjectType ) {
- if(!returnType.equals(Type.OBJECT))
- il.append( new CHECKCAST( cp.addClass( (ObjectType)returnType ) ) );
- return il.append( new ARETURN() );
- }else if ( returnType instanceof BasicType ){
- if ( returnType.equals( Type.BOOLEAN ) ){
- il.append( new CHECKCAST( cp.addClass( BOOLEAN_OBJECT ) ) );
- il.append( factory.createInvoke(Boolean.class.getName(),"booleanValue",
- Type.BOOLEAN,new Type[]{},INVOKEVIRTUAL )
- );
- return il.append( new IRETURN());
- }else if (returnType.equals( Type.CHAR )){
-
- il.append( new CHECKCAST( cp.addClass( CHARACTER_OBJECT ) ) );
- il.append( factory.createInvoke(Character.class.getName(),"charValue",
- Type.CHAR,new Type[]{},INVOKEVIRTUAL )
- );
- return il.append( new IRETURN());
- }else if (returnType.equals( Type.LONG )){
-
- il.append( new CHECKCAST( cp.addClass( NUMBER_OBJECT ) ) );
- il.append( factory.createInvoke(Number.class.getName(),"longValue",
- Type.LONG,new Type[]{},INVOKEVIRTUAL )
- );
- return il.append( new LRETURN());
- }else if (returnType.equals( Type.DOUBLE )){
-
- il.append( new CHECKCAST( cp.addClass( NUMBER_OBJECT ) ) );
- il.append( factory.createInvoke(Number.class.getName(),"doubleValue",
- Type.DOUBLE,new Type[]{},INVOKEVIRTUAL )
- );
- return il.append( new DRETURN());
- }else if (returnType.equals( Type.FLOAT )){
-
- il.append( new CHECKCAST( cp.addClass( NUMBER_OBJECT ) ) );
- il.append( factory.createInvoke(java.lang.Number.class.getName(),"floatValue",
- Type.FLOAT,new Type[]{},INVOKEVIRTUAL )
- );
- return il.append( new FRETURN());
- }else {
-
- il.append( new CHECKCAST( cp.addClass( NUMBER_OBJECT ) ) );
- il.append( factory.createInvoke(Number.class.getName(),"intValue",
- Type.INT,new Type[]{},INVOKEVIRTUAL )
- );
- return il.append( new IRETURN());
+ private static InstructionHandle generateReturnValue(
+ InstructionList il,
+ InstructionFactory factory,
+ ConstantPoolGen cp,
+ Type returnType,
+ int stack) {
+ if (returnType.equals(Type.VOID)) {
+ return il.append(new RETURN());
+ }
+ il.append(new ASTORE(stack));
+ il.append(new ALOAD(stack));
+ if (returnType instanceof ObjectType) {
+ if (!returnType.equals(Type.OBJECT))
+ il.append(new CHECKCAST(cp.addClass((ObjectType) returnType)));
+ return il.append(new ARETURN());
+ } else if (returnType instanceof BasicType) {
+ if (returnType.equals(Type.BOOLEAN)) {
+ il.append(new CHECKCAST(cp.addClass(BOOLEAN_OBJECT)));
+ il.append(
+ factory.createInvoke(
+ Boolean.class.getName(),
+ "booleanValue",
+ Type.BOOLEAN,
+ new Type[] {},
+ INVOKEVIRTUAL));
+ return il.append(new IRETURN());
+ } else if (returnType.equals(Type.CHAR)) {
+ il.append(new CHECKCAST(cp.addClass(CHARACTER_OBJECT)));
+ il.append(
+ factory.createInvoke(
+ Character.class.getName(),
+ "charValue",
+ Type.CHAR,
+ new Type[] {},
+ INVOKEVIRTUAL));
+ return il.append(new IRETURN());
+ } else if (returnType.equals(Type.LONG)) {
+ il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT)));
+ il.append(
+ factory.createInvoke(
+ Number.class.getName(),
+ "longValue",
+ Type.LONG,
+ new Type[] {},
+ INVOKEVIRTUAL));
+ return il.append(new LRETURN());
+ } else if (returnType.equals(Type.DOUBLE)) {
+ il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT)));
+ il.append(
+ factory.createInvoke(
+ Number.class.getName(),
+ "doubleValue",
+ Type.DOUBLE,
+ new Type[] {},
+ INVOKEVIRTUAL));
+ return il.append(new DRETURN());
+ } else if (returnType.equals(Type.FLOAT)) {
+ il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT)));
+ il.append(
+ factory.createInvoke(
+ java.lang.Number.class.getName(),
+ "floatValue",
+ Type.FLOAT,
+ new Type[] {},
+ INVOKEVIRTUAL));
+ return il.append(new FRETURN());
+ } else {
+ il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT)));
+ il.append(
+ factory.createInvoke(
+ Number.class.getName(),
+ "intValue",
+ Type.INT,
+ new Type[] {},
+ INVOKEVIRTUAL));
+ return il.append(new IRETURN());
}
-
}
return null;
}
- private static Instruction newWrapper(Type type,ConstantPoolGen cp) {
-
- if ( type instanceof BasicType ){
- if ( type.equals( Type.BOOLEAN ) ){
- return new NEW( cp.addClass( BOOLEAN_OBJECT ) );
-
- }else if ( type.equals( Type.INT ) ){
- return new NEW( cp.addClass( INTEGER_OBJECT ) );
-
- }else if ( type.equals( Type.CHAR ) ){
- return new NEW( cp.addClass( CHARACTER_OBJECT ) );
- }else if ( type.equals( Type.BYTE ) ){
- return new NEW( cp.addClass( BYTE_OBJECT ));
-
- }else if ( type.equals( Type.SHORT ) ){
- return new NEW( cp.addClass( SHORT_OBJECT ));
- }else if ( type.equals( Type.LONG ) ){
- return new NEW( cp.addClass( LONG_OBJECT ));
- }else if ( type.equals( Type.DOUBLE ) ){
- return new NEW( cp.addClass( DOUBLE_OBJECT ) );
-
- }else if ( type.equals( Type.FLOAT ) ){
- return new NEW( cp.addClass( FLOAT_OBJECT ) );
+ private static Instruction newWrapper(Type type, ConstantPoolGen cp) {
+ if (type instanceof BasicType) {
+ if (type.equals(Type.BOOLEAN)) {
+ return new NEW(cp.addClass(BOOLEAN_OBJECT));
+ } else if (type.equals(Type.INT)) {
+ return new NEW(cp.addClass(INTEGER_OBJECT));
+ } else if (type.equals(Type.CHAR)) {
+ return new NEW(cp.addClass(CHARACTER_OBJECT));
+ } else if (type.equals(Type.BYTE)) {
+ return new NEW(cp.addClass(BYTE_OBJECT));
+ } else if (type.equals(Type.SHORT)) {
+ return new NEW(cp.addClass(SHORT_OBJECT));
+ } else if (type.equals(Type.LONG)) {
+ return new NEW(cp.addClass(LONG_OBJECT));
+ } else if (type.equals(Type.DOUBLE)) {
+ return new NEW(cp.addClass(DOUBLE_OBJECT));
+ } else if (type.equals(Type.FLOAT)) {
+ return new NEW(cp.addClass(FLOAT_OBJECT));
}
}
-
return null;
-
}
-
- private static Instruction initWrapper(Type type,ConstantPoolGen cp){
-
- if ( type instanceof BasicType ){
- if ( type.equals( Type.BOOLEAN ) ){
- return new INVOKESPECIAL(cp.addMethodref(Boolean.class.getName(),CONSTRUCTOR_NAME, "(Z)V"));
- }else if ( type.equals( Type.INT ) ){
- return new INVOKESPECIAL(cp.addMethodref(Integer.class.getName(),CONSTRUCTOR_NAME, "(I)V"));
- }else if ( type.equals( Type.CHAR ) ){
- return new INVOKESPECIAL(cp.addMethodref(Character.class.getName(),CONSTRUCTOR_NAME, "(C)V"));
- }else if ( type.equals( Type.BYTE ) ){
- return new INVOKESPECIAL(cp.addMethodref(Byte.class.getName(),CONSTRUCTOR_NAME, "(B)V") );
- }else if ( type.equals( Type.SHORT ) ){
- return new INVOKESPECIAL(cp.addMethodref(Short.class.getName(),CONSTRUCTOR_NAME, "(S)V") );
- }else if ( type.equals( Type.LONG ) ){
- return new INVOKESPECIAL(cp.addMethodref(Long.class.getName(),CONSTRUCTOR_NAME, "(J)V")) ;
- }else if ( type.equals( Type.DOUBLE ) ){
- return new INVOKESPECIAL(cp.addMethodref(Double.class.getName(),CONSTRUCTOR_NAME, "(D)V") );
- }else if ( type.equals( Type.FLOAT ) ){
- return new INVOKESPECIAL(cp.addMethodref(Float.class.getName(),CONSTRUCTOR_NAME, "(F)V")) ;
+ private static Instruction initWrapper(Type type, ConstantPoolGen cp) {
+ if (type instanceof BasicType) {
+ if (type.equals(Type.BOOLEAN)) {
+ return new INVOKESPECIAL(
+ cp.addMethodref(Boolean.class.getName(), CONSTRUCTOR_NAME, "(Z)V"));
+ } else if (type.equals(Type.INT)) {
+ return new INVOKESPECIAL(
+ cp.addMethodref(Integer.class.getName(), CONSTRUCTOR_NAME, "(I)V"));
+ } else if (type.equals(Type.CHAR)) {
+ return new INVOKESPECIAL(
+ cp.addMethodref(Character.class.getName(), CONSTRUCTOR_NAME, "(C)V"));
+ } else if (type.equals(Type.BYTE)) {
+ return new INVOKESPECIAL(
+ cp.addMethodref(Byte.class.getName(), CONSTRUCTOR_NAME, "(B)V"));
+ } else if (type.equals(Type.SHORT)) {
+ return new INVOKESPECIAL(
+ cp.addMethodref(Short.class.getName(), CONSTRUCTOR_NAME, "(S)V"));
+ } else if (type.equals(Type.LONG)) {
+ return new INVOKESPECIAL(
+ cp.addMethodref(Long.class.getName(), CONSTRUCTOR_NAME, "(J)V"));
+ } else if (type.equals(Type.DOUBLE)) {
+ return new INVOKESPECIAL(
+ cp.addMethodref(Double.class.getName(), CONSTRUCTOR_NAME, "(D)V"));
+ } else if (type.equals(Type.FLOAT)) {
+ return new INVOKESPECIAL(
+ cp.addMethodref(Float.class.getName(), CONSTRUCTOR_NAME, "(F)V"));
}
}
-
return null;
}
- private static int loadArg(InstructionList il, Type t, int index,int pos ){
-
- if( t instanceof BasicType ){
-
- if( t.equals( Type.LONG )) {
- il.append(new LLOAD( pos ));
+ private static int loadArg(InstructionList il, Type t, int index, int pos) {
+ if (t instanceof BasicType) {
+ if (t.equals(Type.LONG)) {
+ il.append(new LLOAD(pos));
pos += 2;
return pos;
- }else if( t.equals( Type.DOUBLE )){
- il.append(new DLOAD( pos ));
+ } else if (t.equals(Type.DOUBLE)) {
+ il.append(new DLOAD(pos));
pos += 2;
return pos;
- }else if (t.equals( Type.FLOAT )) {
- il.append(new FLOAD( pos ));
+ } else if (t.equals(Type.FLOAT)) {
+ il.append(new FLOAD(pos));
return ++pos;
- }else {
- il.append(new ILOAD( pos ));
+ } else {
+ il.append(new ILOAD(pos));
return ++pos;
}
- }else{
+ } else {
il.append(new ALOAD(pos));
return ++pos;
}
-
}
-
- private static Type[] toType(Class cls[]){
-
- Type tp []= new Type[ cls.length ];
- for(int i = 0; i < cls.length; i++ ){
+ private static Type[] toType(Class cls[]) {
+ Type tp[] = new Type[cls.length];
+ for (int i = 0; i < cls.length; i++) {
tp[i] = toType(cls[i]);
}
return tp;
}
-
- private static Type toType(Class cls){
-
- if(cls.equals(void.class)){
+ private static Type toType(Class cls) {
+ if (cls.equals(void.class)) {
return Type.VOID;
}
-
- if(cls.isPrimitive()){
-
- if( int.class.equals(cls) ){
+ if (cls.isPrimitive()) {
+ if (int.class.equals(cls)) {
return Type.INT;
- }else if( char.class.equals(cls) ){
+ } else if (char.class.equals(cls)) {
return Type.CHAR;
- }else if( short.class.equals(cls) ){
+ } else if (short.class.equals(cls)) {
return Type.SHORT;
- }else if( byte.class.equals(cls) ){
+ } else if (byte.class.equals(cls)) {
return Type.BYTE;
- }else if( long.class.equals(cls)){
+ } else if (long.class.equals(cls)) {
return Type.LONG;
- }else if (float.class.equals(cls)){
+ } else if (float.class.equals(cls)) {
return Type.FLOAT;
- }else if (double.class.equals(cls)){
+ } else if (double.class.equals(cls)) {
return Type.DOUBLE;
- }else if (boolean.class.equals(cls)){
+ } else if (boolean.class.equals(cls)) {
return Type.BOOLEAN;
}
-
- }else if (cls.isArray()){
-
+ } else if (cls.isArray()) {
return toType(cls.getComponentType());
-
- }else return new ObjectType(cls.getName());
+ } else
+ return new ObjectType(cls.getName());
throw new java.lang.InternalError(cls.getName());
}
-
- private static void invokeSuper(ClassGen cg, MethodGen mg, Type args[]){
+ private static void invokeSuper(ClassGen cg, MethodGen mg, Type args[]) {
ConstantPoolGen cp = cg.getConstantPool();
InstructionList il = mg.getInstructionList();
int pos = 1;
- il.append(new ALOAD(0) );//this
- for( int i = 0; i < args.length; i++ ){//load args to stack
- pos = loadArg(il,args[i] , i, pos ) ;
- }
- il.append( new INVOKESPECIAL( cp.addMethodref(cg.getSuperclassName(),
- mg.getName(),mg.getSignature() ) ) );
- }
-
- private static MethodGen toMethodGen( java.lang.reflect.Method mtd,String className,
- InstructionList il ,ConstantPoolGen cp){
- return new MethodGen(ACC_PUBLIC, toType( mtd.getReturnType() ) , toType(mtd.getParameterTypes()) ,
- null, mtd.getName(), className , il, cp);
- }
- private static MethodGen toMethodGen( java.lang.reflect.Constructor mtd,String className,
- InstructionList il ,ConstantPoolGen cp){
- return new MethodGen(ACC_PUBLIC, Type.VOID , toType(mtd.getParameterTypes()),
- null, CONSTRUCTOR_NAME , className, il, cp );
- }
-
-
- private static Method generateMethod( java.lang.reflect.Method method,
- String fieldName,
- ClassGen cg,int before,
- int after, int invokeSuper){
-
- InstructionList il = new InstructionList();
+ il.append(new ALOAD(0)); //this
+ for (int i = 0; i < args.length; i++) { //load args to stack
+ pos = loadArg(il, args[i], i, pos);
+ }
+ il.append(
+ new INVOKESPECIAL(
+ cp.addMethodref(cg.getSuperclassName(), mg.getName(), mg.getSignature())));
+ }
+ private static MethodGen toMethodGen(
+ java.lang.reflect.Method mtd,
+ String className,
+ InstructionList il,
+ ConstantPoolGen cp) {
+ return new MethodGen(
+ ACC_PUBLIC,
+ toType(mtd.getReturnType()),
+ toType(mtd.getParameterTypes()),
+ null,
+ mtd.getName(),
+ className,
+ il,
+ cp);
+ }
+ private static MethodGen toMethodGen(
+ java.lang.reflect.Constructor mtd,
+ String className,
+ InstructionList il,
+ ConstantPoolGen cp) {
+ return new MethodGen(
+ ACC_PUBLIC,
+ Type.VOID,
+ toType(mtd.getParameterTypes()),
+ null,
+ CONSTRUCTOR_NAME,
+ className,
+ il,
+ cp);
+ }
+ private static Method generateMethod(
+ java.lang.reflect.Method method,
+ String fieldName,
+ ClassGen cg,
+ int before,
+ int after,
+ int invokeSuper) {
+
+ InstructionList il = new InstructionList();
InstructionFactory factory = new InstructionFactory(cg);
ConstantPoolGen cp = cg.getConstantPool();
- MethodGen mg = toMethodGen(method, cg.getClassName(),il, cp);
+ MethodGen mg = toMethodGen(method, cg.getClassName(), il, cp);
Type types[] = mg.getArgumentTypes();
int argCount = types.length;
-
- addMethodField( fieldName, cg );
-
- boolean returnsValue = !mg.getReturnType().equals( Type.VOID );
- boolean abstractM = java.lang.reflect.Modifier.isAbstract(method.getModifiers());
+ addMethodField(fieldName, cg);
+ boolean returnsValue = !mg.getReturnType().equals(Type.VOID);
+ boolean abstractM =
+ java.lang.reflect.Modifier.isAbstract(method.getModifiers());
InstructionHandle ehEnd = null;
GOTO gotoHandled = null;
IFEQ ifInvoke = null;
InstructionHandle condition = null;
InstructionHandle ehHandled = null;
InstructionHandle ehStart = null;
-
InstructionHandle start = il.getStart();
-
- int loaded = createArgArray(il,factory,cp,mg.getArgumentTypes());
+ int loaded = createArgArray(il, factory, cp, mg.getArgumentTypes());
int argArray = loaded;
- int resutFromBefore = ++loaded ;
-
- il.append( new ASTORE(argArray) );
- if(!abstractM){// invoke before
- il.append( new ALOAD(0) );
- il.append(factory.createFieldAccess(cg.getClassName(),FIELD_NAME,new ObjectType(INTERCEPTOR_CLASS),GETFIELD));
- il.append( new ALOAD(0) );
- il.append( factory.createGetStatic(cg.getClassName(),fieldName, METHOD_OBJECT ) );
- il.append( new ALOAD( argArray ) );
- il.append( new INVOKEINTERFACE(before,4) );
- il.append( new ASTORE( resutFromBefore ) );
-
- }else {
- il.append( new ACONST_NULL() );
- il.append( new ASTORE( resutFromBefore ) );
+ int resutFromBefore = ++loaded;
+ il.append(new ASTORE(argArray));
+ if (!abstractM) { // invoke before
+ il.append(new ALOAD(0));
+ il.append(
+ factory.createFieldAccess(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ GETFIELD));
+ il.append(new ALOAD(0));
+ il.append(factory.createGetStatic(cg.getClassName(), fieldName, METHOD_OBJECT));
+ il.append(new ALOAD(argArray));
+ il.append(new INVOKEINTERFACE(before, 4));
+ il.append(new ASTORE(resutFromBefore));
+ } else {
+ il.append(new ACONST_NULL());
+ il.append(new ASTORE(resutFromBefore));
}
//locals
- il.append( new ACONST_NULL() );
+ il.append(new ACONST_NULL());
int resultFromSuper = ++loaded;
- il.append( new ASTORE( resultFromSuper ) );
- il.append( new ICONST(0) );
+ il.append(new ASTORE(resultFromSuper));
+ il.append(new ICONST(0));
int superInvoked = ++loaded;
- il.append( new ISTORE( superInvoked ) );
- il.append( new ACONST_NULL() );
+ il.append(new ISTORE(superInvoked));
+ il.append(new ACONST_NULL());
int error = ++loaded;
- il.append( new ASTORE( error ) );
- if(!abstractM){//test before invoke super
- il.append( new ALOAD(0) );//this.handler
- il.append(factory.createFieldAccess(cg.getClassName(),FIELD_NAME,new ObjectType(INTERCEPTOR_CLASS),GETFIELD));
- il.append( new ALOAD(0) );//this
- il.append( factory.createGetStatic(cg.getClassName(),fieldName, METHOD_OBJECT ) );
- il.append( new ALOAD(argArray) );
- il.append( new ALOAD(resutFromBefore) );
- il.append( new INVOKEINTERFACE(invokeSuper,5) );
+ il.append(new ASTORE(error));
+ if (!abstractM) { //test before invoke super
+ il.append(new ALOAD(0)); //this.handler
+ il.append(
+ factory.createFieldAccess(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ GETFIELD));
+ il.append(new ALOAD(0)); //this
+ il.append(factory.createGetStatic(cg.getClassName(), fieldName, METHOD_OBJECT));
+ il.append(new ALOAD(argArray));
+ il.append(new ALOAD(resutFromBefore));
+ il.append(new INVOKEINTERFACE(invokeSuper, 5));
//test returned true
ifInvoke = new IFEQ(null);
- condition = il.append( ifInvoke );
- il.append( new ICONST(1));
- ehStart = il.append( new ISTORE( superInvoked ) );// Ivoked = true
- Instruction wrapper = newWrapper( mg.getReturnType(),cp );
- if( wrapper != null ){
- ehStart = il.append( wrapper );
- il.append( new DUP() );
- }
- //invokeSuper
- /*
- int pos = 1;
- il.append(new ALOAD(0) );//this
- for( int i = 0; i < argCount; i++ ){//load args to stack
- pos = loadArg(il,types[i] , i, pos ) ;
- }
- il.append( new INVOKESPECIAL( cp.addMethodref(cg.getSuperclassName(),
- method.getName(),mg.getSignature() ) ) );
- */
- invokeSuper(cg,mg,types);
- if( wrapper != null ){
- il.append( initWrapper(mg.getReturnType(),cp) );
+ condition = il.append(ifInvoke);
+ il.append(new ICONST(1));
+ ehStart = il.append(new ISTORE(superInvoked)); // Ivoked = true
+ Instruction wrapper = newWrapper(mg.getReturnType(), cp);
+ if (wrapper != null) {
+ ehStart = il.append(wrapper);
+ il.append(new DUP());
}
- if( returnsValue ){
- ehEnd = il.append( new ASTORE(resultFromSuper) );
+
+ invokeSuper(cg, mg, types);
+ if (wrapper != null) {
+ il.append(initWrapper(mg.getReturnType(), cp));
+ }
+ if (returnsValue) {
+ ehEnd = il.append(new ASTORE(resultFromSuper));
}
gotoHandled = new GOTO(null);
- if(!returnsValue ){
- ehEnd = il.append( gotoHandled );
- }else{
- il.append( gotoHandled );
+ if (!returnsValue) {
+ ehEnd = il.append(gotoHandled);
+ } else {
+ il.append(gotoHandled);
}
- ehHandled = il.append( new ASTORE(error ) );
+ ehHandled = il.append(new ASTORE(error));
}
-
- InstructionHandle endif = il.append( new ALOAD(0) );//this
-
- if( !abstractM ){
+ InstructionHandle endif = il.append(new ALOAD(0)); //this
+ if (!abstractM) {
ifInvoke.setTarget(endif);
gotoHandled.setTarget(endif);
}
-
- il.append(factory.createFieldAccess(cg.getClassName(),FIELD_NAME,new ObjectType(INTERCEPTOR_CLASS),GETFIELD));
- il.append( new ALOAD(0) );//this
- il.append( factory.createGetStatic(cg.getClassName(),fieldName,METHOD_OBJECT ) );
- il.append( new ALOAD(argArray) );
- il.append( new ALOAD(resutFromBefore) );
- il.append( new ILOAD(superInvoked) );
- il.append( new ALOAD(resultFromSuper) );
- il.append( new ALOAD(error) );
- il.append( new INVOKEINTERFACE(after,8) );
-
- InstructionHandle exitMethod = generateReturnValue(il,factory,cp,mg.getReturnType(),++loaded);
-
- if( !abstractM ){
- mg.addExceptionHandler(ehStart,ehEnd,ehHandled,Type.THROWABLE);
+ il.append(
+ factory.createFieldAccess(
+ cg.getClassName(),
+ FIELD_NAME,
+ new ObjectType(INTERCEPTOR_CLASS),
+ GETFIELD));
+ il.append(new ALOAD(0)); //this
+ il.append(factory.createGetStatic(cg.getClassName(), fieldName, METHOD_OBJECT));
+ il.append(new ALOAD(argArray));
+ il.append(new ALOAD(resutFromBefore));
+ il.append(new ILOAD(superInvoked));
+ il.append(new ALOAD(resultFromSuper));
+ il.append(new ALOAD(error));
+ il.append(new INVOKEINTERFACE(after, 8));
+ InstructionHandle exitMethod =
+ generateReturnValue(il, factory, cp, mg.getReturnType(), ++loaded);
+ if (!abstractM) {
+ mg.addExceptionHandler(ehStart, ehEnd, ehHandled, Type.THROWABLE);
}
-
mg.setMaxStack();
mg.setMaxLocals();
Method result = getMethod(mg);
- if( DEBUG ){
+ if (DEBUG) {
System.err.println(mg.getMethod());
System.err.println(mg.getMethod().getCode());
System.err.flush();
}
-
return result;
}
-
- static class MethodWrapper{
+ static class MethodWrapper {
java.lang.reflect.Method method;
- MethodWrapper(java.lang.reflect.Method method){
- if( method == null ){
+ MethodWrapper(java.lang.reflect.Method method) {
+ if (method == null) {
throw new NullPointerException();
}
this.method = method;
}
- public boolean equals(Object obj){
- if(obj == null || !( obj instanceof java.lang.reflect.Method) ){
+ public boolean equals(Object obj) {
+ if (obj == null || !(obj instanceof java.lang.reflect.Method)) {
return false;
}
- return equalsForEnhancer(method,(java.lang.reflect.Method)obj);
+ return equalsForEnhancer(method, (java.lang.reflect.Method) obj);
}
- public int hashCode(){
+ public int hashCode() {
return method.hashCode();
}
}
- static boolean equalsForEnhancer(java.lang.reflect.Method m1,java.lang.reflect.Method m2 ) {
- if( m1 == m2 ){
+ static boolean equalsForEnhancer(
+ java.lang.reflect.Method m1,
+ java.lang.reflect.Method m2) {
+ if (m1 == m2) {
return true;
}
- if( m1.getName().equals(m2.getName()) ){
+ if (m1.getName().equals(m2.getName())) {
Class[] params1 = m1.getParameterTypes();
Class[] params2 = m2.getParameterTypes();
if (params1.length == params2.length) {
for (int i = 0; i < params1.length; i++) {
- if ( params1[i] != params2[i] ){
+ if (params1[i] != params2[i]) {
return false;
}
}
return true;
}
}
-
return false;
}
-
-}
+}
\ No newline at end of file
1.6 +12 -12 jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/TestEnhancer.java
Index: TestEnhancer.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/TestEnhancer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TestEnhancer.java 7 Mar 2002 22:02:23 -0000 1.5
+++ TestEnhancer.java 9 Mar 2002 19:07:49 -0000 1.6
@@ -64,7 +64,7 @@
/**
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: TestEnhancer.java,v 1.5 2002/03/07 22:02:23 baliuka Exp $
+ *@version $Id: TestEnhancer.java,v 1.6 2002/03/09 19:07:49 baliuka Exp $
*/
public class TestEnhancer extends TestCase {
@@ -109,8 +109,8 @@
public Object beforeInvoke( Object obj,java.lang.reflect.Method method,
Object args[] )
throws java.lang.Throwable{
- System.err.print("beforeInvoke:" + method);
- printArgs(args);
+ // System.err.print("beforeInvoke:" + method);
+ // printArgs(args);
return null;
}
@@ -118,15 +118,15 @@
Object args[], Object retValFromBefore )
throws java.lang.Throwable{
- System.err.print("invokeSuper:" + method);
- printArgs(args);
+ // System.err.print("invokeSuper:" + method);
+ // printArgs(args);
if( "remove".equals(method.getName()) ) return false;//owerride size
return true;//let super to call this
}
public void afterConstruction(Object obj,Object args[] ){
- System.err.print("costructed: " + obj);
- printArgs(args);
+ // System.err.print("costructed: " + obj);
+ // printArgs(args);
}
public Object afterReturn( Object obj, java.lang.reflect.Method method,
@@ -134,12 +134,12 @@
boolean invokedSuper, Object retValFromSuper,
java.lang.Throwable e )throws java.lang.Throwable{
if( e != null ){
- System.err.println("Cauth Exeption from super " + obj.getClass().getSuperclass().getName());
- e.printStackTrace();
- System.err.println();
+ // System.err.println("Cauth Exeption from super " + obj.getClass().getSuperclass().getName());
+ // e.printStackTrace();
+ // System.err.println();
}
- System.err.print("afterReturn:" + method + " returned:" + retValFromSuper);
- printArgs(args);
+ // System.err.print("afterReturn:" + method + " returned:" + retValFromSuper);
+ // printArgs(args);
if( !invokedSuper )return new Boolean(false); //it was "remove"
return retValFromSuper;//return the same as supper
}
1.9 +20 -18 jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/TestSample.java
Index: TestSample.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/TestSample.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- TestSample.java 28 Feb 2002 18:28:41 -0000 1.8
+++ TestSample.java 9 Mar 2002 19:07:49 -0000 1.9
@@ -72,7 +72,7 @@
/**
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
- *@version $Id: TestSample.java,v 1.8 2002/02/28 18:28:41 baliuka Exp $
+ *@version $Id: TestSample.java,v 1.9 2002/03/09 19:07:49 baliuka Exp $
*/
public class TestSample extends TestCase {
@@ -97,16 +97,17 @@
Transaction transaction = pm.getTransaction();
transaction.begin();
- TestPersistent object1 = (TestPersistent) pm.createInstance(TestPersistent.class);
+ TestPersistentClassType object1 = (TestPersistentClassType) pm.createInstance(TestPersistentClassType.class);
Object oid = pm.getOID(object1);
+ object1.doSomething(object1.toString());
transaction.commit();
-
+
transaction.begin();
- TestPersistent object2 = (TestPersistent) pm.findInstance(TestPersistent.class, oid);
+ TestPersistentClassType object2 = (TestPersistentClassType) pm.findInstance(TestPersistentClassType.class, oid);
transaction.commit();
transaction.begin();
- TestPersistent object3 = (TestPersistent) pm.createInstance(TestPersistent.class);
+ TestPersistentClassType object3 = (TestPersistentClassType) pm.createInstance(TestPersistentClassType.class);
object3.setDateVal(new java.util.Date());
object3.setIntVal(i);
object3.setFloatVal(i / 2);
@@ -127,20 +128,20 @@
Transaction transaction = pm.getTransaction();
transaction.begin();
- java.util.Set objects = pm.findAll(TestPersistent.class);
+ java.util.Set objects = pm.findAll(TestPersistentClassType.class);
System.out.println("retrieved " + objects.size());
java.util.Iterator i = objects.iterator();
while (i.hasNext()) {
- TestPersistent object = (TestPersistent) i.next();
- System.out.println("ID = " + object);
- System.out.println("BoolVal = " + object.getBoolVal());
- System.out.println("DateVal = " + object.getDateVal());
- System.out.println("IntVal = " + object.getIntVal());
- System.out.println("FloatVal = " + object.getFloatVal());
- System.out.println("StrVal1 = " + object.getStrVal1());
- System.out.println("Parent Object = " + object.getParent());
+ TestPersistentClassType object = (TestPersistentClassType) i.next();
+ object.toString();
+ object.getBoolVal();
+ object.getDateVal();
+ object.getIntVal();
+ object.getFloatVal();
+ object.getStrVal1();
+ object.getParent();
}
@@ -150,19 +151,20 @@
public void testRollback() throws java.lang.Exception {
_testCreate();
+
_testRetrieve();
Transaction transaction = pm.getTransaction();
transaction.begin();
- java.util.Set objects = pm.findAll(TestPersistent.class);
+ java.util.Set objects = pm.findAll(TestPersistentClassType.class);
transaction.commit();
java.util.Iterator i = objects.iterator();
while (i.hasNext()) {
transaction.begin();
- TestPersistent object = (TestPersistent) i.next();
+ TestPersistentClassType object = (TestPersistentClassType) i.next();
String val = object.getStrVal();
object.setStrVal( i + "");
transaction.rollback();
@@ -173,7 +175,7 @@
transaction.begin();
- TestPersistent object = (TestPersistent) pm.createInstance(TestPersistent.class);
+ TestPersistentClassType object = (TestPersistentClassType) pm.createInstance(TestPersistentClassType.class);
object.setStrVal("Test roolback on new created " + object);
System.out.println(object.getStrVal());
transaction.rollback();
@@ -187,7 +189,7 @@
transaction.commit();
transaction.begin();
- object = (TestPersistent) pm.createInstance(TestPersistent.class);
+ object = (TestPersistentClassType) pm.createInstance(TestPersistentClassType.class);
object.setIntVal(777);
transaction.commit();
1.2 +2 -2 jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/storage.xml
Index: storage.xml
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/storage.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- storage.xml 28 Feb 2002 18:28:41 -0000 1.1
+++ storage.xml 9 Mar 2002 19:07:49 -0000 1.2
@@ -3,10 +3,10 @@
<!DOCTYPE storage >
<storage>
- <mclass id="org.apache.commons.simplestore.TestPersistent" name="TEST_PERSISTENT" oid="ID">
+ <mclass id="org.apache.commons.simplestore.TestPersistentClassType" name="TEST_PERSISTENT" oid="ID">
<field id="strVal1" name="s_1_str_val"/>
<field id="parent" name="parent_object"/>
- <reference mclass="org.apache.commons.simplestore.TestPersistent"
+ <reference mclass="org.apache.commons.simplestore.TestPersistentClassType"
field="parent"/>
</mclass>
</storage>
1.1 jakarta-commons-sandbox/simplestore/src/test/org/apache/commons/simplestore/TestPersistentClassType.java
Index: TestPersistentClassType.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache Cocoon" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.simplestore;
/**
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
*@version $Id: TestPersistentClassType.java,v 1.1 2002/03/09 19:07:49 baliuka Exp $
*/
public abstract class TestPersistentClassType implements TestPersistent{
/** Creates a new instance of TestPersistentClassType */
public TestPersistentClassType() {
}
public void doSomething(String arg){
this.setStrVal("done Something " + arg);
System.out.println(getStrVal());
}
public abstract void setDateVal(java.util.Date val) ;
public abstract void setBoolVal(boolean val) ;
public abstract java.util.Date getDateVal() ;
public abstract void setIntVal(int val);
public abstract void setFloatVal(float val) ;
public abstract float getFloatVal() ;
public abstract void setStrVal1(String strVal1);
public abstract void setStrVal(String strVal1);
public abstract String getStrVal();
public abstract String getStrVal1();
public abstract void setParent(TestPersistent tp);
public abstract int getIntVal();
public abstract boolean getBoolVal();
public abstract TestPersistent getParent();
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>