001: /**
002: * EasyBeans
003: * Copyright (C) 2006-2007 Bull S.A.S.
004: * Contact: easybeans@ow2.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: MDBFactory.java 1970 2007-10-16 11:49:25Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.container.mdb;
025:
026: import org.ow2.easybeans.api.EZBContainer;
027: import org.ow2.easybeans.api.FactoryException;
028: import org.ow2.easybeans.api.bean.EasyBeansMDB;
029: import org.ow2.easybeans.api.bean.info.IBeanInfo;
030: import org.ow2.easybeans.api.pool.PoolException;
031: import org.ow2.easybeans.container.mdb.EasyBeansMDBContext;
032: import org.ow2.easybeans.container.mdb.MDBFactory;
033: import org.ow2.easybeans.container.AbsFactory;
034: import org.ow2.easybeans.container.info.MessageDrivenInfo;
035: import org.ow2.easybeans.pool.JPool;
036: import org.ow2.easybeans.pool.PoolEntryStatistics;
037: import org.ow2.easybeans.pool.PoolFactory;
038: import org.ow2.easybeans.rpc.api.EJBRequest;
039: import org.ow2.easybeans.rpc.api.EJBResponse;
040: import org.ow2.util.log.Log;
041: import org.ow2.util.log.LogFactory;
042:
043: /**
044: * This classes is reponsible to manage the MDB objects.<br />
045: * Each MDB object (EasyBeansMDB) has a link to a MessageEndPoint object. The
046: * internal message endpoint object is used by the resource adapter with the
047: * help of the message end point factory.
048: * @author Florent Benoit
049: */
050: public abstract class MDBFactory extends AbsFactory<EasyBeansMDB>
051: implements PoolFactory<EasyBeansMDB, Long> {
052:
053: /**
054: * Logger.
055: */
056: private static Log logger = LogFactory.getLog(MDBFactory.class);
057:
058: /**
059: * Runtime information about the session bean.
060: */
061: private MessageDrivenInfo messageDrivenInfo = null;
062:
063: /**
064: * Builds a new MDB factory with a given name and its container.
065: * @param className name of this factory (name of class that is managed)
066: * @param container the root component of this factory.
067: * @throws FactoryException if class can't be loaded.
068: */
069: public MDBFactory(final String className,
070: final EZBContainer container) throws FactoryException {
071: super (className, container);
072: setPool(new JPool<EasyBeansMDB, Long>(this ));
073: }
074:
075: /**
076: * A request comes to the bean factory and needs to be handled.<br>
077: * A response is done which contains the answer.
078: * @param request the EJB request.
079: * @return a response that have been processed by the factory.
080: */
081: @Override
082: public EJBResponse rpcInvoke(final EJBRequest request) {
083: // Not used by MDB : Invocation is done by Resource Adapter on Message
084: // End Point
085: return null;
086: }
087:
088: /**
089: * Do a local call on a method of this factory.
090: * @param hash the hash of the method to execute.
091: * @param methodArgs the arguments of the method
092: * @param beanId the id of the bean that we want (stateful).
093: * @return response container new id (if any) and value.
094: */
095: public EJBResponse localCall(final long hash,
096: final Object[] methodArgs, final Long beanId) {
097: // Not used by MDB : Invocation is done by Resource Adapter on Message
098: // End Point
099: return null;
100: }
101:
102: /**
103: * Stops the factory.
104: */
105: @Override
106: public void stop() {
107: super .stop();
108:
109: // remove pool
110: try {
111: getPool().stop();
112: } catch (PoolException e) {
113: logger.error("Problem when stopping the factory", e);
114: }
115: }
116:
117: /**
118: * @return information of the current bean.
119: */
120: public IBeanInfo getBeanInfo() {
121: return messageDrivenInfo;
122: }
123:
124: /**
125: * @return information of the current bean.
126: */
127: public MessageDrivenInfo getMessageDrivenInfo() {
128: return messageDrivenInfo;
129: }
130:
131: /**
132: * Sets the information object for a session bean.
133: * @param messageDrivenInfo information on the bean.
134: */
135: public void setMessageDrivenInfo(
136: final MessageDrivenInfo messageDrivenInfo) {
137: this .messageDrivenInfo = messageDrivenInfo;
138: }
139:
140: /**
141: * Creates an instance with the given hint.
142: * @param clue a clue given by the Pool. Could be null.
143: * @throws PoolException if instance cannot be created.
144: * @return the created instance.
145: */
146: public EasyBeansMDB create(final Long clue) throws PoolException {
147: EasyBeansMDB instance = null;
148: try {
149: instance = getBeanClass().newInstance();
150: } catch (InstantiationException e) {
151: throw new PoolException("Cannot create a new instance", e);
152: } catch (IllegalAccessException e) {
153: throw new PoolException("Cannot create a new instance", e);
154: }
155:
156: // Set the factory
157: instance.setEasyBeansFactory(this );
158:
159: // Init the MDB context
160: EasyBeansMDBContext mdbContext = new EasyBeansMDBContext(
161: instance);
162: instance.setEasyBeansContext(mdbContext);
163:
164: ClassLoader oldClassLoader = Thread.currentThread()
165: .getContextClassLoader();
166: Thread.currentThread().setContextClassLoader(
167: getContainer().getClassLoader());
168: try {
169: // Call injection
170: injectResources(instance);
171:
172: // post construct callback
173: instance.postConstructEasyBeansLifeCycle();
174: } finally {
175: Thread.currentThread()
176: .setContextClassLoader(oldClassLoader);
177: }
178:
179: return instance;
180: }
181:
182: /**
183: * Checks if the given object with the given clue is matching.
184: * @param object given object against which the check should be done.
185: * @param clue the object used as clue to check the matching.
186: * @return true if it is matching, else false.
187: */
188: public boolean isMatching(final EasyBeansMDB object, final Long clue) {
189: // all instances are matching.
190: // But we shouldn't go here as we can use any instance.
191: return true;
192: }
193:
194: /**
195: * Validate an instance by giving some statistics.
196: * @param object the instance to validate
197: * @param stats some statistics to help in the validating process.
198: * @return true if the element is valid, else false.
199: */
200: public boolean validate(final EasyBeansMDB object,
201: final PoolEntryStatistics stats) {
202: return true;
203: }
204:
205: }
|