[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