001: /**
002: * EasyBeans
003: * Copyright (C) 2006 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: BaseTimeoutCallbackAccess.java 1970 2007-10-16 11:49:25Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.tests.common.ejbs.base.timer;
025:
026: import static org.ow2.easybeans.tests.common.ejbs.entity.callbacklogger.CallbackType.TIMEOUT;
027: import static org.ow2.easybeans.tests.common.ejbs.entity.callbacklogger.OperationType.ENTERPRISE_BEAN;
028: import static org.ow2.easybeans.tests.common.ejbs.entity.callbacklogger.OperationType.ENTITY_MANAGER;
029: import static org.ow2.easybeans.tests.common.ejbs.entity.callbacklogger.OperationType.ENTITY_MANAGER_FACTORY;
030: import static org.ow2.easybeans.tests.common.ejbs.entity.callbacklogger.OperationType.RESOURCE_MANAGER;
031: import static org.ow2.easybeans.tests.common.ejbs.entity.callbacklogger.OperationType.TIMER;
032: import static org.ow2.easybeans.tests.common.ejbs.entity.callbacklogger.OperationType.USER_TRANSACTION;
033: import static org.ow2.easybeans.tests.common.ejbs.entity.callbacklogger.OperationType.isEqual;
034: import static org.ow2.easybeans.tests.common.helper.ContextHelper.checkResource;
035:
036: import java.io.Serializable;
037:
038: import javax.annotation.Resource;
039: import javax.ejb.EJB;
040: import javax.ejb.EJBContext;
041: import javax.ejb.Timeout;
042: import javax.ejb.Timer;
043: import javax.ejb.TimerService;
044: import javax.jms.JMSException;
045: import javax.jms.Message;
046: import javax.persistence.EntityManager;
047: import javax.persistence.EntityManagerFactory;
048: import javax.persistence.PersistenceContext;
049: import javax.persistence.PersistenceUnit;
050: import javax.sql.DataSource;
051: import javax.transaction.UserTransaction;
052:
053: import org.ow2.easybeans.tests.common.ejbs.base.ItfOneMethod01;
054: import org.ow2.easybeans.tests.common.ejbs.stateless.containermanaged.callbacklogger.BaseInsertOperation;
055: import org.ow2.easybeans.tests.common.jms.MessageProperty;
056: import org.ow2.easybeans.tests.common.resources.EMFactoryTester;
057: import org.ow2.easybeans.tests.common.resources.EntityManagerTester;
058: import org.ow2.util.log.Log;
059: import org.ow2.util.log.LogFactory;
060:
061: /**
062: * Used as base of beans to test timeout callback.
063: * @author Eduardo Studzinski Estima de Castro
064: * @author Gisele Pinheiro Souza
065: */
066: @EJB(name="ejb/bean01",beanInterface=ItfOneMethod01.class,beanName="EJBInjectionBean")
067: @Resource(name="jdbc/ds01",type=javax.sql.DataSource.class,mappedName="jdbc_1")
068: @PersistenceUnit(name="persistence/pu01")
069: @PersistenceContext(name="persistence/pctx01")
070: public abstract class BaseTimeoutCallbackAccess extends
071: BaseInsertOperation implements ItfCreateTimer {
072:
073: /**
074: * Log helper.
075: */
076: private Log logger = LogFactory
077: .getLog(BaseTimeoutCallbackAccess.class);
078:
079: /**
080: * Gets the bean name.
081: * @return name
082: */
083: public abstract String getName();
084:
085: /**
086: * Tests the UserTransaction.
087: * @param utx instance
088: * @return true if the instance is working properly, otherwise false.
089: */
090: public abstract boolean testUserTransaction(
091: final UserTransaction utx);
092:
093: /**
094: * TimerService.
095: */
096: @Resource
097: private TimerService ts;
098:
099: /**
100: * Context.
101: */
102: @Resource
103: private EJBContext ctx;
104:
105: /**
106: * UserTransaction must not be injected.
107: */
108: @Resource
109: private UserTransaction utx;
110:
111: /**
112: * Starts a timer. The timeout will perform the operation specifed in the MessageProperty.OPERATION property.
113: * @param message msg
114: */
115: public void onMessage(final Message message) {
116: String op = null;
117:
118: try {
119: op = message.getStringProperty(MessageProperty.OPERATION
120: .toString());
121: startTimer(DURATION, op);
122: } catch (JMSException e) {
123: logger.debug("Error getting operation type: {0}", e);
124: }
125: }
126:
127: /**
128: * This timer performs the operation defined in the info.
129: * @param timer timer with information.
130: */
131: @Timeout
132: public void timeout(final Timer timer) {
133: String op = "";
134: Serializable info = timer.getInfo();
135:
136: if (info != null) {
137: op = info.toString();
138: }
139:
140: if (isEqual(RESOURCE_MANAGER, op)) {
141: DataSource ds = (DataSource) ctx.lookup("jdbc/ds01");
142: checkResource(ds);
143: log(getName(), TIMEOUT, getName(), RESOURCE_MANAGER);
144:
145: } else if (isEqual(ENTERPRISE_BEAN, op)) {
146: ItfOneMethod01 bean = (ItfOneMethod01) ctx
147: .lookup("ejb/bean01");
148: bean.getBool();
149: log(getName(), TIMEOUT, getName(), ENTERPRISE_BEAN);
150:
151: } else if (isEqual(ENTITY_MANAGER_FACTORY, op)) {
152: EntityManagerFactory emf = (EntityManagerFactory) ctx
153: .lookup("persistence/pu01");
154: try {
155: EMFactoryTester.checkInstance(emf, "tmpTable"
156: + this .hashCode());
157: log(getName(), TIMEOUT, getName(),
158: ENTITY_MANAGER_FACTORY);
159: } catch (Exception e) {
160: logger.debug("Error in EntityManagerFactory use: {0}",
161: e);
162: e.printStackTrace();
163: }
164:
165: } else if (isEqual(ENTITY_MANAGER, op)) {
166: EntityManager em = (EntityManager) ctx
167: .lookup("persistence/pctx01");
168: try {
169: EntityManagerTester.checkInstance(em, "tmpTable"
170: + this .hashCode());
171: log(getName(), TIMEOUT, getName(), ENTITY_MANAGER);
172: } catch (Exception e) {
173: logger.debug("Error in EntityManagerFactory use: {0}",
174: e);
175: e.printStackTrace();
176: }
177:
178: } else if (isEqual(TIMER, op)) {
179: ts.createTimer(DURATION, "").cancel();
180: log(getName(), TIMEOUT, getName(), TIMER);
181:
182: } else if (isEqual(USER_TRANSACTION, op)) {
183: if (testUserTransaction(utx)) {
184: log(getName(), TIMEOUT, getName(), USER_TRANSACTION);
185: }
186: } else {
187: logger.debug("Invalid operation: {0}", op);
188: }
189: }
190:
191: /**
192: * Starts a timer.
193: * @param duration timer duration
194: * @param op operation that the timeout callback must perform
195: */
196: public void startTimer(final int duration, final Serializable op) {
197: ts.createTimer(duration, op.toString());
198: }
199: }
|