Package org.geoserver.wps.scriptlet

Source Code of org.geoserver.wps.scriptlet.ScriptletProcessFactory

/* Copyright (c) 2001 - 2007 TOPP - 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.scriptlet;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;

import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geotools.data.FeatureSource;
import org.geotools.data.Parameter;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.NameImpl;
import org.geotools.process.Process;
import org.geotools.process.ProcessFactory;
import org.geotools.text.Text;
import org.opengis.coverage.grid.GridCoverage;
import org.opengis.feature.type.Name;
import org.opengis.util.InternationalString;

/**
* A process factory that wraps a JavaScript script file and presents it as a WPS Process.
*
* @author David Winslow <dwinslow@opengeo.org>
*/
public class ScriptletProcessFactory implements ProcessFactory {
    public static final String JS_NAMESPACE = "js";
    public static final String SCRIPT_SEARCH_PATH = "scripts/processes/";
    private GeoServerResourceLoader resourceLoader =
        GeoServerExtensions.bean(GeoServerResourceLoader.class);
   
    public Set<Name> getNames() {
        Set<Name> result = new HashSet<Name>();
       
        File scriptDirectory = null;
        try {
            scriptDirectory = resourceLoader.find(SCRIPT_SEARCH_PATH);
        } catch (IOException ioe) {
            // no, it's cool. we might have to handle a null return anyway.
        }

        if (scriptDirectory != null) {
            for (String script : scriptDirectory.list(new FilenameFilter() {
                public boolean accept(File f, String name) {
                    return name.endsWith(".js");
                }
            })) {
                result.add(new NameImpl(JS_NAMESPACE, script.substring(0, script.length() - 3)));
            }
        }

        return result;
    }
   
    File findScript(Name name) {
        if(name == null)
            throw new NullPointerException("Process name cannot be null");

        String fileBaseName = name.getLocalPart();

        File scriptDirectory = null;
        try {
            scriptDirectory = resourceLoader.find(SCRIPT_SEARCH_PATH);
        } catch (IOException ioe) {
            // no, it's cool. we might have to handle a null return anyway.
        }

        if (scriptDirectory != null) {       
            File script = new File(scriptDirectory, fileBaseName + ".js");
            if (script.exists()) {
                return script;
            }
        }

        throw new IllegalArgumentException("Unknown process '" + name + "'");
    }

    /**
     * Creates a GeoTools Process which wraps a JavaScript script file
     *
     * @param Name a qualified name identifying the script file
     */
    public JavaScriptProcess create(Name name) throws IllegalArgumentException {
        File script = findScript(name);
        return new JavaScriptProcess(script);
    }

    public InternationalString getDescription(Name name) {
        // TODO: Implement a description mechanism
        JavaScriptProcess script = create(name);
        return Text.text(script.getMetadata().get("description").toString());
    }

    public InternationalString getTitle(Name name) {
        JavaScriptProcess script = create(name);
        return Text.text(script.getMetadata().get("title").toString());
    }

    public String getName(Name name) {
        File f = findScript(name);
        return f.getName().replaceAll(".js$", "");
    }

    public boolean supportsProgress(Name name) {
        // look up the script to make sure we throw an exception if it doesn't exist. 
        // TODO: Is this the expected behavior? (same for getVersion)
        File script = findScript(name);
        return false;
    }

    public String getVersion(Name name) {
        File script = findScript(name);
        return "1.0.0";
    }

    public Map<String, Parameter<?>> getParameterInfo(Name name) {
        JavaScriptProcess process = create(name);
        return process.getParameterInfo();
    }

    public Map<String, Parameter<?>> getResultInfo(Name name, Map<String, Object> inputs)
            throws IllegalArgumentException {
        JavaScriptProcess process = create(name);
        return process.getResultInfo();
    }

    @Override
    public String toString() {
        return "ScriptletFactory";
    }
}
TOP

Related Classes of org.geoserver.wps.scriptlet.ScriptletProcessFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.