Scarab commit: svn commit: r10497 - trunk/src/java/org/tigris/scarab: actions tools util

[email protected]
Newsgroups gmane.comp.java.scarab.cvs
Message-ID <[email protected]>
Author: ronvoe122
Date: 2007-12-11 14:11:02-0800
New Revision: 10497

Modified:
   trunk/src/java/org/tigris/scarab/actions/Search.java
   trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java
   trunk/src/java/org/tigris/scarab/util/ScarabUtil.java

Log:
SCB2303: All query-strings defining an issue-search are now internally treated as encoded utf-8-strings. 

This should ensure that queries containing non-ascii-characters are working independent of the character-encoding in browser and DB.

The encoding and decoding is done using the standard URLEn/Decoder-classes.
The custom-encoder has been removed.

Modified: trunk/src/java/org/tigris/scarab/actions/Search.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/Search.java?view=diff&rev=10497&p1=trunk/src/java/org/tigris/scarab/actions/Search.java&p2=trunk/src/java/org/tigris/scarab/actions/Search.java&r1=10496&r2=10497
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/Search.java	(original)
+++ trunk/src/java/org/tigris/scarab/actions/Search.java	2007-12-11 14:11:02-0800
@@ -553,8 +553,7 @@
         // user runs a saved query, the resulting issue list is
         // displayed with that query's settings. 
         //
-        StringValueParser parser = new StringValueParser();
-        parser.parse(query.getValue(), '&', '=', true);
+        StringValueParser parser = ScarabUtil.parseURL(query.getValue());
         
         if (parser.containsKey("resultsperpage")) {
             data.getParameters().add("resultsperpage",
@@ -716,7 +715,7 @@
         while(iter.hasNext())
         {
             Integer id = (Integer)iter.next();
-            queryPart += "&attv__"+id+"val="+searchString;
+            queryPart += "&attv__"+id+"val="+ScarabUtil.urlEncode(searchString);
         }
         queryPart += "&searchmptq=true";
         

Modified: trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java?view=diff&rev=10497&p1=trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java&p2=trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java&r1=10496&r2=10497
==============================================================================
--- trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java	(original)
+++ trunk/src/java/org/tigris/scarab/tools/ScarabRequestTool.java	2007-12-11 14:11:02-0800
@@ -133,6 +133,7 @@
 import org.tigris.scarab.util.ScarabException;
 import org.tigris.scarab.util.ScarabLink;
 import org.tigris.scarab.util.ScarabPaginatedList;
+import org.tigris.scarab.util.ScarabUtil;
 import org.tigris.scarab.util.SimpleSkipFiltering;
 import org.tigris.scarab.util.word.IssueSearch;
 import org.tigris.scarab.util.word.IssueSearchFactory;
@@ -1609,9 +1610,8 @@
         }
         else 
         {
+            StringValueParser parser = ScarabUtil.parseURL(param);
             intake = new Intake();
-            StringValueParser parser = new StringValueParser();
-            parser.parse(param, '&', '=', true);
             intake.init(parser);
         }
 
@@ -1632,11 +1632,8 @@
         search.setIssueListAttributeColumns(getRModuleUserAttributes());
         search.setLocalizationTool(getLocalizationTool());
 
-        Intake intake = parseQuery(query);
+        StringValueParser parser = ScarabUtil.parseURL(query);
 
-        // If they have entered users to search on, add them to the search
-        StringValueParser parser = new StringValueParser();
-        parser.parse(query, '&', '=', true);
         String[] userList = parser.getStrings("user_list");
         boolean searchInAllAttributes = parser.getBoolean("searchallattributes",false);
         if (userList != null && userList.length > 0)
@@ -1655,6 +1652,8 @@
             }
         }
 
+        Intake intake = new Intake();        
+        intake.init(parser);
         Group searchGroup = intake.get("SearchIssue", search.getQueryKey());
 
         boolean datesValid = true;
@@ -1781,20 +1780,6 @@
     }
 
     /**
-     * Parses query into intake values.
-    */
-    public Intake parseQuery(String query)
-        throws Exception
-    {
-        Intake intake = new Intake();
-        StringValueParser parser = new StringValueParser();
-        parser.parse(query, '&', '=', true);
-        
-        intake.init(parser);
-        return intake;
-    }
-
-    /**
      * Performs search on current query (which is stored in user session).
      */
     public List getCurrentSearchResults()

Modified: trunk/src/java/org/tigris/scarab/util/ScarabUtil.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/ScarabUtil.java?view=diff&rev=10497&p1=trunk/src/java/org/tigris/scarab/util/ScarabUtil.java&p2=trunk/src/java/org/tigris/scarab/util/ScarabUtil.java&r1=10496&r2=10497
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/ScarabUtil.java	(original)
+++ trunk/src/java/org/tigris/scarab/util/ScarabUtil.java	2007-12-11 14:11:02-0800
@@ -46,10 +46,12 @@
  * individuals on behalf of Collab.Net.
  */ 
 
