[jboss-svn-commits] JBL Code SVN: r12976 - in labs/jbossrules/trunk/drools-core/src/main/java/org: drools and 9 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jul 1 15:05:05 EDT 2007


Author: tirelli
Date: 2007-07-01 15:05:05 -0400 (Sun, 01 Jul 2007)
New Revision: 12976

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/Objenesis.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisException.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisHelper.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisSerializer.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisStd.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/NullInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/ObjectInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/SerializationInstantiatorHelper.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/AccessibleInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ConstructorInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/NewInstanceInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ObjectInputStreamInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ObjectStreamClassInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJInstantiatorBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJSerializationInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/JRockit131Instantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/JRockitLegacyInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13Instantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13InstantiatorBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13SerializationInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/SunReflectionFactoryInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/SunReflectionFactorySerializationInstantiator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/BaseInstantiatorStrategy.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/InstantiatorStrategy.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/SerializingInstantiatorStrategy.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/StdInstantiatorStrategy.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/objenesis/
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
Log:
Refactoring package name for inlined objenesis

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java	2007-07-01 17:44:42 UTC (rev 12975)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -19,10 +19,10 @@
 import java.lang.reflect.Field;
 
 import org.drools.RuntimeDroolsException;
+import org.drools.objenesis.Objenesis;
+import org.drools.objenesis.ObjenesisStd;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
 import org.drools.spi.ObjectType;
