db-ojb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From acl...@apache.org
Subject cvs commit: db-ojb/src/java/org/apache/ojb/broker/core/proxy OJBSerializableProxy.java VirtualProxy.java AbstractIndirectionHandler.java OJBProxy.java
Date Wed, 17 Aug 2005 21:19:39 GMT
aclute      2005/08/17 14:19:39

  Modified:    src/java/org/apache/ojb/broker/core/proxy Tag:
                        OJB_1_0_RELEASE VirtualProxy.java
                        AbstractIndirectionHandler.java OJBProxy.java
  Added:       src/java/org/apache/ojb/broker/core/proxy Tag:
                        OJB_1_0_RELEASE OJBSerializableProxy.java
  Log:
  Added the ability for reference proxies to be serialized/unserialized without issue. Proxy
objects are replaced with a simple seriaizlable class that has no issue with classloaders
as it is not dynamically generated.
  
  When the new objects is unserialized, it replaced itself with a fresh proxy.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.1.2.4   +6 -1      db-ojb/src/java/org/apache/ojb/broker/core/proxy/VirtualProxy.java
  
  Index: VirtualProxy.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/proxy/VirtualProxy.java,v
  retrieving revision 1.1.2.3
  retrieving revision 1.1.2.4
  diff -u -r1.1.2.3 -r1.1.2.4
  --- VirtualProxy.java	9 Aug 2005 20:03:21 -0000	1.1.2.3
  +++ VirtualProxy.java	17 Aug 2005 21:19:39 -0000	1.1.2.4
  @@ -126,5 +126,10 @@
           return indirectionHandler.getIdentity();
       }
       
  +	public Object writeReplace()
  +	{
  +		return this; 
  +	}
  +    
   
   }
  
  
  
  1.1.2.2   +402 -363  db-ojb/src/java/org/apache/ojb/broker/core/proxy/AbstractIndirectionHandler.java
  
  Index: AbstractIndirectionHandler.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/proxy/AbstractIndirectionHandler.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- AbstractIndirectionHandler.java	9 Aug 2005 20:03:21 -0000	1.1.2.1
  +++ AbstractIndirectionHandler.java	17 Aug 2005 21:19:39 -0000	1.1.2.2
  @@ -31,14 +31,14 @@
   
   /**
    * Abstract implementation for the indirection handler used by ojb's proxies.
  - *
  + * 
    * @version $Id$
    */
   public abstract class AbstractIndirectionHandler implements IndirectionHandler
   {
  -static final long serialVersionUID = -1993879565033755826L;
  +    static final long serialVersionUID = -1993879565033755826L;
       
  -    /** Reference to the used PersistenceBroker */
  +	/** Reference to the used PersistenceBroker */
       private transient PersistenceBrokerInternal _broker = null;
       /** The key for acquiring the above broker */
       private PBKey _brokerKey;
  @@ -57,365 +57,404 @@
       */
       private boolean _needsClose;
   
  -    /**
  -     * Creates a new indirection handler for the indicated object.
  -     * 
  -     * @param brokerKey The key of the persistence broker
  -     * @param id        The identity of the subject
  -     */
  -    public AbstractIndirectionHandler(PBKey brokerKey, Identity id)
  -    {
  -        setBrokerKey(brokerKey);
  -        setIdentity(id);
  -    }
  -
  -    /**
  -     * Returns the identity of the subject.
  -     * 
  -     * @return The identity
  -     */
  -    public Identity getIdentity()
  -    {
  -        return _id;
  -    }
  -
  -    /**
  -     * Sets the identity of the subject of this indirection handler.
  -     *  
  -     * @param identity
  -     */
  -    protected void setIdentity(Identity identity)
  -    {
  -        _id = identity;
  -    }
  -
  -    /**
  -     * Returns the key of the persistence broker used by this indirection handler.
  -     * 
  -     * @return The broker key
  -     */
  -    public PBKey getBrokerKey()
  -    {
  -        return _brokerKey;
  -    }
  -
  -    /**
  -     * Sets the key of the persistence broker used by this indirection handler.
  -     *
  -     * @param brokerKey The broker key
  -     */
  -    protected void setBrokerKey(PBKey brokerKey)
  -    {
  -        _brokerKey = brokerKey;
  -    }
  -
  -    /**
  -     * Adds a materialization listener.
  -     * 
  -     * @param listener The listener to add
  -     */
  -    public synchronized void addListener(MaterializationListener listener)
  -    {
  -        if (_listeners == null)
  -        {
  -            _listeners = new ArrayList();
  -        }
  -        // add listener only once
  -        if(!_listeners.contains(listener))
  -        {
  -            _listeners.add(listener);
  -        }
  -    }
  -
  -    /**
  -     * Removes a materialization listener.
  -     * 
  -     * @param listener The listener to remove
  -     */
  -    public synchronized void removeListener(MaterializationListener listener)
  -    {
  -        if (_listeners != null)
  -        {
  -            _listeners.remove(listener);
  -        }
  -    }
  -
  -    /**
  -     * Calls beforeMaterialization on all registered listeners in the reverse order
  -     * of registration.
  -     */
  -    protected void beforeMaterialization()
  -    {
  -        if (_listeners != null)
  -        {
  -            MaterializationListener listener;
  -
  -            for (int idx = _listeners.size() - 1; idx >= 0; idx--)
  -            {
  -                listener = (MaterializationListener)_listeners.get(idx);
  -                listener.beforeMaterialization(this, _id);
  -            }
  -        }
  -    }
  -
  -    /**
  -     * Calls afterMaterialization on all registered listeners in the reverse order
  -     * of registration.
  -     */
  -    protected void afterMaterialization()
  -    {
  -        if (_listeners != null)
  -        {
  -            MaterializationListener listener;
  -
  -            // listeners may remove themselves during the afterMaterialization callback.
  -            // thus we must iterate through the listeners vector from back to front
  -            // to avoid index problems.
  -            for (int idx = _listeners.size() - 1; idx >= 0; idx--)
  -            {
  -                listener = (MaterializationListener)_listeners.get(idx);
  -                listener.afterMaterialization(this, _realSubject);
  -            }
  -        }
  -    }
  -
  -    /**
  -     * Gets the persistence broker used by this indirection handler.
  -     * If no PBKey is available a runtime exception will be thrown.
  -     * 
  -     * @return a PersistenceBroker
  -     */
  -    protected synchronized PersistenceBrokerInternal getBroker() throws PBFactoryException
  -    {
  -        PersistenceBrokerInternal broker;
  -
  -        if (getBrokerKey() == null)
  -        {
  -            /*
  -            arminw:
  -            if no PBKey is set we throw an exception, because we don't
  -            know which PB (connection) should be used.
  -            */
  -            throw new OJBRuntimeException("Can't find associated PBKey. Need PBKey to obtain
a valid" +
  -                                          "PersistenceBroker instance from intern resources.");
  -        }
  -        // first try to use the current threaded broker to avoid blocking
  -        broker = PersistenceBrokerThreadMapping.currentPersistenceBroker(getBrokerKey());
  -        // current broker not found, create a intern new one
  -        if (broker == null)
  -        {
  -            if (_broker == null)
  -            {
  -                _broker = (PersistenceBrokerInternal)PersistenceBrokerFactory.createPersistenceBroker(getBrokerKey());
  -                // TODO: Better way?
  -                _needsClose = true;
  -                broker      = _broker;
  -            }
  -        }
  -        return broker;
  -    }
  -
  -    /**
  -     * Release the PersistenceBroker instance currently used.
  -     */
  -    protected void releaseBroker()
  -    {
  -        if (_broker != null && _needsClose)
  -        {
  -            _needsClose = false;
  -            _broker.close();
  -            _broker = null;
  -        }
  -    }
  -
  -
  -    /**
  -     * [Copied from {@link java.lang.reflect.InvocationHandler}]:<br/>
  -     * Processes a method invocation on a proxy instance and returns
  -     * the result.  This method will be invoked on an invocation handler
  -     * when a method is invoked on a proxy instance that it is
  -     * associated with.
  -     *
  -     * @param	proxy The proxy instance that the method was invoked on
  -     *
  -     * @param	method The <code>Method</code> instance corresponding to
  -     * the interface method invoked on the proxy instance.  The declaring
  -     * class of the <code>Method</code> object will be the interface that
  -     * the method was declared in, which may be a superinterface of the
  -     * proxy interface that the proxy class inherits the method through.
  -     *
  -     * @param	args An array of objects containing the values of the
  -     * arguments passed in the method invocation on the proxy instance,
  -     * or <code>null</code> if interface method takes no arguments.
  -     * Arguments of primitive types are wrapped in instances of the
  -     * appropriate primitive wrapper class, such as
  -     * <code>java.lang.Integer</code> or <code>java.lang.Boolean</code>.
  -     *
  -     * @return	The value to return from the method invocation on the
  -     * proxy instance.  If the declared return type of the interface
  -     * method is a primitive type, then the value returned by
  -     * this method must be an instance of the corresponding primitive
  -     * wrapper class; otherwise, it must be a type assignable to the
  -     * declared return type.  If the value returned by this method is
  -     * <code>null</code> and the interface method's return type is
  -     * primitive, then a <code>NullPointerException</code> will be
  -     * thrown by the method invocation on the proxy instance.  If the
  -     * value returned by this method is otherwise not compatible with
  -     * the interface method's declared return type as described above,
  -     * a <code>ClassCastException</code> will be thrown by the method
  -     * invocation on the proxy instance.
  -     *
  -     * @throws	PersistenceBrokerException The exception to throw from the method
  -     * invocation on the proxy instance.  The exception's type must be
  -     * assignable either to any of the exception types declared in the
  -     * <code>throws</code> clause of the interface method or to the
  -     * unchecked exception types <code>java.lang.RuntimeException</code>
  -     * or <code>java.lang.Error</code>.  If a checked exception is
  -     * thrown by this method that is not assignable to any of the
  -     * exception types declared in the <code>throws</code> clause of
  -     * the interface method, then an
  -     * {@link java.lang.reflect.UndeclaredThrowableException} containing the
  -     * exception that was thrown by this method will be thrown by the
  -     * method invocation on the proxy instance.
  -     *
  -     * @see java.lang.reflect.UndeclaredThrowableException
  -     */
  -    public Object invoke(Object proxy, Method method, Object[] args)
  -    {
  -        Object subject    = null;
  -        String methodName = method.getName();
  -
  -        try
  -        {
  -            // [andrew clute]
  -            // short-circuit any calls to a finalize methjod if the subject
  -            // has not been retrieved yet
  -            if ("finalize".equals(methodName) && _realSubject == null)
  -            {
  -                return null;
  -            }
  -            
  -            // [tomdz]
  -            // Previously the hashcode of the identity would have been used
  -            // but this requires a compatible hashCode implementation in the
  -            // proxied object (which is somewhat unlikely, even the default
  -            // hashCode implementation does not fulfill this requirement)
  -            // for those that require this behavior, a custom indirection
  -            // handler can be used, or the hashCode of the identity
  -            /*
  -            if ("hashCode".equals(methodName))
  -            {
  -                return new Integer(_id.hashCode());
  -            }
  -            */
  -
  -            // [tomdz]
  -            // this would handle toString differently for non-materialized proxies
  -            // (to avoid materialization due to logging)
  -            // however toString should be a normal business method which
  -            // materializes the proxy
  -            // if this is not desired, then the ProxyHandler.toString(Object) method
  -            // should be used instead (e.g. for logging within OJB)
  -            /*
  -            if ((realSubject == null) && "toString".equals(methodName))
  -            {
  -                return "unmaterialized proxy for " + id;
  -            }
  -            */
  -
  -            // BRJ: make sure that the object to be compared is a real object
  -            // otherwise equals may return false.
  -            if ("equals".equals(methodName) && args[0] != null)
  -            {
  -                Object otherObj = getBroker().getProxyFactory().getRealObject(args[0]);
  -                args[0] = otherObj;
  -            }
  -            
  -            if ("getIndirectionHandler".equals(methodName) && args[0] != null)
  -            {
  -               return this;
  -            }
  -            
  -            
  -
  -            subject = getRealSubject();
  -            return method.invoke(subject, args);
  -            // [olegnitz] I've changed the following strange lines
  -            // to the above one. Why was this done in such complicated way?
  -            // Is it possible that subject doesn't implement the method's interface?
  -            // Method m = subject.getClass().getMethod(method.getName(), method.getParameterTypes());
  -            // return m.invoke(subject, args);
  -        }
  -        catch (Exception ex)
  -        {
  -            throw new PersistenceBrokerException("Error invoking method "+method.getName(),
ex);
  -        }
  -    }
  -
  -    /**
  -     * Returns the proxies real subject. The subject will be materialized if necessary.
  -     * 
  -     * @return The subject
  -     */
  -    public Object getRealSubject() throws PersistenceBrokerException
  -    {
  -        if (_realSubject == null)
  -        {
  -            beforeMaterialization();
  -            _realSubject = materializeSubject();
  -            afterMaterialization();
  -        }
  -        return _realSubject;
  -    }
  -
  -    /**
  -     * [olegnitz] This looks stupid, but is really necessary for OTM:
  -     * the materialization listener replaces the real subject
  -     * by its clone to ensure transaction isolation.
  -     * Is there a better way to do this?
  -     */
  -    public void setRealSubject(Object object)
  -    {
  -        _realSubject = object;
  -    }
  -
  -    /**
  -     * Retrieves the real subject from the underlying RDBMS. Override this method if
  -     * the object is to be materialized in a specific way.
  -     * 
  -     * @return The real subject of the proxy
  -     */
  -    protected synchronized Object materializeSubject() throws PersistenceBrokerException
  -    {
  -        PersistenceBroker broker = getBroker();
  -
  -        try
  -        {
  -            Object realSubject = broker.getObjectByIdentity(_id);
  -
  -            if (realSubject == null)
  -            {
  -                LoggerFactory.getLogger(IndirectionHandler.class).warn("Can not materialize
object for Identity " + _id + " - using PBKey " + getBrokerKey());
  -            }
  -            return realSubject;
  -        }
  -        catch (Exception ex)
  -        {
  -            throw new PersistenceBrokerException(ex);
  -        }
  -        finally
  -        {
  +	/**
  +	 * Creates a new indirection handler for the indicated object.
  +	 * 
  +	 * @param brokerKey
  +	 *            The key of the persistence broker
  +	 * @param id
  +	 *            The identity of the subject
  +	 */
  +	public AbstractIndirectionHandler(PBKey brokerKey, Identity id)
  +	{
  +		setBrokerKey(brokerKey);
  +		setIdentity(id);
  +	}
  +
  +	/**
  +	 * Returns the identity of the subject.
  +	 * 
  +	 * @return The identity
  +	 */
  +	public Identity getIdentity()
  +	{
  +		return _id;
  +	}
  +
  +	/**
  +	 * Sets the identity of the subject of this indirection handler.
  +	 * 
  +	 * @param identity
  +	 */
  +	protected void setIdentity(Identity identity)
  +	{
  +		_id = identity;
  +	}
  +
  +	/**
  +	 * Returns the key of the persistence broker used by this indirection
  +	 * handler.
  +	 * 
  +	 * @return The broker key
  +	 */
  +	public PBKey getBrokerKey()
  +	{
  +		return _brokerKey;
  +	}
  +
  +	/**
  +	 * Sets the key of the persistence broker used by this indirection handler.
  +	 * 
  +	 * @param brokerKey
  +	 *            The broker key
  +	 */
  +	protected void setBrokerKey(PBKey brokerKey)
  +	{
  +		_brokerKey = brokerKey;
  +	}
  +
  +	/**
  +	 * Adds a materialization listener.
  +	 * 
  +	 * @param listener
  +	 *            The listener to add
  +	 */
  +	public synchronized void addListener(MaterializationListener listener)
  +	{
  +		if (_listeners == null)
  +		{
  +			_listeners = new ArrayList();
  +		}
  +		// add listener only once
  +		if (!_listeners.contains(listener))
  +		{
  +			_listeners.add(listener);
  +		}
  +	}
  +
  +	/**
  +	 * Removes a materialization listener.
  +	 * 
  +	 * @param listener
  +	 *            The listener to remove
  +	 */
  +	public synchronized void removeListener(MaterializationListener listener)
  +	{
  +		if (_listeners != null)
  +		{
  +			_listeners.remove(listener);
  +		}
  +	}
  +
  +	/**
  +	 * Calls beforeMaterialization on all registered listeners in the reverse
  +	 * order of registration.
  +	 */
  +	protected void beforeMaterialization()
  +	{
  +		if (_listeners != null)
  +		{
  +			MaterializationListener listener;
  +
  +			for (int idx = _listeners.size() - 1; idx >= 0; idx--)
  +			{
  +				listener = (MaterializationListener) _listeners.get(idx);
  +				listener.beforeMaterialization(this, _id);
  +			}
  +		}
  +	}
  +
  +	/**
  +	 * Calls afterMaterialization on all registered listeners in the reverse
  +	 * order of registration.
  +	 */
  +	protected void afterMaterialization()
  +	{
  +		if (_listeners != null)
  +		{
  +			MaterializationListener listener;
  +
  +			// listeners may remove themselves during the afterMaterialization
  +			// callback.
  +			// thus we must iterate through the listeners vector from back to
  +			// front
  +			// to avoid index problems.
  +			for (int idx = _listeners.size() - 1; idx >= 0; idx--)
  +			{
  +				listener = (MaterializationListener) _listeners.get(idx);
  +				listener.afterMaterialization(this, _realSubject);
  +			}
  +		}
  +	}
  +
  +	/**
  +	 * Gets the persistence broker used by this indirection handler. If no PBKey
  +	 * is available a runtime exception will be thrown.
  +	 * 
  +	 * @return a PersistenceBroker
  +	 */
  +	protected synchronized PersistenceBrokerInternal getBroker() throws PBFactoryException
  +	{
  +		PersistenceBrokerInternal broker;
  +
  +		if (getBrokerKey() == null)
  +		{
  +			/*
  +			 * arminw: if no PBKey is set we throw an exception, because we
  +			 * don't know which PB (connection) should be used.
  +			 */
  +			throw new OJBRuntimeException("Can't find associated PBKey. Need PBKey to obtain a valid"
  +					+ "PersistenceBroker instance from intern resources.");
  +		}
  +		// first try to use the current threaded broker to avoid blocking
  +		broker = PersistenceBrokerThreadMapping.currentPersistenceBroker(getBrokerKey());
  +		// current broker not found, create a intern new one
  +		if (broker == null)
  +		{
  +			if (_broker == null)
  +			{
  +				_broker = (PersistenceBrokerInternal) PersistenceBrokerFactory.createPersistenceBroker(getBrokerKey());
  +				// TODO: Better way?
  +				_needsClose = true;
  +				broker = _broker;
  +			}
  +		}
  +		return broker;
  +	}
  +
  +	/**
  +	 * Release the PersistenceBroker instance currently used.
  +	 */
  +	protected void releaseBroker()
  +	{
  +		if (_broker != null && _needsClose)
  +		{
  +			_needsClose = false;
  +			_broker.close();
  +			_broker = null;
  +		}
  +	}
  +
  +	/**
  +	 * [Copied from {@link java.lang.reflect.InvocationHandler}]:<br/>
  +	 * Processes a method invocation on a proxy instance and returns the result.
  +	 * This method will be invoked on an invocation handler when a method is
  +	 * invoked on a proxy instance that it is associated with.
  +	 * 
  +	 * @param proxy
  +	 *            The proxy instance that the method was invoked on
  +	 * 
  +	 * @param method
  +	 *            The <code>Method</code> instance corresponding to the
  +	 *            interface method invoked on the proxy instance. The declaring
  +	 *            class of the <code>Method</code> object will be the
  +	 *            interface that the method was declared in, which may be a
  +	 *            superinterface of the proxy interface that the proxy class
  +	 *            inherits the method through.
  +	 * 
  +	 * @param args
  +	 *            An array of objects containing the values of the arguments
  +	 *            passed in the method invocation on the proxy instance, or
  +	 *            <code>null</code> if interface method takes no arguments.
  +	 *            Arguments of primitive types are wrapped in instances of the
  +	 *            appropriate primitive wrapper class, such as
  +	 *            <code>java.lang.Integer</code> or
  +	 *            <code>java.lang.Boolean</code>.
  +	 * 
  +	 * @return The value to return from the method invocation on the proxy
  +	 *         instance. If the declared return type of the interface method is
  +	 *         a primitive type, then the value returned by this method must be
  +	 *         an instance of the corresponding primitive wrapper class;
  +	 *         otherwise, it must be a type assignable to the declared return
  +	 *         type. If the value returned by this method is <code>null</code>
  +	 *         and the interface method's return type is primitive, then a
  +	 *         <code>NullPointerException</code> will be thrown by the method
  +	 *         invocation on the proxy instance. If the value returned by this
  +	 *         method is otherwise not compatible with the interface method's
  +	 *         declared return type as described above, a
  +	 *         <code>ClassCastException</code> will be thrown by the method
  +	 *         invocation on the proxy instance.
  +	 * 
  +	 * @throws PersistenceBrokerException
  +	 *             The exception to throw from the method invocation on the
  +	 *             proxy instance. The exception's type must be assignable
  +	 *             either to any of the exception types declared in the
  +	 *             <code>throws</code> clause of the interface method or to
  +	 *             the unchecked exception types
  +	 *             <code>java.lang.RuntimeException</code> or
  +	 *             <code>java.lang.Error</code>. If a checked exception is
  +	 *             thrown by this method that is not assignable to any of the
  +	 *             exception types declared in the <code>throws</code> clause
  +	 *             of the interface method, then an
  +	 *             {@link java.lang.reflect.UndeclaredThrowableException}
  +	 *             containing the exception that was thrown by this method will
  +	 *             be thrown by the method invocation on the proxy instance.
  +	 * 
  +	 * @see java.lang.reflect.UndeclaredThrowableException
  +	 */
  +	public Object invoke(Object proxy, Method method, Object[] args)
  +	{
  +		Object subject = null;
  +		String methodName = method.getName();
  +
  +		try
  +		{
  +			// [andrew clute]
  +			// short-circuit any calls to a finalize methjod if the subject
  +			// has not been retrieved yet
  +			if ("finalize".equals(methodName) && _realSubject == null)
  +			{
  +				return null;
  +			}
  +
  +			// [andrew clute]
  +			// When trying to serialize a proxy, we need to determine how to
  +			// handle it
  +			if ("writeReplace".equals(methodName))
  +			{
  +				if (_realSubject == null)
  +				{
  +					// Unmaterialized proxies are replaced by simple
  +					// serializable
  +					// objects that can be unserialized without classloader
  +					// issues
  +					return generateSerializableProxy();
  +				} else
  +				{
  +					// Materiliazed objects should be passed back as they might
  +					// have
  +					// been mutated
  +					return getRealSubject();
  +				}
  +			}
  +
  +			// [tomdz]
  +			// Previously the hashcode of the identity would have been used
  +			// but this requires a compatible hashCode implementation in the
  +			// proxied object (which is somewhat unlikely, even the default
  +			// hashCode implementation does not fulfill this requirement)
  +			// for those that require this behavior, a custom indirection
  +			// handler can be used, or the hashCode of the identity
  +			/*
  +			 * if ("hashCode".equals(methodName)) { return new
  +			 * Integer(_id.hashCode()); }
  +			 */
  +
  +			// [tomdz]
  +			// this would handle toString differently for non-materialized
  +			// proxies
  +			// (to avoid materialization due to logging)
  +			// however toString should be a normal business method which
  +			// materializes the proxy
  +			// if this is not desired, then the ProxyHandler.toString(Object)
  +			// method
  +			// should be used instead (e.g. for logging within OJB)
  +			/*
  +			 * if ((realSubject == null) && "toString".equals(methodName)) {
  +			 * return "unmaterialized proxy for " + id; }
  +			 */
  +
  +			// BRJ: make sure that the object to be compared is a real object
  +			// otherwise equals may return false.
  +			if ("equals".equals(methodName) && args[0] != null)
  +			{
  +				Object otherObj = getBroker().getProxyFactory().getRealObject(args[0]);
  +				args[0] = otherObj;
  +			}
  +
  +			if ("getIndirectionHandler".equals(methodName) && args[0] != null)
  +			{
  +				return this;
  +			}
  +
  +			subject = getRealSubject();
  +			return method.invoke(subject, args);
  +			// [olegnitz] I've changed the following strange lines
  +			// to the above one. Why was this done in such complicated way?
  +			// Is it possible that subject doesn't implement the method's
  +			// interface?
  +			// Method m = subject.getClass().getMethod(method.getName(),
  +			// method.getParameterTypes());
  +			// return m.invoke(subject, args);
  +		} catch (Exception ex)
  +		{
  +			throw new PersistenceBrokerException("Error invoking method " + method.getName(), ex);
  +		}
  +	}
  +
  +	/**
  +	 * Returns the proxies real subject. The subject will be materialized if
  +	 * necessary.
  +	 * 
  +	 * @return The subject
  +	 */
  +	public Object getRealSubject() throws PersistenceBrokerException
  +	{
  +		if (_realSubject == null)
  +		{
  +			beforeMaterialization();
  +			_realSubject = materializeSubject();
  +			afterMaterialization();
  +		}
  +		return _realSubject;
  +	}
  +
  +	/**
  +	 * [olegnitz] This looks stupid, but is really necessary for OTM: the
  +	 * materialization listener replaces the real subject by its clone to ensure
  +	 * transaction isolation. Is there a better way to do this?
  +	 */
  +	public void setRealSubject(Object object)
  +	{
  +		_realSubject = object;
  +	}
  +
  +	/**
  +	 * Retrieves the real subject from the underlying RDBMS. Override this
  +	 * method if the object is to be materialized in a specific way.
  +	 * 
  +	 * @return The real subject of the proxy
  +	 */
  +	protected synchronized Object materializeSubject() throws PersistenceBrokerException
  +	{
  +		PersistenceBroker broker = getBroker();
  +
  +		try
  +		{
  +			Object realSubject = broker.getObjectByIdentity(_id);
  +
  +			if (realSubject == null)
  +			{
  +				LoggerFactory.getLogger(IndirectionHandler.class).warn(
  +						"Can not materialize object for Identity " + _id + " - using PBKey " + getBrokerKey());
  +			}
  +			return realSubject;
  +		} catch (Exception ex)
  +		{
  +			throw new PersistenceBrokerException(ex);
  +		} finally
  +		{
   			releaseBroker();
  -        }
  -    }
  +		}
  +	}
   
  -    /**
  -     * Determines whether the real subject already has been materialized.
  -     * 
  -     * @return <code>true</code> if the real subject has already been loaded
  -     */
  -    public boolean alreadyMaterialized()
  -    {
  -        return _realSubject != null;
  -    }
  +	/**
  +	 * Determines whether the real subject already has been materialized.
  +	 * 
  +	 * @return <code>true</code> if the real subject has already been loaded
  +	 */
  +	public boolean alreadyMaterialized()
  +	{
  +		return _realSubject != null;
  +	}
  +
  +	/**
  +	 * Generate a simple object that is serializable and placeholder for
  +	 * proxies.
  +	 * 
  +	 */
  +	private Object generateSerializableProxy()
  +	{
  +		return new OJBSerializableProxy(getIdentity().getObjectsRealClass(), this);
  +	}
   }
  
  
  
  1.2.2.2   +3 -0      db-ojb/src/java/org/apache/ojb/broker/core/proxy/OJBProxy.java
  
  Index: OJBProxy.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/proxy/OJBProxy.java,v
  retrieving revision 1.2.2.1
  retrieving revision 1.2.2.2
  diff -u -r1.2.2.1 -r1.2.2.2
  --- OJBProxy.java	9 Aug 2005 20:03:21 -0000	1.2.2.1
  +++ OJBProxy.java	17 Aug 2005 21:19:39 -0000	1.2.2.2
  @@ -23,4 +23,7 @@
       
       public IndirectionHandler getIndirectionHandler();
   
  +    //in order to intercept the the Serializable functions, our Proxy must implement
  +    //this method
  +    public Object writeReplace();
   }
  
  
  
  No                   revision
  
  Index: OJBProxy.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/proxy/OJBProxy.java,v
  retrieving revision 1.2.2.1
  retrieving revision 1.2.2.2
  diff -u -r1.2.2.1 -r1.2.2.2
  --- OJBProxy.java	9 Aug 2005 20:03:21 -0000	1.2.2.1
  +++ OJBProxy.java	17 Aug 2005 21:19:39 -0000	1.2.2.2
  @@ -23,4 +23,7 @@
       
       public IndirectionHandler getIndirectionHandler();
   
  +    //in order to intercept the the Serializable functions, our Proxy must implement
  +    //this method
  +    public Object writeReplace();
   }
  
  
  
  No                   revision
  
  Index: OJBProxy.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/proxy/OJBProxy.java,v
  retrieving revision 1.2.2.1
  retrieving revision 1.2.2.2
  diff -u -r1.2.2.1 -r1.2.2.2
  --- OJBProxy.java	9 Aug 2005 20:03:21 -0000	1.2.2.1
  +++ OJBProxy.java	17 Aug 2005 21:19:39 -0000	1.2.2.2
  @@ -23,4 +23,7 @@
       
       public IndirectionHandler getIndirectionHandler();
   
  +    //in order to intercept the the Serializable functions, our Proxy must implement
  +    //this method
  +    public Object writeReplace();
   }
  
  
  
  1.1.2.1   +53 -0     db-ojb/src/java/org/apache/ojb/broker/core/proxy/Attic/OJBSerializableProxy.java
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org


Mime
View raw message