From 447d1f273b845796ee5188ca36c211628ed7d055 Mon Sep 17 00:00:00 2001 From: "Christian P. MOMON" Date: Thu, 20 Jun 2013 00:34:28 +0200 Subject: [PATCH] Remove kiss4web package and files because of split. --- .classpath | 2 - lib/commons-fileupload-1.2.1.jar | Bin 57779 -> 0 bytes lib/servlet-api.jar | Bin 97693 -> 0 bytes src/fr/devinsy/kiss4web/CookieHelper.java | 176 ----- src/fr/devinsy/kiss4web/Page.java | 18 - src/fr/devinsy/kiss4web/PageManager.java | 399 ----------- .../devinsy/kiss4web/ServletDispatcher.java | 71 -- .../kiss4web/SimpleServletDispatcher.java | 666 ------------------ src/fr/devinsy/kiss4web/security/Group.java | 105 --- src/fr/devinsy/kiss4web/security/Groups.java | 163 ----- .../kiss4web/security/GroupsFileReader.java | 55 -- .../kiss4web/security/SecurityAgent.java | 151 ---- src/fr/devinsy/kiss4web/security/User.java | 139 ---- src/fr/devinsy/kiss4web/security/Users.java | 109 --- .../kiss4web/security/UsersFileReader.java | 56 -- src/fr/devinsy/util/web/FileItemHelper.java | 83 --- src/fr/devinsy/util/web/Redirector.java | 26 - .../devinsy/util/web/SimpleSecurityAgent.java | 168 ----- tests/CmdExecTester.java | 111 ++- tests/XidvcTester.java | 90 --- 20 files changed, 40 insertions(+), 2548 deletions(-) delete mode 100644 lib/commons-fileupload-1.2.1.jar delete mode 100644 lib/servlet-api.jar delete mode 100644 src/fr/devinsy/kiss4web/CookieHelper.java delete mode 100644 src/fr/devinsy/kiss4web/Page.java delete mode 100644 src/fr/devinsy/kiss4web/PageManager.java delete mode 100755 src/fr/devinsy/kiss4web/ServletDispatcher.java delete mode 100755 src/fr/devinsy/kiss4web/SimpleServletDispatcher.java delete mode 100644 src/fr/devinsy/kiss4web/security/Group.java delete mode 100644 src/fr/devinsy/kiss4web/security/Groups.java delete mode 100644 src/fr/devinsy/kiss4web/security/GroupsFileReader.java delete mode 100644 src/fr/devinsy/kiss4web/security/SecurityAgent.java delete mode 100644 src/fr/devinsy/kiss4web/security/User.java delete mode 100644 src/fr/devinsy/kiss4web/security/Users.java delete mode 100644 src/fr/devinsy/kiss4web/security/UsersFileReader.java delete mode 100644 src/fr/devinsy/util/web/FileItemHelper.java delete mode 100644 src/fr/devinsy/util/web/Redirector.java delete mode 100644 src/fr/devinsy/util/web/SimpleSecurityAgent.java delete mode 100644 tests/XidvcTester.java diff --git a/.classpath b/.classpath index 53d7722..53930f2 100644 --- a/.classpath +++ b/.classpath @@ -7,8 +7,6 @@ - - diff --git a/lib/commons-fileupload-1.2.1.jar b/lib/commons-fileupload-1.2.1.jar deleted file mode 100644 index aa209b3887c90933cdc58c8c8572e90435e8e48d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57779 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

