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.