[ 
https://issues.apache.org/jira/browse/OLINGO-940?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Daniel Li updated OLINGO-940:
-----------------------------
    Description: 
When doing the filter "$filter=substringof('AT & T',tolower(AccountName))", the 
system will throw "Invalid filter expression: '((substringof('at '." error.

After looking at the implementation, we found there is bug when parsing query 
string in 
org.apache.olingo.odata2.core.servlet.RestUtil.extractAllQueryParameters(String)
 and 
org.apache.olingo.odata2.core.servlet.RestUtil.extractQueryParameters(String). 

For V2 2.0.1 and V2 2.0.2, it only split the query string by "&", when the 
filter value contains "&", the error is occurred. 
List<String> queryParameters 
=Arrays.asList(Decoder.decode(queryString).split("\\&")); 

>From V2 2.0.3, it still split the query string by "&", 
List<String> queryParameters = Arrays.asList(queryString.split("\\&")); 

To fix this issue, below is my suggestion(based on V2 2.0.1 & V2 2.0.2), add 
special handling after decode the query string: 
List<String> queryParameters = 
Arrays.asList(handleSpecialCharacter(Decoder.decode(queryString)).split("\\&"));
 and then add below method:

   /**
     * Handle special characters to encode characters such as "%" and "&" etc..
     * 
     * @param queryString
     *            A decoded query string
     * @return
   */
  private static String handleSpecialCharacter(String queryString) {
      Pattern pattern = Pattern.compile("\\'.+\\'");
      Matcher matcher = pattern.matcher(queryString);
      StringBuffer sb = new StringBuffer();
      while(matcher.find()) {
          String matchStr = matcher.group();
          String str1 = matcher.replaceFirst(matchStr.replaceAll("%", 
"%25").replaceAll("&", "%26"));
          sb.append(str1);
      }
      return sb.toString();
  }

  was:
When doing the filter "$filter=substringof('AT & T',tolower(AccountName))", the 
system will throw "Invalid filter expression: '((substringof('at '." error.

After looking at the implementation, we found there is bug when parsing query 
string in 
org.apache.olingo.odata2.core.servlet.RestUtil.extractAllQueryParameters(String)
 and 
org.apache.olingo.odata2.core.servlet.RestUtil.extractQueryParameters(String). 

For V2 2.0.1 and V2 2.0.2, it only split the query string by "&", when the 
filter value contains "&", the error is occurred. 
List<String> queryParameters 
=Arrays.asList(Decoder.decode(queryString).split("\\&")); 

>From V2 2.0.3, it still split the query string by "&", 
List<String> queryParameters = Arrays.asList(queryString.split("\\&")); 

To fix this issue, below is my suggestion(based on V2 2.0.1 & V2 2.0.2), add 
special handling after decode the query string: 
List<String> queryParameters = 
Arrays.asList(handleSpecialCharacter(Decoder.decode(queryString)).split("\\&"));
 and then add below method:

 /**
     * Handle special characters to encode characters such as "%" and "&" etc..
     * 
     * @param queryString
     *            A decoded query string
     * @return
     */
  private static String handleSpecialCharacter(String queryString) {
      Pattern pattern = Pattern.compile("\\'.+\\'");
      Matcher matcher = pattern.matcher(queryString);
      StringBuffer sb = new StringBuffer();
      while(matcher.find()) {
          String matchStr = matcher.group();
          String str1 = matcher.replaceFirst(matchStr.replaceAll("%", 
"%25").replaceAll("&", "%26"));
          sb.append(str1);
      }
      return sb.toString();
  }


> Doesn't support query by special characters like "&" in $filter expression
> --------------------------------------------------------------------------
>
>                 Key: OLINGO-940
>                 URL: https://issues.apache.org/jira/browse/OLINGO-940
>             Project: Olingo
>          Issue Type: Bug
>          Components: odata2-core
>    Affects Versions: V2 2.0.1, V2 2.0.2, V2 2.0.3, V2 2.0.4, V2 2.0.5, V2 
> 2.0.6
>            Reporter: Daniel Li
>            Priority: Critical
>             Fix For: V2 2.0.7
>
>
> When doing the filter "$filter=substringof('AT & T',tolower(AccountName))", 
> the system will throw "Invalid filter expression: '((substringof('at '." 
> error.
> After looking at the implementation, we found there is bug when parsing query 
> string in 
> org.apache.olingo.odata2.core.servlet.RestUtil.extractAllQueryParameters(String)
>  and 
> org.apache.olingo.odata2.core.servlet.RestUtil.extractQueryParameters(String).
>  
> For V2 2.0.1 and V2 2.0.2, it only split the query string by "&", when the 
> filter value contains "&", the error is occurred. 
> List<String> queryParameters 
> =Arrays.asList(Decoder.decode(queryString).split("\\&")); 
> From V2 2.0.3, it still split the query string by "&", 
> List<String> queryParameters = Arrays.asList(queryString.split("\\&")); 
> To fix this issue, below is my suggestion(based on V2 2.0.1 & V2 2.0.2), add 
> special handling after decode the query string: 
> List<String> queryParameters = 
> Arrays.asList(handleSpecialCharacter(Decoder.decode(queryString)).split("\\&"));
>  and then add below method:
>    /**
>      * Handle special characters to encode characters such as "%" and "&" 
> etc..
>      * 
>      * @param queryString
>      *            A decoded query string
>      * @return
>    */
>   private static String handleSpecialCharacter(String queryString) {
>       Pattern pattern = Pattern.compile("\\'.+\\'");
>       Matcher matcher = pattern.matcher(queryString);
>       StringBuffer sb = new StringBuffer();
>       while(matcher.find()) {
>           String matchStr = matcher.group();
>           String str1 = matcher.replaceFirst(matchStr.replaceAll("%", 
> "%25").replaceAll("&", "%26"));
>           sb.append(str1);
>       }
>       return sb.toString();
>   }



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to