use of org.geotoolkit.processing.chain.model.ElementProcess in project geotoolkit by Geomatys.
the class ChainProcessDemo method main.
public static void main(String[] args) throws ProcessException {
// produce a chain equivalent to : ($a + 10) / $b
final Chain chain = new Chain("myChain");
// input/out/constants parameters
final Parameter a = chain.addInputParameter("a", Double.class, "title", "desc", 1, 1, null);
final Parameter b = chain.addInputParameter("b", Double.class, "title", "desc", 1, 1, null);
final Parameter r = chain.addOutputParameter("r", Double.class, "title", "desc", 1, 1, null);
final Constant c = chain.addConstant(1, Double.class, 10d);
// chain blocks
final ElementProcess add = chain.addProcessElement(2, "math", "add");
final ElementProcess divide = chain.addProcessElement(3, "math", "divide");
// execution flow links
chain.addFlowLink(Element.BEGIN.getId(), add.getId());
chain.addFlowLink(add.getId(), divide.getId());
chain.addFlowLink(divide.getId(), Element.END.getId());
// data flow links
chain.addDataLink(Element.BEGIN.getId(), a.getCode(), add.getId(), "first");
chain.addDataLink(c.getId(), "", add.getId(), "second");
chain.addDataLink(add.getId(), "result", divide.getId(), "first");
chain.addDataLink(Element.BEGIN.getId(), b.getCode(), divide.getId(), "second");
chain.addDataLink(divide.getId(), "result", Element.END.getId(), r.getCode());
// ////////////////// execute the chain /////////////////////////////////
// create a process descriptor to use it like any process.
final ProcessDescriptor desc = new ChainProcessDescriptor(chain, new DefaultDataIdentification());
// input params
final ParameterValueGroup input = desc.getInputDescriptor().createValue();
input.parameter("a").setValue(15d);
input.parameter("b").setValue(2d);
final org.geotoolkit.process.Process process = desc.createProcess(input);
final ParameterValueGroup result = process.call();
System.out.println(result.parameter("r").getValue());
}
use of org.geotoolkit.processing.chain.model.ElementProcess in project geotoolkit by Geomatys.
the class EventChain method getDataType.
/**
* Return the Java class of a parameter or constant.
*
* @param obj Could be a Parameter, Constant or ChainElement
* @param in in case of ChainElement obj, search code in input or output parameters. True to search in inputs, false for outputs.
* @param code of the parameter in case of ChainElement obj.
* @return Class or ClassFull for Parameter.
*/
private Object getDataType(final Object obj, final boolean in, final String code) {
if (obj instanceof Parameter) {
final Parameter dto = (Parameter) obj;
return dto.getType();
} else if (obj instanceof Constant) {
final Constant dto = (Constant) obj;
return dto.getType();
} else if (obj instanceof ElementProcess) {
final ElementProcess dto = (ElementProcess) obj;
try {
final ProcessDescriptor pd = ProcessFinder.getProcessDescriptor(getFactories().iterator(), dto.getAuthority(), dto.getCode());
final GeneralParameterDescriptor gd = (in) ? pd.getInputDescriptor().descriptor(code) : pd.getOutputDescriptor().descriptor(code);
if (gd instanceof ExtendedParameterDescriptor) {
Object type = ((ExtendedParameterDescriptor) gd).getUserObject().get(ChainProcessDescriptor.KEY_DISTANT_CLASS);
if (type == null) {
// rely on base type
type = ((ExtendedParameterDescriptor) gd).getValueClass();
}
return type;
} else if (gd instanceof ParameterDescriptor) {
final Object type = ((ParameterDescriptor) gd).getValueClass();
return type;
}
} catch (NoSuchIdentifierException ex) {
return null;
}
}
return null;
}
use of org.geotoolkit.processing.chain.model.ElementProcess 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));
}
}
}
}
use of org.geotoolkit.processing.chain.model.ElementProcess in project geotoolkit by Geomatys.
the class ChainProcessTest method createBranchChain.
private Chain createBranchChain() {
// produce a chain equivalent to : (($a+10) > 20) ? *10 : /10
final Chain chain = new Chain("branchChain");
int id = 1;
// input/out/constants parameters
final Parameter a = chain.addInputParameter("a", Double.class, "title", "desc", 1, 1, null);
final Parameter r = chain.addOutputParameter("r", Double.class, "title", "desc", 1, 1, null);
final Constant c10 = chain.addConstant(id++, Double.class, 10d);
// chain blocks
final ElementProcess add = chain.addProcessElement(id++, "demo", "add");
final ElementProcess multi = chain.addProcessElement(id++, "demo", "multiply");
final ElementProcess divide = chain.addProcessElement(id++, "demo", "divide");
final ElementCondition condition = chain.addConditionElement(id++);
condition.getInputs().add(new Parameter("value", Double.class, "", "", 1, 1));
condition.setSyntax("CQL");
condition.setExpression("value > 20");
// execution flow links
chain.addFlowLink(BEGIN.getId(), add.getId());
chain.addFlowLink(add.getId(), condition.getId());
final FlowLink success = chain.addFlowLink(condition.getId(), multi.getId());
condition.getSuccess().add(success);
final FlowLink fail = chain.addFlowLink(condition.getId(), divide.getId());
condition.getFailed().add(fail);
chain.addFlowLink(divide.getId(), END.getId());
chain.addFlowLink(multi.getId(), END.getId());
// data flow links
chain.addDataLink(c10.getId(), "", add.getId(), "second");
chain.addDataLink(c10.getId(), "", multi.getId(), "second");
chain.addDataLink(c10.getId(), "", divide.getId(), "second");
chain.addDataLink(BEGIN.getId(), a.getCode(), add.getId(), "first");
chain.addDataLink(add.getId(), "result", condition.getId(), "value");
chain.addDataLink(add.getId(), "result", multi.getId(), "first");
chain.addDataLink(add.getId(), "result", divide.getId(), "first");
chain.addDataLink(divide.getId(), "result", END.getId(), r.getCode());
chain.addDataLink(multi.getId(), "result", END.getId(), r.getCode());
return chain;
}
use of org.geotoolkit.processing.chain.model.ElementProcess in project geotoolkit by Geomatys.
the class ChainProcessTest method createSimpleChain.
private Chain createSimpleChain() {
// produce a chain equivalent to : ($1 + 10) / $2
final Chain chain = new Chain("myChain");
int id = 1;
// input/out/constants parameters
final Parameter a = chain.addInputParameter("a", Double.class, "title", "desc", 1, 1, 2.0);
final Parameter b = chain.addInputParameter("b", Double.class, "title", "desc", 1, 1, 3.0);
final Parameter r = chain.addOutputParameter("r", Double.class, "title", "desc", 1, 1, null);
final Constant c = chain.addConstant(id++, Double.class, 10d);
// chain blocks
final ElementProcess add = chain.addProcessElement(id++, "demo", "add");
final ElementProcess divide = chain.addProcessElement(id++, "demo", "divide");
// execution flow links
chain.addFlowLink(BEGIN.getId(), add.getId());
chain.addFlowLink(add.getId(), divide.getId());
chain.addFlowLink(divide.getId(), END.getId());
// data flow links
chain.addDataLink(BEGIN.getId(), a.getCode(), add.getId(), "first");
chain.addDataLink(c.getId(), "", add.getId(), "second");
chain.addDataLink(add.getId(), "result", divide.getId(), "first");
chain.addDataLink(BEGIN.getId(), b.getCode(), divide.getId(), "second");
chain.addDataLink(divide.getId(), "result", END.getId(), r.getCode());
return chain;
}
Aggregations