/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.toolkit.modules.concurrency.internal;
import java.util.List;
import java.util.concurrent.Callable;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.toolkit.modules.concurrency.api.AsyncExceptionListener;
import de.rcenvironment.toolkit.modules.concurrency.api.AsyncTaskService;
import de.rcenvironment.toolkit.modules.concurrency.api.RunnablesGroup;
import de.rcenvironment.toolkit.modules.concurrency.api.TaskDescription;
/**
* Default implementation of {@link RunnablesGroup}. This current implementation simply delegates to {@link CallablesGroupImpl}.
*
* @author Robert Mischke
*/
public final class RunnablesGroupImpl extends CallablesGroupImpl<RuntimeException> implements RunnablesGroup {
// frequently instantiated, so use a static logger to avoid overhead
private static final Log sharedLog = LogFactory.getLog(CallablesGroupImpl.class);
public RunnablesGroupImpl(AsyncTaskService asyncTaskService) {
super(asyncTaskService);
}
@Override
public void add(final Runnable task) {
add(new Callable<RuntimeException>() {
@Override
@TaskDescription("Internal RunnablesGroup task delegate")
public RuntimeException call() throws Exception {
// CHECKSTYLE:DISABLE (IllegalCatch) - Throwables should not slip through, e.g. for unit assertion tests
try {
task.run();
return null;
} catch (Throwable e) {
return wrapIfNecessary(e);
}
// CHECKSTYLE:ENABLE (IllegalCatch)
}
private RuntimeException wrapIfNecessary(Throwable e) {
if (e instanceof RuntimeException) {
sharedLog.debug("Caught asynchronous exception", e);
return (RuntimeException) e;
} else {
sharedLog.error("Non-RTE throwable caught:", e);
return new RuntimeException(e);
}
}
});
}
@Override
public List<RuntimeException> executeParallel() {
return super.executeParallel(new AsyncExceptionListener() {
@Override
public void onAsyncException(Exception e) {
sharedLog.error("Uncaught exception in RunnablesGroup", e);
}
});
}
}