&knfH<$GJKCG=|8T=8!%js9}oQ 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�_l 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 diff --git a/lib/servlet-api.jar b/lib/servlet-api.jar deleted file mode 100644 index dd326d361146c9a7851fa96fa4ca48ec4f742c30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97693 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[" + tokens[tokens.length - 1] + "]"); - name.append (formatClassName (tokens[tokens.length - 1])); - - result = name.toString (); - } - - // - return (result); - } - - /** - * - */ - static public String buildClassName2 (String pathInfo) - { - String result; - - if (pathInfo.endsWith (".xhtml")) - { - char[] source = pathInfo.toCharArray (); - - StringBuffer out = new StringBuffer (); - for (char c : source) - { - out.append ("[" + c + "]"); - } - logger.debug (out.toString ()); - - char[] target = new char[source.length - 7]; - int lastStartToken = 0; - for (int nChar = 1; nChar < source.length - 5; nChar++) - { - char charSource = source[nChar]; - switch (charSource) - { - case '/': - target[nChar - 1] = '.'; - lastStartToken = nChar; - break; - - case '.': - target[lastStartToken] = Character.toUpperCase (target[lastStartToken]); - break; - - default: - target[nChar - 1] = source[nChar]; - } - } - - out = new StringBuffer (); - for (char c : target) - { - out.append ("[" + c + "]"); - } - logger.debug (out.toString ()); - - result = new String (target); - } - else if (pathInfo.equals ("/")) - { - result = "Accueil"; - } - else if (pathInfo.endsWith ("/")) - { - char[] source = pathInfo.toCharArray (); - - StringBuffer out = new StringBuffer (); - for (char c : source) - { - out.append ("[" + c + "]"); - } - logger.debug (out.toString ()); - - char[] target = new char[source.length - 2]; - int lastStartToken = 0; - for (int nChar = 1; nChar < source.length - 1; nChar++) - { - char charSource = source[nChar]; - switch (charSource) - { - case '/': - target[nChar - 1] = '.'; - lastStartToken = nChar + 1; - break; - - default: - target[nChar - 1] = source[nChar]; - } - } - - char[] targetPlus = new char [source.length - lastStartToken]; - targetPlus[0] = '.'; - targetPlus[1] = Character.toUpperCase (source[lastStartToken]); - int index = 2; - for (int nChar = lastStartToken + 1; nChar < source.length - 1; nChar++) - { - targetPlus[index] = source[nChar]; - index += 1; - } - - out = new StringBuffer (); - for (char c : target) - { - out.append ("[" + c + "]"); - } - logger.debug (out.toString ()); - out = new StringBuffer (); - for (char c : targetPlus) - { - out.append ("[" + c + "]"); - } - logger.debug (out.toString ()); - - result = new String (target) + new String (targetPlus); - } - else - { - logger.debug ("unknow case"); - result = null; - } - - // - return (result); - } - - - /** - */ - public Page instanciatePage (String className) - { - Page result; - - Class pageClass = null; - try - { - pageClass = (Class) Class.forName (className); - } - catch (java.lang.ClassNotFoundException exception) - { - result = null; - } - - logger.info ("class=" + pageClass); - - if (pageClass == null) - { - result = null; - logger.error ("Unknow page: (" + className + ")"); - } - else - { - try - { - result = pageClass.newInstance (); - } - catch (java.lang.InstantiationException exception) - { - logger.error ("Can't instanciate page (" + className + ")"); - result = null; - } - catch (java.lang.IllegalAccessException exception) - { - logger.error ("(2) Can't instanciate page (" + className + ")"); - result = null; - } - } - - // - return (result); - } - - /** - * - */ - public void doGet (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 () + "]"); - - String className = buildClassName (request.getPathInfo ()); - logger.info ("className=" + className); - - Page page = this.instanciatePage ("site." + className); - - if (page == null) - { - response.setContentType ("text/html"); - PrintWriter out = response.getWriter(); - - out.println ("Unknow page."); - } - else - { - HttpSession session = request.getSession (false); - String login; - if (session == null) - { - login = null; - } - else - { - login = (String) session.getAttribute ("login"); - } - - if (this.securityAgent.checkPermission (request.getPathInfo (), login)) - { - page.doIt (request, response); - logger.info ("securityAgent say 'permission OK': (" + login + ", " + request.getPathInfo () + ")"); - } - else - { - logger.info ("securityAgent say 'permission KO': (" + login + ", " + request.getPathInfo () + ")"); - - if (login == null) - { - response.sendRedirect ("/gestion/login.xhtml"); - } - else - { - response.setContentType ("text/html"); - PrintWriter out = response.getWriter(); - - out.println (""); - out.println ("Permission denied."); - out.println ("

