Fixed dispatching rule.

This commit is contained in:
Christian P. MOMON 2012-09-17 14:35:49 +02:00
parent 896b9c8578
commit 94d55f65d2

View file

@ -1,12 +1,11 @@
/** /**
* @author Christian Momon, June 2008. * @author Christian Momon, June 2008. This file is free software under the
* This file is free software under the terms of the GNU Library General Public License * terms of the GNU Library General Public License as published by the
* as published by the Free Software Foundation version 2 or any later version. * Free Software Foundation version 2 or any later version.
*/ */
package fr.devinsy.kiss4web; package fr.devinsy.kiss4web;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
@ -22,7 +21,6 @@ import javax.servlet.http.HttpServletResponse;
import fr.devinsy.util.StringList; import fr.devinsy.util.StringList;
/** /**
* *
*/ */
@ -34,15 +32,139 @@ public class SimpleServletDispatcher extends HttpServlet
static final protected Pattern SHORT_REWRITED_URL_CLASS = Pattern.compile("^([^-]+)-.+\\.xhtml$"); static final protected Pattern SHORT_REWRITED_URL_CLASS = Pattern.compile("^([^-]+)-.+\\.xhtml$");
static final protected Pattern SHORT_REWRITED_URL_PARAMETERS = Pattern.compile("^[^-]+-(.+)\\.xhtml$"); static final protected Pattern SHORT_REWRITED_URL_PARAMETERS = Pattern.compile("^[^-]+-(.+)\\.xhtml$");
static final protected Pattern LONG_REWRITED_URL_CLASS = Pattern.compile("^([^-]+)-/.*$"); static final protected Pattern LONG_REWRITED_URL_CLASS = Pattern.compile("^([^-]+)-/.*$");
//static final protected Pattern LONG_REWRITED_URL_PARAMETERS = Pattern.compile("^.+-/(.)+*$"); // static final protected Pattern LONG_REWRITED_URL_PARAMETERS =
// Pattern.compile("^.+-/(.)+*$");
static final protected Pattern REWRITE_PARAMETER = Pattern.compile("[^%\\w\\d]"); static final protected Pattern REWRITE_PARAMETER = Pattern.compile("[^%\\w\\d]");
protected String webclassesRootPath; protected String webclassesRootPath;
/**
* "Code can be shortest, speedest and memory smallest, but not the three in same time, only two"
* , unknow citation.
*
* Note: characters array avalaible here
* http://fr.wikipedia.org/wiki/Table_des_caract
* %C3%A8res_Unicode_%280000-0FFF%29
*/
static protected char NONE = (char) 0;
static protected int[] rewritingParameterMapping = {
/* 00 */NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
/* 10 */NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
/* 20 */'-', NONE, NONE, '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-',
/* 30 */'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '-', '-', '-', '-', '-',
/* 40 */'\u0040', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
/* 50 */'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '-', '-', '-', '-', '-',
/* 60 */'-', '\u0061', '\u0062', '\u0063', '\u0064', '\u0065', '\u0066', '\u0067', '\u0068', '\u0069', '\u006A', '\u006B', '\u006C', '\u006D', '\u006E',
'\u006F',
/* 70 */'\u0070', '\u0071', '\u0072', '\u0073', '\u0074', '\u0075', '\u0076', '\u0077', '\u0078', '\u0079', '\u007A', '\u007B', '\u007C', '\u007D',
'-', '-',
/* 80 */NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
/* 90 */NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
/* A0 */'\u00A0', '\u00A1', '\u00A2', '\u00A3', '\u00A4', '\u00A5', '\u00A6', '\u00A7', '\u00A8', '\u00A9', '\u00AA', '\u00AB', '\u00AC', '\u00AD',
'\u00AE', '\u00AF',
/* B0 */'-', '\u00B1', '\u00B2', '\u00B3', '\u00B4', '\u00B5', '\u00B6', '\u00B7', '\u00B8', '\u00B9', '\u00BA', '\u00BB', '\u00BC', '\u00BD',
'\u00BE', '\u00BF',
/* C0 */'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
/* D0 */'\u00D0', '\u00D1', 'o', 'o', 'o', 'o', 'o', 'o', '\u00D8', 'u', 'u', 'u', 'u', 'y', '\u00DE', '\u00DF',
/* E0 */'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
/* F0 */'o', 'n', 'o', 'o', 'o', 'o', 'o', '\u00F7', '-', 'u', 'u', 'u', 'u', 'y', '-', 'y' };
/** /**
* *
*/ */
@Override
public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
{
doIt(request, response);
}
/**
*
*
*/
public void doIt(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
{
logger.info("==================================================");
logger.info("getContextPath=[" + request.getContextPath() + "]");
logger.info("getPathInfo=[" + request.getPathInfo() + "]");
logger.info("getPathTranslated=[" + request.getPathTranslated() + "]");
logger.info("getQueryString=[" + request.getQueryString() + "]");
logger.info("getRequestURI=[" + request.getRequestURI() + "]");
logger.info("getRequestURL=[" + request.getRequestURL() + "]");
logger.info("getServletPath=[" + request.getServletPath() + "]");
//
/*
* In past, possibility to use the servlet path was enable. It is too
* complexe, not kiss mind. String path; if (request.getPathInfo() ==
* null) { // web.xml url-pattern= *.xhtml path =
* request.getServletPath(); } else { // web.xml url-pattern = /* path =
* request.getPathInfo(); }
*/
// String path = request.getRequestURI();
String path = request.getPathInfo();
if ((!path.endsWith("/")) && (!path.endsWith(".xhtml")) && (!path.contains("-/")))
{
// path = getServletContext().getRealPath("/") +
// request.getRequestURI();
path = getServletContext().getRealPath("/") + request.getPathInfo();
returnInlineFile(response, new File(path), getServletContext().getMimeType(path));
logger.info("File returned directly [" + path + "] with mimetype [" + getServletContext().getMimeType(path) + "].");
}
else
{
String className = pathInfoToClassName(path, this.webclassesRootPath);
logger.info("className=[" + className + "]");
HttpServlet servlet = instanciateServlet(className);
// servlet.getServletContext().setAttribute(arg0, arg1);
if (servlet == null)
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head></head><body>");
out.println("Unknow page.");
out.println("</body></html>");
out.close();
}
else if (isAuthorized(request, response))
{
servlet.init(this.getServletConfig());
servlet.service(request, response);
}
else
{
/*
* TODO // response.setContentType ("text/html"); PrintWriter
* out = response.getWriter();
*
* out.println ("<html><head></head><body>"); out.println
* ("Not authorized page."); out.println ("</body></html>");
*/
}
}
}
/**
*
*/
@Override
public void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
{
doIt(request, response);
}
/**
*
*/
@Override
public void init() throws ServletException public void init() throws ServletException
{ {
super.init(); super.init();
@ -68,126 +190,23 @@ public class SimpleServletDispatcher extends HttpServlet
} }
} }
/** /**
* Convert a path in a class name, using easy conventions.
* *
* "/" => "Index_xhtml"
* "/good/" => "good.Good_xhtml"
* "/good/morning.xhtml" => "good.Morning_xhtml"
* "/good/morning_girl.xhtml" => "good.Morning_girl_xhtml"
* "/good/morning-123.xhtml" => "good.Morning_xhtml" ('123' is detected as a parameter, it will be decoded in the class called later).
* "/good/morning-/12/toto.jpg" => "good.Morning" ('12' and 'toto.jpg" are detected as a parameter, they will be decoded in the class called later).
*/ */
static public String pathInfoToClassName (String pathInfo) public boolean isAuthorized(final HttpServletRequest request, final HttpServletResponse response)
{ {
String result; boolean result;
if ((pathInfo == null) || (pathInfo.length() == 0)) result = true;
{
result = null;
}
else
{
if ( pathInfo.equals ("/"))
{
result = "Index_xhtml";
}
else
{
int keywordIndex = pathInfo.lastIndexOf("-/");
if (keywordIndex != -1)
{
// Long rewrited URL case.
String[] tokens = pathInfo.substring(0, keywordIndex).split("/");
StringList name = new StringList();
// Note: as pathInfo starts always with a '/', the first good token index is 1.
for (int tokenCounter = 1; tokenCounter < tokens.length - 1; tokenCounter++)
{
name.append (tokens[tokenCounter]);
name.append ('.');
}
String lastToken = tokens[tokens.length - 1];
name.append (lastToken.substring(0, 1).toUpperCase()).append (lastToken.substring(1).replace('.', '_'));
result = name.toString ();
}
else
{
String[] tokens = pathInfo.split ("/");
StringList name = new StringList();
// Note: as pathInfo starts always with a '/', the first good token index is 1.
for (int tokenCounter = 1; tokenCounter < tokens.length - 1; tokenCounter++)
{
name.append (tokens[tokenCounter]);
name.append ('.');
}
String lastToken = tokens[tokens.length - 1];
if (pathInfo.endsWith ("/"))
{
name.append(lastToken).append(".").append(lastToken.substring(0, 1).toUpperCase()).append(lastToken.substring(1)).append("_xhtml");
}
else
{
Matcher matcher = SHORT_REWRITED_URL_CLASS.matcher(lastToken);
if (matcher.matches())
{
// Short rewrited URL case.
//logger.debug("group 1=[" + matcher.group(1) + "]");
lastToken = matcher.group(1) + ".xhtml";
}
name.append (lastToken.substring(0, 1).toUpperCase()).append (lastToken.substring(1).replace('.', '_'));
}
result = name.toString ();
logger.debug ("==>[" + tokens[tokens.length - 1] + "]");
}
}
}
logger.info ("[" + pathInfo + "] => [" + result + "]");
// //
return (result); return (result);
} }
/** /**
* *
*/ */
static public String pathInfoToClassName (String pathInfo, String prefix) static public HttpServlet instanciateServlet(final String className)
{
String result;
String className = pathInfoToClassName(pathInfo);
if (prefix == null)
{
result = className;
}
else if (prefix.endsWith("."))
{
result = prefix + className;
}
else
{
result = prefix + "." + className;
}
//
return (result);
}
/**
*
*/
static public HttpServlet instanciateServlet (String className)
{ {
HttpServlet result; HttpServlet result;
@ -230,43 +249,149 @@ public class SimpleServletDispatcher extends HttpServlet
return (result); return (result);
} }
/** /**
* * Extract values from a path. Example: "/article-/123/doors/open.xhtml" =>
* "123", "doors" and "open".
*/ */
public boolean isAuthorized(HttpServletRequest request, HttpServletResponse response) static public String[] longRewritedUrlParameters(final String path)
{ {
boolean result; String[] result;
result = true; result = path.substring(path.indexOf("-/") + 2).split("/");
// //
return (result); return (result);
} }
/** /**
* Convert a path in a class name, using easy conventions.
* *
* "/" => "Index_xhtml" "/good/" => "good.Good_xhtml" "/good/morning.xhtml"
* => "good.Morning_xhtml" "/good/morning_girl.xhtml" =>
* "good.Morning_girl_xhtml" "/good/morning-123.xhtml" =>
* "good.Morning_xhtml" ('123' is detected as a parameter, it will be
* decoded in the class called later). "/good/morning-/12/toto.jpg" =>
* "good.Morning" ('12' and 'toto.jpg" are detected as a parameter, they
* will be decoded in the class called later).
*/ */
static public void returnInlineFile(HttpServletResponse response, File file, String mimeType) throws IOException static public String pathInfoToClassName(final String pathInfo)
{ {
returnFile(response, file, mimeType, false); String result;
if ((pathInfo == null) || (pathInfo.length() == 0))
{
result = null;
}
else
{
if (pathInfo.equals("/"))
{
result = "Index_xhtml";
}
else
{
int keywordIndex = pathInfo.lastIndexOf("-/");
if (keywordIndex != -1)
{
// Long rewrited URL case.
String[] tokens = pathInfo.substring(0, keywordIndex).split("/");
StringList name = new StringList();
// Note: as pathInfo starts always with a '/', the first
// good token index is 1.
for (int tokenCounter = 1; tokenCounter < (tokens.length - 1); tokenCounter++)
{
name.append(tokens[tokenCounter]);
name.append('.');
} }
String lastToken = tokens[tokens.length - 1];
name.append(lastToken.substring(0, 1).toUpperCase()).append(lastToken.substring(1).replace('.', '_'));
result = name.toString();
}
else
{
String[] tokens = pathInfo.split("/");
StringList name = new StringList();
// Note: as pathInfo starts always with a '/', the first
// good token index is 1.
for (int tokenCounter = 1; tokenCounter < (tokens.length - 1); tokenCounter++)
{
name.append(tokens[tokenCounter]);
name.append('.');
}
String lastToken = tokens[tokens.length - 1];
if (pathInfo.endsWith("/"))
{
name.append(lastToken).append(".").append(lastToken.substring(0, 1).toUpperCase()).append(lastToken.substring(1)).append("_xhtml");
}
else
{
Matcher matcher = SHORT_REWRITED_URL_CLASS.matcher(lastToken);
if (matcher.matches())
{
// Short rewrited URL case.
// logger.debug("group 1=[" + matcher.group(1) +
// "]");
lastToken = matcher.group(1) + ".xhtml";
}
name.append(lastToken.substring(0, 1).toUpperCase()).append(lastToken.substring(1).replace('.', '_'));
}
result = name.toString();
logger.debug("==>[" + tokens[tokens.length - 1] + "]");
}
}
}
logger.info("[" + pathInfo + "] => [" + result + "]");
//
return (result);
}
/** /**
* *
*/ */
static public void returnAttachmentFile(HttpServletResponse response, File file, String mimeType) throws IOException static public String pathInfoToClassName(final String pathInfo, final String prefix)
{
String result;
String className = pathInfoToClassName(pathInfo);
if (prefix == null)
{
result = className;
}
else if (prefix.endsWith("."))
{
result = prefix + className;
}
else
{
result = prefix + "." + className;
}
//
return (result);
}
/**
*
*/
static public void returnAttachmentFile(final HttpServletResponse response, final File file, final String mimeType) throws IOException
{ {
returnFile(response, file, mimeType, true); returnFile(response, file, mimeType, true);
} }
/** /**
* *
*/ */
static public void returnFile(HttpServletResponse response, File file, String mimeType, boolean isAttachment) throws IOException static public void returnFile(final HttpServletResponse response, final File file, final String mimeType, final boolean isAttachment) throws IOException
{ {
if ((file == null) || (!file.exists())) if ((file == null) || (!file.exists()))
@ -276,10 +401,11 @@ public class SimpleServletDispatcher extends HttpServlet
else else
{ {
/* /*
response.setContentType("application/" + extension); * response.setContentType("application/" + extension);
response.setContentLength((int) data.length); * response.setContentLength((int) data.length);
response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\""); * response.setHeader("Content-Disposition"
response.flushBuffer(); * ,"attachment; filename=\"" + filename + "\"");
* response.flushBuffer();
*/ */
response.reset(); response.reset();
response.setContentType(mimeType); response.setContentType(mimeType);
@ -290,7 +416,8 @@ public class SimpleServletDispatcher extends HttpServlet
ServletOutputStream out = response.getOutputStream(); ServletOutputStream out = response.getOutputStream();
FileInputStream in = null; FileInputStream in = null;
try // Only for the in. try
// Only for the in.
{ {
byte[] buffer = new byte[64 * 1024]; byte[] buffer = new byte[64 * 1024];
@ -326,287 +453,41 @@ public class SimpleServletDispatcher extends HttpServlet
} }
} }
/**
*
*/
static public void returnInlineFile(final HttpServletResponse response, final File file, final String mimeType) throws IOException
{
returnFile(response, file, mimeType, false);
}
/** /**
*
* *
*/ */
public void doIt (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException static public String[] rewritedUrlParameters(final HttpServletRequest request)
{
logger.info ("==================================================");
logger.info ("getContextPath=[" + request.getContextPath () + "]");
logger.info ("getPathInfo=[" + request.getPathInfo () + "]");
logger.info ("getPathTranslated=[" + request.getPathTranslated () + "]");
logger.info ("getQueryString=[" + request.getQueryString () + "]");
logger.info ("getRequestURI=[" + request.getRequestURI () + "]");
logger.info ("getRequestURL=[" + request.getRequestURL () + "]");
logger.info ("getServletPath=[" + request.getServletPath () + "]");
//
/* In past, possibility to use the servlet path was enable. It is too complexe, not kiss mind.
String path;
if (request.getPathInfo() == null)
{
// web.xml url-pattern= *.xhtml
path = request.getServletPath();
}
else
{
// web.xml url-pattern = /*
path = request.getPathInfo();
}
*/
String path = request.getRequestURI();
if ((!path.endsWith("/")) && (!path.endsWith(".xhtml")) && (!path.contains("-/")))
{
path = getServletContext ().getRealPath("/") + request.getRequestURI();
returnInlineFile(response, new File(path), getServletContext().getMimeType(path));
logger.info("File returned directly [" + path + "] with mimetype [" + getServletContext().getMimeType(path) + "].");
}
else
{
String className = pathInfoToClassName (path, this.webclassesRootPath);
logger.info ("className=[" + className + "]");
HttpServlet servlet = instanciateServlet (className);
//servlet.getServletContext().setAttribute(arg0, arg1);
if (servlet == null)
{
response.setContentType ("text/html");
PrintWriter out = response.getWriter();
out.println ("<html><head></head><body>");
out.println ("Unknow page.");
out.println ("</body></html>");
out.close();
}
else if (isAuthorized(request, response))
{
servlet.init(this.getServletConfig());
servlet.service(request, response);
}
else
{
/*
* TODO
//
response.setContentType ("text/html");
PrintWriter out = response.getWriter();
out.println ("<html><head></head><body>");
out.println ("Not authorized page.");
out.println ("</body></html>");
*/
}
}
}
/**
* "Code can be shortest, speedest and memory smallest, but not the three in same time, only two", unknow citation.
*
* Note: characters array avalaible here http://fr.wikipedia.org/wiki/Table_des_caract%C3%A8res_Unicode_%280000-0FFF%29
*/
static protected char NONE = (char) 0;
static protected int[] rewritingParameterMapping =
{
/* 00 */ NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE ,
/* 10 */ NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE ,
/* 20 */ '-' , NONE , NONE , '-' , '-' , '-' , '-' , '-' , '-' , '-' , '-' , '-' , '-' , '-' , '-' , '-' ,
/* 30 */ '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '-' , '-' , '-' , '-' , '-' , '-' ,
/* 40 */ '\u0040', 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' ,
/* 50 */ 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z' , '-' , '-' , '-' , '-' , '-' ,
/* 60 */ '-' , '\u0061', '\u0062', '\u0063', '\u0064', '\u0065', '\u0066', '\u0067', '\u0068', '\u0069', '\u006A', '\u006B', '\u006C', '\u006D', '\u006E', '\u006F',
/* 70 */ '\u0070', '\u0071', '\u0072', '\u0073', '\u0074', '\u0075', '\u0076', '\u0077', '\u0078', '\u0079', '\u007A', '\u007B', '\u007C', '\u007D', '-' , '-' ,
/* 80 */ NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE ,
/* 90 */ NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE , NONE ,
/* A0 */ '\u00A0', '\u00A1', '\u00A2', '\u00A3', '\u00A4', '\u00A5', '\u00A6', '\u00A7', '\u00A8', '\u00A9', '\u00AA', '\u00AB', '\u00AC', '\u00AD', '\u00AE', '\u00AF',
/* B0 */ '-' , '\u00B1', '\u00B2', '\u00B3', '\u00B4', '\u00B5', '\u00B6', '\u00B7', '\u00B8', '\u00B9', '\u00BA', '\u00BB', '\u00BC', '\u00BD', '\u00BE', '\u00BF',
/* C0 */ 'a' , 'a' , 'a' , 'a' , 'a' , 'a' , 'a' , 'c' , 'e' , 'e' , 'e' , 'e' , 'i' , 'i' , 'i' , 'i' ,
/* D0 */ '\u00D0', '\u00D1', 'o' , 'o' , 'o' , 'o' , 'o' , 'o' , '\u00D8', 'u' , 'u' , 'u' , 'u' , 'y' , '\u00DE', '\u00DF',
/* E0 */ 'a' , 'a' , 'a' , 'a' , 'a' , 'a' , 'a' , 'c' , 'e' , 'e' , 'e' , 'e' , 'i' , 'i' , 'i' , 'i' ,
/* F0 */ 'o' , 'n' , 'o' , 'o' , 'o' , 'o' , 'o' , '\u00F7', '-' , 'u' , 'u' , 'u' , 'u' , 'y' , '-' , 'y'
};
/**
*
*
* @param parameter
* @return
*/
static String rewriteParameter (String parameter)
{
String result;
StringBuffer buffer = new StringBuffer(parameter.length());
char previousCar = NONE;
for (int charIndex = 0; charIndex < parameter.length(); charIndex++)
{
//logger.info("" + charIndex + " " + parameter.charAt(charIndex) + " " + (char) tab[parameter.charAt(charIndex)]);
char car = (char) rewritingParameterMapping[parameter.charAt(charIndex)];
if (car != NONE)
{
if ((car != '-') || ((car == '-') && (previousCar != '-')))
{
buffer.append(car);
previousCar = car;
}
}
}
if (buffer.charAt(buffer.length() - 1) == '-')
{
buffer.setLength(buffer.length() - 1);
}
result = buffer.toString();
logger.info("[" + parameter + "] -> [" + result + "]");
//
return (result);
}
/**
* This method gives a way for a short rewriting URL format.
*
* Sometimes, URL has to be rewrited because we need to put parameter in the page name.
*
* Example:
* "/good/article.xhtm?id=123&class=today&title=story's about me"
* => rewriteShorturl("/good/article", "xhtml", "123", "Story's aboute me");
* => "/good/article-123-today-story-s-about-me.xhtml"
*/
static public String rewriteShortUrl(String uri, String extension, String... parameters)
{
String result;
StringList string = new StringList();
string.append(uri);
for (String parameter : parameters)
{
// Not use of String.replaceAll() method in goal to optimize Pattern compile action.
//string.append("-").append(REWRITE_PARAMETER.matcher(parameter.toLowerCase()).replaceAll("-"));
string.append("-").append(rewriteParameter(parameter));
}
if ((extension != null) && (extension.length() != 0))
{
string.append(".").append(extension);
}
result = string.toString();
//
return(result);
}
/**
* Extract value from a path.
* Example:
* "/article-123.xhtml" => "123".
*/
static public String[] shortRewritedUrlParameters(String path)
{ {
String[] result; String[] result;
Matcher matcher = SHORT_REWRITED_URL_PARAMETERS.matcher(path); result = longRewritedUrlParameters(request.getRequestURI());
if (matcher.matches())
{
if (matcher.groupCount() != 1)
{
result = null;
}
else
{
result = matcher.group(1).split("-");
}
}
else
{
result = null;
}
// //
return (result); return (result);
} }
/**
*
*/
static public String[] shortRewritedUrlParameters(HttpServletRequest request)
{
String[] result;
result = shortRewritedUrlParameters(request.getRequestURI());
//
return(result);
}
/**
* Return value of the first parameter.
*/
static public String shortRewritedUrlParameter(String path)
{
String result;
String[] results = shortRewritedUrlParameters(path);
if ((results == null) || (results.length == 0))
{
result = null;
}
else
{
result = results[0];
}
//
return(result);
}
/**
*
*/
static public String shortRewritedUrlParameter(HttpServletRequest request)
{
String result;
result = shortRewritedUrlParameter(request.getRequestURI());
//
return(result);
}
/** /**
* This method gives a way for a long rewriting URL format. Long as in REST. * This method gives a way for a long rewriting URL format. Long as in REST.
* *
* Sometimes, URL has to be rewrited because we need to put parameter in the page name. * Sometimes, URL has to be rewrited because we need to put parameter in the
* page name.
* *
* Example: * Example: "/good/give_file?id=123&filename=foo.jpg" =>
* "/good/give_file?id=123&filename=foo.jpg" * rewriteShorturl("/good/give_file", "123", "foo.jpg"); =>
* => rewriteShorturl("/good/give_file", "123", "foo.jpg"); * "/good/give_file-/123/foo.jpg"
* => "/good/give_file-/123/foo.jpg"
* *
* Note: "-/" is used to indicate the start of parameters. * Note: "-/" is used to indicate the start of parameters.
* *
*/ */
static public String rewriteLongUrl(String uri, String... parameters) static public String rewriteLongUrl(final String uri, final String... parameters)
{ {
String result; String result;
@ -631,51 +512,155 @@ public class SimpleServletDispatcher extends HttpServlet
return (result); return (result);
} }
/**
*
*
* @param parameter
* @return
*/
static String rewriteParameter(final String parameter)
{
String result;
StringBuffer buffer = new StringBuffer(parameter.length());
char previousCar = NONE;
for (int charIndex = 0; charIndex < parameter.length(); charIndex++)
{
// logger.info("" + charIndex + " " + parameter.charAt(charIndex) +
// " " + (char) tab[parameter.charAt(charIndex)]);
char car = (char) rewritingParameterMapping[parameter.charAt(charIndex)];
if (car != NONE)
{
if ((car != '-') || ((car == '-') && (previousCar != '-')))
{
buffer.append(car);
previousCar = car;
}
}
}
if (buffer.charAt(buffer.length() - 1) == '-')
{
buffer.setLength(buffer.length() - 1);
}
result = buffer.toString();
logger.info("[" + parameter + "] -> [" + result + "]");
//
return (result);
}
/** /**
* Extract values from a path. * This method gives a way for a short rewriting URL format.
* Example: *
* "/article-/123/doors/open.xhtml" => "123", "doors" and "open". * Sometimes, URL has to be rewrited because we need to put parameter in the
* page name.
*
* Example: "/good/article.xhtm?id=123&class=today&title=story's about me"
* => rewriteShorturl("/good/article", "xhtml", "123", "Story's aboute me");
* => "/good/article-123-today-story-s-about-me.xhtml"
*/ */
static public String[] longRewritedUrlParameters(String path) static public String rewriteShortUrl(final String uri, final String extension, final String... parameters)
{ {
String[] result; String result;
result = path.substring(path.indexOf("-/") + 2).split("/"); StringList string = new StringList();
string.append(uri);
for (String parameter : parameters)
{
// Not use of String.replaceAll() method in goal to optimize Pattern
// compile action.
// string.append("-").append(REWRITE_PARAMETER.matcher(parameter.toLowerCase()).replaceAll("-"));
string.append("-").append(rewriteParameter(parameter));
}
if ((extension != null) && (extension.length() != 0))
{
string.append(".").append(extension);
}
result = string.toString();
// //
return (result); return (result);
} }
/** /**
* *
*/ */
static public String[] rewritedUrlParameters(HttpServletRequest request) static public String shortRewritedUrlParameter(final HttpServletRequest request)
{ {
String[] result; String result;
result = longRewritedUrlParameters(request.getRequestURI()); result = shortRewritedUrlParameter(request.getRequestURI());
// //
return (result); return (result);
} }
/**
* Return value of the first parameter.
*/
static public String shortRewritedUrlParameter(final String path)
{
String result;
String[] results = shortRewritedUrlParameters(path);
if ((results == null) || (results.length == 0))
{
result = null;
}
else
{
result = results[0];
}
//
return (result);
}
/** /**
* *
*/ */
public void doGet (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException static public String[] shortRewritedUrlParameters(final HttpServletRequest request)
{ {
doIt (request, response); String[] result;
}
result = shortRewritedUrlParameters(request.getRequestURI());
//
return (result);
}
/** /**
* * Extract value from a path. Example: "/article-123.xhtml" => "123".
*/ */
public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException static public String[] shortRewritedUrlParameters(final String path)
{ {
doIt (request, response); String[] result;
Matcher matcher = SHORT_REWRITED_URL_PARAMETERS.matcher(path);
if (matcher.matches())
{
if (matcher.groupCount() != 1)
{
result = null;
}
else
{
result = matcher.group(1).split("-");
}
}
else
{
result = null;
}
//
return (result);
} }
} }