use of org.geotoolkit.processing.AbstractProcess in project geotoolkit by Geomatys.
the class ProcessJobDetail method getListeners.
public List<ProcessListener> getListeners() {
final List<ProcessListener> listeners = new ArrayList<>();
if (getJobDataMap().get(KEY_PROCESS) != null) {
final AbstractProcess process = (AbstractProcess) getJobDataMap().get(KEY_PROCESS);
Collections.addAll(listeners, process.getListeners());
}
return listeners;
}
use of org.geotoolkit.processing.AbstractProcess in project geotoolkit by Geomatys.
the class ChainProcess method execute.
/**
* {@inheritDoc}
*/
@Override
protected void execute() throws ProcessException {
final Chain model = getDescriptor().getModel();
// processing progress
final float workLoadPart = 100 / model.getElements().size();
float currentProgress = 0;
int i = 1;
final Collection<FlowNode> nodes = Flow.createFlow(model);
List<List<FlowNode>> ranked = Flow.sortByRank(nodes);
// prepare all parameters for each process step
final Map<Integer, ParameterValueGroup> configs = new HashMap<>();
for (FlowNode node : nodes) {
final Object obj = node.getObject();
if (obj == ElementProcess.END) {
configs.put(Integer.MAX_VALUE, outputParameters);
} else if (obj == ElementProcess.BEGIN) {
// do nothing
} else if (obj instanceof ElementProcess) {
final ElementProcess element = (ElementProcess) obj;
final ProcessDescriptor desc;
try {
desc = getProcessDescriptor(element);
} catch (NoSuchIdentifierException ex) {
throw new ProcessException("Sub process " + element.getAuthority() + "." + element.getCode() + " not found.", this, ex);
}
configs.put(element.getId(), desc.getInputDescriptor().createValue());
} else if (obj instanceof ElementCondition) {
final ElementCondition element = (ElementCondition) obj;
if (element.getFailed().isEmpty() || element.getSuccess().isEmpty()) {
throw new ProcessException("A conditional element should have at least one success AND one failed execution link.", this, null);
}
configs.put(element.getId(), ChainProcessDescriptor.createParams(element.getInputs(), "conditionInput", true).createValue());
}
}
// set all constant values in configurations
for (Constant cst : model.getConstants()) {
// copy constant in children nodes
final Object value = ConstantUtilities.stringToValue(cst.getValue(), cst.getType());
for (DataLink link : model.getInputLinks(cst.getId())) {
setValue(value, configs.get(link.getTargetId()).parameter(link.getTargetCode()));
}
}
// Will contain all the versions of processes used
final StringBuilder processVersion = new StringBuilder();
// run processes in order
for (int j = 0; j < ranked.size(); j++) {
final List<FlowNode> rank = ranked.get(j);
currentProgress = (i - 1) * workLoadPart;
for (FlowNode node : rank) {
final Object obj = node.getObject();
if (obj == ElementProcess.BEGIN) {
// copy input params in children nodes
for (DataLink link : model.getInputLinks(Integer.MIN_VALUE)) {
List<ParameterValue> values = getValues(inputParameters, link.getSourceCode());
boolean first = true;
for (ParameterValue paramValue : values) {
if (first) {
final Object value = paramValue.getValue();
setValue(value, configs.get(link.getTargetId()).parameter(link.getTargetCode()));
first = false;
} else {
final Object value = paramValue.getValue();
final ParameterDescriptor desc = (ParameterDescriptor) configs.get(link.getTargetId()).getDescriptor().descriptor(link.getTargetCode());
final ParameterValue newParam = new DefaultParameterValue(desc);
setValue(value, newParam);
configs.get(link.getTargetId()).values().add(newParam);
}
}
}
} else if (obj == ElementProcess.END) {
// do nothing
} else if (obj instanceof ElementProcess) {
// handle process cancel
stopIfDismissed();
// handle process pause
if (isPaused()) {
fireProcessPaused(descriptor.getIdentifier().getCode() + " paused", currentProgress);
while (isPaused()) {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
LOGGER.log(Level.WARNING, "Interruption while process is in pause", ex);
}
}
fireProcessResumed(descriptor.getIdentifier().getCode() + " resumed", currentProgress);
}
// execute process
final ElementProcess element = (ElementProcess) obj;
final ParameterValueGroup config = configs.get(element.getId());
final ProcessDescriptor pdesc;
try {
pdesc = getProcessDescriptor(element);
} catch (NoSuchIdentifierException ex) {
throw new ProcessException("Sub process not found", this, ex);
}
currentProcess = pdesc.createProcess(config);
currentProcess.addListener(new ForwardProcessListener(this, currentProgress, workLoadPart));
if (currentProcess instanceof AbstractProcess) {
((AbstractProcess) currentProcess).setJobId(jobId);
}
final String processId = pdesc.getIdentifier().getCode();
// Fill process version with values coming from the current process.
if (processVersion.length() > 0) {
processVersion.append(", ");
}
processVersion.append(processId).append(" ");
if (currentProcess.getDescriptor() instanceof AbstractProcessDescriptor) {
processVersion.append(((AbstractProcessDescriptor) currentProcess.getDescriptor()).getVersion());
} else {
processVersion.append("1.0");
}
final ParameterValueGroup result = currentProcess.call();
// fireProgressing(pdesc.getIdentifier().getCode() + " completed", i * part, false);
i++;
// set result in children
for (DataLink link : model.getInputLinks(element.getId())) {
final List<ParameterValue> values = getValues(result, link.getSourceCode());
boolean first = true;
for (ParameterValue paramValue : values) {
if (first) {
final Object value = paramValue.getValue();
setValue(value, configs.get(link.getTargetId()).parameter(link.getTargetCode()));
first = false;
} else {
final Object value = paramValue.getValue();
final ParameterDescriptor desc = (ParameterDescriptor) configs.get(link.getTargetId()).getDescriptor().descriptor(link.getTargetCode());
final ParameterValue newParam = new DefaultParameterValue(desc);
setValue(value, newParam);
configs.get(link.getTargetId()).values().add(newParam);
}
}
}
} else if (obj instanceof ElementCondition) {
final ElementCondition condition = (ElementCondition) obj;
final Boolean result = executeConditionalElement(condition, configs.get(condition.getId()));
final Chain updateModel = new Chain(model);
if (result) {
updateModel.getFlowLinks().removeAll(condition.getFailed());
} else {
updateModel.getFlowLinks().removeAll(condition.getSuccess());
}
ranked = Flow.sortByRank(Flow.createFlow(updateModel));
}
}
}
}
Aggregations