+import java.net.URLEncoder;
 import java.util.Iterator;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.fulcrum.parser.StringValueParser;
 import org.apache.turbine.RunData;
 import org.tigris.scarab.om.Module;
 
@@ -188,135 +190,20 @@
     }
 
     /**
-     * URL encodes <code>in</code>. If the string is null, nothing will be
-     * written. This method is faster than urlEncodeSlow if the string to
-     * encode does not contain any characters needing encoding. It adds some
-     * penalty for strings which actually need to be encoded. for short strings
-     * ~20 characters the upside is a 75% decrease. while the penalty is a 10%
-     * increase. As many query parameters do not need encoding even in i18n
-     * applications it should be much better to delay the byte conversion.
-     * 
+     * URL encodes <code>in</code>.     * 
      * @param in the String to encode.
      * @return the url-encoded string.
      */
     public static final String urlEncode(String in)
     {
-        if (in == null)
+        try
         {
-            return null;
+            return URLEncoder.encode(in, "UTF-8");
         }
-
-        if (in.length() == 0)
+        catch ( Exception e)
         {
-            return "";
-        }
-
-        StringBuffer out = new StringBuffer(in.length());
-        char[] chars = in.toCharArray();
-
-        for (int i = 0; i < chars.length; i++)
-        {
-            char c = chars[i];
-
-            if (c < 128 && safe[c])
-            {
-                out.append(c);
-            }
-            else if (c == ' ')
-            {
-                out.append('+');
-            }
-            else
-            {
-                // since we need to encode we will give up on
-                // doing it the fast way and convert to bytes.
-                return out
-                    .append(urlEncodeSlow(in.substring(i).getBytes()))
-                    .toString();
-            }
+            throw new RuntimeException(e);
         }
-        return out.toString();
-    }
-
-    /**
-     * URL encodes <code>in</code>. Code 'borrowed' from DynamicURI.java in
-     * the Jakarta Turbine 3 package. We use this code instead of
-     * java.net.Encoder because Encoder.encode is deprecated and we don't feel
-     * like putting a dependency on JDK 1.4.1. This should work fine for our
-     * purposes.
-     * 
-     * @param in a non-empty String to encode.
-     * @return the url-encoded string.
-     */
-    private static final String urlEncodeSlow(byte[] bytes)
-    {
-        StringBuffer out = new StringBuffer(bytes.length * 2);
-
-        for (int i = 0; i < bytes.length; i++)
-        {
-            char c = (char)bytes[i];
-
-            if (c < 128 && safe[c])
-            {
-                out.append(c);
-            }
-            else if (c == ' ')
-            {
-                out.append('+');
-            }
-            else
-            {
-                byte toEscape = bytes[i];
-                out.append('%');
-                int low = (toEscape & 0x0f);
-                int high = ((toEscape & 0xf0) >> 4);
-                out.append(HEXADECIMAL[high]);
-                out.append(HEXADECIMAL[low]);
-            }
-        }
-        return out.toString();
-    }
-	
-    /**
-     * Array mapping hexadecimal values to the corresponding ASCII characters.
-     */
-    private static final char[] HEXADECIMAL =
-        {
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-            'A', 'B', 'C', 'D', 'E', 'F'
-        };
-
-    /**
-     * Characters that need not be encoded. This is much faster than using a
-     * BitSet, and for such a small array the space cost seems justified.
-     */
-    private static boolean[] safe = new boolean[ 128 ];
-
-    /** Static initializer for {@link #safe} */
-    static
-    {
-        for (int i = 'a'; i <= 'z'; i++)
-        {
-            safe[ i ] = true;
-        }
-        for (int i = 'A'; i <= 'Z'; i++)
-        {
-            safe[ i ] = true;
-        }
-        for (int i = '0'; i <= '9'; i++)
-        {
-            safe[ i ] = true;
-        }
-
-        safe['-'] = true;
-        safe['_'] = true;
-        safe['.'] = true;
-        safe['!'] = true;
-        safe['~'] = true;
-        safe['*'] = true;
-        safe['\''] = true;
-        safe['('] = true;
-        safe[')'] = true;
     }
     
     public static String filterNonXml(String input)
@@ -353,4 +240,12 @@
         return false;
     }
 
+    public static StringValueParser parseURL(String url) throws Exception
+    {
+        StringValueParser parser = new StringValueParser();
+        parser.setCharacterEncoding("UTF-8");
+        parser.parse(url, '&', '=', true);
+        return parser;
+    }
+
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.