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.ejb.plugins;
023:
024: import org.jboss.ejb.EnterpriseContext;
025: import org.jboss.util.Executable;
026:
027: /** Abstract class for passivation jobs.
028: Subclasses should implement {@link #execute} synchronizing it in some way because
029: the execute method is normally called in the passivation thread,
030: while the cancel method is normally called from another thread.
031: To avoid that subclasses override methods of this class without
032: make them synchronized (except execute of course), they're declared final.
033:
034: @author <a href="mailto:simone.bordet@compaq.com">Simone Bordet</a>
035: @author Scott.Stark@jboss.org
036: @version $Revision: 57209 $
037: */
038: public abstract class AbstractPassivationJob implements Executable {
039: protected EnterpriseContext ctx;
040: protected Object key;
041: protected boolean isCancelled;
042: protected boolean isExecuted;
043:
044: AbstractPassivationJob(EnterpriseContext ctx, Object key) {
045: this .ctx = ctx;
046: this .key = key;
047: }
048:
049: /**
050: * (Bill Burke) We can't rely on the EnterpriseContext to provide PassivationJob
051: * with a valid key because it may get freed to the InstancePool, then
052: * reused before the PassivationJob executes.
053: */
054: final Object getKey() {
055: return key;
056: }
057:
058: /**
059: * Returns the EnterpriseContext associated with this passivation job,
060: * so the bean that will be passivated.
061: * No need to synchronize access to this method, since the returned
062: * reference is immutable
063: */
064: final EnterpriseContext getEnterpriseContext() {
065: return ctx;
066: }
067:
068: /**
069: * Mark this job for cancellation.
070: * @see #isCancelled
071: */
072: final synchronized void cancel() {
073: isCancelled = true;
074: }
075:
076: /**
077: * Returns whether this job has been marked for cancellation
078: * @see #cancel
079: */
080: final synchronized boolean isCancelled() {
081: return isCancelled;
082: }
083:
084: /**
085: * Mark this job as executed
086: * @see #isExecuted
087: */
088: final synchronized void executed() {
089: isExecuted = true;
090: }
091:
092: /**
093: * Returns whether this job has been executed
094: * @see #executed
095: */
096: final synchronized boolean isExecuted() {
097: return isExecuted;
098: }
099:
100: }
|