harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From telli...@apache.org
Subject svn commit: r578502 [10/10] - in /harmony/enhanced/classlib/branches/java6: depends/files/ depends/jars/ depends/manifests/xerces_2.9.0/ depends/manifests/xerces_2.9.1/ depends/manifests/xerces_2.9.1/META-INF/ make/ modules/archive/src/main/native/arch...
Date Sat, 22 Sep 2007 21:25:00 GMT
Modified: harmony/enhanced/classlib/branches/java6/modules/nio_char/src/main/java/java/nio/charset/CharsetEncoder.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/nio_char/src/main/java/java/nio/charset/CharsetEncoder.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/nio_char/src/main/java/java/nio/charset/CharsetEncoder.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/nio_char/src/main/java/java/nio/charset/CharsetEncoder.java Sat Sep 22 14:24:54 2007
@@ -343,32 +343,35 @@
         CoderResult result = null;
         while (true) {
             result = encode(in, output, false);
-            checkCoderResult(result);
-            if (result.isUnderflow()) {
+            if (result==CoderResult.UNDERFLOW) {
                 break;
-            } else if (result.isOverflow()) {
+            } else if (result==CoderResult.OVERFLOW) {
                 output = allocateMore(output);
+                continue;
             }
+            checkCoderResult(result);
         }
         result = encode(in, output, true);
         checkCoderResult(result);
 
         while (true) {
             result = flush(output);
-            checkCoderResult(result);
-            if (result.isOverflow()) {
-                output = allocateMore(output);
-            } else {
+            if (result==CoderResult.UNDERFLOW) {
+                output.flip();
                 break;
+            } else if (result==CoderResult.OVERFLOW) {
+                output = allocateMore(output);
+                continue;
             }
-        }
-
+            checkCoderResult(result);
         output.flip();
         if (result.isMalformed()) {
             throw new MalformedInputException(result.length());
         } else if (result.isUnmappable()) {
             throw new UnmappableCharacterException(result.length());
         }
+            break;
+        }
         status = FLUSH;
         return output;
     }
@@ -378,10 +381,9 @@
      */
     private void checkCoderResult(CoderResult result)
             throws CharacterCodingException {
-        if (result.isMalformed() && malformAction == CodingErrorAction.REPORT) {
+        if (malformAction == CodingErrorAction.REPORT && result.isMalformed() ) {
             throw new MalformedInputException(result.length());
-        } else if (result.isUnmappable()
-                && unmapAction == CodingErrorAction.REPORT) {
+        } else if (unmapAction == CodingErrorAction.REPORT && result.isUnmappable()) {
             throw new UnmappableCharacterException(result.length());
         }
     }
@@ -478,16 +480,19 @@
             } catch (BufferUnderflowException e) {
                 throw new CoderMalfunctionError(e);
             }
