diff --git a/src/fr/devinsy/kiss4web/SimpleServletDispatcher.java b/src/fr/devinsy/kiss4web/SimpleServletDispatcher.java index 929ccaa..c32eb48 100755 --- a/src/fr/devinsy/kiss4web/SimpleServletDispatcher.java +++ b/src/fr/devinsy/kiss4web/SimpleServletDispatcher.java @@ -1,12 +1,11 @@ /** - * @author Christian Momon, June 2008. - * This file is free software under the terms of the GNU Library General Public License - * as published by the Free Software Foundation version 2 or any later version. + * @author Christian Momon, June 2008. This file is free software under the + * terms of the GNU Library General Public License as published by the + * Free Software Foundation version 2 or any later version. */ package fr.devinsy.kiss4web; - import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -22,28 +21,151 @@ import javax.servlet.http.HttpServletResponse; import fr.devinsy.util.StringList; - /** * */ public class SimpleServletDispatcher extends HttpServlet { private static final long serialVersionUID = -3471226305721330069L; - static protected org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger (ServletDispatcher.class); + static protected org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(ServletDispatcher.class); 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 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]"); 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' }; + /** * */ - public void init () throws ServletException + @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(""); + out.println("Unknow page."); + out.println(""); + + 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 (""); out.println + * ("Not authorized page."); out.println (""); + */ + } + } + } + + /** + * + */ + @Override + public void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException + { + doIt(request, response); + } + + /** + * + */ + @Override + public void init() throws ServletException { super.init(); this.webclassesRootPath = getInitParameter("webClassesRootPath"); @@ -55,31 +177,104 @@ public class SimpleServletDispatcher extends HttpServlet try { System.out.println("Log configuration found (" + logFilepathname + "), will use it."); - org.apache.log4j.PropertyConfigurator.configure (getServletContext().getRealPath("/") + logFilepathname); + org.apache.log4j.PropertyConfigurator.configure(getServletContext().getRealPath("/") + logFilepathname); } catch (Exception exception) { System.out.println("Log configuration FILE NOT FOUND (" + logFilepathname + "), use of the basic configurator."); org.apache.log4j.BasicConfigurator.configure(); } - + logger = org.apache.log4j.Logger.getLogger(this.getClass()); logger.info("Log initialization done."); } } + /** + * + */ + public boolean isAuthorized(final HttpServletRequest request, final HttpServletResponse response) + { + boolean result; + + result = true; + + // + return (result); + } + + /** + * + */ + static public HttpServlet instanciateServlet(final String className) + { + HttpServlet result; + + Class servletClass = null; + try + { + servletClass = (Class) Class.forName(className); + } + catch (java.lang.ClassNotFoundException exception) + { + result = null; + } + + logger.info("class=" + servletClass); + + if (servletClass == null) + { + result = null; + logger.error("Unknow page: (" + className + ")"); + } + else + { + try + { + result = servletClass.newInstance(); + } + catch (java.lang.InstantiationException exception) + { + logger.error("Can't instanciate servlet (" + className + ")"); + result = null; + } + catch (java.lang.IllegalAccessException exception) + { + logger.error("(2) Can't instanciate servlet (" + className + ")"); + result = null; + } + } + + // + return (result); + } + + /** + * Extract values from a path. Example: "/article-/123/doors/open.xhtml" => + * "123", "doors" and "open". + */ + static public String[] longRewritedUrlParameters(final String path) + { + String[] result; + + result = path.substring(path.indexOf("-/") + 2).split("/"); + + // + 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). + * "/" => "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) + static public String pathInfoToClassName(final String pathInfo) { String result; @@ -89,45 +284,47 @@ public class SimpleServletDispatcher extends HttpServlet } else { - if ( pathInfo.equals ("/")) + 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++) + // 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 ('.'); + 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 (); + name.append(lastToken.substring(0, 1).toUpperCase()).append(lastToken.substring(1).replace('.', '_')); + result = name.toString(); } else { - String[] tokens = pathInfo.split ("/"); - + 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++) + // 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 ('.'); + name.append(tokens[tokenCounter]); + name.append('.'); } - + String lastToken = tokens[tokens.length - 1]; - if (pathInfo.endsWith ("/")) + if (pathInfo.endsWith("/")) { name.append(lastToken).append(".").append(lastToken.substring(0, 1).toUpperCase()).append(lastToken.substring(1)).append("_xhtml"); } @@ -137,35 +334,35 @@ public class SimpleServletDispatcher extends HttpServlet if (matcher.matches()) { // Short rewrited URL case. - //logger.debug("group 1=[" + matcher.group(1) + "]"); + // logger.debug("group 1=[" + matcher.group(1) + + // "]"); lastToken = matcher.group(1) + ".xhtml"; } - - name.append (lastToken.substring(0, 1).toUpperCase()).append (lastToken.substring(1).replace('.', '_')); + + name.append(lastToken.substring(0, 1).toUpperCase()).append(lastToken.substring(1).replace('.', '_')); } - - result = name.toString (); - logger.debug ("==>[" + tokens[tokens.length - 1] + "]"); + + result = name.toString(); + logger.debug("==>[" + tokens[tokens.length - 1] + "]"); } } } - - logger.info ("[" + pathInfo + "] => [" + result + "]"); + + logger.info("[" + pathInfo + "] => [" + result + "]"); // return (result); } - /** * */ - static public String pathInfoToClassName (String pathInfo, String prefix) + static public String pathInfoToClassName(final String pathInfo, final String prefix) { String result; String className = pathInfoToClassName(pathInfo); - + if (prefix == null) { result = className; @@ -177,287 +374,168 @@ public class SimpleServletDispatcher extends HttpServlet else { result = prefix + "." + className; - } - - // - return (result); - } - - - /** - * - */ - static public HttpServlet instanciateServlet (String className) - { - HttpServlet result; - - Class servletClass = null; - try - { - servletClass = (Class) Class.forName (className); - } - catch (java.lang.ClassNotFoundException exception) - { - result = null; - } - - logger.info ("class=" + servletClass); - - if (servletClass == null) - { - result = null; - logger.error ("Unknow page: (" + className + ")"); - } - else - { - try - { - result = servletClass.newInstance (); - } - catch (java.lang.InstantiationException exception) - { - logger.error ("Can't instanciate servlet (" + className + ")"); - result = null; - } - catch (java.lang.IllegalAccessException exception) - { - logger.error ("(2) Can't instanciate servlet (" + className + ")"); - result = null; - } } // return (result); } - /** * */ - public boolean isAuthorized(HttpServletRequest request, HttpServletResponse response) - { - boolean result; - - result = true; - - // - return(result); - } - - - /** - * - */ - static public void returnInlineFile(HttpServletResponse response, File file, String mimeType) throws IOException - { - returnFile(response, file, mimeType, false); - } - - - /** - * - */ - static public void returnAttachmentFile(HttpServletResponse response, File file, String mimeType) throws IOException + static public void returnAttachmentFile(final HttpServletResponse response, final File file, final String mimeType) throws IOException { 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())) - { - response.sendError(HttpServletResponse.SC_NOT_FOUND); - } - else - { - /* - response.setContentType("application/" + extension); - response.setContentLength((int) data.length); - response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\""); - response.flushBuffer(); + + if ((file == null) || (!file.exists())) + { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + } + else + { + /* + * response.setContentType("application/" + extension); + * response.setContentLength((int) data.length); + * response.setHeader("Content-Disposition" + * ,"attachment; filename=\"" + filename + "\""); + * response.flushBuffer(); */ - response.reset(); - response.setContentType(mimeType); - response.setContentLength((int) file.length()); - response.setHeader("Content-Disposition","inline; filename=\"" + file.getName()+ "\""); - response.flushBuffer(); + response.reset(); + response.setContentType(mimeType); + response.setContentLength((int) file.length()); + response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\""); + response.flushBuffer(); - ServletOutputStream out = response.getOutputStream(); - - FileInputStream in = null; - try // Only for the in. - { - byte[] buffer = new byte[64*1024]; + ServletOutputStream out = response.getOutputStream(); - in = new FileInputStream(file); - boolean ended = false; - while (!ended) - { - int count = in.read(buffer); - - if (count == -1) - { - ended = true; - } - else - { - out.write(buffer, 0, count); - } - } - out.flush(); - out.close(); - } - catch (IOException exception) - { - response.sendError(HttpServletResponse.SC_PARTIAL_CONTENT); - } - finally - { - if (in != null) - { - in.close(); - } - } - } - } - - - /** - * - * - */ - public void doIt (HttpServletRequest request, 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(); - - 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) + FileInputStream in = null; + try + // Only for the in. { - response.setContentType ("text/html"); - PrintWriter out = response.getWriter(); - - out.println (""); - out.println ("Unknow page."); - out.println (""); - + byte[] buffer = new byte[64 * 1024]; + + in = new FileInputStream(file); + boolean ended = false; + while (!ended) + { + int count = in.read(buffer); + + if (count == -1) + { + ended = true; + } + else + { + out.write(buffer, 0, count); + } + } + out.flush(); out.close(); } - else if (isAuthorized(request, response)) + catch (IOException exception) { - servlet.init(this.getServletConfig()); - servlet.service(request, response); + response.sendError(HttpServletResponse.SC_PARTIAL_CONTENT); } - else + finally { - /* - * TODO - // - response.setContentType ("text/html"); - PrintWriter out = response.getWriter(); - - out.println (""); - out.println ("Not authorized page."); - out.println (""); - */ + if (in != null) + { + in.close(); + } } } } - /** - * "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 = + static public void returnInlineFile(final HttpServletResponse response, final File file, final String mimeType) throws IOException { - /* 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' - }; + returnFile(response, file, mimeType, false); + } + + /** + * + */ + static public String[] rewritedUrlParameters(final HttpServletRequest request) + { + String[] result; + + result = longRewritedUrlParameters(request.getRequestURI()); + + // + return (result); + } + + /** + * 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. + * + * Example: "/good/give_file?id=123&filename=foo.jpg" => + * rewriteShorturl("/good/give_file", "123", "foo.jpg"); => + * "/good/give_file-/123/foo.jpg" + * + * Note: "-/" is used to indicate the start of parameters. + * + */ + static public String rewriteLongUrl(final String uri, final String... parameters) + { + String result; + + StringList string = new StringList(); + + string.append(uri).append("-"); + if ((parameters == null) || (parameters.length == 0)) + { + string.append("/"); + } + else + { + for (String parameter : parameters) + { + string.append("/").append(parameter); + } + } + + result = string.toString(); + + // + return (result); + } - /** * * * @param parameter * @return */ - static String rewriteParameter (String parameter) + 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)]); + // 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; + buffer.append(car); + previousCar = car; } } } @@ -466,36 +544,36 @@ public class SimpleServletDispatcher extends HttpServlet { 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. + * 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" + * 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) + static public String rewriteShortUrl(final String uri, final String extension, final 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("-")); + // 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)); } @@ -503,23 +581,68 @@ public class SimpleServletDispatcher extends HttpServlet { string.append(".").append(extension); } - + result = string.toString(); - + // - return(result); + return (result); } + /** + * + */ + static public String shortRewritedUrlParameter(final HttpServletRequest request) + { + String result; + + result = shortRewritedUrlParameter(request.getRequestURI()); + + // + return (result); + } /** - * Extract value from a path. - * Example: - * "/article-123.xhtml" => "123". + * Return value of the first parameter. */ - static public String[] shortRewritedUrlParameters(String path) + 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); + } + + /** + * + */ + static public String[] shortRewritedUrlParameters(final HttpServletRequest request) { String[] result; - + + result = shortRewritedUrlParameters(request.getRequestURI()); + + // + return (result); + } + + /** + * Extract value from a path. Example: "/article-123.xhtml" => "123". + */ + static public String[] shortRewritedUrlParameters(final String path) + { + String[] result; + Matcher matcher = SHORT_REWRITED_URL_PARAMETERS.matcher(path); if (matcher.matches()) { @@ -538,144 +661,6 @@ public class SimpleServletDispatcher extends HttpServlet } // - 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. - * - * Sometimes, URL has to be rewrited because we need to put parameter in the page name. - * - * Example: - * "/good/give_file?id=123&filename=foo.jpg" - * => rewriteShorturl("/good/give_file", "123", "foo.jpg"); - * => "/good/give_file-/123/foo.jpg" - * - * Note: "-/" is used to indicate the start of parameters. - * - */ - static public String rewriteLongUrl(String uri, String... parameters) - { - String result; - - StringList string = new StringList(); - - string.append(uri).append("-"); - if ((parameters == null) || (parameters.length == 0)) - { - string.append("/"); - } - else - { - for (String parameter : parameters) - { - string.append("/").append(parameter); - } - } - - result = string.toString(); - - // - return(result); - } - - - /** - * Extract values from a path. - * Example: - * "/article-/123/doors/open.xhtml" => "123", "doors" and "open". - */ - static public String[] longRewritedUrlParameters(String path) - { - String[] result; - - result = path.substring(path.indexOf("-/") + 2).split("/"); - - // - return(result); - } - - - /** - * - */ - static public String[] rewritedUrlParameters(HttpServletRequest request) - { - String[] result; - - result = longRewritedUrlParameters(request.getRequestURI()); - - // - return(result); - } - - - /** - * - */ - public void doGet (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException - { - doIt (request, response); - } - - - /** - * - */ - public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException - { - doIt (request, response); + return (result); } }