package org.geotoolkit.processing;
import org.geotoolkit.process.ProcessEvent;
import org.geotoolkit.process.ProcessListener;
import org.opengis.util.InternationalString;
/**
* A ProcessListener implementation that simplify progressing event spreading to parent process.
* This listener is used to update parent process progress value from child-process progressing.
* <p>
* Example :
* We have a {@code parent} process that execute a {@code child} process.
* The {@code parent} give arbitrarily 10% of his total work load to {@code child} process and start
* {@code child} process at 42% of his work.
* This listener will forward {@code child} progressing events from 42% to 52%;
* </p>
* <p>
* <code>
* Process child = new ChildProcess();
* child.addListener(new ForwardProcessListener(this, 42f, 10f));
* child.call();
* </code>
* </p>
*
* @author Quentin Boileau (Geomatys)
* @since 4.0
*/
public class ForwardProcessListener implements ProcessListener {
private final AbstractProcess parentProcess;
private final float taskPercentStart;
private final float taskWorkLength;
/**
* Constructor
* @param parentProcess process to forward events to
* @param taskPercentStart start percent from parent process
* @param taskWorkLength child process duration in percent
*/
public ForwardProcessListener(AbstractProcess parentProcess, float taskPercentStart, float taskWorkLength) {
this.parentProcess = parentProcess;
this.taskPercentStart = taskPercentStart;
this.taskWorkLength = taskWorkLength;
}
@Override
public void started(ProcessEvent processEvent) {
String processName = getProcessName(processEvent);
fireProgressing(processName+" : Start", taskPercentStart, null);
}
private String getProcessName(ProcessEvent processEvent) {
String processName = null;
try {
final InternationalString is = processEvent.getSource().getDescriptor().getDisplayName();
if (is != null) {
processName = is.toString();
}
if (processName == null) {
processName = processEvent.getSource().getDescriptor().getIdentifier().getCode();
}
} catch (Exception ex) {
processName = "";
}
return processName;
}
@Override
public void progressing(ProcessEvent processEvent) {
String processName = getProcessName(processEvent);
String msg = processName + " : " + processEvent.getTask().toString();
float progress = taskPercentStart + (taskWorkLength * (processEvent.getProgress() / 100f));
fireProgressing(msg, progress, processEvent.getException());
}
private void fireProgressing(String message, float progress, Exception ex) {
final ProcessEvent event = new ProcessEvent(parentProcess, message, progress, ex);
final ProcessListener[] listeners = parentProcess.getListeners();
for (ProcessListener listener : listeners) {
listener.progressing(event);
}
}
@Override
public void paused(ProcessEvent processEvent) {
//no forward
}
@Override
public void resumed(ProcessEvent processEvent) {
//no forward
}
@Override
public void completed(ProcessEvent processEvent) {
String processName = getProcessName(processEvent);
fireProgressing(processName+" : Completed", taskPercentStart+ taskWorkLength, null);
}
@Override
public void failed(ProcessEvent processEvent) {
//no forward
}
}