use of org.geotoolkit.processing.chain.model.Chain 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.Chain in project geotoolkit by Geomatys.
the class ChainProcess method toString.
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[ChainProcess]");
final Chain chain = getDescriptor().getModel();
if (chain != null) {
sb.append("Chain: \n");
sb.append("elements:\n");
for (Element element : chain.getElements()) {
sb.append(element).append('\n');
}
}
return sb.toString();
}
use of org.geotoolkit.processing.chain.model.Chain 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.Chain in project geotoolkit by Geomatys.
the class ChainProcessTest method testBranchXmlRW.
@Test
public void testBranchXmlRW() throws ProcessException, JAXBException, IOException {
final Chain before = createBranchChain();
final File f = File.createTempFile("chain", ".xml");
before.write(f);
final Chain chain = Chain.read(f);
// process registries to use
final Set<MockProcessRegistry> registries = Collections.singleton(new MockProcessRegistry());
// create a process descriptor to use it like any process.
final ProcessDescriptor desc = new ChainProcessDescriptor(chain, MockProcessRegistry.IDENTIFICATION, registries);
// input params , condition evaluates to TRUE----------------------------
ParameterValueGroup input = desc.getInputDescriptor().createValue();
input.parameter("a").setValue(15d);
Process process = desc.createProcess(input);
ParameterValueGroup result = process.call();
assertEquals(250d, result.parameter("r").doubleValue(), 0.000001);
// input params , condition evaluates to FALSE---------------------------
input = desc.getInputDescriptor().createValue();
input.parameter("a").setValue(-5d);
process = desc.createProcess(input);
result = process.call();
assertEquals(0.5d, result.parameter("r").doubleValue(), 0.000001);
}
use of org.geotoolkit.processing.chain.model.Chain in project geotoolkit by Geomatys.
the class ChainProcessTest method testSimpleXmlRW.
@Test
public void testSimpleXmlRW() throws ProcessException, JAXBException, IOException {
final Chain before = createSimpleChain();
final File f = File.createTempFile("chain", ".xml");
before.write(f);
final Chain chain = Chain.read(f);
// assert that default value are not lost
assertNotNull(chain.getInput("a"));
assertNotNull(chain.getInput("a").getDefaultValue());
// process registries to use
final Set<MockProcessRegistry> registries = Collections.singleton(new MockProcessRegistry());
// create a process descriptor to use it like any process.
final ProcessDescriptor desc = new ChainProcessDescriptor(chain, MockProcessRegistry.IDENTIFICATION, registries);
// input params
final ParameterValueGroup input = desc.getInputDescriptor().createValue();
input.parameter("a").setValue(15d);
input.parameter("b").setValue(2d);
final Process process = desc.createProcess(input);
final ParameterValueGroup result = process.call();
assertEquals(12.5d, result.parameter("r").doubleValue(), 0.000001);
}
Aggregations