blob: dbcada33fcf4217569e18d2a692cb5e3597bff4b [file] [log] [blame]
/*
* Copyright 2004-2005 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.codehaus.groovy.grails.web.pages;
import groovy.lang.Writable;
import groovy.text.Template;
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes;
import org.codehaus.groovy.grails.web.servlet.DefaultGrailsApplicationAttributes;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* NOTE: Based on work done by on the GSP standalone project (https://gsp.dev.java.net/)
*
* Main servlet class. Example usage in web.xml:
* <servlet>
* <servlet-name>GroovyPagesServlet</servlet-name>
* <servlet-class>org.codehaus.groovy.grails.web.pages.GroovyPagesServlet</servlet-class>
* <init-param>
* <param-name>showSource</param-name>
* <param-value>1</param-value>
* <description>
* Allows developers to view the intermediade source code, when they pass
* a showSource argument in the URL (eg /edit/list?showSource=true.
* </description>
* </init-param>
* </servlet>
*
* @author Troy Heninger
* @author Graeme Rocher
* Date: Jan 10, 2004
*
*/
public class GroovyPagesServlet extends HttpServlet /*implements GroovyObject*/ {
Object x;
private ServletContext context;
private boolean showSource = false;
private static Map pageCache = Collections.synchronizedMap(new HashMap());
private static ClassLoader parent;
private GroovyPagesTemplateEngine engine;
private GrailsApplicationAttributes grailsAttributes;
/**
* @return the servlet context
*/
public ServletContext getServletContext() { return context; }
/**
* Initialize the servlet, set it's parameters.
* @param config servlet settings
*/
public void init(ServletConfig config) {
// Get the servlet context
context = config.getServletContext();
context.log("GSP servlet initialized");
// Ensure that we use the correct classloader so that we can find
// classes in an application server.
parent = Thread.currentThread().getContextClassLoader();
if (parent == null) parent = getClass().getClassLoader();
showSource = config.getInitParameter("showSource") != null;
this.grailsAttributes = new DefaultGrailsApplicationAttributes(context);
} // init()
/**
* Handle HTTP GET requests.
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPage(request, response);
} // doGet()
/**
* Handle HTTP POST requests.
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPage(request, response);
} // doPost()
/**
* Execute page and produce output.
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void doPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.engine = grailsAttributes.getPagesTemplateEngine();
this.engine.setShowSource(this.showSource);
String pageId = engine.getPageId(request);
URL pageUrl = engine.getPageUrl(context,pageId);
if (pageUrl == null) {
context.log("GroovyPagesServlet: \"" + pageUrl + "\" not found");
response.sendError(404, "\"" + pageUrl + "\" not found.");
return;
}
Template t = engine.createTemplate(context,request,response);
Writable w = t.make();
Writer out = GSPResonseWriter.getInstance(response, 8192);
try {
w.writeTo(out);
}
finally {
if (out != null) out.close();
}
} // doPage()
}