001    package org.apache.ojb.broker.core.proxy;
002    
003    /* Copyright 2002-2005 The Apache Software Foundation
004     *
005     * Licensed under the Apache License, Version 2.0 (the "License");
006     * you may not use this file except in compliance with the License.
007     * You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    import java.io.Serializable;
019    
020    import org.apache.ojb.broker.Identity;
021    import org.apache.ojb.broker.PBKey;
022    import org.apache.ojb.broker.PersistenceBrokerException;
023    
024    /**
025     * Proxy base class. can be used to implement lazy materialization techniques.
026     * 
027     * @author <a href="mailto:thomas.mahler@itellium.com">Thomas Mahler<a>
028     * @version $Id: VirtualProxy.java,v 1.1 2007-08-24 22:17:32 ewestfal Exp $
029     */
030    public abstract class VirtualProxy implements OJBProxy,Serializable
031    {
032            static final long serialVersionUID = -3999451313262635171L;
033    
034        /**
035         * reference to the IndirectionHandler that encapsulates the delegation mechanism
036         * */
037        private IndirectionHandler indirectionHandler = null;
038    
039        /**
040         * Creates a new, uninitialized proxy.
041         */
042        public VirtualProxy()
043        {}
044    
045        /**
046         * Creates a VirtualProxy for the subject with the given identity.
047         * 
048         * @param key The key of the PersistenceBroker
049         * @param oid The identity of the subject
050         */
051        public VirtualProxy(PBKey key, Identity oid)
052        {
053            indirectionHandler = AbstractProxyFactory.getProxyFactory().createIndirectionHandler(key, oid);
054        }
055    
056        /**
057         * Create a VirtualProxy that uses the given invocation handler.
058         * [tomdz] Why here the use of InvocationHandler ?
059         * 
060         * @param handler The indirection handler of the proxy
061         * 
062         */
063        
064        public VirtualProxy(IndirectionHandler handler)
065        {
066            indirectionHandler = handler;
067        }
068    
069        /**
070         * Returns the indirection handler of the given proxy.
071         * 
072         * @param proxy The proxy
073         * @return The indirection handler
074         */
075        public static IndirectionHandler getIndirectionHandler(VirtualProxy proxy)
076        {
077            return proxy.indirectionHandler;
078        }
079    
080        /**
081         * Determines whether this proxy already has been materialized.
082         * 
083         * @return <code>true</code> if the real subject already been loaded
084         */
085        public boolean alreadyMaterialized()
086        {
087            return indirectionHandler.alreadyMaterialized();
088        }
089    
090    
091        /**
092         * Returns the proxies real subject. The subject will be materialized if necessary.
093         * 
094         * @return The subject
095         */
096        public Object getRealSubject() throws PersistenceBrokerException
097        {
098            return indirectionHandler.getRealSubject();
099        }
100        
101        /**
102         * Returns the IndirectionHandler
103         * 
104         * @return The indirectionHandler
105         */
106        public IndirectionHandler getIndirectionHandler()
107        {
108            return indirectionHandler; 
109        }
110    
111        /**
112         * Returns the identity of the subject.
113         * 
114         * @return The identity
115         */
116        Identity getIdentity()
117        {
118            return indirectionHandler.getIdentity();
119        }
120        
121            public Object writeReplace()
122            {
123                    return this; 
124            }
125        
126    
127    }