001 /*
002 * Copyright (c) 2011, Cloudera, Inc. All Rights Reserved.
003 *
004 * Cloudera, Inc. licenses this file to you under the Apache License,
005 * Version 2.0 (the "License"). You may not use this file except in
006 * compliance with the License. You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * This software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
011 * CONDITIONS OF ANY KIND, either express or implied. See the License for
012 * the specific language governing permissions and limitations under the
013 * License.
014 */
015 package com.cloudera.lib.lang;
016
017 import com.cloudera.lib.util.Check;
018
019 import java.util.concurrent.Callable;
020
021 /**
022 * Adapter class that allows <code>Runnable</code>s and <code>Callable</code>s to
023 * be treated as the other.
024 */
025 public class RunnableCallable implements Callable<Void>, Runnable {
026 private Runnable runnable;
027 private Callable<?> callable;
028
029 /**
030 * Constructor that takes a runnable.
031 *
032 * @param runnable runnable.
033 */
034 public RunnableCallable(Runnable runnable) {
035 this.runnable = Check.notNull(runnable, "runnable");
036 }
037
038 /**
039 * Constructor that takes a callable.
040 * @param callable callable.
041 */
042 public RunnableCallable(Callable<?> callable) {
043 this.callable = Check.notNull(callable, "callable");
044 }
045
046 /**
047 * Invokes the wrapped callable/runnable as a callable.
048 * @return void
049 * @throws Exception thrown by the wrapped callable/runnable invocation.
050 */
051 @Override
052 public Void call() throws Exception {
053 if (runnable != null) {
054 runnable.run();
055 }
056 else {
057 callable.call();
058 }
059 return null;
060 }
061
062 /**
063 * Invokes the wrapped callable/runnable as a runnable.
064 * @return void
065 * @throws Exception thrown by the wrapped callable/runnable invocation.
066 */
067 @Override
068 public void run() {
069 if (runnable != null) {
070 runnable.run();
071 }
072 else {
073 try {
074 callable.call();
075 }
076 catch (Exception ex) {
077 throw new RuntimeException(ex);
078 }
079 }
080 }
081
082 /**
083 * Returns the class name of the wrapper callable/runnable.
084 *
085 * @return the class name of the wrapper callable/runnable.
086 */
087 public String toString() {
088 return (runnable != null) ? runnable.getClass().getSimpleName() : callable.getClass().getSimpleName();
089 }
090 }