http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/QueueDrainer.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/QueueDrainer.java b/commons/src/main/java/com/twitter/common/util/QueueDrainer.java deleted file mode 100644 index 2903076..0000000 --- a/commons/src/main/java/com/twitter/common/util/QueueDrainer.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util; - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; - -import com.google.common.base.Preconditions; - -/** - * Joins a task queue with an executor service, to add control over when - * tasks are actually made available for execution. - * - * @author Srinivasan Rajagopal - */ -public class QueueDrainer<T extends Runnable> implements Runnable { - - private final Executor taskExecutor; - private final BlockingQueue<T> blockingQueue; - - /** - * Creates a QueueDrainer that associates the queue with an executorService. - * - * @param taskExecutor Executor to execute a task if present. - * @param blockingQueue Queue to poll if there is a runnable to execute. - */ - public QueueDrainer(Executor taskExecutor, BlockingQueue<T> blockingQueue) { - this.taskExecutor = Preconditions.checkNotNull(taskExecutor); - this.blockingQueue = Preconditions.checkNotNull(blockingQueue); - } - - /** - * Picks tasks from the Queue to execute if present else no-op. - */ - @Override - public void run() { - Runnable command = blockingQueue.poll(); - if (command != null) { - taskExecutor.execute(command); - } - } -}
http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/Random.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/Random.java b/commons/src/main/java/com/twitter/common/util/Random.java deleted file mode 100644 index dd95428..0000000 --- a/commons/src/main/java/com/twitter/common/util/Random.java +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util; - -import com.google.common.base.Preconditions; - -/** - * An interface to define the common functionality that is required for generating random values. - * - * @author William Farner - */ -public interface Random { - - /** - * @see java.util.Random#nextDouble() - */ - public double nextDouble(); - - /** - * @see java.util.Random#nextInt(int) - */ - public int nextInt(int n); - - /** - * A Random that wraps a java.util.Random. - */ - static class SystemRandom implements Random { - private final java.util.Random rand; - - public SystemRandom(java.util.Random rand) { - this.rand = Preconditions.checkNotNull(rand); - } - - @Override - public double nextDouble() { - return rand.nextDouble(); - } - - @Override - public int nextInt(int n) { - return rand.nextInt(n); - } - } - - // Utility class. - public static class Util { - private Util() {} - - /** - * Creates a new Random based off the default system Random. - * @return A new default Random. - */ - public static Random newDefaultRandom() { - return new SystemRandom(new java.util.Random()); - } - - /** - * Adapts a java.util.Random into a Random. - * - * @param rand The java.util.Random to adapt. - * @return A new Random. - */ - public static Random fromSystemRandom(java.util.Random rand) { - return new SystemRandom(rand); - } - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/RangeNormalizer.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/RangeNormalizer.java b/commons/src/main/java/com/twitter/common/util/RangeNormalizer.java deleted file mode 100644 index 96e4844..0000000 --- a/commons/src/main/java/com/twitter/common/util/RangeNormalizer.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -//************************************************************************ -// -// Summize -// -// This work protected by US Copyright Law and contains proprietary and -// confidential trade secrets. -// -// (c) Copyright 2006 Summize, ALL RIGHTS RESERVED. -// -//************************************************************************ -package com.twitter.common.util; - -/** - * Generic range normalizer class. Values must be positive. - * - * @author Abdur Chowdhury - */ -public class RangeNormalizer { - public RangeNormalizer(double minA, double maxA, double minB, double maxB) { - _minA = minA; - _maxA = maxA; - _minB = minB; - _maxB = maxB; - _denominator = (_maxA - _minA); - _B = (_maxB - _minB); - _midB = minB + (_B / 2f); - } - - public double normalize(double value) { - // if no input range, return a mid range value - if (_denominator == 0) { - return _midB; - } - - return ((value - _minA) / _denominator) * _B + _minB; - } - - public static double normalize(double value, double minA, double maxA, double minB, double maxB) { - // if the source min and max are equal, don't return 0, return something - // in the target range (perhaps this "default" should be another argument) - if (minA == maxA) { - return minB; - } - - return ((value - minA) / (maxA - minA)) * (maxB - minB) + minB; - } - - public static float normalizeToStepDistribution(double rating) { - int integerRating = (int) Math.round(rating); - - if (integerRating == 2) { - integerRating = 1; - } else if (integerRating == 4) { - integerRating = 3; - } else if (integerRating == 6) { - integerRating = 5; - } else if (integerRating == 8) { - integerRating = 7; - } else if (integerRating == 9) { - integerRating = 10; - } - - return (float) integerRating; - } - - // ******************************************************************* - private double _denominator; - private double _B; - private double _minA = Double.MIN_VALUE; - private double _maxA = Double.MAX_VALUE; - private double _minB = Double.MIN_VALUE; - private double _maxB = Double.MAX_VALUE; - private double _midB = Double.MAX_VALUE; -} - http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/RateLimitedCommandExecutor.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/RateLimitedCommandExecutor.java b/commons/src/main/java/com/twitter/common/util/RateLimitedCommandExecutor.java deleted file mode 100644 index 4e117c4..0000000 --- a/commons/src/main/java/com/twitter/common/util/RateLimitedCommandExecutor.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util; - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.google.common.base.Preconditions; - -import com.twitter.common.base.ExceptionalCommand; -import com.twitter.common.quantity.Amount; -import com.twitter.common.quantity.Time; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * CommandExecutor that invokes {@code queueDrainer} with a best-effort - * mechanism to execute with a fixed interval between requests of {@code - * intervalBetweenRequests}. - * - * @author Srinivasan Rajagopal - */ -public class RateLimitedCommandExecutor implements CommandExecutor { - - private static final Logger LOG = Logger.getLogger(RateLimitedCommandExecutor.class.getName()); - - private final BlockingQueue<RetryingRunnable<?>> blockingQueue; - - /** - * Create a CommandExecutor that executes enquequed tasks in the task - * executor with specified interval between executions. - * - * @param taskExecutor executor for periodic execution of enqueued tasks. - * @param intervalBetweenRequests interval between requests to rate limit - * request rate. - * @param queueDrainer A runnable that is responsible for draining the queue. - * @param blockingQueue Queue to keep outstanding work in. - */ - public RateLimitedCommandExecutor( - ScheduledExecutorService taskExecutor, - Amount<Long, Time> intervalBetweenRequests, - Runnable queueDrainer, - BlockingQueue<RetryingRunnable<?>> blockingQueue) { - - checkNotNull(taskExecutor); - checkNotNull(intervalBetweenRequests); - checkArgument(intervalBetweenRequests.as(Time.MILLISECONDS) > 0); - checkNotNull(queueDrainer); - this.blockingQueue = checkNotNull(blockingQueue); - taskExecutor.scheduleWithFixedDelay( - getSafeRunner(queueDrainer), - 0, - intervalBetweenRequests.as(Time.MILLISECONDS), - TimeUnit.MILLISECONDS); - } - - private static Runnable getSafeRunner(final Runnable runnable) { - return new Runnable() { - @Override public void run() { - try { - runnable.run(); - } catch (RuntimeException t) { - LOG.log(Level.INFO, " error processing task " + runnable); - } - } - }; - } - - @Override - public <E extends Exception> void execute(String name, ExceptionalCommand<E> task, - Class<E> exceptionClass, int numTries, Amount<Long, Time> retryDelay) { - blockingQueue.add(new RetryingRunnable<E>(name, task, exceptionClass, - numTries, retryDelay, this)); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/RetryingRunnable.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/RetryingRunnable.java b/commons/src/main/java/com/twitter/common/util/RetryingRunnable.java deleted file mode 100644 index b3a3ba5..0000000 --- a/commons/src/main/java/com/twitter/common/util/RetryingRunnable.java +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util; - -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.google.common.base.Throwables; - -import org.apache.commons.lang.builder.ToStringBuilder; - -import com.twitter.common.base.ExceptionalCommand; -import com.twitter.common.quantity.Amount; -import com.twitter.common.quantity.Time; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * A runnable task that is retried in a user-configurable fashion. - * - * @param <E> The type of exception that the ExceptionalCommand throws. - * - * @author Utkarsh Srivastava - */ -public class RetryingRunnable<E extends Exception> implements Runnable { - private final String name; - private final int tryNum; - private final int numTries; - private final Amount<Long, Time> retryDelay; - private final ExceptionalCommand<E> task; - private final CommandExecutor commandExecutor; - private final Class<E> exceptionClass; - - private static final Logger LOG = Logger.getLogger(RetryingRunnable.class.getName()); - - /** - * Create a Task with name {@code name} that executes at most {@code numTries} - * in case of failure with an interval of {@code retryDelay} between attempts. - * - * @param name Human readable name for this task. - * @param task the task to execute. - * @param exceptionClass class of the exception thrown by the task. - * @param numTries the total number of times to try. - * @param retryDelay the delay between successive tries. - * @param commandExecutor Executor to resubmit retries to. - * @param tryNum the seq number of this try. - */ - public RetryingRunnable( - String name, - ExceptionalCommand<E> task, - Class<E> exceptionClass, - int numTries, - Amount<Long, Time> retryDelay, - CommandExecutor commandExecutor, - int tryNum) { - - this.name = checkNotNull(name); - this.task = checkNotNull(task); - this.exceptionClass = checkNotNull(exceptionClass); - this.retryDelay = checkNotNull(retryDelay); - this.commandExecutor = checkNotNull(commandExecutor); - checkArgument(numTries > 0); - this.tryNum = tryNum; - this.numTries = numTries; - } - - /** - * Create a Task with name {@code name} that executes at most {@code numTries} - * in case of failure with an interval of {@code retryDelay} between attempts - * and sets tryNum to be the first (=1). - * - * @param name Human readable name for this task. - * @param task the task to execute. - * @param exceptionClass class of the exception thrown by the task. - * @param numTries the total number of times to try. - * @param retryDelay the delay between successive tries. - * @param commandExecutor Executor to resubmit retries to. - */ - public RetryingRunnable( - String name, - ExceptionalCommand<E> task, - Class<E> exceptionClass, - int numTries, - Amount<Long, Time> retryDelay, - CommandExecutor commandExecutor) { - - this(name, task, exceptionClass, numTries, retryDelay, commandExecutor, /*tryNum=*/ 1); - } - - @Override - public void run() { - try { - task.execute(); - } catch (Exception e) { - if (e.getClass().isAssignableFrom(exceptionClass)) { - if (tryNum < numTries) { - commandExecutor.execute(name, task, exceptionClass, numTries - 1, retryDelay); - } else { - LOG.log(Level.INFO, "Giving up on task: " + name + " " - + "after " + "trying " + numTries + " times" + ".", e); - } - } else { - LOG.log(Level.INFO, "Giving up on task: " + name + " after trying " - + numTries + " times. " + "due to unhandled exception ", e); - throw Throwables.propagate(e); - } - } - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("name", name) - .append("tryNum", tryNum) - .append("numTries", numTries) - .append("retryDelay", retryDelay) - .toString(); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/Sampler.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/Sampler.java b/commons/src/main/java/com/twitter/common/util/Sampler.java deleted file mode 100644 index 97400dd..0000000 --- a/commons/src/main/java/com/twitter/common/util/Sampler.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util; - -import com.google.common.base.Preconditions; - -/** - * A sampler that implements logic for fractional random selection. - * - * @author William Farner - */ -public class Sampler { - - private final Random rand; - private final double threshold; - - /** - * Creates a new sampler using the default system {@link Random}. - * - * @param selectPercent Percentage to randomly select, must be between 0 and 100 (inclusive). - */ - public Sampler(float selectPercent) { - this(selectPercent, Random.Util.newDefaultRandom()); - } - - /** - * Creates a new sampler using the provided {@link Random}. - * - * @param selectPercent Percentage to randoml select, must be between 0 and 100 (inclusive). - * @param rand The random utility to use for generating random numbers. - */ - public Sampler(float selectPercent, Random rand) { - Preconditions.checkArgument((selectPercent >= 0) && (selectPercent <= 100), - "Invalid selectPercent value: " + selectPercent); - - this.threshold = selectPercent / 100; - this.rand = Preconditions.checkNotNull(rand); - } - - public boolean select() { - return rand.nextDouble() < threshold; - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/StartWatch.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/StartWatch.java b/commons/src/main/java/com/twitter/common/util/StartWatch.java deleted file mode 100644 index 08afa78..0000000 --- a/commons/src/main/java/com/twitter/common/util/StartWatch.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -//************************************************************************ -// -// Summize -// -// This work protected by US Copyright Law and contains proprietary and -// confidential trade secrets. -// -// (c) Copyright 2007 Summize, ALL RIGHTS RESERVED. -// -//************************************************************************ - -package com.twitter.common.util; - -import org.apache.commons.lang.time.StopWatch; - -public class StartWatch extends StopWatch { - public StartWatch() { - super(); - } - - public void start() { - _started = true; - super.start(); - } - - public void resume() { - if (!_started) { - start(); - } else { - super.resume(); - } - } - - private boolean _started = false; -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/Stat.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/Stat.java b/commons/src/main/java/com/twitter/common/util/Stat.java deleted file mode 100644 index 4f10ea0..0000000 --- a/commons/src/main/java/com/twitter/common/util/Stat.java +++ /dev/null @@ -1,351 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util; - -//*************************************************************** -// - -import java.io.DataInput; -import java.io.DataInputStream; -import java.io.DataOutput; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Serializable; -import java.text.NumberFormat; - -/** - * This class is designed to provide basic statistics collection. - * For each instance of this object statistics and be added to it - * then the sum, mean, std dev, min and max can be gathered at the - * end. To reuse this object, a clear method can be called to reset - * the statistics. - */ -public class Stat implements Serializable { - - /** - * Add a number to the statistics collector. - * doubles are used for all collections. - * - * @param x number added to the statistics. - */ - public void addNumber(int x) { - addNumber((double) x); - } - - /** - * Add a number to the statistics collector. - * doubles are used for all collections. - * - * @param x number added to the statistics. - */ - public void addNumber(float x) { - addNumber((double) x); - } - - /** - * Add a number to the statistics collector. - * doubles are used for all collections. - * - * @param x number added to the statistics. - */ - public synchronized void addNumber(double x) { - if (_max < x) { - _max = x; - } - if (_min > x) { - _min = x; - } - - _sum += x; - _sumOfSq += (x * x); - _number++; - - return; - } - - - /** - * Clear the statistics counters... - */ - public void clear() { - _max = 0; - _min = Double.MAX_VALUE; - _number = 0; - _mean = 0; - _stdDev = 0; - _sum = 0; - _sumOfSq = 0; - } - - - /** - * Create a string representation of the - * statistics collected so far. NOTE this - * is formatted and may not suit all needs - * and thus the user should just call the - * needed methods to get mean, std dev, etc. - * and format the data as needed. - * - * @return String Java string formatted output of results. - */ - public String toString() { - return toString(false); - } - - - /** - * Create a string representation of the - * statistics collected so far. The results - * are formatted in percentage format if - * passed in true, otherwise the results - * are the same as the toString call. NOTE this - * is formatted and may not suit all needs - * and thus the user should just call the - * needed methods to get mean, std dev, etc. - * and format the data as needed. - * - * @param percent Format as percentages if set to true. - * @return String Java string formatted output of results. - */ - public String toString(boolean percent) { - calculate(); - NumberFormat nf = NumberFormat.getInstance(); - nf.setMaximumFractionDigits(4); - - if (_number > 1) { - StringBuffer results = new StringBuffer(); - if (percent) { - results.append("Number:" + nf.format(_number * 100) + "%"); - } else { - results.append("Number:" + nf.format(_number)); - } - - if (percent) { - results.append(" Max:" + nf.format(_max * 100) + "%"); - } else { - results.append(" Max:" + nf.format(_max)); - } - - if (percent) { - results.append(" Min:" + nf.format(_min * 100) + "%"); - } else { - results.append(" Min:" + nf.format(_min)); - } - - if (percent) { - results.append(" Mean:" + nf.format(_mean * 100) + "%"); - } else { - results.append(" Mean:" + nf.format(_mean)); - } - - results.append(" Sum:" + nf.format(_sum)); - results.append(" STD:" + nf.format(_stdDev)); - return results.toString(); - } else if (_number == 1) { - if (percent) { - return ("Number:" + nf.format(_sum * 100) + "%"); - } else { - return ("Number:" + nf.format(_sum)); - } - } else { - return ("Number: N/A"); - } - } - - - private void calculate() { - getMean(); - getStandardDev(); - } - - - /** - * Get the max data element added to the statistics - * object so far. - * - * @return double - Maximum entry added so far. - */ - public double getMax() { - return _max; - } - - - /** - * Get the min data element added to the statistics - * object so far. - * - * @return double - Min entry added so far. - */ - public double getMin() { - return _min; - } - - - /** - * Get the number of data elements added to the statistics - * object so far. - * - * @return double - Number of entries added so far. - */ - public long getNumberOfElements() { - return _number; - } - - - /** - * Get the average or mean of data elements added to the - * statistics object so far. - * - * @return double - Mean of entries added so far. - */ - public double getMean() { - if (_number > 0) { - _mean = _sum / _number; - } - return _mean; - } - - /** - * Get the ratio of the sum of elements divided by the number - * of elements added * 100 - * - * @return double - Percent of entries added so far. - */ - public double getPercent() { - if (_number > 0) { - _mean = _sum / _number; - } - _mean = _mean * 100; - return _mean; - } - - - /** - * Get the sum or mean of data elements added to the - * statistics object so far. - * - * @return double - Sum of entries added so far. - */ - public double getSum() { - return _sum; - } - - - /** - * Get the sum of the squares of the data elements added - * to the statistics object so far. - * - * @return double - Sum of the squares of the entries added so far. - */ - public double getSumOfSq() { - return _sumOfSq; - } - - - /** - * Get the standard deviation of the data elements added - * to the statistics object so far. - * - * @return double - Sum of the standard deviation of the entries added so far. - */ - public double getStandardDev() { - if (_number > 1) { - _stdDev = Math.sqrt((_sumOfSq - ((_sum * _sum) / _number)) / (_number - 1)); - } - return _stdDev; - } - - - /** - * Read the data from the InputStream so it can be used to populate - * the current objects state. - * - * @param in java.io.InputStream to write to. - * @throws IOException - */ - public void readFromDataInput(InputStream in) throws IOException { - DataInput di = new DataInputStream(in); - readFromDataInput(di); - return; - } - - - /** - * Read the data from the DataInput so it can be used to populate - * the current objects state. - * - * @param in java.io.InputStream to write to. - * @throws IOException - */ - public void readFromDataInput(DataInput in) throws IOException { - _max = in.readDouble(); - _min = in.readDouble(); - _number = in.readLong(); - _mean = in.readDouble(); - _stdDev = in.readDouble(); - _sum = in.readDouble(); - _sumOfSq = in.readDouble(); - return; - } - - - /** - * Write the data to the output steam so it can be streamed to an - * other process, wire or storage median in a format that another Stats - * object can read. - * - * @param out java.io.OutputStream to write to. - * @throws IOException - */ - public void writeToDataOutput(OutputStream out) throws IOException { - DataOutput dout = new DataOutputStream(out); - writeToDataOutput(dout); - return; - - } - - - /** - * Write the data to the data output object so it can be written to an - * other process, wire or storage median in a format that another Stats - * object can read. - * - * @param out java.io.DataOutput to write to. - * @throws IOException - */ - public void writeToDataOutput(DataOutput out) throws IOException { - out.writeDouble(_max); - out.writeDouble(_min); - out.writeLong(_number); - out.writeDouble(_mean); - out.writeDouble(_stdDev); - out.writeDouble(_sum); - out.writeDouble(_sumOfSq); - return; - } - - - // ************************************ - private static final long serialVersionUID = 1L; - private double _max = 0 ; - private double _min = Double.MAX_VALUE ; - private long _number = 0 ; - private double _mean = 0 ; - private double _stdDev = 0 ; - private double _sum = 0 ; - private double _sumOfSq ; -} - http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/StateMachine.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/StateMachine.java b/commons/src/main/java/com/twitter/common/util/StateMachine.java deleted file mode 100644 index 1f2916e..0000000 --- a/commons/src/main/java/com/twitter/common/util/StateMachine.java +++ /dev/null @@ -1,583 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util; - -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.logging.Logger; - -import com.google.common.base.Function; -import com.google.common.base.Preconditions; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; - -import org.apache.commons.lang.builder.HashCodeBuilder; - -import com.twitter.common.base.Closure; -import com.twitter.common.base.Closures; -import com.twitter.common.base.ExceptionalSupplier; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.twitter.common.base.MorePreconditions.checkNotBlank; - -/** - * Represents a state machine that is not necessarily a Finite State Machine. - * The caller may configure the state machine to permit only known state transitions, or to only - * disallow known state transitions (and permit unknown transitions). - * - * @param <T> THe type of objects that the caller uses to represent states. - * - * TODO(William Farner): Consider merging the stats-tracking ala PipelineStats into this. - */ -public class StateMachine<T> { - private static final Logger LOG = Logger.getLogger(StateMachine.class.getName()); - - private final String name; - - // Stores mapping from states to the states that the machine is allowed to transition into. - private final Multimap<T, T> stateTransitions; - - private final Closure<Transition<T>> transitionCallback; - private final boolean throwOnBadTransition; - - private volatile T currentState; - private final Lock readLock; - private final Lock writeLock; - - - private StateMachine(String name, - T initialState, - Multimap<T, T> stateTransitions, - Closure<Transition<T>> transitionCallback, - boolean throwOnBadTransition) { - this.name = name; - this.currentState = initialState; - this.stateTransitions = stateTransitions; - this.transitionCallback = transitionCallback; - this.throwOnBadTransition = throwOnBadTransition; - - ReadWriteLock stateLock = new ReentrantReadWriteLock(true /* fair */); - readLock = stateLock.readLock(); - writeLock = stateLock.writeLock(); - } - - /** - * Gets the name of this state machine. - * - * @return The state machine name. - */ - public String getName() { - return name; - } - - /** - * Fetches the state that the machine is currently in. - * - * @return Current state. - */ - public T getState() { - return currentState; - } - - /** - * Checks that the current state is the {@code expectedState} and throws if it is not. - * - * @param expectedState The expected state - * @throws IllegalStateException if the current state is not the {@code expectedState}. - */ - public void checkState(T expectedState) { - checkState(ImmutableSet.of(expectedState)); - } - - /** - * Checks that the current state is one of the {@code allowedStates} and throws if it is not. - * - * @param allowedStates The allowed states. - * @throws IllegalStateException if the current state is not the {@code expectedState}. - */ - public void checkState(Set<T> allowedStates) { - checkNotNull(allowedStates); - checkArgument(!allowedStates.isEmpty(), "At least one possible state must be provided."); - - readLock.lock(); - try { - if (!allowedStates.contains(currentState)) { - throw new IllegalStateException( - String.format("In state %s, expected to be in %s.", currentState, allowedStates)); - } - } finally { - readLock.unlock(); - } - } - - /** - * Executes the supplied {@code work} if the state machine is in the {@code expectedState}, - * postponing any concurrently requested {@link #transition(Object)} until after the execution of - * the work. - * - * @param expectedState The expected state the work should be performed in. - * @param work The work to perform in the {@code expectedState}. - * @param <O> The type returned by the unit of work. - * @param <E> The type of exception that may be thrown by the unit of work. - * @return The result of the unit of work if the current state is the {@code expectedState}. - * @throws IllegalStateException if the current state is not the {@code expectedState}. - * @throws E if the unit of work throws. - */ - public <O, E extends Exception> O doInState(T expectedState, ExceptionalSupplier<O, E> work) - throws E { - - checkNotNull(expectedState); - checkNotNull(work); - - readLock.lock(); - try { - checkState(expectedState); - return work.get(); - } finally { - readLock.unlock(); - } - } - - /** - * Transitions the machine into state {@code nextState}. - * - * @param nextState The state to move into. - * @throws IllegalStateTransitionException If the state transition is not allowed. - * @return {@code true} if the transition was allowed, {@code false} otherwise. - */ - public boolean transition(T nextState) throws IllegalStateTransitionException { - boolean transitionAllowed = false; - - T currentCopy = currentState; - - writeLock.lock(); - try { - if (stateTransitions.containsEntry(currentState, nextState)) { - currentState = nextState; - transitionAllowed = true; - } else if (throwOnBadTransition) { - throw new IllegalStateTransitionException( - String.format("State transition from %s to %s is not allowed.", currentState, - nextState)); - } - } finally { - writeLock.unlock(); - } - - transitionCallback.execute(new Transition<T>(currentCopy, nextState, transitionAllowed)); - return transitionAllowed; - } - - public static class IllegalStateTransitionException extends IllegalStateException { - public IllegalStateTransitionException(String msg) { - super(msg); - } - } - - /** - * Convenience method to create a builder object. - * - * @param <T> Type of builder to create. - * @param name Name of the state machine to create a builder for. - * @return New builder. - */ - public static <T> Builder<T> builder(String name) { - return new Builder<T>(name); - } - - /** - * A state and its allowed transitions (if any) and (optional) callback. - * - * @param <T> State type. - */ - public static class Rule<T> { - private final T from; - private final Set<T> to; - private final Closure<Transition<T>> callback; - - private Rule(T from) { - this(from, ImmutableSet.<T>of()); - } - - private Rule(T from, Set<T> to) { - this(from, to, Closures.<Transition<T>>noop()); - } - - private Rule(T from, Set<T> to, Closure<Transition<T>> callback) { - this.from = checkNotNull(from); - this.to = checkNotNull(to); - this.callback = checkNotNull(callback); - } - - /** - * Associates a callback to be triggered after any attempt to transition from this state is - * made. - * - * @param callback Callback to signal. - * @return A new rule that is identical to this rule, but with the provided - * callback - */ - public Rule<T> withCallback(Closure<Transition<T>> callback) { - return new Rule<T>(from, to, callback); - } - - /** - * A helper class when building a transition rule, to define the allowed transitions. - * - * @param <T> State type. - */ - public static class AllowedTransition<T> { - private final Rule<T> rule; - - private AllowedTransition(Rule<T> rule) { - this.rule = rule; - } - - /** - * Associates a single allowed transition with this state. - * - * @param state Allowed transition state. - * @return A new rule that identical to the original, but only allowing a transition to the - * provided state. - */ - public Rule<T> to(T state) { - return new Rule<T>(rule.from, ImmutableSet.<T>of(state), rule.callback); - } - - /** - * Associates multiple transitions with this state. - * - * @param state An allowed transition state. - * @param additionalStates Additional states that may be transitioned to. - * @return A new rule that identical to the original, but only allowing a transition to the - * provided states. - */ - public Rule<T> to(T state, T... additionalStates) { - return new Rule<T>(rule.from, ImmutableSet.copyOf(Lists.asList(state, additionalStates))); - } - - /** - * Allows no transitions to be performed from this state. - * - * @return The original rule. - */ - public Rule<T> noTransitions() { - return rule; - } - } - - /** - * Creates a new transition rule. - * - * @param state State to create and associate transitions with. - * @param <T> State type. - * @return A new transition rule builder. - */ - public static <T> AllowedTransition<T> from(T state) { - return new AllowedTransition<T>(new Rule<T>(state)); - } - } - - /** - * Builder to create a state machine. - * - * @param <T> - */ - public static class Builder<T> { - private final String name; - private T initialState; - private final Multimap<T, T> stateTransitions = HashMultimap.create(); - private final List<Closure<Transition<T>>> transitionCallbacks = Lists.newArrayList(); - private boolean throwOnBadTransition = true; - - public Builder(String name) { - this.name = checkNotBlank(name); - } - - /** - * Sets the initial state for the state machine. - * - * @param state Initial state. - * @return A reference to the builder. - */ - public Builder<T> initialState(T state) { - checkNotNull(state); - initialState = state; - return this; - } - - /** - * Adds a state and its allowed transitions. - * - * @param rule The state and transition rule to add. - * @return A reference to the builder. - */ - public Builder<T> addState(Rule<T> rule) { - return addState(rule.callback, rule.from, rule.to); - } - - /** - * Adds a state and its allowed transitions. - * At least one transition state must be added, it is not necessary to explicitly add states - * that have no allowed transitions (terminal states). - * - * @param callback Callback to notify of any transition attempted from the state. - * @param state State to add. - * @param transitionStates Allowed transitions from {@code state}. - * @return A reference to the builder. - */ - public Builder<T> addState(Closure<Transition<T>> callback, T state, - Set<T> transitionStates) { - checkNotNull(callback); - checkNotNull(state); - - Preconditions.checkArgument(Iterables.all(transitionStates, Predicates.notNull())); - - stateTransitions.putAll(state, transitionStates); - - @SuppressWarnings("unchecked") - Predicate<Transition<T>> filter = Transition.from(state); - onTransition(filter, callback); - return this; - } - - /** - * Varargs version of {@link #addState(com.twitter.common.base.Closure, Object, java.util.Set)}. - * - * @param callback Callback to notify of any transition attempted from the state. - * @param state State to add. - * @param transitionStates Allowed transitions from {@code state}. - * @return A reference to the builder. - */ - public Builder<T> addState(Closure<Transition<T>> callback, T state, - T... transitionStates) { - Set<T> states = ImmutableSet.copyOf(transitionStates); - Preconditions.checkArgument(Iterables.all(states, Predicates.notNull())); - - return addState(callback, state, states); - } - - /** - * Adds a state and its allowed transitions. - * At least one transition state must be added, it is not necessary to explicitly add states - * that have no allowed transitions (terminal states). - * - * @param state State to add. - * @param transitionStates Allowed transitions from {@code state}. - * @return A reference to the builder. - */ - public Builder<T> addState(T state, T... transitionStates) { - return addState(Closures.<Transition<T>>noop(), state, transitionStates); - } - - private void onTransition(Predicate<Transition<T>> transitionFilter, - Closure<Transition<T>> handler) { - onAnyTransition(Closures.filter(transitionFilter, handler)); - } - - /** - * Adds a callback to be executed for every state transition, including invalid transitions - * that are attempted. - * - * @param handler Callback to notify of transition attempts. - * @return A reference to the builder. - */ - public Builder<T> onAnyTransition(Closure<Transition<T>> handler) { - transitionCallbacks.add(handler); - return this; - } - - /** - * Adds a log message for every state transition that is attempted. - * - * @return A reference to the builder. - */ - public Builder<T> logTransitions() { - return onAnyTransition(new Closure<Transition<T>>() { - @Override public void execute(Transition<T> transition) { - LOG.info(name + " state machine transition " + transition); - } - }); - } - - /** - * Allows the caller to specify whether {@link IllegalStateTransitionException} should be thrown - * when a bad state transition is attempted (the default behavior). - * - * @param throwOnBadTransition Whether an exception should be thrown when a bad state transition - * is attempted. - * @return A reference to the builder. - */ - public Builder<T> throwOnBadTransition(boolean throwOnBadTransition) { - this.throwOnBadTransition = throwOnBadTransition; - return this; - } - - /** - * Builds the state machine. - * - * @return A reference to the prepared state machine. - */ - public StateMachine<T> build() { - Preconditions.checkState(initialState != null, "Initial state must be specified."); - checkArgument(!stateTransitions.isEmpty(), "No state transitions were specified."); - return new StateMachine<T>(name, - initialState, - stateTransitions, - Closures.combine(transitionCallbacks), - throwOnBadTransition); - } - } - - /** - * Representation of a state transition. - * - * @param <T> State type. - */ - public static class Transition<T> { - private final T from; - private final T to; - private final boolean allowed; - - public Transition(T from, T to, boolean allowed) { - this.from = checkNotNull(from); - this.to = checkNotNull(to); - this.allowed = allowed; - } - - private static <T> Function<Transition<T>, T> from() { - return new Function<Transition<T>, T>() { - @Override public T apply(Transition<T> transition) { - return transition.from; - } - }; - } - - private static <T> Function<Transition<T>, T> to() { - return new Function<Transition<T>, T>() { - @Override public T apply(Transition<T> transition) { - return transition.to; - } - }; - } - - private static <T> Predicate<Transition<T>> oneSideFilter( - Function<Transition<T>, T> extractor, final T... states) { - checkArgument(Iterables.all(Arrays.asList(states), Predicates.notNull())); - - return Predicates.compose(Predicates.in(ImmutableSet.copyOf(states)), extractor); - } - - /** - * Creates a predicate that returns {@code true} for transitions from the given states. - * - * @param states States to filter on. - * @param <T> State type. - * @return A from-state filter. - */ - public static <T> Predicate<Transition<T>> from(final T... states) { - return oneSideFilter(Transition.<T>from(), states); - } - - /** - * Creates a predicate that returns {@code true} for transitions to the given states. - * - * @param states States to filter on. - * @param <T> State type. - * @return A to-state filter. - */ - public static <T> Predicate<Transition<T>> to(final T... states) { - return oneSideFilter(Transition.<T>to(), states); - } - - /** - * Creates a predicate that returns {@code true} for a specific state transition. - * - * @param from From state. - * @param to To state. - * @param <T> State type. - * @return A state transition filter. - */ - public static <T> Predicate<Transition<T>> transition(final T from, final T to) { - @SuppressWarnings("unchecked") - Predicate<Transition<T>> fromFilter = from(from); - @SuppressWarnings("unchecked") - Predicate<Transition<T>> toFilter = to(to); - return Predicates.and(fromFilter, toFilter); - } - - public T getFrom() { - return from; - } - - public T getTo() { - return to; - } - - public boolean isAllowed() { - return allowed; - } - - /** - * Checks whether this transition represents a state change, which means that the 'to' state is - * not equal to the 'from' state, and the transition is allowed. - * - * @return {@code true} if the state was changed, {@code false} otherwise. - */ - public boolean isValidStateChange() { - return isAllowed() && !from.equals(to); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof Transition)) { - return false; - } - - if (o == this) { - return true; - } - - Transition<?> other = (Transition) o; - return from.equals(other.from) && to.equals(other.to); - } - - @Override - public int hashCode() { - return new HashCodeBuilder() - .append(from) - .append(to) - .toHashCode(); - } - - @Override - public String toString() { - String str = from.toString() + " -> " + to.toString(); - if (!isAllowed()) { - str += " (not allowed)"; - } - return str; - } - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/Timer.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/Timer.java b/commons/src/main/java/com/twitter/common/util/Timer.java deleted file mode 100644 index 32fca24..0000000 --- a/commons/src/main/java/com/twitter/common/util/Timer.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util; - -import com.twitter.common.base.Commands; -import com.twitter.common.base.ExceptionalCommand; -import com.twitter.common.base.ExceptionalSupplier; -import com.twitter.common.stats.SlidingStats; - -/** - * A utility for timing blocks of code. - * - * <p>TODO(John Sirois): consider instead: - * <T, E extends Exception> Pair<T, Long> doTimed(ExceptionalSupplier<T, E> timedWork) throws E - * or a subinterface of Command/Closure/Supplier/Function that exposes a timing method as other ways - * to factor in timing. - * - * @author John Sirois - */ -public final class Timer { - - /** - * Times the block of code encapsulated by {@code timedWork} recoding the result in {@code stat}. - * - * @param stat the stat to record the timing with - * @param timedWork the code to time - * @param <E> the type of exception {@code timedWork} may throw - * @throws E if {@code timedWork} throws - */ - public static <E extends Exception> void doTimed(SlidingStats stat, - final ExceptionalCommand<E> timedWork) throws E { - doTimed(stat, Commands.asSupplier(timedWork)); - } - - /** - * Times the block of code encapsulated by {@code timedWork} recoding the result in {@code stat}. - * - * @param stat the stat to record the timing with - * @param timedWork the code to time - * @param <T> the type of result {@code timedWork} returns - * @param <E> the type of exception {@code timedWork} may throw - * @return the result of {@code timedWork} if it completes normally - * @throws E if {@code timedWork} throws - */ - public static <T, E extends Exception> T doTimed(SlidingStats stat, - ExceptionalSupplier<T, E> timedWork) throws E { - StartWatch timer = new StartWatch(); - timer.start(); - try { - return timedWork.get(); - } finally { - timer.stop(); - stat.accumulate(timer.getTime()); - } - } - - private Timer() { - // utility - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/TruncatedBinaryBackoff.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/TruncatedBinaryBackoff.java b/commons/src/main/java/com/twitter/common/util/TruncatedBinaryBackoff.java deleted file mode 100644 index 23da467..0000000 --- a/commons/src/main/java/com/twitter/common/util/TruncatedBinaryBackoff.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util; - -import com.google.common.base.Preconditions; -import com.twitter.common.quantity.Amount; -import com.twitter.common.quantity.Time; - -/** - * A BackoffStrategy that implements truncated binary exponential backoff. - */ -public class TruncatedBinaryBackoff implements BackoffStrategy { - private final long initialBackoffMs; - private final long maxBackoffIntervalMs; - private final boolean stopAtMax; - - /** - * Creates a new TruncatedBinaryBackoff that will start by backing off for {@code initialBackoff} - * and then backoff of twice as long each time its called until reaching the {@code maxBackoff} at - * which point shouldContinue() will return false and any future backoffs will always wait for - * that amount of time. - * - * @param initialBackoff the intial amount of time to backoff - * @param maxBackoff the maximum amount of time to backoff - * @param stopAtMax whether shouldContinue() returns false when the max is reached - */ - public TruncatedBinaryBackoff(Amount<Long, Time> initialBackoff, - Amount<Long, Time> maxBackoff, boolean stopAtMax) { - Preconditions.checkNotNull(initialBackoff); - Preconditions.checkNotNull(maxBackoff); - Preconditions.checkArgument(initialBackoff.getValue() > 0); - Preconditions.checkArgument(maxBackoff.compareTo(initialBackoff) >= 0); - initialBackoffMs = initialBackoff.as(Time.MILLISECONDS); - maxBackoffIntervalMs = maxBackoff.as(Time.MILLISECONDS); - this.stopAtMax = stopAtMax; - } - - /** - * Same as main constructor, but this will always return true from shouldContinue(). - * - * @param initialBackoff the intial amount of time to backoff - * @param maxBackoff the maximum amount of time to backoff - */ - public TruncatedBinaryBackoff(Amount<Long, Time> initialBackoff, Amount<Long, Time> maxBackoff) { - this(initialBackoff, maxBackoff, false); - } - - @Override - public long calculateBackoffMs(long lastBackoffMs) { - Preconditions.checkArgument(lastBackoffMs >= 0); - long backoff = (lastBackoffMs == 0) ? initialBackoffMs - : Math.min(maxBackoffIntervalMs, lastBackoffMs * 2); - return backoff; - } - - @Override - public boolean shouldContinue(long lastBackoffMs) { - Preconditions.checkArgument(lastBackoffMs >= 0); - boolean stop = stopAtMax && (lastBackoffMs >= maxBackoffIntervalMs); - - return !stop; - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/caching/Cache.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/caching/Cache.java b/commons/src/main/java/com/twitter/common/util/caching/Cache.java deleted file mode 100644 index b8e437c..0000000 --- a/commons/src/main/java/com/twitter/common/util/caching/Cache.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util.caching; - -/** - * Definition of basic caching functionality. Cache keys and values are expected to always be - * valid, non-null values. - * - * @author William Farner - */ -public interface Cache<K, V> { - - /** - * Fetches a value from the cache. - * - * @param key The key for the value to fetch, must not be {@code null}. - * @return The cached value corresponding with {@code key}, or {@code null} if no entry exists. - */ - public V get(K key); - - /** - * Stores a key-value pair in the cache. - * - * @param key The key to store, must not be {@code null}. - * @param value The value to store, must not be {@code null}. - */ - public void put(K key, V value); - - /** - * Deletes an entry from the cache. - * - * @param key Key for the value to delete, must not be {@code null}. - */ - public void delete(K key); -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/caching/CachingMethodProxy.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/caching/CachingMethodProxy.java b/commons/src/main/java/com/twitter/common/util/caching/CachingMethodProxy.java deleted file mode 100644 index f44b278..0000000 --- a/commons/src/main/java/com/twitter/common/util/caching/CachingMethodProxy.java +++ /dev/null @@ -1,262 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util.caching; - -import com.google.common.base.Function; -import com.google.common.base.Preconditions; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - * A proxy class that handles caching of return values for method calls to a wrapped object. - * - * Example usage: - * - * Foo uncached = new Foo(); - * CachingMethodProxy<Foo> methodProxy = CachingMethodProxy.proxyFor(uncached, Foo.class); - * Foo foo = methodProxy.getCachingProxy(); - * methodProxy.cache(foo.doBar(), lruCache1) - * .cache(foo.doBaz(), lruCache2) - * .prepare(); - * - * @author William Farner - */ -public class CachingMethodProxy<T> { - - // Dummy return values to return when in recording state. - private static final Map<Class<?>, Object> EMPTY_RETURN_VALUES = - ImmutableMap.<Class<?>, Object>builder() - .put(Boolean.TYPE, Boolean.FALSE) - .put(Byte.TYPE, Byte.valueOf((byte) 0)) - .put(Short.TYPE, Short.valueOf((short) 0)) - .put(Character.TYPE, Character.valueOf((char)0)) - .put(Integer.TYPE, Integer.valueOf(0)) - .put(Long.TYPE, Long.valueOf(0)) - .put(Float.TYPE, Float.valueOf(0)) - .put(Double.TYPE, Double.valueOf(0)) - .build(); - private static final Map<Class<?>, Class<?>> AUTO_BOXING_MAP = - ImmutableMap.<Class<?>, Class<?>>builder() - .put(Boolean.TYPE, Boolean.class) - .put(Byte.TYPE, Byte.class) - .put(Short.TYPE, Short.class) - .put(Character.TYPE, Character.class) - .put(Integer.TYPE, Integer.class) - .put(Long.TYPE, Long.class) - .put(Float.TYPE, Float.class) - .put(Double.TYPE, Double.class) - .build(); - - // The uncached resource, whose method calls are deemed to be expensive and cacheable. - private final T uncached; - - // The methods that are cached, and the caches themselves. - private final Map<Method, MethodCache> methodCaches = Maps.newHashMap(); - private final Class<T> type; - - private Method lastMethodCall = null; - private boolean recordMode = true; - - /** - * Creates a new caching method proxy that will wrap an object and cache for the provided methods. - * - * @param uncached The uncached object that will be reverted to when a cache entry is not present. - */ - private CachingMethodProxy(T uncached, Class<T> type) { - this.uncached = Preconditions.checkNotNull(uncached); - this.type = Preconditions.checkNotNull(type); - Preconditions.checkArgument(type.isInterface(), "The proxied type must be an interface."); - } - - private static Object invokeMethod(Object subject, Method method, Object[] args) - throws Throwable { - try { - return method.invoke(subject, args); - } catch (IllegalAccessException e) { - throw new RuntimeException("Cannot access " + subject.getClass() + "." + method, e); - } catch (InvocationTargetException e) { - throw e.getCause(); - } - } - - /** - * A cached method and its caching control structures. - * - * @param <K> Cache key type. - * @param <V> Cache value type, expected to match the return type of the method. - */ - private static class MethodCache<K, V> { - private final Method method; - private final Cache<K, V> cache; - private final Function<Object[], K> keyBuilder; - private final Predicate<V> entryFilter; - - MethodCache(Method method, Cache<K, V> cache, Function<Object[], K> keyBuilder, - Predicate<V> entryFilter) { - this.method = method; - this.cache = cache; - this.keyBuilder = keyBuilder; - this.entryFilter = entryFilter; - } - - V doInvoke(Object uncached, Object[] args) throws Throwable { - K key = keyBuilder.apply(args); - - V cachedValue = cache.get(key); - - if (cachedValue != null) return cachedValue; - - Object fetched = invokeMethod(uncached, method, args); - - if (fetched == null) return null; - - @SuppressWarnings("unchecked") - V typedValue = (V) fetched; - - if (entryFilter.apply(typedValue)) cache.put(key, typedValue); - - return typedValue; - } - } - - /** - * Creates a new builder for the given type. - * - * @param uncached The uncached object that should be insulated by caching. - * @param type The interface that a proxy should be created for. - * @param <T> Type parameter to the proxied class. - * @return A new builder. - */ - public static <T> CachingMethodProxy<T> proxyFor(T uncached, Class<T> type) { - return new CachingMethodProxy<T>(uncached, type); - } - - @SuppressWarnings("unchecked") - public T getCachingProxy() { - return (T) Proxy.newProxyInstance(type.getClassLoader(), new Class[] { type }, - new InvocationHandler() { - @Override public Object invoke(Object proxy, Method method, Object[] args) - throws Throwable { - return doInvoke(method, args); - } - }); - } - - private Object doInvoke(Method method, Object[] args) throws Throwable { - return recordMode ? recordCall(method) : cacheRequest(method, args); - } - - private Object recordCall(Method method) { - Preconditions.checkArgument(method.getReturnType() != Void.TYPE, - "Void return methods cannot be cached: " + method); - Preconditions.checkArgument(method.getParameterTypes().length > 0, - "Methods with zero arguments cannot be cached: " + method); - Preconditions.checkState(lastMethodCall == null, - "No cache instructions provided for call to: " + lastMethodCall); - - lastMethodCall = method; - - Class<?> returnType = method.getReturnType(); - return returnType.isPrimitive() ? EMPTY_RETURN_VALUES.get(returnType) : null; - } - - private Object cacheRequest(Method method, Object[] args) throws Throwable { - MethodCache cache = methodCaches.get(method); - - // Check if we are caching for this method. - if (cache == null) return invokeMethod(uncached, method, args); - - return cache.doInvoke(uncached, args); - } - - /** - * Instructs the proxy that cache setup is complete, and the proxy instance should begin caching - * and delegating uncached calls. After this is called, any subsequent calls to any of the - * cache setup methods will result in an {@link IllegalStateException}. - */ - public void prepare() { - Preconditions.checkState(!methodCaches.isEmpty(), "At least one method must be cached."); - Preconditions.checkState(recordMode, "prepare() may only be invoked once."); - - recordMode = false; - } - - public <V> CachingMethodProxy<T> cache(V value, Cache<List, V> cache) { - return cache(value, cache, Predicates.<V>alwaysTrue()); - } - - public <V> CachingMethodProxy<T> cache(V value, Cache<List, V> cache, - Predicate<V> valueFilter) { - return cache(value, cache, DEFAULT_KEY_BUILDER, valueFilter); - } - - public <K, V> CachingMethodProxy<T> cache(V value, Cache<K, V> cache, - Function<Object[], K> keyBuilder) { - // Get the last method call and declare it the cached method. - return cache(value, cache, keyBuilder, Predicates.<V>alwaysTrue()); - } - - public <K, V> CachingMethodProxy<T> cache(V value, Cache<K, V> cache, - Function<Object[], K> keyBuilder, Predicate<V> valueFilter) { - Preconditions.checkNotNull(cache); - Preconditions.checkNotNull(keyBuilder); - Preconditions.checkNotNull(valueFilter); - - Preconditions.checkState(recordMode, "Cache setup is not allowed after prepare() is called."); - - // Get the last method call and declare it the cached method. - Preconditions.checkState(lastMethodCall != null, "No method call captured to be cached."); - - Class<?> returnType = lastMethodCall.getReturnType(); - - Preconditions.checkArgument(returnType != Void.TYPE, - "Cannot cache results from void method: " + lastMethodCall); - - if (returnType.isPrimitive()) { - // If a primitive type is returned, we need to make sure that the cache holds the boxed - // type for the primitive. - returnType = AUTO_BOXING_MAP.get(returnType); - } - - // TODO(William Farner): Figure out a simple way to make this possible. Right now, since the proxy - // objects return null, we get a null here and can't check the type. - //Preconditions.checkArgument(value.getClass() == returnType, - // String.format("Cache value type '%s' does not match method return type '%s'", - // value.getClass(), lastMethodCall.getReturnType())); - - methodCaches.put(lastMethodCall, new MethodCache<K, V>(lastMethodCall, cache, keyBuilder, - valueFilter)); - - lastMethodCall = null; - - return this; - } - - private static final Function<Object[], List> DEFAULT_KEY_BUILDER = - new Function<Object[], List>() { - @Override public List apply(Object[] args) { - return Arrays.asList(args); - } - }; -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/caching/LRUCache.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/caching/LRUCache.java b/commons/src/main/java/com/twitter/common/util/caching/LRUCache.java deleted file mode 100644 index f0dd2d3..0000000 --- a/commons/src/main/java/com/twitter/common/util/caching/LRUCache.java +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util.caching; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import com.twitter.common.base.Closure; -import com.twitter.common.base.MorePreconditions; -import com.twitter.common.collections.Pair; -import com.twitter.common.stats.Stats; - -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; - -/** - * A cache with a fixed maximum size, evicting items that were used least-recently. - * WARNING: This is not thread-safe. If you wish to get a thread-safe version of a constructed - * LRUCache, you must wrap it with {@link Collections#synchronizedMap(java.util.Map)}. - * - * @author William Farner - */ -public class LRUCache<K, V> implements Cache<K, V> { - - private Map<K, V> map; - - private final AtomicLong accesses; - private final AtomicLong misses; - - /** - * Creates a new bounded cache with the given load factor. - * - * @param name Unique name for this cache. - * @param maxCapacity Maximum capacity for the cache, after which items will be evicted. - * @param loadFactor Load factor for the cache. - * @param makeSynchronized Whether the underlying map should be synchronized. - * @param evictionListener Listener to be notified when an element is evicted, or {@code null} if - * eviction notifications are not needed. - */ - private LRUCache(final String name, final int maxCapacity, float loadFactor, - boolean makeSynchronized, final Closure<Pair<K, V>> evictionListener) { - map = new LinkedHashMap<K, V>(maxCapacity, loadFactor, true /* Access order. */) { - @Override public boolean removeEldestEntry(Map.Entry<K, V> entry) { - boolean evict = size() > maxCapacity; - if (evict && evictionListener != null) { - evictionListener.execute(Pair.of(entry.getKey(), entry.getValue())); - } - return evict; - } - }; - - if (makeSynchronized) { - map = Collections.synchronizedMap(map); - } - - accesses = Stats.exportLong(name + "_lru_cache_accesses"); - misses = Stats.exportLong(name + "_lru_cache_misses"); - } - - public static <K, V> Builder<K, V> builder() { - return new Builder<K, V>(); - } - - public static class Builder<K, V> { - private String name = null; - - private int maxSize = 1000; - - // Sadly, LinkedHashMap doesn't expose this, so the default is pulled from the javadoc. - private float loadFactor = 0.75F; - - private boolean makeSynchronized = true; - - private Closure<Pair<K, V>> evictionListener = null; - - public Builder<K, V> name(String name) { - this.name = MorePreconditions.checkNotBlank(name); - return this; - } - - public Builder<K, V> maxSize(int maxSize) { - Preconditions.checkArgument(maxSize > 0); - this.maxSize = maxSize; - return this; - } - - public Builder<K, V> loadFactor(float loadFactor) { - this.loadFactor = loadFactor; - return this; - } - - public Builder<K, V> makeSynchronized(boolean makeSynchronized) { - this.makeSynchronized = makeSynchronized; - return this; - } - - public Builder<K, V> evictionListener(Closure<Pair<K, V>> evictionListener) { - this.evictionListener = evictionListener; - return this; - } - - public LRUCache<K, V> build() { - return new LRUCache<K, V>(name, maxSize, loadFactor, makeSynchronized, evictionListener); - } - } - - @Override - public V get(K key) { - accesses.incrementAndGet(); - V value = map.get(key); - if (value == null) { - misses.incrementAndGet(); - } - return value; - } - - @Override - public void put(K key, V value) { - map.put(key, value); - } - - @Override - public void delete(K key) { - map.remove(key); - } - - public int size() { - return map.size(); - } - - @Override - public String toString() { - return String.format("size: %d, accesses: %s, misses: %s", - map.size(), - accesses, - misses); - } - - public Collection<V> copyValues() { - synchronized(map) { - return ImmutableList.copyOf(map.values()); - } - } - - public long getAccesses() { - return accesses.longValue(); - } - - public long getMisses() { - return misses.longValue(); - } - - public double getHitRate() { - double numAccesses = accesses.longValue(); - return numAccesses == 0 ? 0 : (numAccesses - misses.longValue()) / numAccesses; - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/concurrent/BackingOffFutureTask.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/concurrent/BackingOffFutureTask.java b/commons/src/main/java/com/twitter/common/util/concurrent/BackingOffFutureTask.java deleted file mode 100644 index 6dab3b8..0000000 --- a/commons/src/main/java/com/twitter/common/util/concurrent/BackingOffFutureTask.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util.concurrent; - -import com.google.common.base.Preconditions; -import com.twitter.common.util.BackoffStrategy; - -import java.util.concurrent.Callable; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -/** - * A {@link RetryingFutureTask} that will resubmit itself to a work queue with a backoff. - * - * @author William Farner - */ -public class BackingOffFutureTask extends RetryingFutureTask { - private final ScheduledExecutorService executor; - private final BackoffStrategy backoffStrategy; - private long backoffMs = 0; - - /** - * Creates a new retrying future task that will execute a unit of work until successfully - * completed, or the retry limit has been reached. - * - * @param executor The executor service to resubmit the task to upon failure. - * @param callable The unit of work. The work is considered successful when {@code true} is - * returned. It may return {@code false} or throw an exception when - * unsueccessful. - * @param maxRetries The maximum number of times to retry the task. - * @param backoffStrategy Strategy to use for determining backoff duration. - */ - public BackingOffFutureTask(ScheduledExecutorService executor, Callable<Boolean> callable, - int maxRetries, BackoffStrategy backoffStrategy) { - super(executor, callable, maxRetries); - this.executor = executor; - this.backoffStrategy = Preconditions.checkNotNull(backoffStrategy); - } - - @Override - protected void retry() { - backoffMs = backoffStrategy.calculateBackoffMs(backoffMs); - executor.schedule(this, backoffMs, TimeUnit.MILLISECONDS); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/concurrent/ExceptionHandlingExecutorService.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/concurrent/ExceptionHandlingExecutorService.java b/commons/src/main/java/com/twitter/common/util/concurrent/ExceptionHandlingExecutorService.java deleted file mode 100644 index 1208b7e..0000000 --- a/commons/src/main/java/com/twitter/common/util/concurrent/ExceptionHandlingExecutorService.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util.concurrent; - -import java.util.Collection; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import com.google.common.base.Function; -import com.google.common.base.Preconditions; -import com.google.common.base.Supplier; -import com.google.common.base.Throwables; -import com.google.common.collect.Collections2; - -/** - * An executor service that delegates to another executor service, invoking an uncaught - * exception handler if any exceptions are thrown in submitted work. - * - * @see MoreExecutors - */ -class ExceptionHandlingExecutorService extends ForwardingExecutorService<ExecutorService> { - private final Supplier<Thread.UncaughtExceptionHandler> handler; - - ExceptionHandlingExecutorService( - ExecutorService delegate, - Supplier<Thread.UncaughtExceptionHandler> handler) { - - super(delegate); - this.handler = Preconditions.checkNotNull(handler); - } - - @Override - public <T> Future<T> submit(Callable<T> task) { - return super.submit(TaskConverter.alertingCallable(task, handler)); - } - - @Override - public <T> Future<T> submit(Runnable task, T result) { - return super.submit(TaskConverter.alertingRunnable(task, handler), result); - } - - @Override - public Future<?> submit(Runnable task) { - return super.submit(TaskConverter.alertingRunnable(task, handler)); - } - - @Override - public <T> List<Future<T>> invokeAll( - Collection<? extends Callable<T>> tasks) throws InterruptedException { - - return super.invokeAll(TaskConverter.alertingCallables(tasks, handler)); - } - - @Override - public <T> List<Future<T>> invokeAll( - Collection<? extends Callable<T>> tasks, - long timeout, - TimeUnit unit) throws InterruptedException { - - return super.invokeAll(TaskConverter.alertingCallables(tasks, handler), timeout, unit); - } - - @Override - public <T> T invokeAny( - Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException { - - return super.invokeAny(TaskConverter.alertingCallables(tasks, handler)); - } - - @Override - public <T> T invokeAny( - Collection<? extends Callable<T>> tasks, - long timeout, - TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - - return super.invokeAny(TaskConverter.alertingCallables(tasks, handler), timeout, unit); - } -} http://git-wip-us.apache.org/repos/asf/aurora/blob/06ddaadb/commons/src/main/java/com/twitter/common/util/concurrent/ExceptionHandlingScheduledExecutorService.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/com/twitter/common/util/concurrent/ExceptionHandlingScheduledExecutorService.java b/commons/src/main/java/com/twitter/common/util/concurrent/ExceptionHandlingScheduledExecutorService.java deleted file mode 100644 index 474d612..0000000 --- a/commons/src/main/java/com/twitter/common/util/concurrent/ExceptionHandlingScheduledExecutorService.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.twitter.common.util.concurrent; - -import java.util.Collection; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.common.base.Throwables; -import com.google.common.collect.Collections2; - -/** - * A scheduled executor service that delegates to another executor service, invoking an uncaught - * exception handler if any exceptions are thrown in submitted work. - * - * @see MoreExecutors - */ -class ExceptionHandlingScheduledExecutorService - extends ForwardingExecutorService<ScheduledExecutorService> - implements ScheduledExecutorService { - private final Supplier<Thread.UncaughtExceptionHandler> handler; - - /** - * Construct a {@link ScheduledExecutorService} with a supplier of - * {@link Thread.UncaughtExceptionHandler} that handles exceptions thrown from submitted work. - */ - ExceptionHandlingScheduledExecutorService( - ScheduledExecutorService delegate, - Supplier<Thread.UncaughtExceptionHandler> handler) { - super(delegate); - this.handler = handler; - } - - @Override - public ScheduledFuture<?> schedule(Runnable runnable, long delay, TimeUnit timeUnit) { - return delegate.schedule(TaskConverter.alertingRunnable(runnable, handler), delay, timeUnit); - } - - @Override - public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit timeUnit) { - return delegate.schedule(TaskConverter.alertingCallable(callable, handler), delay, timeUnit); - } - - @Override - public ScheduledFuture<?> scheduleAtFixedRate( - Runnable runnable, long initialDelay, long period, TimeUnit timeUnit) { - return delegate.scheduleAtFixedRate( - TaskConverter.alertingRunnable(runnable, handler), initialDelay, period, timeUnit); - } - - @Override - public ScheduledFuture<?> scheduleWithFixedDelay( - Runnable runnable, long initialDelay, long delay, TimeUnit timeUnit) { - return delegate.scheduleWithFixedDelay( - TaskConverter.alertingRunnable(runnable, handler), initialDelay, delay, timeUnit); - } - - @Override - public <T> Future<T> submit(Callable<T> task) { - return delegate.submit(TaskConverter.alertingCallable(task, handler)); - } - - @Override - public <T> Future<T> submit(Runnable task, T result) { - return delegate.submit(TaskConverter.alertingRunnable(task, handler), result); - } - - @Override - public Future<?> submit(Runnable task) { - return delegate.submit(TaskConverter.alertingRunnable(task, handler)); - } - - @Override - public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) - throws InterruptedException { - return delegate.invokeAll(TaskConverter.alertingCallables(tasks, handler)); - } - - @Override - public <T> List<Future<T>> invokeAll( - Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) - throws InterruptedException { - return delegate.invokeAll(TaskConverter.alertingCallables(tasks, handler), timeout, unit); - } - - @Override - public <T> T invokeAny(Collection<? extends Callable<T>> tasks) - throws InterruptedException, ExecutionException { - return delegate.invokeAny(TaskConverter.alertingCallables(tasks, handler)); - } - - @Override - public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, TimeoutException { - return delegate.invokeAny(TaskConverter.alertingCallables(tasks, handler), timeout, unit); - } - - @Override - public void execute(Runnable command) { - delegate.execute(TaskConverter.alertingRunnable(command, handler)); - } -}