-import org.objenesis.Objenesis;
-import org.objenesis.ObjenesisStd;
-import org.objenesis.instantiator.ObjectInstantiator;
 
 /**
  * Java class semantics <code>ObjectType</code>.

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/Objenesis.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/Objenesis.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/Objenesis.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,29 @@
+package org.drools.objenesis;
+
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * Common interface to all kind of Objenesis objects
+ * 
+ * @author Henri Tremblay
+ */
+public interface Objenesis {
+
+    /**
+     * Will create a new object without any constructor being called
+     * 
+     * @param clazz Class to instantiate
+     * @return New instance of clazz
+     */
+    Object newInstance(Class clazz);
+
+    /**
+     * Will pick the best instantiator for the provided class. If you need to create a lot of
+     * instances from the same class, it is way more efficient to create them from the same
+     * ObjectInstantiator than calling {@link #newInstance(Class)}.
+     * 
+     * @param clazz Class to instantiate
+     * @return Instantiator dedicated to the class
+     */
+    ObjectInstantiator getInstantiatorOf(Class clazz);
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/Objenesis.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisBase.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisBase.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,85 @@
+package org.drools.objenesis;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+import org.drools.objenesis.strategy.InstantiatorStrategy;
+
+/**
+ * Base class to extend if you want to have a class providing your own default strategy. Can also be
+ * instantiated directly.
+ * 
+ * @author Henri Tremblay
+ */
+public class ObjenesisBase
+    implements
+    Objenesis {
+
+    /** Strategy used by this Objenesi implementation to create classes */
+    protected final InstantiatorStrategy strategy;
+
+    /** Strategy cache. Key = Class, Value = InstantiatorStrategy */
+    protected Map                        cache;
+
+    /**
+     * Constructor allowing to pick a strategy and using cache
+     * 
+     * @param strategy Strategy to use
+     */
+    public ObjenesisBase(final InstantiatorStrategy strategy) {
+        this( strategy,
+              true );
+    }
+
+    /**
+     * Flexible constructor allowing to pick the strategy and if caching should be used
+     * 
+     * @param strategy Strategy to use
+     * @param useCache If {@link ObjectInstantiator}s should be cached
+     */
+    public ObjenesisBase(final InstantiatorStrategy strategy,
+                         final boolean useCache) {
+        if ( strategy == null ) {
+            throw new IllegalArgumentException( "A strategy can't be null" );
+        }
+        this.strategy = strategy;
+        this.cache = useCache ? new HashMap() : null;
+    }
+
+    public String toString() {
+        return getClass().getName() + " using " + this.strategy.getClass().getName() + (this.cache == null ? " without" : " with") + " caching";
+    }
+
+    /**
+     * Will create a new object without any constructor being called
+     * 
+     * @param clazz Class to instantiate
+     * @return New instance of clazz
+     */
+    public Object newInstance(final Class clazz) {
+        return getInstantiatorOf( clazz ).newInstance();
+    }
+
+    /**
+     * Will pick the best instantiator for the provided class. If you need to create a lot of
+     * instances from the same class, it is way more efficient to create them from the same
+     * ObjectInstantiator than calling {@link #newInstance(Class)}.
+     * 
+     * @param clazz Class to instantiate
+     * @return Instantiator dedicated to the class
+     */
+    public synchronized ObjectInstantiator getInstantiatorOf(final Class clazz) {
+        if ( this.cache == null ) {
+            return this.strategy.newInstantiatorOf( clazz );
+        }
+        ObjectInstantiator instantiator = (ObjectInstantiator) this.cache.get( clazz.getName() );
+        if ( instantiator == null ) {
+            instantiator = this.strategy.newInstantiatorOf( clazz );
+            this.cache.put( clazz.getName(),
+                       instantiator );
+        }
+        return instantiator;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisBase.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisException.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisException.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisException.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,42 @@
+package org.drools.objenesis;
+
+/**
+ * Exception thrown by Objenesis. It wraps any instantiation exceptions. Note that this exception is
+ * runtime to prevent having to catch it. It will do normal exception wrapping for JDK 1.4 and more
+ * and basic message wrapping for JDK 1.3.
+ * 
+ * @author Henri Tremblay
+ */
+public class ObjenesisException extends RuntimeException {
+
+    private static final boolean jdk14 = (Double.parseDouble( System.getProperty( "java.specification.version" ) ) > 1.3);
+
+    /**
+     * @param msg Error message
+     */
+    public ObjenesisException(final String msg) {
+        super( msg );
+    }
+
+    /**
+     * @param cause Wrapped exception. The message will be the one of the cause.
+     */
+    public ObjenesisException(final Throwable cause) {
+        super( cause == null ? null : cause.toString() );
+        if ( jdk14 ) {
+            initCause( cause );
+        }
+    }
+
+    /**
+     * @param msg Error message
+     * @param cause Wrapped exception
+     */
+    public ObjenesisException(final String msg,
+                              final Throwable cause) {
+        super( msg );
+        if ( jdk14 ) {
+            initCause( cause );
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisException.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisHelper.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,65 @@
+package org.drools.objenesis;
+
+import java.io.Serializable;
+
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * Use Objenesis in a static way. <strong>It is strongly not recommended to use this class.</strong>
+ * 
+ * @author Henri Tremblay
+ */
+public final class ObjenesisHelper {
+
+    private static final Objenesis OBJENESIS_STD        = new ObjenesisStd();
+
+    private static final Objenesis OBJENESIS_SERIALIZER = new ObjenesisSerializer();
+
+    private ObjenesisHelper() {
+    }
+
+    /**
+     * Will create a new object without any constructor being called
+     * 
+     * @param clazz Class to instantiate
+     * @return New instance of clazz
+     */
+    public static final Object newInstance(final Class clazz) {
+        return OBJENESIS_STD.newInstance( clazz );
+    }
+
+    /**
+     * Will create an object just like it's done by ObjectInputStream.readObject (the default
+     * constructor of the first non serializable class will be called)
+     * 
+     * @param clazz Class to instantiate
+     * @return New instance of clazz
+     */
+    public static final Serializable newSerializableInstance(final Class clazz) {
+        return (Serializable) OBJENESIS_SERIALIZER.newInstance( clazz );
+    }
+
+    /**
+     * Will pick the best instantiator for the provided class. If you need to create a lot of
+     * instances from the same class, it is way more efficient to create them from the same
+     * ObjectInstantiator than calling {@link #newInstance(Class)}.
+     * 
+     * @param clazz Class to instantiate
+     * @return Instantiator dedicated to the class
+     */
+    public static final ObjectInstantiator getInstantiatorOf(final Class clazz) {
+        return OBJENESIS_STD.getInstantiatorOf( clazz );
+    }
+
+    /**
+     * Same as {@link #getInstantiatorOf(Class)} but providing an instantiator emulating
+     * ObjectInputStream.readObject behavior.
+     * 
+     * @see #newSerializableInstance(Class)
+     * @param clazz Class to instantiate
+     * @return Instantiator dedicated to the class
+     */
+    public static final ObjectInstantiator getSerializableObjectInstantiatorOf(final Class clazz) {
+        return OBJENESIS_SERIALIZER.getInstantiatorOf( clazz );
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisHelper.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisSerializer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisSerializer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisSerializer.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,29 @@
+package org.drools.objenesis;
+
+import org.drools.objenesis.strategy.SerializingInstantiatorStrategy;
+
+/**
+ * Objenesis implementation using the {@link SerializingInstantiatorStrategy}.
+ * 
+ * @author Henri Tremblay
+ */
+public class ObjenesisSerializer extends ObjenesisBase {
+
+    /**
+     * Default constructor using the {@link org.drools.objenesis.strategy.SerializingInstantiatorStrategy}
+     */
+    public ObjenesisSerializer() {
+        super( new SerializingInstantiatorStrategy() );
+    }
+
+    /**
+     * Instance using the {@link org.drools.objenesis.strategy.SerializingInstantiatorStrategy} with or without caching
+     * {@link org.drools.objenesis.instantiator.ObjectInstantiator}s
+     * 
+     * @param useCache If {@link org.drools.objenesis.instantiator.ObjectInstantiator}s should be cached
+     */
+    public ObjenesisSerializer(final boolean useCache) {
+        super( new SerializingInstantiatorStrategy(),
+               useCache );
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisSerializer.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisStd.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisStd.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisStd.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,29 @@
+package org.drools.objenesis;
+
+import org.drools.objenesis.strategy.StdInstantiatorStrategy;
+
+/**
+ * Objenesis implementation using the {@link org.drools.objenesis.strategy.StdInstantiatorStrategy}.
+ * 
+ * @author Henri Tremblay
+ */
+public class ObjenesisStd extends ObjenesisBase {
+
+    /**
+     * Default constructor using the {@link org.drools.objenesis.strategy.StdInstantiatorStrategy}
+     */
+    public ObjenesisStd() {
+        super( new StdInstantiatorStrategy() );
+    }
+
+    /**
+     * Instance using the {@link org.drools.objenesis.strategy.StdInstantiatorStrategy} with or without
+     * caching {@link org.drools.objenesis.instantiator.ObjectInstantiator}s
+     * 
+     * @param useCache If {@link org.drools.objenesis.instantiator.ObjectInstantiator}s should be cached
+     */
+    public ObjenesisStd(final boolean useCache) {
+        super( new StdInstantiatorStrategy(),
+               useCache );
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/ObjenesisStd.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/NullInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/NullInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/NullInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,18 @@
+package org.drools.objenesis.instantiator;
+
+/**
+ * The instantiator that always return a null instance
+ * 
+ * @author Henri Tremblay
+ */
+public class NullInstantiator
+    implements
+    ObjectInstantiator {
+
+    /**
+     * @return Always null
+     */
+    public Object newInstance() {
+        return null;
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/NullInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/ObjectInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/ObjectInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/ObjectInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,16 @@
+package org.drools.objenesis.instantiator;
+
+/**
+ * Instantiates a new object.
+ */
+public interface ObjectInstantiator {
+
+    /**
+     * Returns a new instance of an object. The returned object's class is defined by the
+     * implementation.
+     * 
+     * @return A new instance of an object.
+     */
+    Object newInstance();
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/ObjectInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/SerializationInstantiatorHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/SerializationInstantiatorHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/SerializationInstantiatorHelper.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,33 @@
+package org.drools.objenesis.instantiator;
+
+import java.io.Serializable;
+
+/**
+ * Helper for common serialization-compatible instantiation functions
+ * 
+ * @author Leonardo Mesquita
+ */
+public class SerializationInstantiatorHelper {
+
+    /**
+     * Returns the first non-serializable superclass of a given class. According to Java Object
+     * Serialization Specification, objects read from a stream are initialized by calling an
+     * accessible no-arg constructor from the first non-serializable superclass in the object's
+     * hierarchy, allowing the state of non-serializable fields to be correctly initialized.
+     * 
+     * @param type Serializable class for which the first non-serializable superclass is to be found
+     * @return The first non-serializable superclass of 'type'.
+     * @see java.io.Serializable
+     */
+    public static Class getNonSerializableSuperClass(final Class type) {
+        Class result = type;
+        while ( Serializable.class.isAssignableFrom( result ) ) {
+            result = result.getSuperclass();
+            if ( result == null ) {
+                throw new Error( "Bad class hierarchy: No non-serializable parents" );
+            }
+        }
+        return result;
+
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/SerializationInstantiatorHelper.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/AccessibleInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/AccessibleInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/AccessibleInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,19 @@
+package org.drools.objenesis.instantiator.basic;
+
+
+/**
+ * Instantiates a class by grabbing the no-args constructor, making it accessible and then calling
+ * Constructor.newInstance(). Although this still requires no-arg constructors, it can call
+ * non-public constructors (if the security manager allows it).
+ * 
+ * @see org.drools.objenesis.instantiator.ObjectInstantiator
+ */
+public class AccessibleInstantiator extends ConstructorInstantiator {
+
+    public AccessibleInstantiator(final Class type) {
+        super( type );
+        if ( this.constructor != null ) {
+            this.constructor.setAccessible( true );
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/AccessibleInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ConstructorInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ConstructorInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ConstructorInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,36 @@
+package org.drools.objenesis.instantiator.basic;
+
+import java.lang.reflect.Constructor;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * Instantiates a class by grabbing the no args constructor and calling Constructor.newInstance().
+ * This can deal with default public constructors, but that's about it.
+ * 
+ * @see ObjectInstantiator
+ */
+public class ConstructorInstantiator
+    implements
+    ObjectInstantiator {
+
+    protected Constructor constructor;
+
+    public ConstructorInstantiator(final Class type) {
+        try {
+            this.constructor = type.getDeclaredConstructor( (Class[]) null );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+
+    public Object newInstance() {
+        try {
+            return this.constructor.newInstance( (Object[]) null );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ConstructorInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/NewInstanceInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/NewInstanceInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/NewInstanceInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,30 @@
+package org.drools.objenesis.instantiator.basic;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * The simplest instantiator - simply calls Class.newInstance(). This can deal with default public
+ * constructors, but that's about it.
+ * 
+ * @see ObjectInstantiator
+ */
+public class NewInstanceInstantiator
+    implements
+    ObjectInstantiator {
+
+    private final Class type;
+
+    public NewInstanceInstantiator(final Class type) {
+        this.type = type;
+    }
+
+    public Object newInstance() {
+        try {
+            return this.type.newInstance();
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/NewInstanceInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ObjectInputStreamInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ObjectInputStreamInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ObjectInputStreamInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,170 @@
+package org.drools.objenesis.instantiator.basic;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.NotSerializableException;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamClass;
+import java.io.ObjectStreamConstants;
+import java.io.Serializable;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * Instantiates a class by using a dummy input stream that always feeds data for an empty object of
+ * the same kind. NOTE: This instantiator may not work properly if the class being instantiated
+ * defines a "readResolve" method, since it may return objects that have been returned previously
+ * (i.e., there's no guarantee that the returned object is a new one), or even objects from a
+ * completely different class.
+ * 
+ * @author Leonardo Mesquita
+ * @see org.drools.objenesis.instantiator.ObjectInstantiator
+ */
+public class ObjectInputStreamInstantiator
+    implements
+    ObjectInstantiator {
+    private static class MockStream extends InputStream {
+
+        private int                pointer;
+        private byte[]             data;
+        private int                sequence;
+        private static final int[] NEXT = new int[]{1, 2, 2};
+        private byte[][]           buffers;
+
+        private final byte[]       FIRST_DATA;
+        private static byte[]      HEADER;
+        private static byte[]      REPEATING_DATA;
+
+        static {
+            initialize();
+        }
+
+        private static void initialize() {
+            try {
+                ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+                DataOutputStream dout = new DataOutputStream( byteOut );
+                dout.writeShort( ObjectStreamConstants.STREAM_MAGIC );
+                dout.writeShort( ObjectStreamConstants.STREAM_VERSION );
+                HEADER = byteOut.toByteArray();
+
+                byteOut = new ByteArrayOutputStream();
+                dout = new DataOutputStream( byteOut );
+
+                dout.writeByte( ObjectStreamConstants.TC_OBJECT );
+                dout.writeByte( ObjectStreamConstants.TC_REFERENCE );
+                dout.writeInt( ObjectStreamConstants.baseWireHandle );
+                REPEATING_DATA = byteOut.toByteArray();
+            } catch ( final IOException e ) {
+                throw new Error( "IOException: " + e.getMessage() );
+            }
+
+        }
+
+        public MockStream(final Class clazz) {
+            this.pointer = 0;
+            this.sequence = 0;
+            this.data = HEADER;
+
+            // (byte) TC_OBJECT
+            // (byte) TC_CLASSDESC
+            // (short length)
+            // (byte * className.length)
+            // (long)serialVersionUID
+            // (byte) SC_SERIALIZABLE
+            // (short)0 <fields>
+            // TC_ENDBLOCKDATA
+            // TC_NULL
+            final ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+            final DataOutputStream dout = new DataOutputStream( byteOut );
+            try {
+                dout.writeByte( ObjectStreamConstants.TC_OBJECT );
+                dout.writeByte( ObjectStreamConstants.TC_CLASSDESC );
+                dout.writeUTF( clazz.getName() );
+                dout.writeLong( ObjectStreamClass.lookup( clazz ).getSerialVersionUID() );
+                dout.writeByte( ObjectStreamConstants.SC_SERIALIZABLE );
+                dout.writeShort( (short) 0 ); // Zero fields
+                dout.writeByte( ObjectStreamConstants.TC_ENDBLOCKDATA );
+                dout.writeByte( ObjectStreamConstants.TC_NULL );
+            } catch ( final IOException e ) {
+                throw new Error( "IOException: " + e.getMessage() );
+            }
+            this.FIRST_DATA = byteOut.toByteArray();
+            this.buffers = new byte[][]{HEADER, this.FIRST_DATA, REPEATING_DATA};
+        }
+
+        private void advanceBuffer() {
+            this.pointer = 0;
+            this.sequence = NEXT[this.sequence];
+            this.data = this.buffers[this.sequence];
+        }
+
+        public int read() throws IOException {
+            final int result = this.data[this.pointer++];
+            if ( this.pointer >= this.data.length ) {
+                advanceBuffer();
+            }
+
+            return result;
+        }
+
+        public int available() throws IOException {
+            return Integer.MAX_VALUE;
+        }
+
+        public int read(final byte[] b,
+                        int off,
+                        final int len) throws IOException {
+            int left = len;
+            int remaining = this.data.length - this.pointer;
+
+            while ( remaining <= left ) {
+                System.arraycopy( this.data,
+                                  this.pointer,
+                                  b,
+                                  off,
+                                  remaining );
+                off += remaining;
+                left -= remaining;
+                advanceBuffer();
+                remaining = this.data.length - this.pointer;
+            }
+            if ( left > 0 ) {
+                System.arraycopy( this.data,
+                                  this.pointer,
+                                  b,
+                                  off,
+                                  left );
+                this.pointer += left;
+            }
+
+            return len;
+        }
+    }
+
+    private ObjectInputStream inputStream;
+
+    public ObjectInputStreamInstantiator(final Class clazz) {
+        if ( Serializable.class.isAssignableFrom( clazz ) ) {
+            try {
+                this.inputStream = new ObjectInputStream( new MockStream( clazz ) );
+            } catch ( final IOException e ) {
+                throw new Error( "IOException: " + e.getMessage() );
+            }
+        } else {
+            throw new ObjenesisException( new NotSerializableException( clazz + " not serializable" ) );
+        }
+    }
+
+    public Object newInstance() {
+        try {
+            return this.inputStream.readObject();
+        } catch ( final ClassNotFoundException e ) {
+            throw new Error( "ClassNotFoundException: " + e.getMessage() );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ObjectInputStreamInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ObjectStreamClassInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ObjectStreamClassInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ObjectStreamClassInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,55 @@
+package org.drools.objenesis.instantiator.basic;
+
+import java.io.ObjectStreamClass;
+import java.lang.reflect.Method;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * Instantiates a class by using reflection to make a call to private method
+ * ObjectStreamClass.newInstance, present in many JVM implementations. This instantiator will create
+ * classes in a way compatible with serialization, calling the first non-serializable superclass'
+ * no-arg constructor.
+ * 
+ * @author Leonardo Mesquita
+ * @see ObjectInstantiator
+ * @see java.io.Serializable
+ */
+public class ObjectStreamClassInstantiator
+    implements
+    ObjectInstantiator {
+
+    private static Method newInstanceMethod;
+
+    private static void initialize() {
+        if ( newInstanceMethod == null ) {
+            try {
+                newInstanceMethod = ObjectStreamClass.class.getDeclaredMethod( "newInstance",
+                                                                               new Class[]{} );
+                newInstanceMethod.setAccessible( true );
+            } catch ( final Exception e ) {
+                throw new ObjenesisException( e );
+            }
+        }
+    }
+
+    private ObjectStreamClass objStreamClass;
+
+    public ObjectStreamClassInstantiator(final Class type) {
+        initialize();
+        this.objStreamClass = ObjectStreamClass.lookup( type );
+    }
+
+    public Object newInstance() {
+
+        try {
+            return newInstanceMethod.invoke( this.objStreamClass,
+                                             new Object[]{} );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/basic/ObjectStreamClassInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,25 @@
+package org.drools.objenesis.instantiator.gcj;
+
+import org.drools.objenesis.ObjenesisException;
+
+/**
+ * Instantiates a class by making a call to internal GCJ private methods. It is only supposed to
+ * work on GCJ JVMs. This instantiator will not call any constructors.
+ * 
+ * @author Leonardo Mesquita
+ * @see org.drools.objenesis.instantiator.ObjectInstantiator
+ */
+public class GCJInstantiator extends GCJInstantiatorBase {
+    public GCJInstantiator(final Class type) {
+        super( type );
+    }
+
+    public Object newInstance() {
+        try {
+            return newObjectMethod.invoke( dummyStream,
+                                           new Object[]{this.type, Object.class} );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJInstantiatorBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJInstantiatorBase.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJInstantiatorBase.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,50 @@
+package org.drools.objenesis.instantiator.gcj;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.lang.reflect.Method;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * Base class for GCJ-based instantiators. It initializes reflection access to method
+ * ObjectInputStream.newObject, as well as creating a dummy ObjectInputStream to be used as the
+ * "this" argument for the method.
+ * 
+ * @author Leonardo Mesquita
+ */
+public abstract class GCJInstantiatorBase
+    implements
+    ObjectInstantiator {
+    protected static Method            newObjectMethod = null;
+    protected static ObjectInputStream dummyStream;
+
+    private static class DummyStream extends ObjectInputStream {
+        public DummyStream() throws IOException {
+            super();
+        }
+    }
+
+    private static void initialize() {
+        if ( newObjectMethod == null ) {
+            try {
+                newObjectMethod = ObjectInputStream.class.getDeclaredMethod( "newObject",
+                                                                             new Class[]{Class.class, Class.class} );
+                newObjectMethod.setAccessible( true );
+                dummyStream = new DummyStream();
+            } catch ( final Exception e ) {
+                throw new ObjenesisException( e );
+            }
+        }
+    }
+
+    protected final Class type;
+
+    public GCJInstantiatorBase(final Class type) {
+        this.type = type;
+        initialize();
+    }
+
+    public abstract Object newInstance();
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJInstantiatorBase.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJSerializationInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJSerializationInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJSerializationInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,31 @@
+package org.drools.objenesis.instantiator.gcj;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.SerializationInstantiatorHelper;
+
+/**
+ * Instantiates a class by making a call to internal GCJ private methods. It is only supposed to
+ * work on GCJ JVMs. This instantiator will create classes in a way compatible with serialization,
+ * calling the first non-serializable superclass' no-arg constructor.
+ * 
+ * @author Leonardo Mesquita
+ * @see org.drools.objenesis.instantiator.ObjectInstantiator
+ */
+public class GCJSerializationInstantiator extends GCJInstantiatorBase {
+    private Class superType;
+
+    public GCJSerializationInstantiator(final Class type) {
+        super( type );
+        this.superType = SerializationInstantiatorHelper.getNonSerializableSuperClass( type );
+    }
+
+    public Object newInstance() {
+        try {
+            return newObjectMethod.invoke( dummyStream,
+                                           new Object[]{this.type, this.superType} );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/gcj/GCJSerializationInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/JRockit131Instantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/JRockit131Instantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/JRockit131Instantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,81 @@
+/**
+ * COPYRIGHT & LICENSE
+ *
+ * This code is Copyright (c) 2006 BEA Systems, inc. It is provided free, as-is and without any warranties for the purpose of
+ * inclusion in Objenesis or any other open source project with a FSF approved license, as long as this notice is not
+ * removed. There are no limitations on modifying or repackaging the code apart from this. 
+ *
+ * BEA does not guarantee that the code works, and provides no support for it. Use at your own risk.
+ *
+ * Originally developed by Leonardo Mesquita. Copyright notice added by Henrik St�hl, BEA JRockit Product Manager.
+ *  
+ */
+package org.drools.objenesis.instantiator.jrockit;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * Instantiates a class by making a call to internal JRockit private methods. It is only supposed to
+ * work on JRockit 7.0 JVMs, which are compatible with Java API 1.3.1. This instantiator will not
+ * call any constructors.
+ * 
+ * @author Leonardo Mesquita
+ * @see org.drools.objenesis.instantiator.ObjectInstantiator
+ */
+public class JRockit131Instantiator
+    implements
+    ObjectInstantiator {
+
+    private Constructor   mungedConstructor;
+
+    private static Method newConstructorForSerializationMethod;
+
+    private static void initialize() {
+        if ( newConstructorForSerializationMethod == null ) {
+            Class cl;
+            try {
+                cl = Class.forName( "COM.jrockit.reflect.MemberAccess" );
+                newConstructorForSerializationMethod = cl.getDeclaredMethod( "newConstructorForSerialization",
+                                                                             new Class[]{Constructor.class, Class.class} );
+                newConstructorForSerializationMethod.setAccessible( true );
+            } catch ( final Exception e ) {
+                throw new ObjenesisException( e );
+            }
+        }
+    }
+
+    public JRockit131Instantiator(final Class type) {
+        initialize();
+
+        if ( newConstructorForSerializationMethod != null ) {
+
+            Constructor javaLangObjectConstructor;
+
+            try {
+                javaLangObjectConstructor = Object.class.getConstructor( (Class[]) null );
+            } catch ( final NoSuchMethodException e ) {
+                throw new Error( "Cannot find constructor for java.lang.Object!" );
+            }
+
+            try {
+                this.mungedConstructor = (Constructor) newConstructorForSerializationMethod.invoke( null,
+                                                                                               new Object[]{javaLangObjectConstructor, type} );
+            } catch ( final Exception e ) {
+                throw new ObjenesisException( e );
+            }
+        }
+
+    }
+
+    public Object newInstance() {
+        try {
+            return this.mungedConstructor.newInstance( (Object[]) null );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/JRockit131Instantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/JRockitLegacyInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/JRockitLegacyInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/JRockitLegacyInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,65 @@
+/**
+ * COPYRIGHT & LICENSE
+ *
+ * This code is Copyright (c) 2006 BEA Systems, inc. It is provided free, as-is and without any warranties for the purpose of
+ * inclusion in Objenesis or any other open source project with a FSF approved license, as long as this notice is not
+ * removed. There are no limitations on modifying or repackaging the code apart from this. 
+ *
+ * BEA does not guarantee that the code works, and provides no support for it. Use at your own risk.
+ *
+ * Originally developed by Leonardo Mesquita. Copyright notice added by Henrik St�hl, BEA JRockit Product Manager.
+ *  
+ */
+
+package org.drools.objenesis.instantiator.jrockit;
+
+import java.lang.reflect.Method;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * Instantiates a class by making a call to internal JRockit private methods. It is only supposed to
+ * work on JRockit 1.4.2 JVMs prior to release R25.1. From release R25.1 on, JRockit supports
+ * sun.reflect.ReflectionFactory, making this "trick" unnecessary. This instantiator will not call
+ * any constructors.
+ * 
+ * @author Leonardo Mesquita
+ * @see org.drools.objenesis.instantiator.ObjectInstantiator
+ * @see org.drools.objenesis.instantiator.sun.SunReflectionFactoryInstantiator
+ */
+public class JRockitLegacyInstantiator
+    implements
+    ObjectInstantiator {
+    private static Method safeAllocObjectMethod = null;
+
+    private static void initialize() {
+        if ( safeAllocObjectMethod == null ) {
+            Class memSystem;
+            try {
+                memSystem = Class.forName( "jrockit.vm.MemSystem" );
+                safeAllocObjectMethod = memSystem.getDeclaredMethod( "safeAllocObject",
+                                                                     new Class[]{Class.class} );
+                safeAllocObjectMethod.setAccessible( true );
+            } catch ( final Exception e ) {
+                throw new ObjenesisException( e );
+            }
+        }
+    }
+
+    private Class type;
+
+    public JRockitLegacyInstantiator(final Class type) {
+        initialize();
+        this.type = type;
+    }
+
+    public Object newInstance() {
+        try {
+            return safeAllocObjectMethod.invoke( null,
+                                                 new Object[]{this.type} );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/jrockit/JRockitLegacyInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13Instantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13Instantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13Instantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,26 @@
+package org.drools.objenesis.instantiator.sun;
+
+import org.drools.objenesis.ObjenesisException;
+
+/**
+ * Instantiates a class by making a call to internal Sun private methods. It is only supposed to
+ * work on Sun HotSpot 1.3 JVM. This instantiator will not call any constructors.
+ * 
+ * @author Leonardo Mesquita
+ * @see org.drools.objenesis.instantiator.ObjectInstantiator
+ */
+public class Sun13Instantiator extends Sun13InstantiatorBase {
+    public Sun13Instantiator(final Class type) {
+        super( type );
+    }
+
+    public Object newInstance() {
+        try {
+            return allocateNewObjectMethod.invoke( null,
+                                                   new Object[]{this.type, Object.class} );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13Instantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13InstantiatorBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13InstantiatorBase.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13InstantiatorBase.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,41 @@
+package org.drools.objenesis.instantiator.sun;
+
+import java.io.ObjectInputStream;
+import java.lang.reflect.Method;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * Base class for Sun 1.3 based instantiators. It initializes reflection access to static method
+ * ObjectInputStream.allocateNewObject.
+ * 
+ * @author Leonardo Mesquita
+ */
+public abstract class Sun13InstantiatorBase
+    implements
+    ObjectInstantiator {
+    protected static Method allocateNewObjectMethod = null;
+
+    private static void initialize() {
+        if ( allocateNewObjectMethod == null ) {
+            try {
+                allocateNewObjectMethod = ObjectInputStream.class.getDeclaredMethod( "allocateNewObject",
+                                                                                     new Class[]{Class.class, Class.class} );
+                allocateNewObjectMethod.setAccessible( true );
+            } catch ( final Exception e ) {
+                throw new ObjenesisException( e );
+            }
+        }
+    }
+
+    protected final Class type;
+
+    public Sun13InstantiatorBase(final Class type) {
+        this.type = type;
+        initialize();
+    }
+
+    public abstract Object newInstance();
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13InstantiatorBase.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13SerializationInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13SerializationInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13SerializationInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,31 @@
+package org.drools.objenesis.instantiator.sun;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.SerializationInstantiatorHelper;
+
+/**
+ * Instantiates a class by making a call to internal Sun private methods. It is only supposed to
+ * work on Sun HotSpot 1.3 JVM. This instantiator will create classes in a way compatible with
+ * serialization, calling the first non-serializable superclass' no-arg constructor.
+ * 
+ * @author Leonardo Mesquita
+ * @see org.drools.objenesis.instantiator.ObjectInstantiator
+ */
+public class Sun13SerializationInstantiator extends Sun13InstantiatorBase {
+    private final Class superType;
+
+    public Sun13SerializationInstantiator(final Class type) {
+        super( type );
+        this.superType = SerializationInstantiatorHelper.getNonSerializableSuperClass( type );
+    }
+
+    public Object newInstance() {
+        try {
+            return allocateNewObjectMethod.invoke( null,
+                                                   new Object[]{this.type, this.superType} );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/Sun13SerializationInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/SunReflectionFactoryInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/SunReflectionFactoryInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/SunReflectionFactoryInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,46 @@
+package org.drools.objenesis.instantiator.sun;
+
+import java.lang.reflect.Constructor;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+import sun.reflect.ReflectionFactory;
+
+/**
+ * Instantiates an object, WITHOUT calling it's constructor, using internal
+ * sun.reflect.ReflectionFactory - a class only available on JDK's that use Sun's 1.4 (or later)
+ * Java implementation. This is the best way to instantiate an object without any side effects
+ * caused by the constructor - however it is not available on every platform.
+ * 
+ * @see ObjectInstantiator
+ */
+public class SunReflectionFactoryInstantiator
+    implements
+    ObjectInstantiator {
+
+    private final Constructor mungedConstructor;
+
+    public SunReflectionFactoryInstantiator(final Class type) {
+
+        final ReflectionFactory reflectionFactory = ReflectionFactory.getReflectionFactory();
+        Constructor javaLangObjectConstructor;
+
+        try {
+            javaLangObjectConstructor = Object.class.getConstructor( (Class[]) null );
+        } catch ( final NoSuchMethodException e ) {
+            throw new Error( "Cannot find constructor for java.lang.Object!" );
+        }
+        this.mungedConstructor = reflectionFactory.newConstructorForSerialization( type,
+                                                                              javaLangObjectConstructor );
+        this.mungedConstructor.setAccessible( true );
+    }
+
+    public Object newInstance() {
+        try {
+            return this.mungedConstructor.newInstance( (Object[]) null );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/SunReflectionFactoryInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/SunReflectionFactorySerializationInstantiator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/SunReflectionFactorySerializationInstantiator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/SunReflectionFactorySerializationInstantiator.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,56 @@
+package org.drools.objenesis.instantiator.sun;
+
+import java.io.NotSerializableException;
+import java.lang.reflect.Constructor;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+import org.drools.objenesis.instantiator.SerializationInstantiatorHelper;
+
+import sun.reflect.ReflectionFactory;
+
+/**
+ * Instantiates an object using internal sun.reflect.ReflectionFactory - a class only available on
+ * JDK's that use Sun's 1.4 (or later) Java implementation. This instantiator will create classes in
+ * a way compatible with serialization, calling the first non-serializable superclass' no-arg
+ * constructor. This is the best way to instantiate an object without any side effects caused by the
+ * constructor - however it is not available on every platform.
+ * 
+ * @see ObjectInstantiator
+ */
+public class SunReflectionFactorySerializationInstantiator
+    implements
+    ObjectInstantiator {
+
+    private final Constructor mungedConstructor;
+
+    public SunReflectionFactorySerializationInstantiator(final Class type) {
+
+        final Class nonSerializableAncestor = SerializationInstantiatorHelper.getNonSerializableSuperClass( type );
+        final ReflectionFactory reflectionFactory = ReflectionFactory.getReflectionFactory();
+        Constructor nonSerializableAncestorConstructor;
+        try {
+            nonSerializableAncestorConstructor = nonSerializableAncestor.getConstructor( (Class[]) null );
+        } catch ( final NoSuchMethodException e ) {
+            /**
+             * @todo (Henri) I think we should throw a NotSerializableException just to put the same
+             *       message a ObjectInputStream. Otherwise, the user won't know if the null returned
+             *       if a "Not serializable", a "No default constructor on ancestor" or a "Exception in
+             *       constructor"
+             */
+            throw new ObjenesisException( new NotSerializableException( type + " has no suitable superclass constructor" ) );
+        }
+
+        this.mungedConstructor = reflectionFactory.newConstructorForSerialization( type,
+                                                                              nonSerializableAncestorConstructor );
+        this.mungedConstructor.setAccessible( true );
+    }
+
+    public Object newInstance() {
+        try {
+            return this.mungedConstructor.newInstance( (Object[]) null );
+        } catch ( final Exception e ) {
+            throw new ObjenesisException( e );
+        }
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/instantiator/sun/SunReflectionFactorySerializationInstantiator.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/BaseInstantiatorStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/BaseInstantiatorStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/BaseInstantiatorStrategy.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,35 @@
+package org.drools.objenesis.strategy;
+
+/**
+ * Base {@link InstantiatorStrategy} class basically containing helpful constant to sort out JVMs.
+ * 
+ * @author Henri Tremblay
+ */
+public abstract class BaseInstantiatorStrategy
+    implements
+    InstantiatorStrategy {
+
+    /** JVM_NAME prefix for JRockit */
+    protected static final String JROCKIT        = "BEA";
+
+    /** JVM_NAME prefix for GCJ */
+    protected static final String GNU            = "GNU libgcj";
+
+    /** JVM_NAME prefix for Sun Java HotSpot */
+    protected static final String SUN            = "Java HotSpot";
+
+    /** JVM version */
+    protected static final String VM_VERSION     = System.getProperty( "java.runtime.version" );
+
+    /** JVM version */
+    protected static final String VM_INFO        = System.getProperty( "java.vm.info" );
+
+    /** Vendor version */
+    protected static final String VENDOR_VERSION = System.getProperty( "java.vm.version" );
+
+    /** Vendor name */
+    protected static final String VENDOR         = System.getProperty( "java.vm.vendor" );
+
+    /** JVM name */
+    protected static final String JVM_NAME       = System.getProperty( "java.vm.name" );
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/BaseInstantiatorStrategy.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/InstantiatorStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/InstantiatorStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/InstantiatorStrategy.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,17 @@
+package org.drools.objenesis.strategy;
+
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+
+/**
+ * Defines a strategy to determine the best instantiator for a class.
+ */
+public interface InstantiatorStrategy {
+
+    /**
+     * Create a dedicated instantiator for the given class
+     * 
+     * @param type Class that will be instantiate
+     * @return Dedicated instantiator
+     */
+    ObjectInstantiator newInstantiatorOf(Class type);
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/InstantiatorStrategy.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/SerializingInstantiatorStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/SerializingInstantiatorStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/SerializingInstantiatorStrategy.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,49 @@
+package org.drools.objenesis.strategy;
+
+import java.io.NotSerializableException;
+import java.io.Serializable;
+
+import org.drools.objenesis.ObjenesisException;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+import org.drools.objenesis.instantiator.basic.ObjectStreamClassInstantiator;
+import org.drools.objenesis.instantiator.gcj.GCJSerializationInstantiator;
+import org.drools.objenesis.instantiator.sun.Sun13SerializationInstantiator;
+
+/**
+ * Guess the best serializing instantiator for a given class. The returned instantiator will
+ * instantiate classes like the genuine java serialization framework (the constructor of the first
+ * not serializable class will be called). Currently, the selection doesn't depend on the class. It
+ * relies on the
+ * <ul>
+ * <li>JVM version</li>
+ * <li>JVM vendor</li>
+ * <li>JVM vendor version</li>
+ * </ul>
+ * However, instantiators are stateful and so dedicated to their class.
+ * 
+ * @see ObjectInstantiator
+ */
+public class SerializingInstantiatorStrategy extends BaseInstantiatorStrategy {
+
+    /**
+     * Return an {@link ObjectInstantiator} allowing to create instance following the java
+     * serialization framework specifications.
+     * 
+     * @param type Class to instantiate
+     * @return The ObjectInstantiator for the class
+     */
+    public ObjectInstantiator newInstantiatorOf(final Class type) {
+        if ( !Serializable.class.isAssignableFrom( type ) ) {
+            throw new ObjenesisException( new NotSerializableException( type + " not serializable" ) );
+        }
+        if ( JVM_NAME.startsWith( SUN ) ) {
+            if ( VM_VERSION.startsWith( "1.3" ) ) {
+                return new Sun13SerializationInstantiator( type );
+            }
+        } else if ( JVM_NAME.startsWith( GNU ) ) {
+            return new GCJSerializationInstantiator( type );
+        }
+        return new ObjectStreamClassInstantiator( type );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/SerializingInstantiatorStrategy.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/StdInstantiatorStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/StdInstantiatorStrategy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/StdInstantiatorStrategy.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -0,0 +1,64 @@
+package org.drools.objenesis.strategy;
+
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+import org.drools.objenesis.instantiator.gcj.GCJInstantiator;
+import org.drools.objenesis.instantiator.jrockit.JRockit131Instantiator;
+import org.drools.objenesis.instantiator.jrockit.JRockitLegacyInstantiator;
+import org.drools.objenesis.instantiator.sun.Sun13Instantiator;
+import org.drools.objenesis.instantiator.sun.SunReflectionFactoryInstantiator;
+
+/**
+ * Guess the best instantiator for a given class. The instantiator will instantiate the class
+ * without calling any constructor. Currently, the selection doesn't depend on the class. It relies
+ * on the
+ * <ul>
+ * <li>JVM version</li>
+ * <li>JVM vendor</li>
+ * <li>JVM vendor version</li>
+ * </ul>
+ * However, instantiators are stateful and so dedicated to their class.
+ * 
+ * @see ObjectInstantiator
+ */
+public class StdInstantiatorStrategy extends BaseInstantiatorStrategy {
+
+    /**
+     * Return an {@link ObjectInstantiator} allowing to create instance without any constructor being
+     * called.
+     * 
+     * @param type Class to instantiate
+     * @return The ObjectInstantiator for the class
+     */
+    public ObjectInstantiator newInstantiatorOf(final Class type) {
+
+        if ( JVM_NAME.startsWith( SUN ) ) {
+            if ( VM_VERSION.startsWith( "1.3" ) ) {
+                return new Sun13Instantiator( type );
+            }
+        } else if ( JVM_NAME.startsWith( JROCKIT ) ) {
+            if ( VM_VERSION.startsWith( "1.3" ) ) {
+                return new JRockit131Instantiator( type );
+            } else if ( VM_VERSION.startsWith( "1.4" ) ) {
+                // JRockit vendor version will be RXX where XX is the version
+                // Versions prior to 26 need special handling
+                // From R26 on, java.vm.version starts with R
+                if ( !VENDOR_VERSION.startsWith( "R" ) ) {
+                    // On R25.1 and R25.2, ReflectionFactory should work. Otherwise, we must use the
+                    // Legacy instantiator.
+                    if ( VM_INFO == null || !VM_INFO.startsWith( "R25.1" ) || !VM_INFO.startsWith( "R25.2" ) ) {
+                        return new JRockitLegacyInstantiator( type );
+                    }
+                }
+            }
+        } else if ( JVM_NAME.startsWith( GNU ) ) {
+            return new GCJInstantiator( type );
+        }
+
+        // Fallback instantiator, should work with:
+        // - Java Hotspot version 1.4 and higher
+        // - JRockit 1.4-R26 and higher
+        // - IBM and Hitachi JVMs
+        // ... might works for others so we just give it a try
+        return new SunReflectionFactoryInstantiator( type );
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/objenesis/strategy/StdInstantiatorStrategy.java
___________________________________________________________________
Name: svn:executable
   + *

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2007-07-01 17:44:42 UTC (rev 12975)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2007-07-01 19:05:05 UTC (rev 12976)
@@ -17,10 +17,7 @@
  */
 
 import java.io.IOException;
-import java.io.ObjectInput;
 import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
@@ -31,7 +28,6 @@
 import org.drools.RuntimeDroolsException;
 import org.drools.base.ShadowProxy;
 import org.drools.base.ShadowProxyFactory;
-import org.drools.base.ShadowProxyHelper;
 import org.drools.common.BaseNode;
 import org.drools.common.DroolsObjectInputStream;
 import org.drools.common.InternalFactHandle;
@@ -40,15 +36,13 @@
 import org.drools.common.NodeMemory;
 import org.drools.facttemplates.Fact;
 import org.drools.facttemplates.FactImpl;
-import org.drools.rule.Package;
+import org.drools.objenesis.Objenesis;
+import org.drools.objenesis.ObjenesisStd;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
 import org.drools.spi.PropagationContext;
-import org.drools.util.ClassUtils;
 import org.drools.util.Iterator;
 import org.drools.util.ObjectHashMap;
 import org.drools.util.ObjectHashMap.ObjectEntry;
-import org.objenesis.Objenesis;
-import org.objenesis.ObjenesisStd;
-import org.objenesis.instantiator.ObjectInstantiator;
 
 /**
  * The Rete-OO network.




More information about the jboss-svn-commits mailing list