/*************************************************************************** * * * ChordFutureImpl.java * * ------------------- * * date : 15.10.2005 * * copyright : (C) 2004-2008 Distributed and * * Mobile Systems Group * * Lehrstuhl fuer Praktische Informatik * * Universitaet Bamberg * * http://www.uni-bamberg.de/pi/ * * email : sven.kaffille@uni-bamberg.de * * karsten.loesing@uni-bamberg.de * * * * * ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * A copy of the license can be found in the license.txt file supplied * * with this software or at: http://www.gnu.org/copyleft/gpl.html * * * ***************************************************************************/ package de.uniba.wiai.lspi.chord.service.impl; import de.uniba.wiai.lspi.chord.service.AsynChord; import de.uniba.wiai.lspi.chord.service.ChordFuture; import de.uniba.wiai.lspi.chord.service.ServiceException; /** * Abstract implementation of {@link ChordFuture}. Provides common * functionality for all {@link ChordFuture} implementations in this package. * * @author sven * @version 1.0.5 * */ abstract class ChordFutureImpl implements ChordFuture { /** * Indicates that the request to {@link AsynChord} has been completed. */ private boolean isDone = false; /** * Any Exception/Throwable that occured during execution of request * associated with this future. */ private Throwable throwable = null; /** * Instances of this can only be created by sub classes. * */ protected ChordFutureImpl() { /* * Nothing to do here. */ } /** * Indicate that the method associated with this has completed. * */ final void setIsDone() { synchronized (this) { this.isDone = true; this.notifyAll(); } } /** * Set a {@link Throwable} that occured during execution of method * associated with this. * * @param t */ final void setThrowable(Throwable t) { this.throwable = t; } /** * @see ChordFuture */ public Throwable getThrowable() { return this.throwable; } /** * @see ChordFuture * @return <code>true</code> if operation associated with this has been performed. * @throws ServiceException */ public final boolean isDone() throws ServiceException { if (this.throwable != null) { throw new ServiceException(this.throwable.getMessage(), this.throwable); } return this.isDone; } /** * @see ChordFuture */ public void waitForBeingDone() throws ServiceException, InterruptedException { synchronized (this) { while (!this.isDone()) { this.wait(); } } } }