"); - out.println (" "); - out.println (""); - out.println (""); - } - } - } - } - - - /** - * - */ - public void doPost (HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException - { - doGet (request, response); - } - - - /** - * - */ - static public String formatClassName (String name) - { - String result; - - result = null; - - String[] splittedLastToken = name.split ("\\."); - String last = splittedLastToken[0]; - //logger.info ("last=" + last); - - String[] tokens = last.split ("_"); - StringBuffer all = new StringBuffer (); - for (String token : tokens) - { - //logger.info ("tok=" + token); - - all.append (Character.toUpperCase (token.charAt (0))); - all.append (token.substring (1)); - } - - result = all.toString (); - - // - return (result); - } - - - /** - * - */ - public SecurityAgent securityAgent () - { - SecurityAgent result; - - result = this.securityAgent; - - // - return (result); - } - - - /** - * - */ - static public User getUserFromSession (HttpServletRequest request) - { - User result; - - if (request == null) - { - result = null; - } - else - { - HttpSession session = request.getSession (false); - - String login; - if (session == null) - { - result = null; - } - else - { - login = (String) session.getAttribute ("login"); - result = PageManager.instance ().securityAgent ().users ().getByLogin (login); - } - } - - // - return (result); - } -} diff --git a/src/fr/devinsy/kiss4web/ServletDispatcher.java b/src/fr/devinsy/kiss4web/ServletDispatcher.java deleted file mode 100755 index 8bb54fa..0000000 --- a/src/fr/devinsy/kiss4web/ServletDispatcher.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @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.*; -import javax.servlet.*; -import javax.servlet.http.*; - - - -/** - * - */ -public class ServletDispatcher extends SimpleServletDispatcher -{ - private static final long serialVersionUID = -3471226305721330069L; - protected org.apache.log4j.Logger logger; - //protected Servlets servlets; - - - /** - * - */ - public void init () throws ServletException - { - super.init(); - this.logger = org.apache.log4j.Logger.getLogger (this.getClass()); - //this.servlets = new Servlets(); - } - - - /** - * - */ - 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 () + "]"); - - String className = pathInfoToClassName (request.getPathInfo ()); - logger.info ("className=" + className); - - HttpServlet servlet = instanciateServlet (className); - - if (servlet == null) - { - response.setContentType ("text/html"); - PrintWriter out = response.getWriter(); - - out.println (""); - out.println ("Unknow page."); - out.println (""); - - out.close(); - } - else - { - servlet.service(request, response); - } - } -} diff --git a/src/fr/devinsy/kiss4web/SimpleServletDispatcher.java b/src/fr/devinsy/kiss4web/SimpleServletDispatcher.java deleted file mode 100755 index c32eb48..0000000 --- a/src/fr/devinsy/kiss4web/SimpleServletDispatcher.java +++ /dev/null @@ -1,666 +0,0 @@ -/** - * @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; -import java.io.PrintWriter; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -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 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 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' }; - - /** - * - */ - @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"); - - // Set logger. - String logFilepathname = getInitParameter("log4j-init-file"); - if (logFilepathname != null) - { - try - { - System.out.println("Log configuration found (" + logFilepathname + "), will use it."); - 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). - */ - static public String pathInfoToClassName(final String pathInfo) - { - 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 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); - } - - /** - * - */ - 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(); - */ - 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]; - - 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(); - } - } - } - } - - /** - * - */ - static public void returnInlineFile(final HttpServletResponse response, final File file, final String mimeType) throws IOException - { - 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(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); - } - - /** - * 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(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("-")); - string.append("-").append(rewriteParameter(parameter)); - } - - if ((extension != null) && (extension.length() != 0)) - { - string.append(".").append(extension); - } - - result = string.toString(); - - // - return (result); - } - - /** - * - */ - static public String shortRewritedUrlParameter(final HttpServletRequest request) - { - String result; - - result = shortRewritedUrlParameter(request.getRequestURI()); - - // - 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); - } - - /** - * - */ - 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()) - { - if (matcher.groupCount() != 1) - { - result = null; - } - else - { - result = matcher.group(1).split("-"); - } - } - else - { - result = null; - } - - // - return (result); - } -} diff --git a/src/fr/devinsy/kiss4web/security/Group.java b/src/fr/devinsy/kiss4web/security/Group.java deleted file mode 100644 index 59749e0..0000000 --- a/src/fr/devinsy/kiss4web/security/Group.java +++ /dev/null @@ -1,105 +0,0 @@ -package fr.devinsy.kiss4web.security; - - -import java.util.*; - -/** - * - */ -public class Group -{ - protected String name; - protected Vector members; - - - /** - * - */ - public Group () - { - this.name = null; - this.members = new Vector (); - } - - - /** - * - */ - public void addMember (String login) - { - if ((login != null) && (login.length () != 0)) - { - this.members.add (login); - } - } - - - /** - * - */ - public boolean contains (String name) - { - boolean result = false; - - result = this.members.contains (name); - - // - return (result); - } - - - /** - * - */ - public Vector members () - { - Vector result; - - result = this.members; - - // - return (result); - } - - - /** - * - */ - public String name () - { - String result; - - result = this.name; - - // - return (result); - } - - - /** - * - */ - public Group setName (String name) - { - this.name = name; - - // - return (this); - } - - - /** - * - */ - public String toString () - { - String result; - - result = "|" + this.name + "|" + this.members + "|"; - - // - return (result); - } -} - -// //////////////////////////////////////////////////////////////////////// diff --git a/src/fr/devinsy/kiss4web/security/Groups.java b/src/fr/devinsy/kiss4web/security/Groups.java deleted file mode 100644 index 1cfdfd1..0000000 --- a/src/fr/devinsy/kiss4web/security/Groups.java +++ /dev/null @@ -1,163 +0,0 @@ -package fr.devinsy.kiss4web.security; - - -import java.util.*; - -/** - * - */ -public class Groups extends Vector -{ - private static final long serialVersionUID = 6238581648850758903L; - - /** - * - */ - public Groups () - { - super (); - } - - - /** - * - */ - public Group get (String name) - { - Group result; - - if (name == null) - { - result = null; - } - else - { - result = null; - boolean ended = false; - Iterator iterator = this.iterator (); - while (!ended) - { - if (iterator.hasNext ()) - { - Group group = iterator.next (); - if (group.name ().equals (name)) - { - ended = true; - result = group; - } - } - else - { - ended = true; - result = null; - } - } - } - - // - return (result); - } - - - /* - * - */ - public boolean contains (String name) - { - boolean result; - - if (get (name) == null) - { - result = false; - } - else - { - result = true; - } - - // - return (result); - } - - - /** - * - */ - public Vector getLoginGroups (String login) - { - Vector result; - - result = new Vector (); - Iterator iterator = this.iterator (); - - while (iterator.hasNext ()) - { - Group group = iterator.next (); - - if (group.members ().contains (login)) - { - result.add (group.name ()); - } - } - - // - return (result); - } - - - /** - * - */ - public String getLoginGroupsString (String login) - { - String result; - - Vector groups = getLoginGroups (login); - - StringBuffer string = new StringBuffer (); - - for (String group : groups) - { - if (string.length () == 0) - { - string.append (group); - } - else - { - string.append (","); - string.append (group); - } - } - - result = string.toString (); - - // - return (result); - } - - - /** - * - */ - public String toString () - { - String result; - - StringBuffer out; - out = new StringBuffer (); - - Iterator iterator = this.iterator (); - - while (iterator.hasNext ()) - { - out.append (iterator.next ().toString () + "\n"); - } - - result = out.toString (); - - // - return (result); - } -} - -// //////////////////////////////////////////////////////////////////////// diff --git a/src/fr/devinsy/kiss4web/security/GroupsFileReader.java b/src/fr/devinsy/kiss4web/security/GroupsFileReader.java deleted file mode 100644 index ab44853..0000000 --- a/src/fr/devinsy/kiss4web/security/GroupsFileReader.java +++ /dev/null @@ -1,55 +0,0 @@ -package fr.devinsy.kiss4web.security; - -import java.io.*; -import java.util.*; - - -/** - * - */ -public class GroupsFileReader -{ - /** - * - */ - static public Groups load (String fileName) throws Exception - { - Groups result; - - result = new Groups (); - - Properties properties = new Properties(); - try - { - properties.load (new FileInputStream(fileName)); - - Iterator iterator = properties.keySet ().iterator (); - while (iterator.hasNext ()) - { - String key = (String) iterator.next (); - String valueLine = (String) properties.get (key); - - // - String[] values = valueLine.split (","); - - Group group = new Group (); - group.setName (key); - for (String value : values) - { - group.addMember (value.trim ()); - } - - result.add (group); - } - } - catch (Exception exception) - { - throw new Exception ("can't load (" + fileName + ")", exception); - } - - // - return (result); - } -} - -// //////////////////////////////////////////////////////////////////////// diff --git a/src/fr/devinsy/kiss4web/security/SecurityAgent.java b/src/fr/devinsy/kiss4web/security/SecurityAgent.java deleted file mode 100644 index 72a926b..0000000 --- a/src/fr/devinsy/kiss4web/security/SecurityAgent.java +++ /dev/null @@ -1,151 +0,0 @@ -package fr.devinsy.kiss4web.security; - - -import java.util.*; - - - -/** - * - */ -public class SecurityAgent -{ - protected Users users; - protected Groups groups; - protected Groups permissions; - - - /** - * - */ - public SecurityAgent (String path) throws Exception - { - this.users = UsersFileReader.load (path + "users.conf"); - this.groups = GroupsFileReader.load (path + "groups.conf"); - this.permissions = GroupsFileReader.load (path + "permissions.conf"); - } - - - /** - * - */ - public Groups groups () - { - Groups result; - - result = this.groups; - - // - return (result); - } - - /** - * - */ - public Groups permissions () - { - Groups result; - - result = this.permissions; - - // - return (result); - } - - /** - * - */ - public Users users () - { - Users result; - - result = this.users; - - // - return (result); - } - - /** - * - */ - public boolean authenticate (String login, String password) - { - boolean result; - - User user = this.users.getByLogin (login); - - if (user == null) - { - result = false; - } - else if (user.password ().equals (password)) - { - result = true; - } - else - { - result = false; - } - - // - return (result); - } - - /** - * - */ - public boolean checkPermission (String url, String login) - { - boolean result = false; - - Group permitGroups = this.permissions.get (url); - - if (permitGroups == null) - { - result = false; - } - else - { - // - boolean ended = false; - Iterator iterator = permitGroups.members ().iterator (); - while (!ended) - { - if (!iterator.hasNext ()) - { - ended = true; - result = false; - } - else - { - String groupName = iterator.next (); - if (groupName.equals ("*")) - { - result = true; - ended = true; - } - else - { - Group members = this.groups.get (groupName); - - if (members == null) - { - result = false; - } - else - { - if (members.contains (login)) - { - ended = true; - result = true; - } - } - } - } - } - } - - // - return (result); - } -} diff --git a/src/fr/devinsy/kiss4web/security/User.java b/src/fr/devinsy/kiss4web/security/User.java deleted file mode 100644 index 0054a75..0000000 --- a/src/fr/devinsy/kiss4web/security/User.java +++ /dev/null @@ -1,139 +0,0 @@ -package fr.devinsy.kiss4web.security; - - - - -/** - * - */ -public class User -{ - protected String login; - protected String password; - protected String realName; - protected String email; - - - /** - * - */ - public User () - { - this.login = null; - this.password = null; - this.realName = null; - this.email = null; - } - - - /** - * - */ - public String email () - { - String result; - - result = this.email; - - // - return (result); - } - - /** - * - */ - public String login () - { - String result; - - result = this.login; - - // - return (result); - } - - /** - * - */ - public String password () - { - String result; - - result = this.password; - - // - return (result); - } - - /** - * - */ - public String realName () - { - String result; - - result = this.realName; - - // - return (result); - } - - - /** - * - */ - public User setEmail (String email) - { - this.email = email; - - // - return (this); - } - - /** - * - */ - public User setLogin (String login) - { - this.login = login; - - // - return (this); - } - - /** - * - */ - public User setPassword (String password) - { - this.password = password; - - // - return (this); - } - - /** - * - */ - public User setRealName (String realName) - { - this.realName = realName; - - // - return (this); - } - - /** - * - */ - public String toString () - { - String result; - - result = "|" + this.login + "|" + this.password + "|" + this.realName + "|"; - - // - return (result); - } -} - diff --git a/src/fr/devinsy/kiss4web/security/Users.java b/src/fr/devinsy/kiss4web/security/Users.java deleted file mode 100644 index 479852b..0000000 --- a/src/fr/devinsy/kiss4web/security/Users.java +++ /dev/null @@ -1,109 +0,0 @@ -package fr.devinsy.kiss4web.security; - - -import java.util.*; - - -/** - * - */ -public class Users extends Vector -{ - private static final long serialVersionUID = 6140538630004281217L; - - - /** - * - */ - public Users () - { - super (); - } - - - /** - * - */ - public User getByLogin (String login) - { - User result; - - if (login == null) - { - result = null; - } - else - { - result = null; - boolean ended = false; - Iterator iterator = this.iterator (); - while (!ended) - { - if (iterator.hasNext ()) - { - User user = iterator.next (); - if (user.login ().equals (login)) - { - ended = true; - result = user; - } - } - else - { - ended = true; - result = null; - } - } - } - - // - return (result); - } - - - /* - * - */ - public boolean contains (String login) - { - boolean result; - - if (getByLogin (login) == null) - { - result = false; - } - else - { - result = true; - } - - // - return (result); - } - - - /** - * - */ - public String toString () - { - String result; - - StringBuffer out; - out = new StringBuffer (); - - Iterator iterator = this.iterator (); - - while (iterator.hasNext ()) - { - out.append (iterator.next ().toString () + "\n"); - } - - result = out.toString (); - - // - return (result); - } -} - -// //////////////////////////////////////////////////////////////////////// diff --git a/src/fr/devinsy/kiss4web/security/UsersFileReader.java b/src/fr/devinsy/kiss4web/security/UsersFileReader.java deleted file mode 100644 index eb07585..0000000 --- a/src/fr/devinsy/kiss4web/security/UsersFileReader.java +++ /dev/null @@ -1,56 +0,0 @@ -package fr.devinsy.kiss4web.security; - -import java.io.*; -import java.util.*; - - -/** - * - */ -public class UsersFileReader -{ - /** - * - */ - static public Users load (String fileName) throws Exception - { - Users result; - - result = new Users (); - - Properties properties = new Properties(); - try - { - properties.load (new FileInputStream(fileName)); - - Iterator iterator = properties.keySet ().iterator (); - while (iterator.hasNext ()) - { - String key = (String) iterator.next (); - String valueLine = (String) properties.get (key); - - // - String[] values = valueLine.split (","); - - User user = new User (); - user.setLogin (key); - user.setPassword (values[0]); - user.setRealName (values[1]); - user.setEmail (values[2]); - - result.add (user); - // - } - } - catch (Exception exception) - { - throw new Exception ("can't load (" + fileName + ")", exception); - } - - - // - return (result); - } -} - -// //////////////////////////////////////////////////////////////////////// diff --git a/src/fr/devinsy/util/web/FileItemHelper.java b/src/fr/devinsy/util/web/FileItemHelper.java deleted file mode 100644 index 67a520a..0000000 --- a/src/fr/devinsy/util/web/FileItemHelper.java +++ /dev/null @@ -1,83 +0,0 @@ -package fr.devinsy.util.web; - -import java.util.List; - -import org.apache.commons.fileupload.FileItem; - - -/** - * - */ -public class FileItemHelper -{ - //static private org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger (FileItemHelper.class); - - /** - * List FileItem - */ - static public String getItemValue (List items, String name) - { - String result; - - FileItem item = getItem(items, name); - - if (item == null) - { - result = null; - } - else - { - result = item.getString(); - } - - // - return(result); - } - - - /** - * List FileItem - */ - static public FileItem getItem (List items, String name) - { - FileItem result; - - if (name == null) - { - result = null; - } - else - { - result = null; - boolean ended = false; - int itemIndex = 0; - while (!ended) - { - if (itemIndex < items.size()) - { - FileItem item = (FileItem) items.get(itemIndex); - - if (name.equals(item.getFieldName())) - { - ended = true; - result = item; - } - else - { - itemIndex += 1; - } - } - else - { - ended = true; - result = null; - } - } - } - - // - return(result); - } -} - -// //////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/src/fr/devinsy/util/web/Redirector.java b/src/fr/devinsy/util/web/Redirector.java deleted file mode 100644 index 2d10f70..0000000 --- a/src/fr/devinsy/util/web/Redirector.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.devinsy.util.web; - -import javax.servlet.http.HttpServletResponse; - - - -/** - * - */ -public class Redirector -{ - static private org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger (Redirector.class); - - /** - * - */ - static public void redirect (HttpServletResponse response, String destination) - { - logger.info ("Redirect to <" + destination + ">"); - - response.setHeader ("Location", destination); - response.setStatus (HttpServletResponse.SC_MOVED_TEMPORARILY); - } -} - -// //////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/src/fr/devinsy/util/web/SimpleSecurityAgent.java b/src/fr/devinsy/util/web/SimpleSecurityAgent.java deleted file mode 100644 index 59dc55e..0000000 --- a/src/fr/devinsy/util/web/SimpleSecurityAgent.java +++ /dev/null @@ -1,168 +0,0 @@ -package fr.devinsy.util.web; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import fr.devinsy.kiss4web.CookieHelper; - - -/** - * - */ -public class SimpleSecurityAgent -{ - static protected org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger (SimpleSecurityAgent.class); - final static public String USERID_LABEL = "securityAgent.userId"; - final static public String ACCOUNTID_LABEL = "securityAgent.accountId"; - final static public String AUTH_LABEL = "securityAgent.auth"; - protected String userIdLabel; - protected String accountIdLabel; - protected String authLabel; - protected String secretKey; - - - - /** - * - */ - public SimpleSecurityAgent(String prefix, String secretKey) - { - this.userIdLabel = prefix + "." + USERID_LABEL; - this.accountIdLabel = prefix + "." + ACCOUNTID_LABEL; - this.authLabel= prefix + "." + AUTH_LABEL; - this.secretKey = secretKey; - } - - - /** - * - */ - static String md5sum(String source) - { - String result; - - result = org.apache.commons.codec.digest.DigestUtils.md5Hex(source); - - - // - return(result); - } - - - /** - * - */ - public String userId(HttpServletRequest request) - { - String result; - - result = (String) CookieHelper.getCookieValue(request, this.userIdLabel); - - // - return(result); - } - - - /** - * - */ - public String accountId(HttpServletRequest request) - { - String result; - - result = (String) CookieHelper.getCookieValue(request, this.accountIdLabel); - - // - return(result); - } - - - - /** - * - */ - public String auth(HttpServletRequest request) - { - String result; - - result = (String) CookieHelper.getCookieValue(request, this.authLabel); - - // - return(result); - } - - - /** - * Check authentication and refresh it (reset countdown). - */ - public boolean isAuthenticated (HttpServletRequest request, HttpServletResponse response) - { - boolean result; - - String accountId = accountId(request); - String userId = userId(request); - String auth = auth(request); - logger.info("cook=[" + auth + "]"); - - if (auth == null) - { - result = false; - } - else if (auth.equals(computeAuth(accountId, userId, request.getRemoteAddr(), this.secretKey))) - { - result = true; - - // Refresh cookies. - setAuthenticated(request, response, accountId, userId); - } - else - { - result = false; - } - - // - return (result); - } - - - /** - * - */ - static public String computeAuth(String key1, String key2, String key3, String key4) - { - String result; - - result = md5sum(key1 + key2 + key3+ key4); - - // - return(result); - } - - /** - * - */ - public void setAuthenticated (HttpServletRequest request, HttpServletResponse response, String accountId, String userId) - { - // Refresh cookie. - int duration = 60*60; - String auth = computeAuth(String.valueOf(accountId), userId, request.getRemoteAddr(), this.secretKey); - - response.addCookie (CookieHelper.buildCookie(this.authLabel, auth, duration)); - response.addCookie (CookieHelper.buildCookie(this.accountIdLabel, accountId, duration)); - response.addCookie (CookieHelper.buildCookie(this.userIdLabel, userId, duration)); - - logger.info("set [" + auth + "," + accountId + "," + userId + "," + request.getRemoteAddr() + ")"); - } - - - /** - * - */ - public void reset(HttpServletRequest request, HttpServletResponse response) - { - CookieHelper.reset(response, this.authLabel); - CookieHelper.reset(response, this.accountIdLabel); - CookieHelper.reset(response, this.userIdLabel); - } -} \ No newline at end of file diff --git a/tests/CmdExecTester.java b/tests/CmdExecTester.java index baef9bf..a85a80a 100644 --- a/tests/CmdExecTester.java +++ b/tests/CmdExecTester.java @@ -2,125 +2,94 @@ * XidvcTest. */ -import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; import fr.devinsy.util.cmdexec.CmdExec; import fr.devinsy.util.cmdexec.StreamGobbler; -import fr.devinsy.util.unix.Unix; -import fr.devinsy.kiss4web.*; - /** * */ -class CmdExecTester -{ +class CmdExecTester { static private org.apache.log4j.Logger logger; - static - { + static { // Initialize logger. org.apache.log4j.Logger logger = null; - org.apache.log4j.BasicConfigurator.configure (); + org.apache.log4j.BasicConfigurator.configure(); + logger = org.apache.log4j.Logger.getRootLogger(); + // logger.setLevel (org.apache.log4j.Level.INFO); + logger.setLevel(org.apache.log4j.Level.INFO); - logger = org.apache.log4j.Logger.getRootLogger (); - //logger.setLevel (org.apache.log4j.Level.INFO); - logger.setLevel (org.apache.log4j.Level.INFO); - - logger.info ("Enter"); + logger.info("Enter"); // - logger.info ("Set the log file format..."); + logger.info("Set the log file format..."); + // log = + // org.apache.log4j.Category.getInstance(Application.class.getName()); + logger.info("... done."); - // log = org.apache.log4j.Category.getInstance(Application.class.getName()); - logger.info ("... done."); - - logger.debug ("Exit"); - logger = org.apache.log4j.Logger.getLogger (CmdExecTester.class); + logger.debug("Exit"); + logger = org.apache.log4j.Logger.getLogger(CmdExecTester.class); } - - /** * */ - public static String check (String title, StringBuffer source, String model) - { + public static String check(final String title, final StringBuffer source, + final String model) { String result; - if (source.indexOf (model) == -1) - { - result = String.format ("%-40s -> KO <-", title) + "\nGet:\n" + source + "\nWaiting:\n" + model; + if (source.indexOf(model) == -1) { + result = String.format("%-40s -> KO <-", title) + "\nGet:\n" + + source + "\nWaiting:\n" + model; + } else { + result = String.format("%-40s [ OK ] ", title); } - else - { - result = String.format ("%-40s [ OK ] ", title); - } - // return (result); } - /** - * + * */ - public static String testCaller (String pathInfo, String prefix) - { - String result; - - result = "[" + pathInfo + "]=>[" + ServletDispatcher.pathInfoToClassName(pathInfo, prefix) + "]"; - - // - return(result); + public static void main(final String[] args) { + System.out.println("Automatic test action for CmdExec!"); + + Matcher m = Pattern.compile("^#\\sowner:\\s([a-z_][a-z0-9_-]*)$") + .matcher("# owner: cpm"); + m.matches(); + // System.out.println("owner=[" + m.matches() + "]"); + System.out.println("owner=[" + m.groupCount() + "]"); + System.out.println("owner=[" + m.group(1) + "]"); + // test1(); + } - - + /** * */ - public static void test1() - { - try - { + public static void test1() { + try { System.out.println("Launch ..."); - - //String command = "/bin/sort -r /etc/passwd"; + + // String command = "/bin/sort -r /etc/passwd"; String[] command = {"/bin/sort", "-r", "/etc/passwd"}; - CmdExec cmd = new CmdExec (command, StreamGobbler.BUFFER, StreamGobbler.BUFFER); + CmdExec cmd = new CmdExec(command, StreamGobbler.BUFFER, + StreamGobbler.BUFFER); System.out.println("exitVal=[" + cmd.getExitValue() + "]"); System.out.println("out=[" + cmd.getOutStream() + "]"); System.out.println("err=[" + cmd.getErrStream() + "]"); - } - catch (Exception exception) - { + } catch (Exception exception) { exception.printStackTrace(); logger.info("ERRRO=" + exception); } } - - /** - * - */ - public static void main(String[] args) - { - System.out.println("Automatic test action for CmdExec!"); - - Matcher m = Pattern.compile("^#\\sowner:\\s([a-z_][a-z0-9_-]*)$").matcher("# owner: cpm"); - m.matches(); - //System.out.println("owner=[" + m.matches() + "]"); - System.out.println("owner=[" + m.groupCount() + "]"); - System.out.println("owner=[" + m.group(1) + "]"); - //test1(); - - - } } diff --git a/tests/XidvcTester.java b/tests/XidvcTester.java deleted file mode 100644 index 9044f35..0000000 --- a/tests/XidvcTester.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Kiss4Web tests. - */ - -import fr.devinsy.kiss4web.*; - - -/** - * - */ -class XidvcTester -{ - static private org.apache.log4j.Logger logger; - - static - { - // Initialize logger. - org.apache.log4j.Logger logger = null; - - org.apache.log4j.BasicConfigurator.configure (); - - - logger = org.apache.log4j.Logger.getRootLogger (); - //logger.setLevel (org.apache.log4j.Level.INFO); - logger.setLevel (org.apache.log4j.Level.INFO); - - logger.info ("Enter"); - - // - logger.info ("Set the log file format..."); - - - // log = org.apache.log4j.Category.getInstance(Application.class.getName()); - logger.info ("... done."); - - logger.debug ("Exit"); - logger = org.apache.log4j.Logger.getLogger (XidvcTester.class.getName ()); - } - - - - /** - * - */ - public static String check (String title, StringBuffer source, String model) - { - String result; - - if (source.indexOf (model) == -1) - { - result = String.format ("%-40s -> KO <-", title) + "\nGet:\n" + source + "\nWaiting:\n" + model; - - } - else - { - result = String.format ("%-40s [ OK ] ", title); - } - - - // - return (result); - } - - - /** - * - */ - public static String testCaller (String pathInfo, String prefix) - { - String result; - - result = "[" + pathInfo + "]=>[" + ServletDispatcher.pathInfoToClassName(pathInfo, prefix) + "]"; - - // - return(result); - } - - /** - * - */ - public static void main(String[] args) - { - System.out.println ("----------------------------"); - System.out.println(testCaller("/", "fr.devinsy.website")); - System.out.println(testCaller("/good/", "fr.devinsy.website")); - System.out.println(testCaller("/good/morning", "fr.devinsy.website")); - System.out.println(testCaller("/good/day_day", "fr.devinsy.website")); - System.out.println(testCaller("/good/day.xhtml", "fr.devinsy.website")); - } -}