/* (c) 2015 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wps.executor; import java.util.Map; import java.util.logging.Logger; import org.geoserver.platform.ExtensionPriority; import org.geoserver.wps.process.DelegatingProcessFactory; import org.geoserver.wps.process.ProcessFilter; import org.geotools.process.Process; import org.geotools.process.ProcessException; import org.geotools.process.ProcessFactory; import org.geotools.util.DelegateProgressListener; import org.geotools.util.logging.Logging; import org.opengis.feature.type.Name; import org.opengis.util.ProgressListener; /** * A process filter making sure the {@link ProgressListener#started()} method is called upon execution * no matter if the process has inputs or not * * @author Andrea Aime - GeoSolutions * */ public class ProcessStartupFilter implements ProcessFilter, ExtensionPriority { public class ProcessStartupWrapper implements Process { Process delegate; public ProcessStartupWrapper(Process delegate) { super(); this.delegate = delegate; } @Override public Map<String, Object> execute(Map<String, Object> input, ProgressListener monitor) throws ProcessException { if(monitor != null) { monitor.started(); monitor = new DelegateProgressListener(monitor) { @Override public void started() { // do not pass over, we already called "started" } }; } return delegate.execute(input, monitor); } } static final Logger LOGGER = Logging.getLogger(ProcessStartupFilter.class); @Override public ProcessFactory filterFactory(ProcessFactory pf) { return new ProcessStartupFactory(pf); } class ProcessStartupFactory extends DelegatingProcessFactory { public ProcessStartupFactory(ProcessFactory delegate) { super(delegate); } @Override public Process create(Name name) { Process process = delegate.create(name); return new ProcessStartupWrapper(process); } } @Override public int getPriority() { return ExtensionPriority.LOWEST + 1; } }