0
\$\begingroup\$

I have a method which does URL decoding on the string value passed along with using Charset:

  public String decodeValue(String value, Charset charset) {
    if (!Strings.isNullOrEmpty(value)) {
      try {
        value = URLDecoder.decode(value, charset.name());
      } catch (UnsupportedEncodingException ex) {
        // log error
        return null;
      }
    }
    return value;
  }

Now if URLDecoder.decode throws UnsupportedEncodingException the first time, then I want to run the same value against these three lines:

value = value.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
value = value.replaceAll("\\+", "%2B");
value = URLDecoder.decode(value, charset.name());

And if then again URLDecoder.decode line throws exception second time, then I will log the error but only second time and return null value otherwise return the value which is decoded so I came up with this:

  public String decodeValue(String value, Charset charset) {
    if (!Strings.isNullOrEmpty(value)) {
      try {
        value = URLDecoder.decode(value, charset.name());
      } catch (UnsupportedEncodingException ex) {
        try {
          value = value.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
          value = value.replaceAll("\\+", "%2B");
          value = URLDecoder.decode(value, charset.name());
        } catch (UnsupportedEncodingException uex) {
          // log error
          return null;
        }
      }
    }
    return value;
  }

I'd like to see if there is any better way to write the above code. As of now, it duplicates the code.

\$\endgroup\$
-1
\$\begingroup\$

Check this can be any help.

public String decodeValue( String value, Charset charset ) {

    if ( !Strings.isNullOrEmpty( value ) ) {
        try {
            return URLDecoder.decode( value.replaceAll( "%(?![0-9a-fA-F]{2})", "%25" ).replaceAll( "\\+", "%2B" ), charset.name() );
        } catch ( UnsupportedEncodingException ex ) {
            // log error
        }
    }
    return null;
}

or another possible solution I've is

public String decodeValue( String value, Charset charset ) {

    if ( !Strings.isNullOrEmpty( value ) ) {
        try {
            return URLDecoder.decode( value, charset.name() );
        } catch ( UnsupportedEncodingException ex ) {
            try {
                return URLDecoder.decode( value.replaceAll( "%(?![0-9a-fA-F]{2})", "%25" ).replaceAll( "\\+", "%2B" ), charset.name() );
            } catch ( UnsupportedEncodingException uex ) {
                // log error
            }
        }
    }
    return null;
}
\$\endgroup\$
  • \$\begingroup\$ Welcome to Code Review! You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and how it improves upon the original) so that the author can learn from your thought process. \$\endgroup\$ – Heslacher Jan 2 '17 at 16:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.