Files
i2p.i2p/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java
2011-11-14 15:06:23 +00:00

117 lines
4.0 KiB
Java

package net.i2p.router.web;
import java.io.IOException;
import java.util.Locale;
import java.util.Map;
import net.i2p.I2PAppContext;
import org.mortbay.http.HttpRequest;
import org.mortbay.http.HttpResponse;
import org.mortbay.jetty.servlet.WebApplicationHandler;
/**
* Convert foo.jsp to foo_xx.jsp for language xx.
* This is appropriate for jsps with large amounts of text.
*
* Also, as of 0.8.2, rewrite "/" and "/index.html" to "/index.jsp",
* and "/foo" to "/foo.jsp".
*
* @author zzz
*/
public class LocaleWebAppHandler extends WebApplicationHandler
{
private final I2PAppContext _context;
public LocaleWebAppHandler(I2PAppContext ctx) {
super();
_context = ctx;
}
/**
* Handle foo.jsp by converting to foo_xx.jsp
* for language xx, where xx is the language for the default locale,
* or as specified in the routerconsole.lang property.
* Unless language == "en".
*/
@Override
public void handle(String pathInContext,
String pathParams,
HttpRequest httpRequest,
HttpResponse httpResponse)
throws IOException
{
// Handle OPTIONS (nothing to override)
if (HttpRequest.__OPTIONS.equals(httpRequest.getMethod()))
{
handleOptions(httpRequest, httpResponse);
return;
}
// transparent rewriting
if (pathInContext.equals("/") || pathInContext.equals("/index.html")) {
// home page
pathInContext = "/index.jsp";
} else if (pathInContext.indexOf("/", 1) < 0 &&
(!pathInContext.endsWith(".jsp")) &&
(!pathInContext.endsWith(".txt"))) {
// add .jsp to pages at top level
pathInContext += ".jsp";
}
//System.err.println("Path: " + pathInContext);
String newPath = pathInContext;
//if (pathInContext.endsWith(".jsp")) {
// We only ended up doing this for help.jsp, so save some effort
// unless we translate more pages like this
if (pathInContext.equals("/help.jsp")) {
int len = pathInContext.length();
// ...but leave foo_xx.jsp alone
if (len < 8 || pathInContext.charAt(len - 7) != '_') {
String lang = _context.getProperty(Messages.PROP_LANG);
if (lang == null || lang.length() <= 0)
lang = Locale.getDefault().getLanguage();
if (lang != null && lang.length() > 0 && !lang.equals("en")) {
String testPath = pathInContext.substring(0, len - 4) + '_' + lang + ".jsp";
// Do we have a servlet for the new path that isn't the catchall *.jsp?
Map.Entry servlet = getHolderEntry(testPath);
if (servlet != null) {
String servletPath = (String) servlet.getKey();
if (servletPath != null && !servletPath.startsWith("*")) {
// success!!
//System.err.println("Servlet is: " + servletPath);
newPath = testPath;
}
}
}
}
}
//System.err.println("New path: " + newPath);
super.handle(newPath, pathParams, httpRequest, httpResponse);
//System.err.println("Was handled? " + httpRequest.isHandled());
}
/**
* Overrides method in ServletHandler
* @since 0.8
*/
@Override
public void handleTrace(HttpRequest request,
HttpResponse response)
throws IOException
{
response.sendError(HttpResponse.__405_Method_Not_Allowed);
}
/**
* Not an override
* @since 0.8
*/
public void handleOptions(HttpRequest request,
HttpResponse response)
throws IOException
{
response.sendError(HttpResponse.__405_Method_Not_Allowed);
}
}