org.geoserver.wps.DeprecatedProcessFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.wps.DeprecatedProcessFactory.java

Source

/* Copyright (c) 2001 - 2013 OpenPlans - www.openplans.org. All rights reserved.
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package org.geoserver.wps;

import java.awt.RenderingHints.Key;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.geoserver.config.ConfigurationListener;
import org.geoserver.config.ConfigurationListenerAdapter;
import org.geoserver.config.GeoServer;
import org.geoserver.config.ServiceInfo;
import org.geoserver.platform.ContextLoadedEvent;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.wps.process.GeoServerProcessors;
import org.geotools.data.Parameter;
import org.geotools.feature.NameImpl;
import org.geotools.process.Process;
import org.geotools.process.ProcessFactory;
import org.geotools.process.Processors;
import org.geotools.text.Text;
import org.opengis.feature.type.Name;
import org.opengis.util.InternationalString;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.ContextStartedEvent;

/**
 * Process factory that maintains backward compatibility for deprecated process names.
 * 
 * @author Justin Deoliveira, OpenGeo
 *
 */
public class DeprecatedProcessFactory
        implements ProcessFactory, DisposableBean, ApplicationListener<ApplicationEvent> {

    volatile Map<Name, Name> map;

    GeoServer geoServer;
    ConfigurationListener listener;

    public DeprecatedProcessFactory() {
        Processors.addProcessFactory(this);
    }

    @Override
    public void destroy() throws Exception {
        if (geoServer != null) {
            geoServer.removeListener(listener);
        }
    }

    @Override
    public boolean isAvailable() {
        return true;
    }

    @Override
    public Map<Key, ?> getImplementationHints() {
        return null;
    }

    @Override
    public InternationalString getTitle() {
        return Text.text("Deprecated processes");
    }

    @Override
    public Set<Name> getNames() {
        return getProcessMappings().keySet();
    }

    @Override
    public InternationalString getTitle(Name name) {
        return doAction(name, new Action<InternationalString>() {
            @Override
            public InternationalString perform(ProcessFactory f, Name oldName, Name newName, Object... args) {
                return f.getTitle(newName);
            }
        });
    }

    @Override
    public InternationalString getDescription(Name name) {
        return doAction(name, new Action<InternationalString>() {
            @Override
            public InternationalString perform(ProcessFactory f, Name oldName, Name newName, Object... args) {
                return f.getDescription(newName);
            }
        });
    }

    @Override
    public String getVersion(Name name) {
        return doAction(name, new Action<String>() {
            @Override
            public String perform(ProcessFactory f, Name oldName, Name newName, Object... args) {
                return f.getVersion(newName);
            }
        });
    }

    @Override
    public Map<String, Parameter<?>> getParameterInfo(Name name) {
        return doAction(name, new Action<Map<String, Parameter<?>>>() {
            @Override
            public Map<String, Parameter<?>> perform(ProcessFactory f, Name oldName, Name newName, Object... args) {
                return f.getParameterInfo(newName);
            }
        });
    }

    @Override
    public Map<String, Parameter<?>> getResultInfo(Name name, Map<String, Object> parameters)
            throws IllegalArgumentException {
        return doAction(name, new Action<Map<String, Parameter<?>>>() {
            @Override
            public Map<String, Parameter<?>> perform(ProcessFactory f, Name oldName, Name newName, Object... args) {
                return f.getResultInfo(newName, (Map<String, Object>) args[0]);
            }
        }, parameters);
    }

    @Override
    public boolean supportsProgress(Name name) {
        Boolean b = doAction(name, new Action<Boolean>() {
            @Override
            public Boolean perform(ProcessFactory f, Name oldName, Name newName, Object... args) {
                return f.supportsProgress(newName);
            }
        });
        return b != null ? b : false;
    }

    @Override
    public Process create(Name name) {
        return doAction(name, new Action<Process>() {
            @Override
            public Process perform(ProcessFactory f, Name oldName, Name newName, Object... args) {
                return f.create(newName);
            }
        });
    }

    interface Action<T> {
        T perform(ProcessFactory f, Name oldName, Name newName, Object... args);
    }

    <T> T doAction(Name oldName, Action<T> a, Object... args) {
        Map<Name, Name> map = getProcessMappings();
        if (map.containsKey(oldName)) {
            Name newName = map.get(oldName);
            ProcessFactory pf = GeoServerProcessors.createProcessFactory(newName);
            if (pf != null) {
                return a.perform(pf, oldName, newName, args);
            }
        }
        return null;
    }

    Map<Name, Name> getProcessMappings() {
        if (map == null) {
            synchronized (DeprecatedProcessFactory.class) {
                if (map == null) {
                    map = new LinkedHashMap();

                    //JTS namespace
                    registerProcessMapping(new NameImpl("JTS", "length"), new NameImpl("geo", "length"), map);
                    registerProcessMapping(new NameImpl("JTS", "isEmpty"), new NameImpl("geo", "isEmpty"), map);
                    registerProcessMapping(new NameImpl("JTS", "contains"), new NameImpl("geo", "contains"), map);
                    registerProcessMapping(new NameImpl("JTS", "disjoint"), new NameImpl("geo", "disjoint"), map);
                    registerProcessMapping(new NameImpl("JTS", "intersects"), new NameImpl("geo", "intersects"),
                            map);
                    registerProcessMapping(new NameImpl("JTS", "isClosed"), new NameImpl("geo", "isClosed"), map);
                    registerProcessMapping(new NameImpl("JTS", "isValid"), new NameImpl("geo", "isValid"), map);
                    registerProcessMapping(new NameImpl("JTS", "buffer"), new NameImpl("geo", "buffer"), map);
                    registerProcessMapping(new NameImpl("JTS", "getY"), new NameImpl("geo", "getY"), map);
                    registerProcessMapping(new NameImpl("JTS", "getX"), new NameImpl("geo", "getX"), map);
                    registerProcessMapping(new NameImpl("JTS", "union"), new NameImpl("geo", "union"), map);
                    registerProcessMapping(new NameImpl("JTS", "intersection"), new NameImpl("geo", "intersection"),
                            map);
                    registerProcessMapping(new NameImpl("JTS", "difference"), new NameImpl("geo", "difference"),
                            map);
                    registerProcessMapping(new NameImpl("JTS", "distance"), new NameImpl("geo", "distance"), map);
                    registerProcessMapping(new NameImpl("JTS", "envelope"), new NameImpl("geo", "envelope"), map);
                    registerProcessMapping(new NameImpl("JTS", "dimension"), new NameImpl("geo", "dimension"), map);
                    registerProcessMapping(new NameImpl("JTS", "overlaps"), new NameImpl("geo", "overlaps"), map);
                    registerProcessMapping(new NameImpl("JTS", "reproject"), new NameImpl("geo", "reproject"), map);
                    registerProcessMapping(new NameImpl("JTS", "simplify"), new NameImpl("geo", "simplify"), map);
                    registerProcessMapping(new NameImpl("JTS", "isSimple"), new NameImpl("geo", "isSimple"), map);
                    registerProcessMapping(new NameImpl("JTS", "equalsExact"), new NameImpl("geo", "equalsExact"),
                            map);
                    registerProcessMapping(new NameImpl("JTS", "getGeometryN"), new NameImpl("geo", "getGeometryN"),
                            map);
                    registerProcessMapping(new NameImpl("JTS", "isWithinDistance"),
                            new NameImpl("geo", "isWithinDistance"), map);
                    registerProcessMapping(new NameImpl("JTS", "touches"), new NameImpl("geo", "touches"), map);
                    registerProcessMapping(new NameImpl("JTS", "crosses"), new NameImpl("geo", "crosses"), map);
                    registerProcessMapping(new NameImpl("JTS", "within"), new NameImpl("geo", "within"), map);
                    registerProcessMapping(new NameImpl("JTS", "relate"), new NameImpl("geo", "relate"), map);
                    registerProcessMapping(new NameImpl("JTS", "convexHull"), new NameImpl("geo", "convexHull"),
                            map);
                    registerProcessMapping(new NameImpl("JTS", "symDifference"),
                            new NameImpl("geo", "symDifference"), map);
                    registerProcessMapping(new NameImpl("JTS", "centroid"), new NameImpl("geo", "centroid"), map);
                    registerProcessMapping(new NameImpl("JTS", "interiorPoint"),
                            new NameImpl("geo", "interiorPoint"), map);
                    registerProcessMapping(new NameImpl("JTS", "numPoints"), new NameImpl("geo", "numPoints"), map);
                    registerProcessMapping(new NameImpl("JTS", "area"), new NameImpl("geo", "area"), map);
                    registerProcessMapping(new NameImpl("JTS", "isRing"), new NameImpl("geo", "isRing"), map);
                    registerProcessMapping(new NameImpl("JTS", "exteriorRing"), new NameImpl("geo", "exteriorRing"),
                            map);
                    registerProcessMapping(new NameImpl("JTS", "numInteriorRing"),
                            new NameImpl("geo", "numInteriorRing"), map);
                    registerProcessMapping(new NameImpl("JTS", "numGeometries"),
                            new NameImpl("geo", "numGeometries"), map);
                    registerProcessMapping(new NameImpl("JTS", "geometryType"), new NameImpl("geo", "geometryType"),
                            map);
                    registerProcessMapping(new NameImpl("JTS", "boundary"), new NameImpl("geo", "boundary"), map);
                    registerProcessMapping(new NameImpl("JTS", "densify"), new NameImpl("geo", "densify"), map);
                    registerProcessMapping(new NameImpl("JTS", "relatePattern"),
                            new NameImpl("geo", "relatePattern"), map);
                    registerProcessMapping(new NameImpl("JTS", "equalsExactTolerance"),
                            new NameImpl("geo", "equalsExactTolerance"), map);
                    registerProcessMapping(new NameImpl("JTS", "pointN"), new NameImpl("geo", "pointN"), map);
                    registerProcessMapping(new NameImpl("JTS", "startPoint"), new NameImpl("geo", "startPoint"),
                            map);
                    registerProcessMapping(new NameImpl("JTS", "endPoint"), new NameImpl("geo", "endPoint"), map);
                    registerProcessMapping(new NameImpl("JTS", "interiorRingN"),
                            new NameImpl("geo", "interiorRingN"), map);
                    registerProcessMapping(new NameImpl("JTS", "polygonize"), new NameImpl("geo", "polygonize"),
                            map);
                    registerProcessMapping(new NameImpl("JTS", "splitPolygon"), new NameImpl("geo", "splitPolygon"),
                            map);

                    //gs geometry processes
                    registerProcessMapping(new NameImpl("gs", "ReprojectGeometry"),
                            new NameImpl("geo", "reproject"), map);

                    //gs feature processes
                    registerProcessMapping(new NameImpl("gs", "Aggregate"), new NameImpl("vec", "Aggregate"), map);
                    registerProcessMapping(new NameImpl("gs", "Bounds"), new NameImpl("vec", "Bounds"), map);
                    registerProcessMapping(new NameImpl("gs", "BufferFeatureCollection"),
                            new NameImpl("vec", "BufferFeatureCollection"), map);
                    registerProcessMapping(new NameImpl("gs", "Centroid"), new NameImpl("vec", "Centroid"), map);
                    registerProcessMapping(new NameImpl("gs", "Clip"), new NameImpl("vec", "Clip"), map);
                    registerProcessMapping(new NameImpl("gs", "CollectGeometries"),
                            new NameImpl("vec", "CollectGeometries"), map);
                    registerProcessMapping(new NameImpl("gs", "Count"), new NameImpl("vec", "Count"), map);
                    registerProcessMapping(new NameImpl("gs", "Feature"), new NameImpl("vec", "Feature"), map);
                    registerProcessMapping(new NameImpl("gs", "Grid"), new NameImpl("vec", "Grid"), map);
                    registerProcessMapping(new NameImpl("gs", "InclusionFeatureCollection"),
                            new NameImpl("vec", "InclusionFeatureCollection"), map);
                    registerProcessMapping(new NameImpl("gs", "IntersectionFeatureCollection"),
                            new NameImpl("vec", "IntersectionFeatureCollection"), map);
                    registerProcessMapping(new NameImpl("gs", "LRSGeocode"), new NameImpl("vec", "LRSGeocode"),
                            map);
                    registerProcessMapping(new NameImpl("gs", "LRSMeasure"), new NameImpl("vec", "LRSMeasure"),
                            map);
                    registerProcessMapping(new NameImpl("gs", "LRSSegment"), new NameImpl("vec", "LRSSegment"),
                            map);
                    registerProcessMapping(new NameImpl("gs", "Nearest"), new NameImpl("vec", "Nearest"), map);
                    registerProcessMapping(new NameImpl("gs", "PointBuffers"), new NameImpl("vec", "PointBuffers"),
                            map);
                    registerProcessMapping(new NameImpl("gs", "PointStacker"), new NameImpl("vec", "PointStacker"),
                            map);
                    registerProcessMapping(new NameImpl("gs", "Query"), new NameImpl("vec", "Query"), map);
                    registerProcessMapping(new NameImpl("gs", "RectangularClip"),
                            new NameImpl("vec", "RectangularClip"), map);
                    registerProcessMapping(new NameImpl("gs", "Reproject"), new NameImpl("vec", "Reproject"), map);
                    registerProcessMapping(new NameImpl("gs", "Simplify"), new NameImpl("vec", "Simplify"), map);
                    registerProcessMapping(new NameImpl("gs", "Snap"), new NameImpl("vec", "Snap"), map);
                    registerProcessMapping(new NameImpl("gs", "Transform"), new NameImpl("vec", "Transform"), map);
                    registerProcessMapping(new NameImpl("gs", "UnionFeatureCollection"),
                            new NameImpl("vec", "UnionFeatureCollection"), map);
                    registerProcessMapping(new NameImpl("gs", "Unique"), new NameImpl("vec", "Unique"), map);
                    registerProcessMapping(new NameImpl("gs", "VectorZonalStatistics"),
                            new NameImpl("vec", "VectorZonalStatistics"), map);
                    registerProcessMapping(new NameImpl("gs", "Heatmap"), new NameImpl("vec", "Heatmap"), map);
                    registerProcessMapping(new NameImpl("gs", "BarnesSurface"),
                            new NameImpl("vec", "BarnesSurface"), map);

                    //gs raster processes
                    registerProcessMapping(new NameImpl("gs", "AddCoverages"), new NameImpl("ras", "AddCoverages"),
                            map);
                    registerProcessMapping(new NameImpl("gs", "AreaGrid"), new NameImpl("ras", "AreaGrid"), map);
                    registerProcessMapping(new NameImpl("gs", "Contour"), new NameImpl("ras", "Contour"), map);
                    registerProcessMapping(new NameImpl("gs", "CropCoverage"), new NameImpl("ras", "CropCoverage"),
                            map);
                    registerProcessMapping(new NameImpl("gs", "MultiplyCoverages"),
                            new NameImpl("ras", "MultiplyCoverages"), map);
                    registerProcessMapping(new NameImpl("gs", "PolygonExtraction"),
                            new NameImpl("ras", "PolygonExtraction"), map);
                    registerProcessMapping(new NameImpl("gs", "RangeLookup"), new NameImpl("ras", "RangeLookup"),
                            map);
                    registerProcessMapping(new NameImpl("gs", "RasterAsPointCollection"),
                            new NameImpl("ras", "RasterAsPointCollection"), map);
                    registerProcessMapping(new NameImpl("gs", "RasterZonalStatistics"),
                            new NameImpl("ras", "RasterZonalStatistics"), map);
                    registerProcessMapping(new NameImpl("gs", "ScaleCoverage"),
                            new NameImpl("ras", "ScaleCoverage"), map);
                    registerProcessMapping(new NameImpl("gs", "StyleCoverage"),
                            new NameImpl("ras", "StyleCoverage"), map);

                    //gt vector processes
                    registerProcessMapping(new NameImpl("gt", "VectorToRaster"),
                            new NameImpl("vec", "VectorToRaster"), map);
                }
            }
        }
        return map;
    }

    void resetProcessMappings() {
        map = null;
    }

    static void registerProcessMapping(Name oldName, Name newName, Map<Name, Name> map) {
        if (GeoServerProcessors.createProcess(newName) != null) {
            map.put(oldName, newName);
        }
    }

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        // add and remove the process factory as necessary
        if (event instanceof ContextLoadedEvent) {
            //JD: look up GeoServer and register now rather than use constructor injection
            // to avoid circular dependency during service loading startup
            geoServer = GeoServerExtensions.bean(GeoServer.class,
                    ((ContextLoadedEvent) event).getApplicationContext());
            listener = new ConfigurationListenerAdapter() {
                @Override
                public void handleServiceChange(ServiceInfo service, List<String> propertyNames,
                        List<Object> oldValues, List<Object> newValues) {
                    if (service instanceof WPSInfo) {
                        resetProcessMappings();
                    }
                }
            };
            geoServer.addListener(listener);
        }
        if (event instanceof ContextRefreshedEvent) {
            Processors.addProcessFactory(this);
        } else if (event instanceof ContextClosedEvent) {
            Processors.removeProcessFactory(this);
        }
    }
}