/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.ejb.txtimer; // $Id: TimerHandleImpl.java 81030 2008-11-14 12:59:42Z dimitris@jboss.org $ import javax.ejb.EJBException; import javax.ejb.NoSuchObjectLocalException; import javax.ejb.Timer; import javax.ejb.TimerHandle; import javax.management.ObjectName; import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.StringTokenizer; /** * An implementation of the TimerHandle * * @author Thomas.Diesler@jboss.org * @version $Revision: 81030 $ * @since 07-Apr-2004 */ public class TimerHandleImpl implements TimerHandle { /** * The date pattern used by this handle */ public static final String DATE_PATTERN = "dd-MMM-yyyy HH:mm:ss.SSS"; // The initial txtimer properties private String timerId; private TimedObjectId timedObjectId; private Date firstTime; private long periode; private Serializable info; private int hashCode; /** * Construct a handle from a timer */ TimerHandleImpl(TimerImpl timer) { timerId = timer.getTimerId(); timedObjectId = timer.getTimedObjectId(); firstTime = timer.getFirstTime(); periode = timer.getPeriode(); info = timer.getInfoInternal(); } /** * Construct a handle from individual parameters */ TimerHandleImpl(String timerId, TimedObjectId timedObjectId, Date firstTime, long periode, Serializable info) { this.timerId = timerId; this.timedObjectId = timedObjectId; this.firstTime = firstTime; this.periode = periode; this.info = info; } /** * Construct a handle from external form */ private TimerHandleImpl(String externalForm) { if (externalForm.startsWith("[") == false || externalForm.endsWith("]") == false) throw new IllegalArgumentException("Square brackets expected arround: " + externalForm); try { // take first and last char off String inStr = externalForm.substring(1, externalForm.length() - 1); if (inStr.startsWith("id=") == false) throw new IllegalArgumentException("Cannot parse: " + externalForm); int targetIndex = inStr.indexOf(",target="); int firstIndex = inStr.indexOf(",first="); String idStr = inStr.substring(3, targetIndex); String targetStr = inStr.substring(targetIndex + 8, firstIndex); String restStr = inStr.substring(firstIndex + 1); timerId = idStr; timedObjectId = TimedObjectId.parse(targetStr); StringTokenizer st = new StringTokenizer(restStr, ",="); if (st.countTokens() % 2 != 0) throw new IllegalArgumentException("Cannot parse: " + externalForm); SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); periode = -1; while (st.hasMoreTokens()) { String key = st.nextToken(); String value = st.nextToken(); if (key.equals("first")) firstTime = sdf.parse(value); if (key.equals("periode")) periode = new Long(value).longValue(); } if (firstTime == null || periode < 0) throw new IllegalArgumentException("Cannot parse: " + externalForm); } catch (ParseException e) { throw new IllegalArgumentException("Cannot parse date/time in: " + externalForm); } } /** * Parse the handle from external form. * "[toid=timedObjectId,first=firstTime,periode=periode]" */ public static TimerHandleImpl parse(String externalForm) { return new TimerHandleImpl(externalForm); } /** * Returns the external representation of the handle. * "[toid=timedObjectId,first=firstTime,periode=periode]" */ public String toExternalForm() { SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); String firstEvent = sdf.format(firstTime); return "[id=" + timerId + ",target=" + timedObjectId + ",first=" + firstEvent + ",periode=" + periode + "]"; } public String getTimerId() { return timerId; } public TimedObjectId getTimedObjectId() { return timedObjectId; } public Date getFirstTime() { return firstTime; } public long getPeriode() { return periode; } public Serializable getInfo() { return info; } /** * Obtain a reference to the txtimer represented by this handle. * * @return Timer which this handle represents * @throws IllegalStateException If this method is invoked while the instance is in * a state that does not allow access to this method. * @throws javax.ejb.NoSuchObjectLocalException * If invoked on a txtimer that has expired or has been cancelled. * @throws javax.ejb.EJBException If this method could not complete due to a system-level failure. */ public Timer getTimer() throws IllegalStateException, NoSuchObjectLocalException, EJBException { EJBTimerService ejbTimerService = EJBTimerServiceLocator.getEjbTimerService(); ObjectName containerId = timedObjectId.getContainerId(); Object instancePk = timedObjectId.getInstancePk(); TimerServiceImpl timerService = (TimerServiceImpl)ejbTimerService.getTimerService(containerId, instancePk); if (timerService == null) throw new NoSuchObjectLocalException("TimerService not available: " + timedObjectId); TimerImpl timer = (TimerImpl)timerService.getTimer(this); if (timer == null || timer.isActive() == false) throw new NoSuchObjectLocalException("Timer not available: " + timedObjectId); return timer; } /** * Return true if objectId, createDate, periode are equal */ public boolean equals(Object obj) { if (obj == this) return true; if (obj instanceof TimerHandleImpl) { TimerHandleImpl other = (TimerHandleImpl)obj; return hashCode() == other.hashCode(); } return false; } /** * Hash code based on objectId, createDate, periode */ public int hashCode() { if (hashCode == 0) { hashCode = toExternalForm().hashCode(); } return hashCode; } /** * Returns a string representation of the object. */ public String toString() { return toExternalForm(); } }