-            if (result.isUnderflow()) {
-                int remaining = in.remaining();
+            if (result==CoderResult.UNDERFLOW) {
                 status = endOfInput ? END : ONGOING;
-                if (endOfInput && remaining > 0) {
+                if (endOfInput) {
+                    int remaining = in.remaining();
+                    if( remaining > 0) {
                     result = CoderResult.malformedForLength(remaining);
                 } else {
                     return result;
                 }
+                } else {
+                    return result;
             }
-            if (result.isOverflow()) {
+            } else if (result==CoderResult.OVERFLOW) {
                 status = endOfInput ? END : ONGOING;
                 return result;
             }

Modified: harmony/enhanced/classlib/branches/java6/modules/nio_char/src/main/java/org/apache/harmony/niochar/charset/ISO_8859_1.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/nio_char/src/main/java/org/apache/harmony/niochar/charset/ISO_8859_1.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/nio_char/src/main/java/org/apache/harmony/niochar/charset/ISO_8859_1.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/nio_char/src/main/java/org/apache/harmony/niochar/charset/ISO_8859_1.java Sat Sep 22 14:24:54 2007
@@ -54,52 +54,66 @@
 		public native int nDecode(char[] array, int arrPosition, int remaining, long outAddr, int absolutePos);
 
 
-		protected CoderResult decodeLoop(ByteBuffer bb, CharBuffer cb){
-                        int cbRemaining = cb.remaining();
-
-		        if(bb.isDirect() && bb.hasRemaining() && cb.hasArray()){
-		            int toProceed = bb.remaining();
-		            boolean throwOverflow = false; 
-		            int cbPos = cb.position();
-		            int bbPos = bb.position();
-		            if( cbRemaining < toProceed ) { 
-		                toProceed = cbRemaining;
-                                throwOverflow = true;
-                            }
-                            int res = nDecode(cb.array(), cb.arrayOffset()+cbPos, toProceed, AddressUtil.getDirectBufferAddress(bb), bbPos);
-                            cb.position(cbPos+res);  
-                            bb.position(bbPos+res);
-                            if(throwOverflow) return CoderResult.OVERFLOW;
-                        }else{
-                        	if(bb.hasArray() && cb.hasArray()) {
-                                int rem = bb.remaining();
-                                rem = cbRemaining >= rem ? rem : cbRemaining;
-                                byte[] arr = bb.array();
-                                char[] cArr = cb.array();
-                                int bStart = bb.position();
-                                int cStart = cb.position();
-                                int i;
-                                for(i=bStart; i<bStart+rem; i++) {
-                                    cArr[cStart++] = (char)((int)arr[i] & 0xFF);
-                                }
-                                bb.position(i);
-                                cb.position(cStart);
-                                if(rem == cbRemaining && bb.hasRemaining()) return CoderResult.OVERFLOW;
-                        	} else {
-                                int rem = bb.remaining();
-                                rem = cbRemaining >= rem ? rem : cbRemaining;
-                                byte[] arr = new byte[rem];
-                                bb.get(arr);
-                                char[] cArr = new char[rem];
-                                for(int i=0; i<rem; i++) {
-                                    cArr[i] = (char)((int)arr[i] & 0xFF);
-                                }
-                                cb.put(cArr); if(cb.remaining() == 0) return CoderResult.OVERFLOW;
-                        	}
-			} 
-                        return CoderResult.UNDERFLOW;
+		protected CoderResult decodeLoop(ByteBuffer bb, CharBuffer cb) {
+			int bbRemaining = bb.remaining();
+			if (bbRemaining == 0) {
+				return CoderResult.UNDERFLOW;
+			}
+			int cbRemaining = cb.remaining();
+			boolean cbHasArray = cb.hasArray();
+			if (cbHasArray) {
+				if (bb.hasArray()) {
+					int rem = bbRemaining;
+					rem = cbRemaining >= rem ? rem : cbRemaining;
+					byte[] arr = bb.array();
+					char[] cArr = cb.array();
+					int bStart = bb.position();
+					int cStart = cb.position();
+					int i;
+					for (i = bStart; i < bStart + rem; i++) {
+						cArr[cStart++] = (char) ((int) arr[i] & 0xFF);
+					}
+					bb.position(i);
+					cb.position(cStart);
+					if (rem == cbRemaining && bb.hasRemaining()) {
+						return CoderResult.OVERFLOW;
+					}
+					return CoderResult.UNDERFLOW;
+				} else if (bb.isDirect()) {
+					int toProceed = bbRemaining;
+					boolean throwOverflow = false;
+					int cbPos = cb.position();
+					int bbPos = bb.position();
+					if (cbRemaining < toProceed) {
+						toProceed = cbRemaining;
+						throwOverflow = true;
+					}
+					int res = nDecode(cb.array(), cb.arrayOffset() + cbPos,
+							toProceed, AddressUtil.getDirectBufferAddress(bb),
+							bbPos);
+					cb.position(cbPos + res);
+					bb.position(bbPos + res);
+					if (throwOverflow) {
+						return CoderResult.OVERFLOW;
+					}
+					return CoderResult.UNDERFLOW;
+				}
+			}
+			int rem = bbRemaining;
+			rem = cbRemaining >= rem ? rem : cbRemaining;
+			byte[] arr = new byte[rem];
+			bb.get(arr);
+			char[] cArr = new char[rem];
+			for (int i = 0; i < rem; i++) {
+				cArr[i] = (char) ((int) arr[i] & 0xFF);
+			}
+			cb.put(cArr);
+			if (cb.remaining() == 0) {
+				return CoderResult.OVERFLOW;
+			}
+			return CoderResult.UNDERFLOW;
 		}
-        }
+	}
 
 	private final class Encoder extends CharsetEncoder{
 		private Encoder(Charset cs){
@@ -108,101 +122,116 @@
                    
 		private native void nEncode(long outAddr, int absolutePos, char[] array, int arrPosition, int[] res);
                                                                                                                           
-		protected CoderResult encodeLoop(CharBuffer cb, ByteBuffer bb){                                             
-                        int bbRemaining = bb.remaining();                                                                     
-                        if(bb.isDirect() && cb.hasRemaining() && cb.hasArray()){                                                
-		            int toProceed = cb.remaining();
-		            boolean throwOverflow = false; 
-		            int cbPos = cb.position();
-		            int bbPos = bb.position();
-		            if( bbRemaining < toProceed ) { 
-		                toProceed = bbRemaining;
-                                throwOverflow = true;
-                            }
-                            int[] res = {toProceed, 0};
-                            nEncode(AddressUtil.getDirectBufferAddress(bb), bbPos, cb.array(), cb.arrayOffset()+cbPos, res);
-                            if( res[0] <= 0 ) {                                                                                                                
-                                bb.position(bbPos-res[0]);                                                                                        
-                                cb.position(cbPos-res[0]);
-                                if(res[1]!=0) {
-                                    if(res[1] < 0)
-                                        return CoderResult.malformedForLength(-res[1]);
-                                    else 
-                                        return CoderResult.unmappableForLength(res[1]);
-                                }
-                            }else{                                          
-                                bb.position(bbPos+res[0]);               
-                                cb.position(cbPos+res[0]);                 
-                                if(throwOverflow) return CoderResult.OVERFLOW;
-                            }                                                     
-                        }else{
-                        	if(bb.hasArray() && cb.hasArray()) {
-                            	byte[] byteArr = bb.array();
-                            	char[] charArr = cb.array();
-                                int rem = cb.remaining();
-                                int byteArrStart = bb.position();
-                                rem = bbRemaining <= rem ? bbRemaining : rem;
-                                int x;
-                                for(x=cb.position(); x < cb.position()+rem; x++) {                                 
-                                    char c = charArr[x];              
-                                    if(c > (char)0x00FF){   
-                                        if (c >= 0xD800 && c <= 0xDFFF) {
-                                            if(x+1 < cb.limit()) {
-                                                char c1 = charArr[x+1];
-                                                if(c1 >= 0xD800 && c1 <= 0xDFFF) {
-                                                    bb.position(byteArrStart); cb.position(x);
-                                                    return CoderResult.unmappableForLength(2);             
-                                                } 
-                                            } else {
-                                                bb.position(byteArrStart); cb.position(x);
-                                                return CoderResult.UNDERFLOW;             
-                                            }
-                                            bb.position(byteArrStart); cb.position(x);
-                                            return CoderResult.malformedForLength(1);             
-                                        }
-                                        bb.position(byteArrStart); cb.position(x);
-                                        return CoderResult.unmappableForLength(1);             
-                                    }else{
-                                        byteArr[byteArrStart++] = (byte)c;
-                                    }                                                                  
-                                } 
-                                bb.position(byteArrStart);
-                                cb.position(x);
-                                if(rem == bbRemaining && cb.hasRemaining()) {
-                                	return CoderResult.OVERFLOW;
-                                }
-                        	} else {
-                                while(cb.hasRemaining()){                                 
-                                    if( bbRemaining == 0 ) return CoderResult.OVERFLOW;    
-                                    char c = cb.get();              
-                                    if(c > (char)0x00FF){   
-                                        if (c >= 0xD800 && c <= 0xDFFF) {
-                                            if(cb.hasRemaining()) {
-                                                char c1 = cb.get();
-                                                if(c1 >= 0xD800 && c1 <= 0xDFFF) {
-                                                    cb.position(cb.position()-2);
-                                                    return CoderResult.unmappableForLength(2);             
-                                                } else {
-                                                	cb.position(cb.position()-1);
-                                                }
-                                            } else {
-                                                cb.position(cb.position()-1);
-                                                return CoderResult.UNDERFLOW;             
-                                            }
-                                            cb.position(cb.position()-1);
-                                            return CoderResult.malformedForLength(1);             
-                                        }
-                                        cb.position(cb.position()-1);
-                                        return CoderResult.unmappableForLength(1);             
-                                    }else{                                                      
-                                        bb.put((byte)c);                                      
-                                        bbRemaining--;                                                
-                                    }                                                                  
-                                }                                                                       
-                        		
-                        	}
-			}                                                                            
-			return CoderResult.UNDERFLOW;                                                 
+		protected CoderResult encodeLoop(CharBuffer cb, ByteBuffer bb) {
+			int cbRemaining = cb.remaining();
+			if (cbRemaining == 0) {
+				return CoderResult.UNDERFLOW;
+			}
+			int bbRemaining = bb.remaining();
+			boolean cbHasArray = cb.hasArray();
+			boolean bbHasArray = bb.hasArray();
+			if (cbHasArray) {
+				if (bbHasArray) {
+					byte[] byteArr = bb.array();
+					char[] charArr = cb.array();
+					int byteArrStart = bb.position();
+					int rem = bbRemaining <= cbRemaining ? bbRemaining
+							: cbRemaining;
+					int cbPos = cb.position();
+					int x;
+					int jchar = 0;
+					for (x = cbPos; x < cbPos + rem; x++) {
+						jchar = (int) charArr[x];
+						if (jchar <= 0xFF) {
+							byteArr[byteArrStart++] = (byte) jchar;
+						} else {
+							break;
+						}
+					}
+					bb.position(byteArrStart);
+					cb.position(x);
+					if (x == cbPos + rem) {
+						// everything is ok
+						if (rem == bbRemaining && cb.hasRemaining()) {
+							return CoderResult.OVERFLOW;
+						}
+						return CoderResult.UNDERFLOW;
+					}
+					// here is jchar >0xFF
+					if (jchar >= 0xD800 && jchar <= 0xDFFF) {
+						if (x + 1 < cb.limit()) {
+							char c1 = charArr[x + 1];
+							if (c1 >= 0xD800 && c1 <= 0xDFFF) {
+								return CoderResult.unmappableForLength(2);
+							}
+						} else {
+							return CoderResult.UNDERFLOW;
+						}
+						return CoderResult.malformedForLength(1);
+					}
+					return CoderResult.unmappableForLength(1);
+				} else if (bb.isDirect()) {
+					int toProceed = cbRemaining;
+					boolean throwOverflow = false;
+					int cbPos = cb.position();
+					int bbPos = bb.position();
+					if (bbRemaining < toProceed) {
+						toProceed = bbRemaining;
+						throwOverflow = true;
+					}
+					int[] res = { toProceed, 0 };
+					nEncode(AddressUtil.getDirectBufferAddress(bb), bbPos, cb
+							.array(), cb.arrayOffset() + cbPos, res);
+					if (res[0] <= 0) {
+						bb.position(bbPos - res[0]);
+						cb.position(cbPos - res[0]);
+						if (res[1] != 0) {
+							if (res[1] < 0) {
+								return CoderResult.malformedForLength(-res[1]);
+							} else {
+								return CoderResult.unmappableForLength(res[1]);
+							}
+						}
+					} else {
+						bb.position(bbPos + res[0]);
+						cb.position(cbPos + res[0]);
+						if (throwOverflow) {
+							return CoderResult.OVERFLOW;
+						}
+					}
+					return CoderResult.UNDERFLOW;
+				}
+			}
+			while (cb.hasRemaining()) {
+				if (bbRemaining == 0) {
+					return CoderResult.OVERFLOW;
+				}
+				char c = cb.get();
+				if (c > (char) 0x00FF) {
+					if (c >= 0xD800 && c <= 0xDFFF) {
+						if (cb.hasRemaining()) {
+							char c1 = cb.get();
+							if (c1 >= 0xD800 && c1 <= 0xDFFF) {
+								cb.position(cb.position() - 2);
+								return CoderResult.unmappableForLength(2);
+							} else {
+								cb.position(cb.position() - 1);
+							}
+						} else {
+							cb.position(cb.position() - 1);
+							return CoderResult.UNDERFLOW;
+						}
+						cb.position(cb.position() - 1);
+						return CoderResult.malformedForLength(1);
+					}
+					cb.position(cb.position() - 1);
+					return CoderResult.unmappableForLength(1);
+				} else {
+					bb.put((byte) c);
+					bbRemaining--;
+				}
+			}
+			return CoderResult.UNDERFLOW;
 		}                                                                                     
                                                                                                       
 	}         

Modified: harmony/enhanced/classlib/branches/java6/modules/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java Sat Sep 22 14:24:54 2007
@@ -156,15 +156,15 @@
 	/*
      * test cached decoder
      */
-    public void test_DecodeLjava_nio_ByteBuffer() throws Exception{
-            MockCharsetForDecoder cs1 = new MockCharsetForDecoder("CachedCharset",null);
-            MockCharsetForDecoder cs2 = new MockCharsetForDecoder("CachedCharset",null);
-            ByteBuffer in = ByteBuffer.wrap(new byte[]{0x00});
-            cs1.decode(in);
-            in.flip();
-            cs2.decode(in);
-            in.flip();
-    }
+//    public void test_DecodeLjava_nio_ByteBuffer() throws Exception{
+//            MockCharsetForDecoder cs1 = new MockCharsetForDecoder("CachedCharset",null);
+//            MockCharsetForDecoder cs2 = new MockCharsetForDecoder("CachedCharset",null);
+//            ByteBuffer in = ByteBuffer.wrap(new byte[]{0x00});
+//            cs1.decode(in);
+//            in.flip();
+//            cs2.decode(in);
+//            in.flip();
+//    }
     /*
      * Mock Charset for cached decoder test
      */
@@ -218,14 +218,14 @@
     /*
      * test cached encoder
      */
-    public void test_EncodeLjava_nio_CharBuffer() throws Exception {
-            MockCharsetForEncoder cs1 = new MockCharsetForEncoder("CachedCharset", null);
-            MockCharsetForEncoder cs2 = new MockCharsetForEncoder("CachedCharset", null);
-            CharBuffer in = CharBuffer.wrap("A");
-            cs1.encode(in);
-            in.flip();
-            cs2.encode(in);
-    }
+//    public void test_EncodeLjava_nio_CharBuffer() throws Exception {
+//            MockCharsetForEncoder cs1 = new MockCharsetForEncoder("CachedCharset", null);
+//            MockCharsetForEncoder cs2 = new MockCharsetForEncoder("CachedCharset", null);
+//            CharBuffer in = CharBuffer.wrap("A");
+//            cs1.encode(in);
+//            in.flip();
+//            cs2.encode(in);
+//    }
 
     /*
      * Mock Charset for cached encoder test

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java Sat Sep 22 14:24:54 2007
@@ -60,9 +60,24 @@
                 Codec.UNSIGNED5, attributeDefinitionCount, cpUTF8);
         attributeDefinitionLayout = parseReferences("attr_definition_layout",
                 in, Codec.UNSIGNED5, attributeDefinitionCount, cpUTF8);
-        if (attributeDefinitionCount > 0)
-            throw new Error("No idea what the adc is for yet");
+        
         attributeDefinitionMap = new AttributeLayoutMap();
+        
+        int overflowIndex = 32;
+        if(segment.getSegmentHeader().getOptions().hasClassFlagsHi()) {
+            overflowIndex = 63;
+        }
+        for (int i = 0; i < attributeDefinitionCount; i++) {
+            int context = attributeDefinitionHeader[i] & 0x03;
+            int index = (attributeDefinitionHeader[i] >> 2) - 1;
+            if(index == -1) {
+                index = overflowIndex++;
+            }
+            attributeDefinitionMap.add(new AttributeLayout(
+                    attributeDefinitionName[i], context,
+                    attributeDefinitionLayout[i], index));
+        }
+        attributeDefinitionMap.checkMap();
     }
 
     public AttributeLayoutMap getAttributeDefinitionMap() {

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayout.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayout.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayout.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayout.java Sat Sep 22 14:24:54 2007
@@ -16,60 +16,8 @@
  */
 package org.apache.harmony.pack200;
 
-// NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
-// NOTE: Do not extract strings as messages; this code is still a
-// work-in-progress
-// NOTE: Also, don't get rid of 'else' statements for the hell of it ...
 
 public class AttributeLayout implements IMatcher {
-	static class Key {
-		private final int context;
-
-		private final String name;
-
-		public Key(String name, int context) throws Pack200Exception {
-			if (name == null || name.length() == 0)
-				throw new Pack200Exception("Cannot have an unnamed layout");
-			if (context != CONTEXT_CLASS && context != CONTEXT_CODE
-					&& context != CONTEXT_FIELD && context != CONTEXT_METHOD)
-				throw new Pack200Exception("Attribute context out of range: "
-						+ context);
-			this.name = name;
-			this.context = context;
-
-		}
-
-		public boolean equals(Object obj) {
-			if (this == obj)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			final Key other = (Key) obj;
-			if (context != other.context)
-				return false;
-			if (name == null) {
-				if (other.name != null)
-					return false;
-			} else if (!name.equals(other.name))
-				return false;
-			return true;
-		}
-
-		public int hashCode() {
-			final int PRIME = 31;
-			int result = 1;
-			result = PRIME * result + context;
-			result = PRIME * result + ((name == null) ? 0 : name.hashCode());
-			return result;
-		}
-
-		public String toString() {
-			return contextNames[context] + ": " + name;
-		}
-
-	}
 
 	public static final String ACC_ABSTRACT = "ACC_ABSTRACT"; //$NON-NLS-1$
 	public static final String ACC_ANNOTATION = "ACC_ANNOTATION"; //$NON-NLS-1$
@@ -103,11 +51,11 @@
 	public static final String ATTRIBUTE_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = "RuntimeVisibleParameterAnnotations"; //$NON-NLS-1$
 	public static final String ATTRIBUTE_SIGNATURE = "Signature"; //$NON-NLS-1$
 	public static final String ATTRIBUTE_SOURCE_FILE = "SourceFile"; //$NON-NLS-1$
-	public static final int CONTEXT_CLASS = 1 << 0;
-	public static final int CONTEXT_CODE = 1 << 4;
-	public static final int CONTEXT_FIELD = 1 << 2;
-	public static final int CONTEXT_METHOD = 1 << 3;
-	private static final String[] contextNames = { "Class", "Field", "Method", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	public static final int CONTEXT_CLASS = 0;
+	public static final int CONTEXT_CODE = 3;
+	public static final int CONTEXT_FIELD = 1;
+	public static final int CONTEXT_METHOD = 2;
+	public static final String[] contextNames = { "Class", "Field", "Method", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			"Code", }; //$NON-NLS-1$
 
 	private static Object getValue(String layout, long value, SegmentConstantPool pool)
@@ -139,27 +87,41 @@
 		}
 		throw new Pack200Exception("Unknown layout encoding: " + layout);
 	}
+    
+    
+    private int context;
 
-	Key key;
+    private int index;
 
 	private final String layout;
 
 	private long mask;
+    
+    private String name;
 
 	public AttributeLayout(String name, int context, String layout, int index)
 			throws Pack200Exception {
 		super();
-		this.key = new Key(name, context);
+        this.index = index;
+        this.context = context;
 		if (index >= 0) {
 			this.mask = 1L << index;
 		} else {
 			this.mask = 0;
 		}
+        if (context != CONTEXT_CLASS && context != CONTEXT_CODE
+                && context != CONTEXT_FIELD && context != CONTEXT_METHOD)
+            throw new Pack200Exception("Attribute context out of range: "
+                    + context);
 		if (layout == null) // || layout.length() == 0)
 			throw new Pack200Exception("Cannot have a null layout");
+        if (name == null || name.length() == 0)
+                throw new Pack200Exception("Cannot have an unnamed layout");
+        this.name = name;
 		this.layout = layout;
 	}
-
+    
+    
 	public boolean equals(Object obj) {
 		if (this == obj)
 			return true;
@@ -168,16 +130,20 @@
 		if (getClass() != obj.getClass())
 			return false;
 		final AttributeLayout other = (AttributeLayout) obj;
-		if (key == null) {
-			if (other.key != null)
-				return false;
-		} else if (!key.equals(other.key))
-			return false;
 		if (layout == null) {
 			if (other.layout != null)
 				return false;
 		} else if (!layout.equals(other.layout))
 			return false;
+        if(index != other.index) 
+            return false;
+        if(context != other.context)
+            return false;
+        if (name == null) {
+            if (other.name != null)
+                return false;
+        } else if (!name.equals(other.name))
+            return false;
 		return true;
 	}
 
@@ -231,23 +197,33 @@
 	}
 
 	public int hashCode() {
-		return key.hashCode();
+        int PRIME = 31;
+        int r = 1;
+        if(name != null) {
+            r = r * PRIME + name.hashCode();
+        }
+		if(layout != null) {
+            r = r* PRIME + layout.hashCode();
+        }
+        r = r * PRIME + index;
+        r = r * PRIME + context;
+        return r;
 	}
 
 	public boolean isClass() {
-		return key.context == CONTEXT_CLASS;
+		return context == CONTEXT_CLASS;
 	}
 
 	public boolean isCode() {
-		return key.context == CONTEXT_CODE;
+		return context == CONTEXT_CODE;
 	}
 
 	public boolean isField() {
-		return key.context == CONTEXT_FIELD;
+		return context == CONTEXT_FIELD;
 	}
 
 	public boolean isMethod() {
-		return key.context == CONTEXT_METHOD;
+		return context == CONTEXT_METHOD;
 	}
 
 	/* (non-Javadoc)
@@ -258,7 +234,19 @@
 	}
 
 	public String toString() {
-		return key.toString();
+        return contextNames[context] + ": " + name;
 	}
+
+    public int getContext() {
+        return context;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public String getName() {
+        return name;
+    }
 
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java Sat Sep 22 14:24:54 2007
@@ -21,6 +21,7 @@
 // work-in-progress
 // NOTE: Also, don't get rid of 'else' statements for the hell of it ...
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 
 /**
@@ -191,10 +192,16 @@
 						AttributeLayout.CONTEXT_METHOD, "*", 25) };
 	}
 
-	private final Map layouts;
+	private final Map classLayouts = new HashMap();
+    private final Map fieldLayouts = new HashMap();
+    private final Map methodLayouts = new HashMap();
+    private final Map codeLayouts = new HashMap();
+    
+    // The order of the maps in this array should not be changed as their indices correspond to
+    // the value of their context constants (AttributeLayout.CONTEXT_CLASS etc.)
+    private final Map[] layouts = new Map[] {classLayouts, fieldLayouts, methodLayouts, codeLayouts};
 
 	public AttributeLayoutMap() throws Pack200Exception {
-		this.layouts = new HashMap();
 		AttributeLayout[] defaultAttributeLayouts = getDefaultAttributeLayouts();
 		for (int i = 0; i < defaultAttributeLayouts.length; i++) {
 			add(defaultAttributeLayouts[i]);
@@ -202,12 +209,50 @@
 	}
 
 	public void add(AttributeLayout layout) {
-		layouts.put(layout.key, layout);
+        layouts[layout.getContext()].put(Integer.valueOf(layout.getIndex()), layout);
 	}
 
 	public AttributeLayout getAttributeLayout(String name, int context)
 			throws Pack200Exception {
-		return (AttributeLayout) layouts.get(new AttributeLayout.Key(name,
-				context));
+	    Map map = layouts[context];
+        for (Iterator iter = map.values().iterator(); iter.hasNext();) {
+            AttributeLayout layout = (AttributeLayout) iter.next();
+            if(layout.getName().equals(name)) {
+                return layout;
+            }            
+        }
+        return null;
 	}
+    
+    /**
+     * The map should not contain the same layout and name combination more than
+     * once for each context.
+     * @throws Pack200Exception 
+     *
+     */
+    public void checkMap() throws Pack200Exception {
+        for (int i = 0; i < layouts.length; i++) {
+            Map map = layouts[i];
+            for (Iterator iter = map.values().iterator(); iter.hasNext();) {
+                AttributeLayout layout1 = (AttributeLayout) iter.next();
+                for (Iterator iter2 = map.values().iterator(); iter2.hasNext();) {
+                    AttributeLayout layout2 = (AttributeLayout) iter2.next();
+                    if(layout1 != layout2) {
+                        if (layout1.getName().equals(layout2.getName())
+                                && layout1.getLayout().equals(
+                                        layout2.getLayout())) {
+                            throw new Pack200Exception(
+                                    "Same layout/name combination: "
+                                            + layout1.getLayout()
+                                            + "/"
+                                            + layout1.getName()
+                                            + " exists twice for context: "
+                                            + AttributeLayout.contextNames[layout1
+                                                    .getContext()]);
+                        }
+                    }
+                }
+            }
+        }
+    }
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java Sat Sep 22 14:24:54 2007
@@ -171,12 +171,7 @@
             } else {
                 z = (long) (-Math.floor(u/ twoPowS) - 1);
             }
-        } else {
-        // TODO: This is required in the spec, but it's making a test fail so needs more investigation.
-        //  z = cast32(u);
         }
-        
-        
 		if (isDelta())
 			z += last;
 		return z;

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java Sat Sep 22 14:24:54 2007
@@ -119,46 +119,41 @@
     }
     
     public long[] parseFlags(String name, InputStream in, int count,
-            Codec codec, boolean hasHi) throws IOException, Pack200Exception {
+            BHSDCodec codec, boolean hasHi) throws IOException, Pack200Exception {
         return parseFlags(name, in, 1, new int[] { count }, (hasHi ? codec
                 : null), codec)[0];
     }
 
     public long[][] parseFlags(String name, InputStream in, int count,
-            int counts[], Codec codec, boolean hasHi) throws IOException,
+            int counts[], BHSDCodec codec, boolean hasHi) throws IOException,
             Pack200Exception {
         return parseFlags(name, in, count, counts, (hasHi ? codec : null),
                 codec);
     }
 
     public long[][] parseFlags(String name, InputStream in, int count,
-            int counts[], Codec hiCodec, Codec loCodec) throws IOException,
+            int counts[], BHSDCodec hiCodec, BHSDCodec loCodec) throws IOException,
             Pack200Exception {
         // TODO Move away from decoding into a parseBand type structure
         if (count == 0) {
             return new long[][] { {} };
         }
         long[][] result = new long[count][];
-        // TODO What happens when the decode here indicates a different
-        // encoding?
-        // TODO Move this to a decodeBandInt
-        long last = 0;
         for (int j = 0; j < count; j++) {
-            result[j] = new long[counts[j]];
-            for (int i = 0; i < counts[j] && hiCodec != null; i++) {
-                last = hiCodec.decode(in, last);
-                result[j][i] = last << 32;
+            int[] hi;
+            if(hiCodec != null) {
+                hi = decodeBandInt(name, in, hiCodec, counts[j]);
+                result[j] = decodeBandLong(name, in, loCodec, counts[j]);
+                for (int i = 0; i < counts[j]; i++) {                    
+                    result[j][i] = (hi[i] << 32) |result[j][i];
+                }
+            } else {
+                result[j] = decodeBandLong(name, in, loCodec, counts[j]);
             }
         }
-        last = 0;
-        for (int j = 0; j < count; j++)
-            for (int i = 0; i < counts[j]; i++) {
-                last = loCodec.decode(in, last);
-                result[j][i] = result[j][i] | last;
-            }
         // TODO Remove debugging code
         debug("Parsed *" + name + " (" + result.length + ")");
-        return result;
+        return result;        
     }
     
     /**
@@ -263,9 +258,7 @@
      * @deprecated this should be removed from production code
      */
     protected void debug(String message) {
-        if (System.getProperty("debug.pack200") != null) {
-            System.err.println(message);
-        }
+        segment.debug(message);
     }
 
 

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java Sat Sep 22 14:24:54 2007
@@ -249,6 +249,7 @@
     public long[] decode(int n, InputStream in, long firstValue) throws IOException,
             Pack200Exception {
         long result[] = new long[n + 1];
+        result[0] = firstValue;
         long last = firstValue;
         for(int i=1;i<n+1;i++) {
             result[i] = last = decode(in,last);

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java Sat Sep 22 14:24:54 2007
@@ -297,12 +297,7 @@
     private void parseCpString(InputStream in) throws IOException,
             Pack200Exception {
         int cpStringCount = header.getCpStringCount();
-        cpString = new String[cpStringCount];
-        long last = 0;
-        for (int i = 0; i < cpStringCount; i++) {
-            int index = (int) (last = Codec.UDELTA5.decode(in, last));
-            cpString[i] = cpUTF8[index];
-        }
+        cpString = parseReferences("cp_String", in, Codec.UDELTA5, cpStringCount, cpUTF8);
     }
 
     private void parseCpUtf8(InputStream in) throws IOException,

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java Sat Sep 22 14:24:54 2007
@@ -51,5 +51,11 @@
 				.parse(Segment.class
 						.getResourceAsStream("/org/apache/harmony/pack200/tests/JustResources.pack.gz")));
 	}
+    
+    public void testInterfaceOnly() throws Exception {
+        assertNotNull(Segment
+                .parse(Segment.class
+                        .getResourceAsStream("/org/apache/harmony/pack200/tests/InterfaceOnly.pack")));
+    }
 
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/portlib/src/main/native/port/unix/hyfile.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/portlib/src/main/native/port/unix/hyfile.c?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/portlib/src/main/native/port/unix/hyfile.c (original)
+++ harmony/enhanced/classlib/branches/java6/modules/portlib/src/main/native/port/unix/hyfile.c Sat Sep 22 14:24:54 2007
@@ -176,10 +176,13 @@
       return -1;
     }
 
