001package com.hammurapi.common.concurrent; 002 003import java.util.concurrent.Callable; 004import java.util.concurrent.ExecutionException; 005import java.util.concurrent.Future; 006import java.util.concurrent.RunnableFuture; 007import java.util.concurrent.TimeUnit; 008import java.util.concurrent.TimeoutException; 009 010public class DelegatingRunnableFuture<V> implements RunnableFuture<V> { 011 012 private Future<V> target; 013 014 private Runnable command; 015 016 private Callable<V> task; 017 018 public DelegatingRunnableFuture(Runnable command, V value) { 019 this.command = command; 020 this.value = value; 021 } 022 023 public Runnable getCommand() { 024 return command; 025 } 026 027 public DelegatingRunnableFuture(Callable<V> task) { 028 this.task = task; 029 } 030 031 public Callable<V> getTask() { 032 return task; 033 } 034 035 public boolean cancel(boolean mayInterruptIfRunning) { 036 return target.cancel(mayInterruptIfRunning); 037 } 038 039 public boolean isCancelled() { 040 return target.isCancelled(); 041 } 042 043 public boolean isDone() { 044 return target.isDone(); 045 } 046 047 public V get() throws InterruptedException, ExecutionException { 048 return target.get(); 049 } 050 051 public V get(long timeout, TimeUnit unit) throws InterruptedException, 052 ExecutionException, TimeoutException { 053 return target.get(timeout, unit); 054 } 055 056 @Override 057 public void run() { 058 if (target instanceof Runnable) { 059 ((Runnable) target).run(); 060 } else { 061 throw new UnsupportedOperationException("Target is not runnable"); 062 } 063 } 064 065 public void setTarget(Future<V> target) { 066 this.target = target; 067 } 068 069 private V value; 070 071 public V getValue() { 072 return value; 073 } 074}