
com.enterprisemath.utils.engine.ExecutorServiceEngine Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of em-utils Show documentation
Show all versions of em-utils Show documentation
Collection of utility classes for large scale projects focusing on robust and testable code.
package com.enterprisemath.utils.engine;
import com.enterprisemath.utils.DatesProvider;
import com.enterprisemath.utils.DomainUtils;
import com.enterprisemath.utils.UniqueCodeGenerator;
import com.enterprisemath.utils.ValidationUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.exception.ExceptionUtils;
/**
* Implementation of engine which uses executor service.
*
* @author radek.hecl
*/
public class ExecutorServiceEngine implements Engine {
/**
* Builder object.
*/
public static class Builder {
/**
* Executor.
*/
private ExecutorService executor;
/**
* Provider for services.
*/
private TaskServiceProvider serviceProvider;
/**
* Listener for task run.
*/
private TaskRunListener listener;
/**
* Generator for unique code.
*/
private UniqueCodeGenerator uniqueCodeGenerator;
/**
* Provider for dates.
*/
private DatesProvider datesProvider;
/**
* Sets executor.
*
* @param executor executor
* @return this instance
*/
public Builder setExecutor(ExecutorService executor) {
this.executor = executor;
return this;
}
/**
* Sets provider for services.
*
* @param serviceProvider provider for services
* @return this instance
*/
public Builder setServiceProvider(TaskServiceProvider serviceProvider) {
this.serviceProvider = serviceProvider;
return this;
}
/**
* Sets listener.
*
* @param listener listener
* @return this instance
*/
public Builder setListener(TaskRunListener listener) {
this.listener = listener;
return this;
}
/**
* Set generator for unique codes.
*
* @param uniqueCodeGenerator generator for unique codes
* @return this instance
*/
public Builder setUniqueCodeGenerator(UniqueCodeGenerator uniqueCodeGenerator) {
this.uniqueCodeGenerator = uniqueCodeGenerator;
return this;
}
/**
* Sets provider for dates.
*
* @param datesProvider provider for dates
* @return this instance
*/
public Builder setDatesProvider(DatesProvider datesProvider) {
this.datesProvider = datesProvider;
return this;
}
/**
* Builds the result object.
*
* @return created object
*/
public ExecutorServiceEngine build() {
return new ExecutorServiceEngine(this);
}
}
/**
* Executor.
*/
private ExecutorService executor;
/**
* Provider for services.
*/
private TaskServiceProvider serviceProvider;
/**
* Listener for task run.
*/
private TaskRunListener listener;
/**
* Generator for unique code.
*/
private UniqueCodeGenerator uniqueCodeGenerator;
/**
* Provider for dates.
*/
private DatesProvider datesProvider;
/**
* Task handlers.
*/
private List handlers = new ArrayList();
/**
* Object for synchronization.
*/
private final Object lock = new Object();
/**
* Creates new instance.
*
* @param builder builder object
*/
public ExecutorServiceEngine(Builder builder) {
executor = builder.executor;
serviceProvider = builder.serviceProvider;
listener = builder.listener;
uniqueCodeGenerator = builder.uniqueCodeGenerator;
datesProvider = builder.datesProvider;
guardInvariants();
}
/**
* Guards this object to be consistent. Throws exception if this is not the case.
*/
private void guardInvariants() {
ValidationUtils.guardNotNull(executor, "executor cannot be null");
ValidationUtils.guardNotNull(serviceProvider, "serviceProvider cannot be null");
ValidationUtils.guardNotNull(listener, "listener cannot be null");
ValidationUtils.guardNotNull(uniqueCodeGenerator, "uniqueCodeGenerator cannot be null");
ValidationUtils.guardNotNull(datesProvider, "datesProvider cannot be null");
}
@Override
public EngineStatus getStatus() {
synchronized (lock) {
cleanHandlers();
EngineStatus.Builder res = new EngineStatus.Builder();
for (TaskHandler hdl : handlers) {
EngineTaskStatus ets = new EngineTaskStatus.Builder().
setCode(hdl.getCode()).
setTaskClass(hdl.task.getClass().getName()).
setProgress(hdl.task.getProgress()).
setStartTimestamp(hdl.startTimestamp).
build();
res.addTaskStatus(ets);
}
return res.build();
}
}
@Override
public TaskManager getTaskManager(String code) {
synchronized (lock) {
cleanHandlers();
for (TaskHandler hdl : handlers) {
if (hdl.getCode().equals(code)) {
return hdl;
}
}
return null;
}
}
@Override
public TaskManager run(TaskRunOrder order) {
synchronized (lock) {
TaskHandler handler = new TaskHandler(this, order);
Future
© 2015 - 2025 Weber Informatics LLC | Privacy Policy