Author: costin
Date: Mon Nov  7 00:04:21 2005
New Revision: 331237

URL: http://svn.apache.org/viewcvs?rev=331237&view=rev
Log:
Move UEncoder to nio. Deprecate most of the methods - they don't seem to
be in use in 5.5 and are pretty bad ( Writer ). In fact - the entire
class could be cleaned up and replaced, maybe with one method in
MessageBytes.

Modified:
    tomcat/sandbox/java/org/apache/tomcat/util/buf/UEncoder.java

Modified: tomcat/sandbox/java/org/apache/tomcat/util/buf/UEncoder.java
URL: 
http://svn.apache.org/viewcvs/tomcat/sandbox/java/org/apache/tomcat/util/buf/UEncoder.java?rev=331237&r1=331236&r2=331237&view=diff
==============================================================================
--- tomcat/sandbox/java/org/apache/tomcat/util/buf/UEncoder.java (original)
+++ tomcat/sandbox/java/org/apache/tomcat/util/buf/UEncoder.java Mon Nov  7 
00:04:21 2005
@@ -19,6 +19,10 @@
 import java.io.CharArrayWriter;
 import java.io.IOException;
 import java.io.Writer;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetEncoder;
 import java.util.BitSet;
 
 /** Efficient implementation for encoders.
@@ -39,51 +43,73 @@
     // Not static - the set may differ ( it's better than adding
     // an extra check for "/", "+", etc
     private BitSet safeChars=null;
-    private C2BConverter c2b=null;
-    private ByteChunk bb=null;
+    private CharsetEncoder c2b=null;
+    //private C2BConverter c2b=null;
+    private ByteBuffer bb=null;
 
     private String encoding="UTF8";
     private static final int debug=0;
+
+    private CharBuffer cb;
     
     public UEncoder() {
        initSafeChars();
     }
 
+    // Doesn't seem to be used. Even if it would - it may need additional
+    // work to reset it.
     public void setEncoding( String s ) {
        encoding=s;
     }
 
+    /** Characters that should not be encoded.
+     *  Typically "/".
+     * 
+     * @param c
+     */
     public void addSafeCharacter( char c ) {
        safeChars.set( c );
     }
 
 
     /** URL Encode string, using a specified encoding.
+     * 
+     * Doesn't appear to be used outside
      *
      * @param buf The writer
      * @param s string to be encoded
      * @throws IOException If an I/O error occurs
+     * @deprecated Shouldn't be public - requires writer, should be simpler
      */
     public void urlEncode( Writer buf, String s )
        throws IOException
     {
        if( c2b==null ) {
-           bb=new ByteChunk(16); // small enough.
-           c2b=new C2BConverter( bb, encoding );
+           bb=ByteBuffer.allocate(16); // small enough.
+           c2b=Charset.forName("UTF8").newEncoder(); 
+            //new C2BConverter( bb, encoding );
+           cb = CharBuffer.allocate(4);
        }
 
-       for (int i = 0; i < s.length(); i++) {
+        for (int i = 0; i < s.length(); i++) {
            int c = (int) s.charAt(i);
            if( safeChars.get( c ) ) {
-               if( debug > 0 ) log("Safe: " + (char)c);
+               //if( debug > 0 ) log("Safe: " + (char)c);
                buf.write((char)c);
            } else {
-               if( debug > 0 ) log("Unsafe:  " + (char)c);
-               c2b.convert( (char)c );
+               //if( debug > 0 ) log("Unsafe:  " + (char)c);
+                cb.append((char)c);
+                cb.flip();
+                c2b.encode(cb, bb, true);
+               //c2b.convert( (char)c );
                
                // "surrogate" - UTF is _not_ 16 bit, but 21 !!!!
                // ( while UCS is 31 ). Amazing...
-               if (c >= 0xD800 && c <= 0xDBFF) {
+               /*
+                 * I think this is going to be handled by 
+                 * c2b.
+                 * 
+                if (c >= 0xD800 && c <= 0xDBFF) {
                    if ( (i+1) < s.length()) {
                        int d = (int) s.charAt(i+1);
                        if (d >= 0xDC00 && d <= 0xDFFF) {
@@ -93,17 +119,23 @@
                        }
                    }
                }
+                */
 
-               c2b.flushBuffer();
+               c2b.flush(bb);
                
-               urlEncode( buf, bb.getBuffer(), bb.getOffset(),
-                          bb.getLength() );
-               bb.recycle();
+               urlEncode( buf, bb.array(), bb.arrayOffset(),
+                          bb.position() );
+               bb.clear();
+                cb.clear();
+                c2b.reset();
+                
            }
        }
     }
 
     /**
+     * Doesn't appear to be used outside.
+     * @deprecated shouldn't be public, bad API
      */
     public void urlEncode( Writer buf, byte bytes[], int off, int len)
        throws IOException
@@ -123,6 +155,10 @@
      * Utility funtion to re-encode the URL.
      * Still has problems with charset, since UEncoder mostly
      * ignores it.
+     * 
+     * Used by tomcat Response.toAbsolute() on the relative part
+     * 
+     * 
      */
     public String encodeURL(String uri) {
        String outUri=null;



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to