You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by li...@apache.org on 2008/05/21 00:04:22 UTC

svn commit: r658460 - /incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java

Author: lindner
Date: Tue May 20 15:04:21 2008
New Revision: 658460

URL: http://svn.apache.org/viewvc?rev=658460&view=rev
Log:
Use java.nio and a concurrent hashmap to allow for more scalable character set conversions.

Modified:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java?rev=658460&r1=658459&r2=658460&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java Tue May 20 15:04:21 2008
@@ -26,6 +26,13 @@
 import java.util.List;
 import java.util.Map;
 
+import java.util.concurrent.ConcurrentHashMap;
+import java.nio.CharBuffer;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CodingErrorAction;
+import java.nio.charset.CharsetEncoder;
+
 /**
  * Represents the results of an HTTP content retrieval operation.
  */
@@ -53,6 +60,9 @@
 
   private HttpResponse rewritten;
 
+  // Holds character sets for fast conversion
+  private static ConcurrentHashMap<String,Charset> encodingToCharset= new ConcurrentHashMap<String,Charset>();
+
   /**
    * Create a dummy empty map. Access via HttpResponse.ERROR
    */
@@ -158,17 +168,17 @@
    */
   public String getResponseAsString() {
     if (responseString == null) {
-      try {
-        String response = new String(responseBytes, encoding);
-        // Strip BOM.
-        if (response.length() > 0 && response.codePointAt(0) == 0xFEFF) {
-          responseString = response.substring(1);
-        } else {
-          responseString = response;
-        }
-      } catch (UnsupportedEncodingException e) {
-        responseString = "Unable to convert from encoding: " + encoding;
+      Charset charset = encodingToCharset.get(encoding);
+      if (charset == null) {
+        charset = Charset.forName(encoding);
+        encodingToCharset.put(encoding,charset);
       }
+      responseString = charset.decode(ByteBuffer.wrap(responseBytes)).toString();
+
+      // Strip BOM if present
+      if (responseString.length() > 0 && responseString.codePointAt(0) == 0xFEFF) {
+        responseString = responseString.substring(1);
+      } 
     }
     return responseString;
   }