001    package org.apache.ojb.broker.core;
002    
003    /* Copyright 2003-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.rmi.RemoteException;
019    import java.util.Collection;
020    import java.util.Enumeration;
021    import java.util.Iterator;
022    
023    import javax.ejb.EJBException;
024    import javax.ejb.SessionBean;
025    import javax.ejb.SessionContext;
026    import javax.naming.Context;
027    import javax.naming.InitialContext;
028    import javax.naming.NamingException;
029    
030    import org.apache.ojb.broker.Identity;
031    import org.apache.ojb.broker.IdentityFactory;
032    import org.apache.ojb.broker.ManageableCollection;
033    import org.apache.ojb.broker.MtoNImplementor;
034    import org.apache.ojb.broker.PBKey;
035    import org.apache.ojb.broker.PBLifeCycleEvent;
036    import org.apache.ojb.broker.PBListener;
037    import org.apache.ojb.broker.PBStateEvent;
038    import org.apache.ojb.broker.PersistenceBroker;
039    import org.apache.ojb.broker.PersistenceBrokerEvent;
040    import org.apache.ojb.broker.PersistenceBrokerException;
041    import org.apache.ojb.broker.PersistenceBrokerInternal;
042    import org.apache.ojb.broker.TransactionAbortedException;
043    import org.apache.ojb.broker.TransactionInProgressException;
044    import org.apache.ojb.broker.TransactionNotInProgressException;
045    import org.apache.ojb.broker.accesslayer.ConnectionManagerIF;
046    import org.apache.ojb.broker.accesslayer.JdbcAccess;
047    import org.apache.ojb.broker.accesslayer.StatementManagerIF;
048    import org.apache.ojb.broker.accesslayer.sql.SqlGenerator;
049    import org.apache.ojb.broker.cache.ObjectCache;
050    import org.apache.ojb.broker.core.proxy.ProxyFactory;
051    import org.apache.ojb.broker.metadata.ClassDescriptor;
052    import org.apache.ojb.broker.metadata.DescriptorRepository;
053    import org.apache.ojb.broker.query.Query;
054    import org.apache.ojb.broker.util.BrokerHelper;
055    import org.apache.ojb.broker.util.ObjectModification;
056    import org.apache.ojb.broker.util.configuration.Configuration;
057    import org.apache.ojb.broker.util.configuration.ConfigurationException;
058    import org.apache.ojb.broker.util.logging.Logger;
059    import org.apache.ojb.broker.util.logging.LoggerFactory;
060    import org.apache.ojb.broker.util.sequence.SequenceManager;
061    
062    /**
063     * @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird</a>
064     *
065     * The PersistenceBrokerBean wraps a persistenceBroker implementation and allows
066     * PersistenceBroker server operations with communication happening over RMI.
067     * Useful if you are going to use OJB in a J2EE environment.
068     *
069     * Allows for OJB objects with proxies to be taken outside of the VM, say to an
070     * instance of a servlet container, and the proxies will call back on the bean
071     * to materialize proxies via standard RMI bean calls, instead of the custom
072     * protocol.
073     *
074     * Container will be responsible for pooling of bean instances.
075     *
076     * Can be used by normal EJB clients, not just the PersistenceBrokerClient
077     *
078     * @ejb:bean
079     *             type="Stateless"
080     *             name="PersistenceBrokerBean"
081     *             jndi-name="org.apache.ojb.broker.core.PersistenceBrokerBean"
082     *             local-jndi-name="ojb.PersistenceBrokerBean"
083     *             view-type="both"
084     *             transaction-type="Container"
085     *
086     * @ejb:interface
087     *         remote-class="org.apache.ojb.broker.server.PersistenceBrokerRemote"
088     *         local-class="org.apache.ojb.broker.server.PersistenceBrokerLocal"
089     *         extends="javax.ejb.EJBObject, org.apache.ojb.broker.PersistenceBroker"
090     *
091     * @ejb:home
092     *         remote-class="org.apache.ojb.broker.server.PersistenceBrokerHome"
093     *         local-class="org.apache.ojb.broker.server.PersistenceBrokerLocalHome"
094     *         extends="javax.ejb.EJBHome"
095     *
096     * @ejb:transaction
097     *         type="Required"
098     *
099     * @ejb:env-entry
100     *         name="ojb.repository"
101     *         type="java.lang.String"
102     *         value="repository.xml"
103     *
104     */
105    
106    public class PersistenceBrokerBean implements PersistenceBroker, SessionBean
107    {
108            private Logger m_log;
109            private SessionContext m_ctx;
110            private String m_ojbRepository;
111            private PBKey m_pbKey;
112            private PersistenceBrokerFactoryIF m_pbf;
113    
114            /**
115             * @ejb:interface-method
116             * @see org.apache.ojb.broker.PersistenceBroker#getDescriptorRepository()
117             */
118            public DescriptorRepository getDescriptorRepository()
119            {
120                    return getBroker().getDescriptorRepository();
121            }
122    
123            /**
124             * @ejb:interface-method
125             * @see org.apache.ojb.broker.PersistenceBroker#getPBKey()
126             */
127            public PBKey getPBKey()
128            {
129                    return getBroker().getPBKey();
130            }
131    
132            /**
133             * @ejb:interface-method
134             * @see org.apache.ojb.broker.PersistenceBroker#delete(Object)
135             */
136            public void delete(Object obj) throws PersistenceBrokerException
137            {
138                    getBroker().delete(obj);
139            }
140    
141            /**
142             * @ejb:interface-method
143             * @see org.apache.ojb.broker.PersistenceBroker#deleteByQuery(Query)
144             */
145            public void deleteByQuery(Query query) throws PersistenceBrokerException
146            {
147                    getBroker().deleteByQuery(query);
148            }
149    
150            /**
151             * @ejb:interface-method
152             * @see org.apache.ojb.broker.PersistenceBroker#removeFromCache(Object)
153             */
154            public void removeFromCache(Object obj) throws PersistenceBrokerException
155            {
156                    getBroker().removeFromCache(obj);
157            }
158    
159            /**
160             * @ejb:interface-method
161             * @see org.apache.ojb.broker.PersistenceBroker#clearCache()
162             */
163            public void clearCache() throws PersistenceBrokerException
164            {
165                    getBroker().clearCache();
166            }
167    
168            /**
169             * @ejb:interface-method
170             * @see org.apache.ojb.broker.PersistenceBroker#store(Object)
171             */
172            public void store(Object obj) throws PersistenceBrokerException
173            {
174                    getBroker().store(obj);
175            }
176    
177            /**
178             * @ejb:interface-method
179             * @see org.apache.ojb.broker.PersistenceBroker#abortTransaction()
180             */
181            public void abortTransaction() throws TransactionNotInProgressException
182            {
183                    getBroker().abortTransaction();
184            }
185    
186            /**
187             * @ejb:interface-method
188             * @see org.apache.ojb.broker.PersistenceBroker#beginTransaction()
189             */
190            public void beginTransaction()
191                            throws TransactionInProgressException, TransactionAbortedException
192            {
193                    getBroker().beginTransaction();
194            }
195    
196            /**
197             * @ejb:interface-method
198             * @see org.apache.ojb.broker.PersistenceBroker#commitTransaction()
199             */
200            public void commitTransaction()
201                            throws TransactionNotInProgressException, TransactionAbortedException
202            {
203                    getBroker().commitTransaction();
204            }
205    
206            /**
207             * @ejb:interface-method
208             * @see org.apache.ojb.broker.PersistenceBroker#isInTransaction()
209             */
210            public boolean isInTransaction() throws PersistenceBrokerException
211            {
212                    return getBroker().isInTransaction();
213            }
214    
215            /**
216             * @ejb:interface-method
217             * @see org.apache.ojb.broker.PersistenceBroker#close()
218             */
219            public boolean close()
220            {
221                    return getBroker().close();
222            }
223    
224        public boolean isClosed()
225        {
226            return getBroker().isClosed();
227        }
228    
229        /**
230             * @ejb:interface-method
231             * @see org.apache.ojb.broker.PersistenceBroker#getCollectionByQuery(Query)
232             */
233            public Collection getCollectionByQuery(Query query)
234                            throws PersistenceBrokerException
235            {
236                    return getBroker().getCollectionByQuery(query);
237            }
238    
239            /**
240             * @ejb:interface-method
241             * @see org.apache.ojb.broker.PersistenceBroker#getCount(Query)
242             */
243            public int getCount(Query query) throws PersistenceBrokerException
244            {
245                    return getBroker().getCount(query);
246            }
247    
248            /**
249             * @ejb:interface-method
250             * @see org.apache.ojb.broker.PersistenceBroker#getCollectionByQuery(Class, Query)
251             */
252            public ManageableCollection getCollectionByQuery(
253                            Class collectionClass,
254                            Query query)
255                            throws PersistenceBrokerException
256            {
257                    return getBroker().getCollectionByQuery(collectionClass, query);
258            }
259    
260            /**
261             * @ejb:interface-method
262             * @see org.apache.ojb.broker.PersistenceBroker#getIteratorByQuery(Query)
263             */
264            public Iterator getIteratorByQuery(Query query)
265                            throws PersistenceBrokerException
266            {
267                    return getBroker().getIteratorByQuery(query);
268            }
269    
270            /**
271             * @ejb:interface-method
272             * @see org.apache.ojb.broker.PersistenceBroker#getReportQueryIteratorByQuery(Query)
273             */
274            public Iterator getReportQueryIteratorByQuery(Query query)
275                            throws PersistenceBrokerException
276            {
277                    return getBroker().getReportQueryIteratorByQuery(query);
278            }
279    
280            /**
281             * @ejb:interface-method
282             * @see org.apache.ojb.broker.PersistenceBroker#getObjectByIdentity(Identity)
283             */
284            public Object getObjectByIdentity(Identity id)
285                            throws PersistenceBrokerException
286            {
287                    return getBroker().getObjectByIdentity(id);
288            }
289    
290            /**
291             * @ejb:interface-method
292             * @see org.apache.ojb.broker.PersistenceBroker#getObjectByQuery(Query)
293             */
294            public Object getObjectByQuery(Query query)
295                            throws PersistenceBrokerException
296            {
297                    return getBroker().getObjectByQuery(query);
298            }
299    
300            /**
301             * @ejb:interface-method
302             * @see org.apache.ojb.broker.PersistenceBroker#getPKEnumerationByQuery(Class, Query)
303             */
304            public Enumeration getPKEnumerationByQuery(
305                            Class PrimaryKeyClass,
306                            Query query)
307                            throws PersistenceBrokerException
308            {
309                    return getBroker().getPKEnumerationByQuery(PrimaryKeyClass, query);
310            }
311    
312            /**
313             * @ejb:interface-method
314             * @see org.apache.ojb.broker.PersistenceBroker#store(Object, ObjectModification)
315             */
316            public void store(Object obj, ObjectModification modification)
317                            throws PersistenceBrokerException
318            {
319                    getBroker().store(obj, modification);
320            }
321    
322    
323            /**
324             * @ejb:interface-method
325             * @see org.apache.ojb.broker.PersistenceBroker#getClassDescriptor(Class)
326             */
327            public ClassDescriptor getClassDescriptor(Class clazz)
328                            throws PersistenceBrokerException
329            {
330                    return getBroker().getClassDescriptor(clazz);
331            }
332    
333            /**
334             * @ejb:interface-method
335             * @see org.apache.ojb.broker.PersistenceBroker#hasClassDescriptor(Class)
336             */
337            public boolean hasClassDescriptor(Class clazz)
338            {
339                    return getBroker().hasClassDescriptor(clazz);
340            }
341    
342    
343            /**
344             * @ejb:interface-method
345             * @see org.apache.ojb.broker.PersistenceBroker#getTopLevelClass(Class)
346             */
347            public Class getTopLevelClass(Class clazz) throws PersistenceBrokerException
348            {
349                    return getBroker().getTopLevelClass(clazz);
350            }
351    
352            /**
353             * @ejb:interface-method
354             * @see org.apache.ojb.broker.PersistenceBroker#serviceStatementManager()
355             */
356            public StatementManagerIF serviceStatementManager()
357            {
358                    return getBroker().serviceStatementManager();
359            }
360    
361            /**
362             * @ejb:interface-method
363             * @see org.apache.ojb.broker.PersistenceBroker#serviceConnectionManager()
364             */
365            public ConnectionManagerIF serviceConnectionManager()
366            {
367                    return getBroker().serviceConnectionManager();
368            }
369    
370            public JdbcAccess serviceJdbcAccess()
371            {
372                    return getBroker().serviceJdbcAccess();
373            }
374    
375            /**
376             * @ejb:interface-method
377             * @see org.apache.ojb.broker.PersistenceBroker#serviceSqlGenerator()
378             */
379            public SqlGenerator serviceSqlGenerator()
380            {
381                    return getBroker().serviceSqlGenerator();
382            }
383    
384            public SequenceManager serviceSequenceManager()
385            {
386                    return getBroker().serviceSequenceManager();
387            }
388    
389            public BrokerHelper serviceBrokerHelper()
390            {
391                    return getBroker().serviceBrokerHelper();
392            }
393    
394            public ObjectCache serviceObjectCache()
395            {
396                    return getBroker().serviceObjectCache();
397            }
398    
399        public IdentityFactory serviceIdentity()
400        {
401            return getBroker().serviceIdentity();
402        }
403    
404            public void fireBrokerEvent(PersistenceBrokerEvent event)
405            {
406                    getBroker().fireBrokerEvent(event);
407            }
408    
409            public void fireBrokerEvent(PBLifeCycleEvent event)
410            {
411                    getBroker().fireBrokerEvent(event);
412            }
413    
414            public void fireBrokerEvent(PBStateEvent event)
415            {
416                    getBroker().fireBrokerEvent(event);
417            }
418        
419        
420    
421            public ProxyFactory getProxyFactory() {
422            return getBroker().getProxyFactory();
423        }
424        
425        public Object createProxy(Class proxyClass, Identity realSubjectsIdentity) {
426            return getBroker().createProxy(proxyClass, realSubjectsIdentity);
427        }
428    
429        /**
430             * @ejb:interface-method
431             * @see org.apache.ojb.broker.PersistenceBroker#addListener(PBListener)
432             */
433            public void addListener(PBListener listener) throws PersistenceBrokerException
434            {
435                    getBroker().addListener(listener);
436            }
437    
438            /**
439             * @ejb:interface-method
440             * @see org.apache.ojb.broker.PersistenceBroker#addListener(PBListener, boolean)
441             */
442            public void addListener(PBListener listener, boolean permanent) throws PersistenceBrokerException
443            {
444                    getBroker().addListener(listener, permanent);
445            }
446    
447            /**
448             * @ejb:interface-method
449             * @see org.apache.ojb.broker.PersistenceBroker#removeListener(PBListener)
450             */
451            public void removeListener(PBListener listener) throws PersistenceBrokerException
452            {
453                    getBroker().removeListener(listener);
454            }
455    
456            /**
457             * @ejb:interface-method
458             * @see org.apache.ojb.broker.PersistenceBroker#retrieveAllReferences(Object)
459             */
460            public void retrieveAllReferences(Object pInstance)
461                            throws PersistenceBrokerException
462            {
463                    getBroker().retrieveAllReferences(pInstance);
464            }
465    
466            /**
467             * @ejb:interface-method
468             * @see org.apache.ojb.broker.PersistenceBroker#retrieveReference(Object, String)
469             */
470            public void retrieveReference(Object pInstance, String pAttributeName)
471                            throws PersistenceBrokerException
472            {
473                    getBroker().retrieveReference(pInstance, pAttributeName);
474            }
475    
476            public void removeAllListeners(boolean permanent) throws PersistenceBrokerException
477            {
478                    getBroker().removeAllListeners(permanent);
479            }
480    
481            /**
482             * @ejb:interface-method
483             * @see org.apache.ojb.broker.PersistenceBroker#removeAllListeners()
484             */
485            public void removeAllListeners() throws PersistenceBrokerException
486            {
487                    getBroker().removeAllListeners();
488            }
489    
490            /**
491             * @ejb:interface-method
492             * @see org.apache.ojb.broker.util.configuration.Configurable#configure(Configuration)
493             */
494            public void configure(Configuration pConfig)
495                            throws ConfigurationException
496            {
497                    getBroker().configure(pConfig);
498            }
499    
500            /**
501             * @ejb:interface-method
502             * @see org.odbms.ObjectContainer#query()
503             */
504            public org.odbms.Query query()
505            {
506                    return getBroker().query();
507            }
508    
509            private void ojbPrepare()
510            {
511                    if (m_log.isDebugEnabled()) m_log.info("PersistenceBrokerBean: ejbActivate was called");
512                    Context context = null;
513                    // Lookup if a environment entry for repository exists
514                    String ojbRepository = null;
515                    try
516                    {
517                            context = new InitialContext();
518                            ojbRepository = (String) context.lookup("java:comp/env/ojb.repository");
519                    }
520                    catch (NamingException e)
521                    {
522                            m_log.error("Lookup for ojb repository failed", e);
523                    }
524                    // no repository found in environment, use default one
525                    if (ojbRepository == null || ojbRepository.equals(""))
526                    {
527                            m_log.info("No enviroment entry was found, use default repository");
528                            ojbRepository = "repository.xml";
529                    }
530                    m_log.info("Use OJB repository file: " + ojbRepository);
531                    m_pbKey = new PBKey(ojbRepository);
532    
533                    // Lookup the PBF implementation
534                    try
535                    {
536                            context = new InitialContext();
537                            m_pbf = ((PBFactoryIF) context.lookup(PBFactoryIF.PBFACTORY_JNDI_NAME)).getInstance();
538                    }
539                    catch (NamingException e)
540                    {
541                            m_log.error("Lookup for PersistenceBrokerFactory failed", e);
542                            throw new PersistenceBrokerException(e);
543                    }
544            }
545    
546            public void ejbActivate() throws EJBException, RemoteException
547            {
548                    m_log = LoggerFactory.getLogger(PersistenceBrokerBean.class);
549                    ojbPrepare();
550            }
551    
552            public void ejbPassivate() throws EJBException, RemoteException
553            {
554                    m_log = null;
555                    m_pbf = null;
556            }
557    
558            public void ejbRemove() throws EJBException, RemoteException
559            {
560                    m_ctx = null;
561            }
562    
563            public void setSessionContext(SessionContext sessionContext) throws EJBException, RemoteException
564            {
565                    m_ctx = sessionContext;
566            }
567    
568            private PersistenceBrokerInternal getBroker()
569            {
570                    return m_pbf.createPersistenceBroker(m_pbKey);
571            }
572    
573        /**
574         * @see org.apache.ojb.broker.PersistenceBroker#deleteMtoNImplementor()
575         */
576        public void deleteMtoNImplementor(MtoNImplementor m2nImpl) throws PersistenceBrokerException
577        {
578            throw new UnsupportedOperationException();
579        }
580    
581        /**
582         * @see org.apache.ojb.broker.PersistenceBroker#addMtoNImplementor()
583         */
584        public void addMtoNImplementor(MtoNImplementor m2nImpl) throws PersistenceBrokerException
585        {
586            throw new UnsupportedOperationException();
587        }
588        
589        
590    }