/*
* Copyright 2000-2004 The Apache Software Foundation.
*
* 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.apache.jetspeed.services.webpage;
// java.io
import java.io.IOException;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.FileReader;
// java.util
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.log4j.Logger;
/**
*
* WebPageServlet is the main servlet entry point for the WebPage Service server.
*
*/
public class WebPageServlet extends HttpServlet
{
public static final String WPS_KILLSESSION = "kill";
public static final String WPS_KILLPARAM = "9";
static Logger log = Logger.getLogger(WebPageServlet.class);
/**
*
* handles an HTTP GET request.
*
*/
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
if (!WebPageManager.isInit())
{
displayInfoPage(response);
log.error(WebPageManager.getErrorString());
return;
}
boolean error = false;
try
{
if (dispatch(request, response, true))
return; // request was handled by the WPS server
}
catch(Exception e)
{
//e.printStackTrace();
log.error(e);
displayErrorPage(response, e.getMessage() );
error = true;
}
// request wasn't handled by the WPS server (no parameters)
// lets just display the info page
if (false == error)
displayInfoPage(response);
}
/**
*
* handles an HTTP POST request.
*
*/
public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
if (!WebPageManager.isInit())
{
displayInfoPage(response);
log.error(WebPageManager.getErrorString());
return;
}
boolean error = false;
try
{
if (dispatch(request, response, false))
return; // request was handled by the WebPageManager server
}
catch(Exception e)
{
//e.printStackTrace();
log.error(e);
displayErrorPage(response, e.getMessage());
error = true;
}
// request wasn't handled by the WebPageManager server (no parameters)
// lets just display the info page
if (false == error)
displayInfoPage(response);
}
/**
*
* Dispatches the HTTP GET or POST action to the WebPageManagerService.
* Requests to the WebPageManager server are indicated in the query parameters.
*
* @return true if the request was intercepted by the WebPageManager server, otherwise false
*/
private boolean dispatch(HttpServletRequest request,
HttpServletResponse response,
boolean isGet)
throws ServletException, IOException
{
Configuration config = Configuration.getInstance();
String nesid = request.getParameter(config.getSID());
String pxurl = request.getParameter(config.getURL());
if (nesid == null && null == pxurl)
return false; // no interception specified
// request is to the WebPageManager server...
if (isGet) {
WebPageManager.get(this, request, response);
}
else {
WebPageManager.post(this, request, response);
}
return true; // did not find a WebPageManager action
}
/**
* Display WebPageManager default info page.
*/
private void displayInfoPage(HttpServletResponse response)
{
try
{
PrintWriter pw = response.getWriter ();
String infoFile = Configuration.getInstance()
.getProperty(Configuration.KEY_CONTENT_INFO);
String indexFile = getServletContext().getRealPath(infoFile);
BufferedReader br = new BufferedReader(new FileReader(indexFile));
String line;
while ((line = br.readLine()) != null)
{
pw.println(line);
}
if (WebPageManager.isInit())
pw.println("<br><font color='green'>:: Status :: Online ::</font><br>" );
else
{
pw.println("<br><font color='red'>:: Status :: Offline ::</font><br>" );
pw.println(":: Reason :: " + WebPageManager.getErrorString());
}
br.close();
}
catch (Exception ex)
{
log.error("Failed to read servlet info page");
displayInfo(response);
}
}
/**
* Display WebPageManager default error page.
*/
private void displayErrorPage(HttpServletResponse response, String msg)
{
try
{
PrintWriter pw = response.getWriter ();
String fileName = Configuration.getInstance()
.getProperty(Configuration.KEY_CONTENT_ERROR);
String template = getServletContext().getRealPath(fileName);
BufferedReader br = new BufferedReader(new FileReader(template));
String line;
while ((line = br.readLine()) != null)
{
int index = line.indexOf("$msg");
if (index > -1) {
StringBuffer buffer = new StringBuffer(line);
WebPageHelper.replaceAll(buffer, "$msg", msg);
pw.println(buffer.toString());
}
else
pw.println(line);
}
br.close();
}
catch (Exception ex)
{
log.error("Failed to read servlet info page");
displayError(response, msg);
}
}
/**
* In certain situations the init() method is called more than once,
* somtimes even concurrently. This causes bad things to happen,
* so we use this flag to prevent it.
*/
private static boolean firstInit = true;
/**
* This init method will load the default resources from a
* properties file.
*
* @param config typical Servlet initialization parameter.
* @exception ServletException a servlet exception.
*/
public final void init(ServletConfig config)
throws ServletException
{
super.init(config);
org.apache.log4j.PropertyConfigurator.configure("WebPageManagerLog4j.properties");
synchronized ( this.getClass() )
{
if (!firstInit)
{
return;
}
firstInit = false;
try
{
WebPageManager.init(config);
}
catch (IOException ex)
{
throw new ServletException(ex.toString());
}
}
}
/**
* Called by the servlet container to indicate to a servlet that the servlet
* is being taken out of service. The WebPageManager server cleans up all connections,
* logging out of sessions.
*
*/
public final void destroy()
{
WebPageManager.destroy();
}
/*
* Used as a failsafe in case the default info page can't be found.
*
*/
private void displayInfo(HttpServletResponse response)
{
try
{
PrintWriter pw = response.getWriter();
pw.println("<HTML><HEAD><title>Jetspeed Web Page Servlet</title></HEAD><BODY><H1>Jetspeed Web Page Servlet</H1>");
if (WebPageManager.isInit())
pw.println("<br><font color='green'>:: Status :: Online ::</font><br>" );
else
{
pw.println("<br><font color='red'>:: Status :: Offline ::</font><br>" );
pw.println(":: Reason :: " + WebPageManager.getErrorString());
}
pw.println("<br><br>Warning. The Jetspeed HTTP Web Page Servlet was not correctly installed.<br>");
pw.println("<br>Please contact Al Gore for support (he invented the internet).<br>");
pw.println("</BODY></HTML>");
}
catch (IOException ex)
{
log.error("Failed to get a PrintWriter on response.");
}
}
/*
* Used as a failsafe in case the default error page can't be found.
*
*/
private void displayError(HttpServletResponse response, String msg)
{
try
{
PrintWriter pw = response.getWriter();
pw.println("<HTML><HEAD><title>Web Page Servlet General Exception</title></HEAD><BODY><H1>Web Page Servlet General Exception</H1>");
if (WebPageManager.isInit())
pw.println("<br><font color='green'>:: Status :: Online ::</font><br>" );
else
{
pw.println("<br><font color='red'>:: Status :: Offline ::</font><br>" );
pw.println(":: Reason :: " + msg);
}
pw.println("<br><br>Warning. The Jetspeed Web Page Servlet was not correctly installed.<br>");
pw.println("<br>Please contact Al Gore for support (he invented the internet).<br>");
pw.println("</BODY></HTML>");
}
catch (IOException ex)
{
log.error("Failed to get a PrintWriter on response.");
}
}
}