-  if (!stat (path, &buffer))
+  if ( ( flags&HyOpenRead && !(flags&HyOpenWrite) )  && !stat (path, &buffer))
     {
       if (S_ISDIR (buffer.st_mode))
         {
+          portLibrary->error_set_last_error_with_message (portLibrary,
+                                                          findError (EEXIST),
+                                                          "Is a directory");
           Trc_PRT_file_open_Exit4 ();
           return -1;
         }

Modified: harmony/enhanced/classlib/branches/java6/modules/sound/src/test/java/org/apache/harmony/sound/tests/javax/sound/sampled/PortInfoTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/sound/src/test/java/org/apache/harmony/sound/tests/javax/sound/sampled/PortInfoTest.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/sound/src/test/java/org/apache/harmony/sound/tests/javax/sound/sampled/PortInfoTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/sound/src/test/java/org/apache/harmony/sound/tests/javax/sound/sampled/PortInfoTest.java Sat Sep 22 14:24:54 2007
@@ -27,7 +27,7 @@
         assertEquals("COMPACT_DISC source port", Port.Info.COMPACT_DISC.toString());
         assertEquals("LINE_OUT target port", Port.Info.LINE_OUT.toString());
 
-        Class cl = Port.class;
+        Class<Port> cl = Port.class;
         String name = "name";
         Port.Info pi1 = new Port.Info(cl, name, true);
         assertEquals(name, pi1.getName());

Modified: harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/JInternalFrame.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/JInternalFrame.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/JInternalFrame.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/JInternalFrame.java Sat Sep 22 14:24:54 2007
@@ -210,7 +210,7 @@
         @Override
         public void updateUI() {
             updateUIForIcon();
-            getInternalFrame().updateUIForFrame();
+            getInternalFrame().updateUI();
         }
 
         void updateUIForIcon() {
@@ -445,7 +445,7 @@
         enableEvents(AWTEvent.KEY_EVENT_MASK);
         setFocusTraversalPolicy(KeyboardFocusManager.getCurrentKeyboardFocusManager()
                 .getDefaultFocusTraversalPolicy());
-        updateUIForFrame();
+        updateUI();
         this.desktopIcon = new JDesktopIcon(this);
         setRootPaneCheckingEnabled(true);
         // non-selected internalFrame must have visible glassPane
@@ -555,14 +555,11 @@
      */
     @Override
     public void updateUI() {
-        updateUIForFrame();
+    	setUI((InternalFrameUI) UIManager.getUI(this));
+    	
         if (getDesktopIcon() != null) {
             getDesktopIcon().updateUIForIcon();
         }
-    }
-
-    void updateUIForFrame() {
-        setUI((InternalFrameUI) UIManager.getUI(this));
     }
 
     /**

Modified: harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/text/html/BlockView.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/text/html/BlockView.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/text/html/BlockView.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/text/html/BlockView.java Sat Sep 22 14:24:54 2007
@@ -74,7 +74,12 @@
 
     public void paint(final Graphics g, final Shape allocation) {
         Rectangle rc = allocation.getBounds();
-        boxPainter.paint(g, rc.x, rc.y, rc.width, rc.height, this);
+
+        // Fix for HARMONY-4755, boxPainter is only initialized
+        // after setPropertiesFromAttributes() is called.
+        if (boxPainter != null) {
+            boxPainter.paint(g, rc.x, rc.y, rc.width, rc.height, this);
+        }
         super.paint(g, allocation);
     }
 

Modified: harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/text/html/HTMLDocument.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/text/html/HTMLDocument.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/text/html/HTMLDocument.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/text/html/HTMLDocument.java Sat Sep 22 14:24:54 2007
@@ -366,16 +366,22 @@
         class AnchorAction extends CharacterAction {
             public void start(final Tag tag, final MutableAttributeSet attr) {
                 anchorReferenceEncountered = attr.isDefined(HTML.Attribute.HREF);
-                super.start(tag, attr);
-                openedBlocks.add(Tag.A);
+                //anchorReferenceEncountered verification added according to H4606
+                if (anchorReferenceEncountered) {
+                    super.start(tag, attr);
+                    openedBlocks.add(Tag.A);
+                }
             }
             
             public void end(final Tag tag) {
                 // According to H4574 Empty AncorTextEncoured verification has
-                // been removed
-                super.end(tag);
-                openedBlocks.remove(Tag.A);
-                anchorReferenceEncountered = false;
+                // been removed, but according H4606 anchorReferenceEncountered
+                // has been added
+                if (anchorReferenceEncountered) {
+                    super.end(tag);
+                    openedBlocks.remove(Tag.A);
+                    anchorReferenceEncountered = false;
+                }
             }
         }
         

Modified: harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/text/html/HTMLDocument_Reader_ActionsTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/text/html/HTMLDocument_Reader_ActionsTest.java?rev=578502&r1=578501&r2=578502&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/text/html/HTMLDocument_Reader_ActionsTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/text/html/HTMLDocument_Reader_ActionsTest.java Sat Sep 22 14:24:54 2007
@@ -216,8 +216,13 @@
 
     public void testAnchorStart() {
         SimpleAttributeSet attr = new SimpleAttributeSet();
-        attr.addAttribute("aaaa", "bbbb");
+        // If href attribute is absent, after 4606 handleStartTag(Tag.A) does
+        // nothing
+        reader.handleStartTag(Tag.A, attr, 0);
+        assertEquals(0, reader.charAttr.getAttributeCount());
+        // After addition the href attribute, Tag.A works as before
         reader.charAttr.addAttribute("bbbb", "aaaa");
+        attr.addAttribute(HTML.Attribute.HREF, "");
         reader.handleStartTag(Tag.A, attr, 0);
         assertEquals(0, reader.parseBuffer.size());
         assertEquals(2, reader.charAttr.getAttributeCount());
@@ -241,7 +246,9 @@
 
     public void testAnchorStartEnd() {
         SimpleAttributeSet attr = new SimpleAttributeSet();
-        attr.addAttribute("aaaa", "bbbb");
+        // If href attribute is absent, after 4606 handleStartTag(Tag.A) does
+        // nothing. After addition the href attribute, Tag.A works as before
+        attr.addAttribute(HTML.Attribute.HREF, "");
         final Tag tag = Tag.A;
         reader.handleStartTag(tag, attr, 0);
         assertEquals(1, reader.charAttr.getAttributeCount());



Mime
View raw message