use of org.geotoolkit.process.ProcessException in project geotoolkit by Geomatys.
the class ProcessJob method execute.
@Override
public void execute(final JobExecutionContext jec) throws JobExecutionException {
final JobDataMap parameters = jec.getJobDetail().getJobDataMap();
final Object objFactoryId = parameters.get(KEY_FACTORY_ID);
final Object objProcessId = parameters.get(KEY_PROCESS_ID);
final Object objProcessParams = parameters.get(KEY_PARAMETERS);
final Object objProcess = parameters.get(KEY_PROCESS);
if (!(objFactoryId instanceof String)) {
throw new JobExecutionException("Factory id is not String, value found : " + objFactoryId);
}
if (!(objProcessId instanceof String)) {
throw new JobExecutionException("Process id is not String, value found : " + objProcessId);
}
if (!(objProcessParams instanceof ParameterValueGroup)) {
throw new JobExecutionException("Parameters is not an ISO parameter, value found : " + objProcessParams);
}
if (objProcess != null && !(objProcess instanceof Process)) {
throw new JobExecutionException("Process object is invalid, value found : " + objProcess);
}
final String factoryId = (String) objFactoryId;
final String processId = (String) objProcessId;
final Parameters params = Parameters.castOrWrap((ParameterValueGroup) objProcessParams);
process = (Process) objProcess;
if (process == null) {
final ProcessDescriptor desc = getProcessDescriptor(factoryId, processId);
process = desc.createProcess(params);
}
final StoreExceptionMonitor monitor = new StoreExceptionMonitor();
process.addListener(monitor);
for (ProcessListener pl : listeners) {
process.addListener(pl);
}
// set the result int he context, for listener that might want it.
final ParameterValueGroup result;
try {
result = process.call();
} catch (ProcessException ex) {
if (monitor.failed != null) {
throw monitor.failed;
} else {
throw new JobExecutionException(ex);
}
}
jec.setResult(result);
}
use of org.geotoolkit.process.ProcessException in project geotoolkit by Geomatys.
the class ChainProcess method executeConditionalElement.
private boolean executeConditionalElement(final ElementCondition condition, final ParameterValueGroup inputs) throws ProcessException {
final FilterFactory ff = FilterUtilities.FF;
final String statement = condition.getExpression();
final String syntax = condition.getSyntax();
Filter filter = null;
if ("CQL".equalsIgnoreCase(syntax)) {
try {
filter = CQL.parseFilter(statement);
} catch (Exception ex) {
// maybe it's just an expression
}
if (filter == null) {
try {
final Expression exp = CQL.parseExpression(statement);
filter = ff.equal(exp, ff.literal(true));
} catch (Exception ex) {
throw new ProcessException("Unvalid CQL : " + statement, this, null);
}
}
} else if ("JAVASCRIPT".equalsIgnoreCase(syntax)) {
final Expression exp = ff.function(JavaScriptFunctionFactory.JAVASCRIPT, ff.literal(statement));
filter = ff.equal(exp, ff.literal(true));
} else if ("GROOVY".equalsIgnoreCase(syntax)) {
final Expression exp = ff.function(GroovyFunctionFactory.GROOVY, ff.literal(statement));
filter = ff.equal(exp, ff.literal(true));
} else {
throw new ProcessException("Unknwoned syntax : " + syntax + " supported sysntaxes are : CQL,Javascript,Groovy", this, null);
}
return filter.test(inputs);
}
use of org.geotoolkit.process.ProcessException 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.process.ProcessException in project geotoolkit by Geomatys.
the class Predictor method write.
private void write(final List<Output> outputs, final GridGeometry grid, final Instant startTime, final Path outputFile) throws IOException, InvalidRangeException, ProcessException {
MathTransform grid2Crs = grid.getGridToCRS(PixelInCell.CELL_CENTER);
if (!(grid2Crs instanceof AffineTransform)) {
throw new ProcessException("Unsupported case: grid 2 crs is not affine", this);
}
final AffineTransform g2c = (AffineTransform) grid2Crs;
Output.write(outputs, grid.getCoordinateReferenceSystem(), startTime.toEpochMilli(), g2c.getTranslateX(), g2c.getTranslateY(), g2c.getScaleX(), g2c.getScaleY(), outputFile.toString());
}
use of org.geotoolkit.process.ProcessException in project geotoolkit by Geomatys.
the class Predictor method initData.
private MeteoDataset initData() throws ProcessException {
final GridCoverageResource wind = inputParameters.getMandatoryValue(WIND_RESOURCE);
final GridCoverageResource current = inputParameters.getMandatoryValue(CURRENT_RESOURCE);
try {
return new SimpleMeteoDataset(new SimpleUVSource(wind), new SimpleUVSource(current));
} catch (DataStoreException e) {
throw new ProcessException("Incompatible data source", this, e);
}
}
Aggregations