/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.script.app;
import static java.lang.String.format;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.script.ScriptEngine;
import org.geoserver.platform.resource.Files;
import org.geoserver.rest.RestletException;
import org.geoserver.script.ScriptManager;
import org.geotools.util.logging.Logging;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.data.Status;
import org.restlet.resource.Resource;
/**
* App resource that handles an app request.
*
* @author Justin Deoliveira, OpenGeo
*/
public class AppResource extends Resource {
static Logger LOGGER = Logging.getLogger(AppResource.class);
ScriptManager scriptMgr;
org.geoserver.platform.resource.Resource script;
public AppResource(org.geoserver.platform.resource.Resource script, ScriptManager scriptMgr, Request request, Response response) {
super(null, request, response);
this.scriptMgr = scriptMgr;
this.script = script;
}
@Deprecated
public AppResource(File script, ScriptManager scriptMgr, Request request, Response response) {
this(Files.asResource(script), scriptMgr, request, response);
}
@Override
public void handleGet() {
try {
ScriptEngine eng = scriptMgr.createNewEngine(script);
if (eng == null) {
throw new RestletException(format("Script engine for %s not found", script.name()),
Status.CLIENT_ERROR_BAD_REQUEST);
}
//look up the app hook
AppHook hook = scriptMgr.lookupAppHook(script);
if (hook == null) {
//TODO: fall back on default
throw new RestletException(format("No hook found for %s", script.path()),
Status.SERVER_ERROR_INTERNAL);
}
Reader in = new BufferedReader(new InputStreamReader(script.in()));
try {
eng.eval(in);
hook.run(getRequest(), getResponse(), eng);
}
finally {
in.close();
}
}
catch (Exception e) {
LOGGER.log(Level.WARNING, e.getLocalizedMessage(), e);
throw new RestletException("Error executing script " + script.name(),
Status.SERVER_ERROR_INTERNAL, e);
}
}
}
;