001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.ejb3.timerservice.quartz;
023:
024: import java.io.Serializable;
025: import java.util.Date;
026:
027: import javax.ejb.EJBException;
028: import javax.ejb.NoSuchObjectLocalException;
029: import javax.ejb.Timer;
030: import javax.ejb.TimerHandle;
031:
032: import org.jboss.logging.Logger;
033: import org.quartz.Scheduler;
034: import org.quartz.SchedulerException;
035: import org.quartz.Trigger;
036:
037: /**
038: * A view on an actual (persistent) timer.
039: *
040: * This object must never be serializable (EJB3 18.4.1)
041: *
042: * @author <a href="mailto:carlo@nerdnet.nl">Carlo de Wolf</a>
043: * @version $Revision: 60233 $
044: */
045: public class TimerImpl implements Timer {
046: private static final Logger log = Logger.getLogger(TimerImpl.class);
047:
048: private Scheduler scheduler;
049: private Trigger trigger;
050: private Serializable info;
051:
052: protected TimerImpl(Scheduler scheduler, Trigger trigger,
053: Serializable info) {
054: assert scheduler != null;
055: assert trigger != null;
056:
057: this .scheduler = scheduler;
058: this .trigger = trigger;
059: this .info = info;
060: }
061:
062: protected void checkState() {
063: // TODO: implement bean state checking to see if a call is allowed
064:
065: if (trigger.getNextFireTime() == null)
066: throw new NoSuchObjectLocalException("timer has expired");
067: }
068:
069: /**
070: * Cause the timer and all its associated expiration notifications to be cancelled.
071: *
072: * @throws IllegalStateException If this method is invoked while the instance is in a state that does not allow access to this method.
073: * @throws NoSuchObjectLocalException If invoked on a timer that has expired or has been cancelled.
074: * @throws EJBException If this method could not complete due to a system-level failure.
075: */
076: public void cancel() throws IllegalStateException,
077: NoSuchObjectLocalException, EJBException {
078: checkState();
079:
080: try {
081: // TODO: call TimerServiceImpl.cancelTimer instead
082: scheduler.unscheduleJob(trigger.getName(), trigger
083: .getGroup());
084: } catch (SchedulerException e) {
085: log.error("cancel failed", e);
086: throw new EJBException(e.getMessage());
087: }
088: }
089:
090: /**
091: * Get the number of milliseconds that will elapse before the next scheduled timer expiration.
092: *
093: * @return The number of milliseconds that will elapse before the next scheduled timer expiration.
094: * @throws IllegalStateException If this method is invoked while the instance is in a state that does not allow access to this method.
095: * @throws NoSuchObjectLocalException If invoked on a timer that has expired or has been cancelled.
096: * @throws EJBException If this method could not complete due to a system-level failure.
097: */
098: public long getTimeRemaining() throws IllegalStateException,
099: NoSuchObjectLocalException, EJBException {
100: // leave all checks to getNextTimeout
101: return getNextTimeout().getTime() - System.currentTimeMillis();
102: }
103:
104: /**
105: * Get the point in time at which the next timer expiration is scheduled to occur.
106: *
107: * @return The point in time at which the next timer expiration is scheduled to occur.
108: * @throws IllegalStateException If this method is invoked while the instance is in a state that does not allow access to this method.
109: * @throws NoSuchObjectLocalException If invoked on a timer that has expired or has been cancelled.
110: * @throws EJBException If this method could not complete due to a system-level failure.
111: */
112: public Date getNextTimeout() throws IllegalStateException,
113: NoSuchObjectLocalException, EJBException {
114: checkState();
115:
116: Date nextTimeout = trigger.getNextFireTime();
117: if (nextTimeout == null)
118: throw new IllegalStateException(
119: "trigger does not have a next fire time"); // TODO: proper EJB3 state check & exception
120: return nextTimeout;
121: }
122:
123: /**
124: * Get the information associated with the timer at the time of creation.
125: *
126: * @return The Serializable object that was passed in at timer creation, or null if the info argument passed in at timer creation was null.
127: * @throws IllegalStateException If this method is invoked while the instance is in a state that does not allow access to this method.
128: * @throws NoSuchObjectLocalException If invoked on a timer that has expired or has been cancelled.
129: * @throws EJBException If this method could not complete due to a system-level failure.
130: */
131: public Serializable getInfo() throws IllegalStateException,
132: NoSuchObjectLocalException, EJBException {
133: checkState();
134:
135: return info;
136: }
137:
138: /**
139: * Get a serializable handle to the timer. This handle can be used at a later time to re-obtain the timer reference.
140: *
141: * @return A serializable handle to the timer.
142: * @throws IllegalStateException If this method is invoked while the instance is in a state that does not allow access to this method.
143: * @throws NoSuchObjectLocalException If invoked on a timer that has expired or has been cancelled.
144: * @throws EJBException If this method could not complete due to a system-level failure.
145: */
146: public TimerHandle getHandle() throws IllegalStateException,
147: NoSuchObjectLocalException, EJBException {
148: checkState();
149:
150: return null; // FIXME: implement getHandle
151: }
152: }
|