Author: tfmorris
Date: 2008-11-14 08:43:54-0800
New Revision: 16048

Modified:
   trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java

Log:
Add some more comments.  No code changes.

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java?view=diff&rev=16048&p1=trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java&p2=trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java&r1=16047&r2=16048
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java     
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java     
2008-11-14 08:43:54-0800
@@ -654,15 +654,35 @@
 
         private static final int BUFFER_SIZE = 120;
         
+        
+        /**
+         * The following three fields make up a doubly mapped buffer with two
+         * sets of pointers (the ByteBuffer objects), one for input and one for
+         * output. Bytes are written into the buffer using outBB which advances
+         * the current position. The following ASCII art shows what the buffer
+         * looks like.<code>
+         *           vp       vl
+         * xxxxxx++++..........
+         *       ^p  ^l
+         * </code> vp & vl are the output (buffer writing) position and limit,
+         * respectively and show the free space that can receive bytes. The ^p
+         * and ^l pointers show the input (buffer reading) position and limit.
+         * They point to valid bytes which have not yet been converted to
+         * characters. The xxx bytes have been both written in and read back
+         * out. The +++ bytes have been written into the buffer, but not read
+         * out yet.
+         */
         private byte[] bytes = new byte[BUFFER_SIZE * 2];
         private ByteBuffer outBB = ByteBuffer.wrap(bytes);
-        // An input view of the same bytes that we can read from
         private ByteBuffer inBB = ByteBuffer.wrap(bytes);
 
+        // Buffer containing characters which have been decoded from the bytes
+        // in inBB.
         private CharBuffer outCB = CharBuffer.allocate(BUFFER_SIZE);
         
+        // RegEx pattern for XML declaration and, optionally, DOCTYPE
         // Backslashes are doubled up - one for Java, one for Regex
-        private final Pattern pattern = Pattern.compile(
+        private final Pattern xmlDeclarationPattern = Pattern.compile(
                 "\\s*<\\?xml.*\\?>\\s*(<!DOCTYPE.*>\\s*)?");
 
         /**
@@ -678,8 +698,7 @@
         }
 
         /**
-         * Construct a filtered output stream using the given character set 
-         * name.
+         * Construct a filtered output stream using the given character set.
          * 
          * @param outputStream source output stream to filter
          * @param charset character set to use for encoding
@@ -738,10 +757,10 @@
                     throw new RuntimeException(
                             "Unknown character decoding error");
                 }
+                
                 // This will have problems if the smallest possible
                 // data segment is smaller than the size of the buffer
                 // needed for regex matching
-
                 if (outCB.position() == outCB.limit()) {
                     processHeader();
                 }
@@ -753,16 +772,20 @@
             headerProcessed = true;
             outCB.position(0); // rewind our character buffer
             
-            Matcher matcher = pattern.matcher(outCB);
-            String headerString = matcher.replaceAll("");
-            
-            ByteBuffer bb = decoder.charset().encode(headerString);
+            Matcher matcher = xmlDeclarationPattern.matcher(outCB);
+            // Remove anything that matches our pattern
+            String headerRemainder = matcher.replaceAll("");
+
+            // Reencode the remaining characters as bytes again
+            ByteBuffer bb = decoder.charset().encode(headerRemainder);
             
+            // and write them to our output stream
             byte[] outBytes = new byte[bb.limit()];
             bb.get(outBytes);
             out.write(outBytes, 0, outBytes.length);
 
-            // Write any left over bytes from a partial character
+            // Write any left over bytes in the input buffer
+            // (perhaps from a partially decoded character)
             if (inBB.remaining() > 0) {
                 out.write(inBB.array(), inBB.position(), 
                         inBB.remaining());

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

Reply via email to