blob: 3e1c7bbbfb23330bbae428540641689289e796c0 [file] [log] [blame]
/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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.google.dart.engine.services.internal.util;
import com.google.dart.engine.AnalysisEngine;
/**
* Utilities for executing actions, such as {@link RunnableObjectEx}.
*/
public class ExecutionUtils {
/**
* Helper class used in {@link #propagate(Throwable)}.
*/
private static class ExceptionThrower {
private static Throwable throwable;
public static synchronized void spit(Throwable t) {
if (System.getProperty("de.ExecutionUtils.propagate().dontThrow") == null) {
ExceptionThrower.throwable = t;
try {
ExceptionThrower.class.newInstance();
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
} finally {
ExceptionThrower.throwable = null;
}
}
}
private ExceptionThrower() throws Throwable {
if (System.getProperty("de.ExecutionUtils.propagate().InstantiationException") != null) {
throw new InstantiationException();
}
if (System.getProperty("de.ExecutionUtils.propagate().IllegalAccessException") != null) {
throw new IllegalAccessException();
}
throw throwable;
}
}
/**
* Propagates {@code Throwable} as-is without any wrapping. This is trick.
*
* @return nothing will ever be returned; this return type is only for your convenience, to use
* this method in "throw" statement.
*/
public static RuntimeException propagate(Throwable throwable) {
if (System.getProperty("de.ExecutionUtils.propagate().forceReturn") == null) {
ExceptionThrower.spit(throwable);
}
return null;
}
/**
* Runs given {@link RunnableEx} and ignores exception.
*
* @return <code>true</code> if execution was done without exception.
*/
public static boolean runIgnore(RunnableEx runnable) {
try {
runnable.run();
return true;
} catch (Throwable e) {
}
return false;
}
/**
* Runs given {@link RunnableEx} and logs exception.
*/
public static boolean runLog(RunnableEx runnable) {
try {
runnable.run();
return true;
} catch (Throwable e) {
AnalysisEngine.getInstance().getLogger().logError("Exception thrown in runnable", e);
return false;
}
}
/**
* Runs given {@link RunnableObjectEx} and re-throws exception.
*
* @return the {@link Object} returned by {@link RunnableObjectEx#run()}.
*/
public static <T> T runObject(RunnableObjectEx<T> runnable) {
try {
return runnable.runObject();
} catch (Throwable e) {
throw propagate(e);
}
}
/**
* Runs given {@link RunnableObjectEx} and ignores exception.
*
* @return the {@link Object} returned by {@link RunnableObjectEx#run()}, or default value if
* exception happens.
*/
public static <T> T runObjectIgnore(RunnableObjectEx<T> runnable, T defaultValue) {
try {
return runnable.runObject();
} catch (Throwable e) {
return defaultValue;
}
}
/**
* Runs given {@link RunnableEx} and re-throws any exceptions without declaring it.
*/
public static void runRethrow(RunnableEx runnable) {
try {
runnable.run();
} catch (Throwable e) {
propagate(e);
}
}
}