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 }