OpenJDK / bsd-port / jdk9 / jdk
changeset 3339:1513e13fae08
Merge
author | lana |
---|---|
date | Thu, 13 Jan 2011 15:03:27 -0800 |
parents | 0a56bdd709d0 c4ec4f80f44e |
children | 8361ef97a0f9 |
files | test/java/awt/Insets/WindowWithWarningTest/WindowWithWarningTest.html test/java/awt/Insets/WindowWithWarningTest/WindowWithWarningTest.java test/javax/script/E4XErrorTest.java test/javax/swing/SwingWorker/6480289/bug6480289.java test/sun/security/krb5/auto/basic.sh |
diffstat | 218 files changed, 7173 insertions(+), 3404 deletions(-) [+] |
line wrap: on
line diff
--- a/make/common/shared/Defs-java.gmk Thu Jan 06 20:10:32 2011 -0800 +++ b/make/common/shared/Defs-java.gmk Thu Jan 13 15:03:27 2011 -0800 @@ -155,7 +155,7 @@ "-Xbootclasspath/p:$(JAVAC_JAR)" \ -jar $(JAVAC_JAR) $(JAVACFLAGS) JAVAH_CMD = $(BOOT_JAVA_CMD) \ - "-Xbootclasspath/p:$(JAVAH_JAR)$(CLASSPATH_SEPARATOR)$(JAVADOC_JAR)$(CLASSPATH_SEPARATOR)$(JAVAC_JAR)" \ + "-Xbootclasspath/p:$(JAVAH_JAR)$(CLASSPATH_SEPARATOR)$(JAVAC_JAR)" \ -jar $(JAVAH_JAR) $(JAVAHFLAGS) JAVADOC_CMD = $(BOOT_JAVA_CMD) \ "-Xbootclasspath/p:$(JAVADOC_JAR)$(CLASSPATH_SEPARATOR)$(JAVAC_JAR)$(CLASSPATH_SEPARATOR)$(DOCLETS_JAR)" \
--- a/make/sun/Makefile Thu Jan 06 20:10:32 2011 -0800 +++ b/make/sun/Makefile Thu Jan 13 15:03:27 2011 -0800 @@ -42,7 +42,15 @@ ifndef OPENJDK ifeq ($(PLATFORM), solaris) ifneq ($(ARCH), amd64) - DGA_SUBDIR = jdga + # Solaris 11 does not have support for new compilation of DGA code. + OS_VERSION = $(shell uname -r) + OS_MAJOR_VERSION := $(call MajorVersion,$(OS_VERSION)) + OS_MINOR_VERSION := $(call MinorVersion,$(OS_VERSION)) + ifeq ($(shell $(EXPR) $(OS_MAJOR_VERSION) == 5), 1) + ifeq ($(shell $(EXPR) $(OS_MINOR_VERSION) \<= 10), 1) + DGA_SUBDIR = jdga + endif + endif endif endif endif
--- a/make/sun/awt/Makefile Thu Jan 06 20:10:32 2011 -0800 +++ b/make/sun/awt/Makefile Thu Jan 13 15:03:27 2011 -0800 @@ -175,6 +175,10 @@ include $(BUILDDIR)/common/Mapfile-vers.gmk include $(BUILDDIR)/common/Library.gmk +COMPILEFONTCONFIG_FLAGS = +ifdef ALT_COMPILEFONTCONFIG_FLAGS + COMPILEFONTCONFIG_FLAGS += $(ALT_COMPILEFONTCONFIG_FLAGS) +endif build: fontconfigs @@ -406,7 +410,7 @@ $(LIBDIR)/%.bfc: $(FONTCONFIGS_SRC)/$(FONTCONFIGS_SRC_PREFIX)%.properties \ $(COMPILEFONTCONFIG_JARFILE) $(prep-target) - $(BOOT_JAVA_CMD) -jar $(COMPILEFONTCONFIG_JARFILE) $< $@ + $(BOOT_JAVA_CMD) -jar $(COMPILEFONTCONFIG_JARFILE) $(COMPILEFONTCONFIG_FLAGS) $< $@ $(install-module-file) $(call chmod-file, 444) @$(java-vm-cleanup)
--- a/make/sun/awt/make.depend Thu Jan 06 20:10:32 2011 -0800 +++ b/make/sun/awt/make.depend Thu Jan 13 15:03:27 2011 -0800 @@ -224,7 +224,7 @@ $(OBJDIR)/DrawLine.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawLine.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/DrawParallelogram.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawParallelogram.h $(CLASSHDRDIR)/sun_java2d_loops_FillParallelogram.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/DrawParallelogram.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawParallelogram.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/ParallelogramUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/DrawPath.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawPath.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/DrawPath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -232,7 +232,7 @@ $(OBJDIR)/DrawRect.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_DrawRect.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/FillParallelogram.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_FillParallelogram.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/FillParallelogram.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_FillParallelogram.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/ParallelogramUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/FillPath.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_FillPath.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/DrawPath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/ProcessPath.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -284,7 +284,7 @@ $(OBJDIR)/MaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskBlit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/awt/utility/rect.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/MaskFill.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h +$(OBJDIR)/MaskFill.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/ParallelogramUtils.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/MouseInfo.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/classfile_constants.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h
--- a/make/sun/awt/mapfile-vers Thu Jan 06 20:10:32 2011 -0800 +++ b/make/sun/awt/mapfile-vers Thu Jan 13 15:03:27 2011 -0800 @@ -118,6 +118,8 @@ Java_sun_java2d_loops_GraphicsPrimitiveMgr_registerNativeLoops; Java_sun_java2d_loops_MaskBlit_MaskBlit; Java_sun_java2d_loops_MaskFill_MaskFill; + Java_sun_java2d_loops_MaskFill_FillAAPgram; + Java_sun_java2d_loops_MaskFill_DrawAAPgram; Java_sun_java2d_loops_TransformHelper_Transform; Java_sun_java2d_pipe_Region_initIDs; Java_sun_java2d_pipe_SpanClipRenderer_initIDs;
--- a/make/sun/awt/mapfile-vers-linux Thu Jan 06 20:10:32 2011 -0800 +++ b/make/sun/awt/mapfile-vers-linux Thu Jan 13 15:03:27 2011 -0800 @@ -115,6 +115,8 @@ Java_sun_java2d_loops_GraphicsPrimitiveMgr_registerNativeLoops; Java_sun_java2d_loops_MaskBlit_MaskBlit; Java_sun_java2d_loops_MaskFill_MaskFill; + Java_sun_java2d_loops_MaskFill_FillAAPgram; + Java_sun_java2d_loops_MaskFill_DrawAAPgram; Java_sun_java2d_pipe_BufferedRenderPipe_fillSpans; Java_sun_java2d_pipe_SpanClipRenderer_initIDs; sun_awt_image_GifImageDecoder_initIDs;
--- a/make/tools/src/build/tools/javazic/Zoneinfo.java Thu Jan 06 20:10:32 2011 -0800 +++ b/make/tools/src/build/tools/javazic/Zoneinfo.java Thu Jan 13 15:03:27 2011 -0800 @@ -222,6 +222,7 @@ boolean continued = false; Zone zone = null; String l; + lineNum = 0; try { while ((line = in.readLine()) != null) {
--- a/src/share/bin/java.c Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/bin/java.c Thu Jan 13 15:03:27 2011 -0800 @@ -158,8 +158,9 @@ * Running Java code in primordial thread caused many problems. We will * create a new thread to invoke JVM. See 6316197 for more information. */ -static jlong threadStackSize = 0; /* stack size of the new thread */ -static jlong heapSize = 0; /* heap size */ +static jlong threadStackSize = 0; /* stack size of the new thread */ +static jlong maxHeapSize = 0; /* max heap size */ +static jlong initialHeapSize = 0; /* inital heap size */ int JNICALL JavaMain(void * args); /* entry point */ @@ -381,7 +382,7 @@ if (showSettings != NULL) { ShowSettings(env, showSettings); - CHECK_EXCEPTION_LEAVE(0); + CHECK_EXCEPTION_LEAVE(1); } /* If the user specified neither a class name nor a JAR file */ if (printXUsage || printUsage || (jarfile == 0 && classname == 0)) { @@ -689,7 +690,14 @@ if (JLI_StrCCmp(str, "-Xmx") == 0) { jlong tmp; if (parse_size(str + 4, &tmp)) { - heapSize = tmp; + maxHeapSize = tmp; + } + } + + if (JLI_StrCCmp(str, "-Xms") == 0) { + jlong tmp; + if (parse_size(str + 4, &tmp)) { + initialHeapSize = tmp; } } } @@ -1506,12 +1514,13 @@ jstring joptString; NULL_CHECK(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper")); NULL_CHECK(showSettingsID = (*env)->GetStaticMethodID(env, cls, - "showSettings", "(ZLjava/lang/String;JJZ)V")); + "showSettings", "(ZLjava/lang/String;JJJZ)V")); joptString = (*env)->NewStringUTF(env, optString); (*env)->CallStaticVoidMethod(env, cls, showSettingsID, JNI_TRUE, joptString, - (jlong)heapSize, + (jlong)initialHeapSize, + (jlong)maxHeapSize, (jlong)threadStackSize, ServerClassMachine()); }
--- a/src/share/classes/com/sun/java/util/jar/pack/AdaptiveCoding.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/AdaptiveCoding.java Thu Jan 13 15:03:27 2011 -0800 @@ -29,13 +29,14 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import static com.sun.java.util.jar.pack.Constants.*; /** * Adaptive coding. * See the section "Adaptive Encodings" in the Pack200 spec. * @author John Rose */ -class AdaptiveCoding implements Constants, CodingMethod { +class AdaptiveCoding implements CodingMethod { CodingMethod headCoding; int headLength; CodingMethod tailCoding; @@ -147,7 +148,6 @@ } if (KX == KX_MAX) return Integer.MAX_VALUE; KX += 1; - int unit2 = 1 << (KX * KX_LG2BASE); int mask2 = KB_MAX << (KX * KX_LG2BASE); K1 |= (mask & ~mask2); K1 += unit; @@ -250,7 +250,7 @@ return m.toString(); } public String toString() { - StringBuffer res = new StringBuffer(20); + StringBuilder res = new StringBuilder(20); AdaptiveCoding run = this; res.append("run("); for (;;) {
--- a/src/share/classes/com/sun/java/util/jar/pack/Attribute.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/Attribute.java Thu Jan 13 15:03:27 2011 -0800 @@ -36,6 +36,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static com.sun.java.util.jar.pack.Constants.*; /** * Represents an attribute in a class-file. @@ -44,7 +45,7 @@ * attribute layouts. * @author John Rose */ -class Attribute implements Comparable, Constants { +class Attribute implements Comparable { // Attribute instance fields. Layout def; // the name and format of this attr @@ -103,7 +104,6 @@ return this.def.compareTo(that.def); } - private static final byte[] noBytes = {}; private static final Map<List<Attribute>, List<Attribute>> canonLists = new HashMap<>(); private static final Map<Layout, Attribute> attributes = new HashMap<>(); private static final Map<Layout, Attribute> standardDefs = new HashMap<>(); @@ -112,7 +112,7 @@ // are used by trimToSize, in order to reduce footprint // of some common cases. (Note that Code attributes are // always zero size.) - public static List getCanonList(List<Attribute> al) { + public static List<Attribute> getCanonList(List<Attribute> al) { synchronized (canonLists) { List<Attribute> cl = canonLists.get(al); if (cl == null) { @@ -465,7 +465,9 @@ return ConstantPool.getUtf8Entry(name()); } - public boolean isEmpty() { return layout == ""; } + public boolean isEmpty() { + return layout.isEmpty(); + } public Layout(int ctype, String name, String layout) { this.ctype = ctype; @@ -479,19 +481,19 @@ } else { String[] bodies = splitBodies(layout); // Make the callables now, so they can be linked immediately. - Element[] elems = new Element[bodies.length]; - this.elems = elems; - for (int i = 0; i < elems.length; i++) { + Element[] lelems = new Element[bodies.length]; + this.elems = lelems; + for (int i = 0; i < lelems.length; i++) { Element ce = this.new Element(); ce.kind = EK_CBLE; ce.removeBand(); ce.bandIndex = NO_BAND_INDEX; ce.layout = bodies[i]; - elems[i] = ce; + lelems[i] = ce; } // Next fill them in. - for (int i = 0; i < elems.length; i++) { - Element ce = elems[i]; + for (int i = 0; i < lelems.length; i++) { + Element ce = lelems[i]; ce.body = tokenizeLayout(this, i, bodies[i]); } //System.out.println(Arrays.asList(elems)); @@ -525,11 +527,12 @@ } public boolean equals(Object x) { - return x instanceof Layout && equals((Layout)x); + return ( x != null) && ( x.getClass() == Layout.class ) && + equals((Layout)x); } public boolean equals(Layout that) { - return this.name == that.name - && this.layout == that.layout + return this.name.equals(that.name) + && this.layout.equals(that.layout) && this.ctype == that.ctype; } public int hashCode() { @@ -589,14 +592,14 @@ return str; } private String stringForDebug() { - Element[] body = this.body; + Element[] lbody = this.body; switch (kind) { case EK_CALL: - body = null; + lbody = null; break; case EK_CASE: if (flagTest(EF_BACK)) - body = null; + lbody = null; break; } return layout @@ -604,7 +607,7 @@ + "<"+ (flags==0?"":""+flags)+kind+len + (refKind==0?"":""+refKind) + ">" + (value==0?"":"("+value+")") - + (body==null?"": ""+Arrays.asList(body)); + + (lbody==null?"": ""+Arrays.asList(lbody)); } } @@ -613,16 +616,19 @@ } static private final Element[] noElems = {}; public Element[] getCallables() { - if (hasCallables()) - return elems; - else + if (hasCallables()) { + Element[] nelems = Arrays.copyOf(elems, elems.length); + return nelems; + } else return noElems; // no callables at all } public Element[] getEntryPoint() { if (hasCallables()) return elems[0].body; // body of first callable - else - return elems; // no callables; whole body + else { + Element[] nelems = Arrays.copyOf(elems, elems.length); + return nelems; // no callables; whole body + } } /** Return a sequence of tokens from the given attribute bytes. @@ -674,7 +680,7 @@ } } - void visitRefs(Holder holder, int mode, final Collection refs) { + void visitRefs(Holder holder, int mode, final Collection<Entry> refs) { if (mode == VRM_CLASSIC) { refs.add(getNameRef()); } @@ -720,7 +726,7 @@ */ static public String normalizeLayoutString(String layout) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0, len = layout.length(); i < len; ) { char ch = layout.charAt(i++); if (ch <= ' ') { @@ -832,14 +838,14 @@ */ static //private Layout.Element[] tokenizeLayout(Layout self, int curCble, String layout) { - ArrayList<Layout.Element> col = new ArrayList<>(layout.length()); + List<Layout.Element> col = new ArrayList<>(layout.length()); tokenizeLayout(self, curCble, layout, col); Layout.Element[] res = new Layout.Element[col.size()]; col.toArray(res); return res; } static //private - void tokenizeLayout(Layout self, int curCble, String layout, ArrayList<Layout.Element> col) { + void tokenizeLayout(Layout self, int curCble, String layout, List<Layout.Element> col) { boolean prevBCI = false; for (int len = layout.length(), i = 0; i < len; ) { int start = i; @@ -897,7 +903,7 @@ case 'T': // union: 'T' any_int union_case* '(' ')' '[' body ']' kind = EK_UN; i = tokenizeSInt(e, layout, i); - ArrayList<Layout.Element> cases = new ArrayList<>(); + List<Layout.Element> cases = new ArrayList<>(); for (;;) { // Keep parsing cases until we hit the default case. if (layout.charAt(i++) != '(') @@ -1051,7 +1057,7 @@ } static //private String[] splitBodies(String layout) { - ArrayList<String> bodies = new ArrayList<>(); + List<String> bodies = new ArrayList<>(); // Parse several independent layout bodies: "[foo][bar]...[baz]" for (int i = 0; i < layout.length(); i++) { if (layout.charAt(i++) != '[') @@ -1156,7 +1162,7 @@ String expandCaseDashNotation(String layout) { int dash = findCaseDash(layout, 0); if (dash < 0) return layout; // no dashes (the common case) - StringBuffer result = new StringBuffer(layout.length() * 3); + StringBuilder result = new StringBuilder(layout.length() * 3); int sofar = 0; // how far have we processed the layout? for (;;) { // for each dash, collect everything up to the dash
--- a/src/share/classes/com/sun/java/util/jar/pack/BandStructure.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/BandStructure.java Thu Jan 13 15:03:27 2011 -0800 @@ -44,16 +44,17 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.jar.Pack200; +import static com.sun.java.util.jar.pack.Constants.*; /** * Define the structure and ordering of "bands" in a packed file. * @author John Rose */ abstract -class BandStructure implements Constants { +class BandStructure { static final int MAX_EFFORT = 9; static final int MIN_EFFORT = 1; static final int DEFAULT_EFFORT = 5; @@ -251,18 +252,18 @@ null }; - final private static HashMap basicCodingIndexes; + final private static Map<Coding, Integer> basicCodingIndexes; static { assert(basicCodings[_meta_default] == null); assert(basicCodings[_meta_canon_min] != null); assert(basicCodings[_meta_canon_max] != null); - HashMap map = new HashMap(); + Map<Coding, Integer> map = new HashMap<>(); for (int i = 0; i < basicCodings.length; i++) { Coding c = basicCodings[i]; if (c == null) continue; assert(i >= _meta_canon_min); assert(i <= _meta_canon_max); - map.put(c, new Integer(i)); + map.put(c, i); } basicCodingIndexes = map; } @@ -270,12 +271,12 @@ return i < basicCodings.length ? basicCodings[i] : null; } public static int indexOf(Coding c) { - Integer i = (Integer) basicCodingIndexes.get(c); + Integer i = basicCodingIndexes.get(c); if (i == null) return 0; return i.intValue(); } public static Coding[] getBasicCodings() { - return (Coding[]) basicCodings.clone(); + return basicCodings.clone(); } protected byte[] bandHeaderBytes; // used for input only @@ -687,7 +688,6 @@ } bandCoding.writeArrayTo(out, values, 0, length); if (out == outputCounter) { - long len1 = outputCounter.getCount(); assert(outputSize == outputCounter.getCount() - len0) : (outputSize+" != "+outputCounter.getCount()+"-"+len0); } @@ -1050,8 +1050,8 @@ // Bootstrap support for CPRefBands. These are needed to record // intended CP indexes, before the CP has been created. - private ArrayList allKQBands = new ArrayList(); - private ArrayList needPredefIndex = new ArrayList(); + private final List<CPRefBand> allKQBands = new ArrayList<>(); + private List<Object[]> needPredefIndex = new ArrayList<>(); int encodeRef(Entry e, Index ix) { @@ -1078,9 +1078,9 @@ && this instanceof PackageWriter) { // Twist the random state based on my first file. // This sends each segment off in a different direction. - List classes = ((PackageWriter)this).pkg.classes; + List<Package.Class> classes = ((PackageWriter)this).pkg.classes; if (!classes.isEmpty()) { - Package.Class cls = (Package.Class) classes.get(0); + Package.Class cls = classes.get(0); codingChooser.addStressSeed(cls.getName().hashCode()); } } @@ -1619,8 +1619,7 @@ /** Given CP indexes, distribute tag-specific indexes to bands. */ protected void setBandIndexes() { // Handle prior calls to setBandIndex: - for (Iterator i = needPredefIndex.iterator(); i.hasNext(); ) { - Object[] need = (Object[]) i.next(); + for (Object[] need : needPredefIndex) { CPRefBand b = (CPRefBand) need[0]; Byte which = (Byte) need[1]; b.setIndex(getCPIndex(which.byteValue())); @@ -1633,7 +1632,7 @@ } protected void setBandIndex(CPRefBand b, byte which) { - Object[] need = { b, new Byte(which) }; + Object[] need = { b, Byte.valueOf(which) }; if (which == CONSTANT_Literal) { // I.e., attribute layouts KQ (no null) or KQN (null ok). allKQBands.add(b); @@ -1645,7 +1644,7 @@ } } - protected void setConstantValueIndex(com.sun.java.util.jar.pack.Package.Class.Field f) { + protected void setConstantValueIndex(Field f) { Index ix = null; if (f != null) { byte tag = f.getLiteralTag(); @@ -1655,8 +1654,7 @@ assert(ix != null); } // Typically, allKQBands is the singleton of field_ConstantValue_KQ. - for (Iterator i = allKQBands.iterator(); i.hasNext(); ) { - CPRefBand xxx_KQ = (CPRefBand) i.next(); + for (CPRefBand xxx_KQ : allKQBands) { xxx_KQ.setIndex(ix); } } @@ -1688,7 +1686,7 @@ protected int attrClassFileVersionMask; // Mapping from Attribute.Layout to Band[] (layout element bands). - protected HashMap attrBandTable = new HashMap(); + protected Map<Attribute.Layout, Band[]> attrBandTable = new HashMap<>(); // Well-known attributes: protected final Attribute.Layout attrCodeEmpty; @@ -1697,15 +1695,18 @@ protected final Attribute.Layout attrConstantValue; // Mapping from Attribute.Layout to Integer (inverse of attrDefs) - HashMap attrIndexTable = new HashMap(); + Map<Attribute.Layout, Integer> attrIndexTable = new HashMap<>(); // Mapping from attribute index (<32 are flag bits) to attributes. - protected ArrayList[] attrDefs = new ArrayList[ATTR_CONTEXT_LIMIT]; + protected List<List<Attribute.Layout>> attrDefs = + new FixedList<>(ATTR_CONTEXT_LIMIT); { for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) { assert(attrIndexLimit[i] == 0); attrIndexLimit[i] = 32; // just for the sake of predefs. - attrDefs[i] = new ArrayList(Collections.nCopies(attrIndexLimit[i], null)); + attrDefs.set(i, new ArrayList<>(Collections.nCopies( + attrIndexLimit[i], (Attribute.Layout)null))); + } // Add predefined attribute definitions: @@ -1867,9 +1868,10 @@ for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) { assert(attrIndexLimit[i] == 0); // decide on it now! attrIndexLimit[i] = (haveFlagsHi(i)? 63: 32); - assert(attrDefs[i].size() == 32); // all predef indexes are <32 - int addMore = attrIndexLimit[i] - attrDefs[i].size(); - attrDefs[i].addAll(Collections.nCopies(addMore, null)); + List<Attribute.Layout> defList = attrDefs.get(i); + assert(defList.size() == 32); // all predef indexes are <32 + int addMore = attrIndexLimit[i] - defList.size(); + defList.addAll(Collections.nCopies(addMore, (Attribute.Layout) null)); } } @@ -1890,13 +1892,13 @@ return testBit(archiveOptions, mask); } - protected ArrayList getPredefinedAttrs(int ctype) { + protected List getPredefinedAttrs(int ctype) { assert(attrIndexLimit[ctype] != 0); - ArrayList res = new ArrayList(attrIndexLimit[ctype]); + List<Attribute.Layout> res = new ArrayList<>(attrIndexLimit[ctype]); // Remove nulls and non-predefs. for (int ai = 0; ai < attrIndexLimit[ctype]; ai++) { if (testBit(attrDefSeen[ctype], 1L<<ai)) continue; - Attribute.Layout def = (Attribute.Layout) attrDefs[ctype].get(ai); + Attribute.Layout def = attrDefs.get(ctype).get(ai); if (def == null) continue; // unused flag bit assert(isPredefinedAttr(ctype, ai)); res.add(def); @@ -1910,7 +1912,7 @@ if (ai >= attrIndexLimit[ctype]) return false; // If the bit is set, it was explicitly def'd. if (testBit(attrDefSeen[ctype], 1L<<ai)) return false; - return (attrDefs[ctype].get(ai) != null); + return (attrDefs.get(ctype).get(ai) != null); } protected void adjustSpecialAttrMasks() { @@ -2050,8 +2052,8 @@ System.out.println("Removing predefined "+ATTR_CONTEXT_NAME[ctype]+ " attribute on bit "+index); } - List defList = attrDefs[ctype]; - Attribute.Layout def = (Attribute.Layout) defList.get(index); + List<Attribute.Layout> defList = attrDefs.get(ctype); + Attribute.Layout def = defList.get(index); assert(def != null); defList.set(index, null); attrIndexTable.put(def, null); @@ -2059,7 +2061,7 @@ assert(index < 64); attrDefSeen[ctype] &= ~(1L<<index); attrFlagMask[ctype] &= ~(1L<<index); - Band[] ab = (Band[]) attrBandTable.get(def); + Band[] ab = attrBandTable.get(def); for (int j = 0; j < ab.length; j++) { ab[j].doneWithUnusedBand(); } @@ -2085,9 +2087,8 @@ long defSeen = attrDefSeen[ctype]; // Note: attrDefSeen is always a subset of attrFlagMask. assert((defSeen & ~attrFlagMask[ctype]) == 0); - for (int i = 0; i < attrDefs[ctype].size(); i++) { - Attribute.Layout def = (Attribute.Layout) - attrDefs[ctype].get(i); + for (int i = 0; i < attrDefs.get(ctype).size(); i++) { + Attribute.Layout def = attrDefs.get(ctype).get(i); if (def == null) continue; // unused flag bit if (def.bandCount == 0) continue; // empty attr if (i < attrIndexLimit[ctype] && !testBit(defSeen, 1L<<i)) { @@ -2102,7 +2103,7 @@ Band[] newAB = makeNewAttributeBands(pfx, def, xxx_attr_bands); assert(newAB.length == def.bandCount); - Band[] prevAB = (Band[]) attrBandTable.put(def, newAB); + Band[] prevAB = attrBandTable.put(def, newAB); if (prevAB != null) { // We won't be using these predefined bands. for (int j = 0; j < prevAB.length; j++) { @@ -2212,14 +2213,14 @@ protected int setAttributeLayoutIndex(Attribute.Layout def, int index) { int ctype = def.ctype; assert(ATTR_INDEX_OVERFLOW <= index && index < attrIndexLimit[ctype]); - List defList = attrDefs[ctype]; + List<Attribute.Layout> defList = attrDefs.get(ctype); if (index == ATTR_INDEX_OVERFLOW) { // Overflow attribute. index = defList.size(); defList.add(def); if (verbose > 0) Utils.log.info("Adding new attribute at "+def +": "+index); - attrIndexTable.put(def, new Integer(index)); + attrIndexTable.put(def, index); return index; } @@ -2240,7 +2241,7 @@ // Remove index binding of any previous fixed attr. attrIndexTable.put(defList.get(index), null); defList.set(index, def); - attrIndexTable.put(def, new Integer(index)); + attrIndexTable.put(def, index); return index; } @@ -2361,7 +2362,7 @@ //////////////////////////////////////////////////////////////////// static int nextSeqForDebug; - static File dumpDir; + static File dumpDir = null; static OutputStream getDumpStream(Band b, String ext) throws IOException { return getDumpStream(b.name, b.seqForDebug, ext, b); } @@ -2512,19 +2513,19 @@ +", "+cstr+", "+ixS+"),"); } - private HashMap prevForAssertMap; + private Map<Band, Band> prevForAssertMap; // DEBUG ONLY: Record something about the band order. boolean notePrevForAssert(Band b, Band p) { if (prevForAssertMap == null) - prevForAssertMap = new HashMap(); + prevForAssertMap = new HashMap<>(); prevForAssertMap.put(b, p); return true; } // DEBUG ONLY: Validate next input band. private boolean assertReadyToReadFrom(Band b, InputStream in) throws IOException { - Band p = (Band) prevForAssertMap.get(b); + Band p = prevForAssertMap.get(b); // Any previous band must be done reading before this one starts. if (p != null && phaseCmp(p.phase(), DISBURSE_PHASE) < 0) { Utils.log.warning("Previous band not done reading."); @@ -2536,19 +2537,21 @@ String name = b.name; if (optDebugBands && !name.startsWith("(")) { // Verify synchronization between reader & writer: - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); int ch; while ((ch = in.read()) > 0) buf.append((char)ch); String inName = buf.toString(); if (!inName.equals(name)) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("Expected "+name+" but read: "); inName += (char)ch; - while (inName.length() < 10) - inName += (char)in.read(); - for (int i = 0; i < inName.length(); i++) + while (inName.length() < 10) { + inName += (char) in.read(); + } + for (int i = 0; i < inName.length(); i++) { sb.append(inName.charAt(i)); + } Utils.log.warning(sb.toString()); return false; } @@ -2573,7 +2576,7 @@ // DEBUG ONLY: Maybe write a debugging cookie to next output band. private boolean assertReadyToWriteTo(Band b, OutputStream out) throws IOException { - Band p = (Band) prevForAssertMap.get(b); + Band p = prevForAssertMap.get(b); // Any previous band must be done writing before this one starts. if (p != null && phaseCmp(p.phase(), DONE_PHASE) < 0) { Utils.log.warning("Previous band not done writing."); @@ -2654,7 +2657,7 @@ protected static Object[] realloc(Object[] a) { return realloc(a, Math.max(10, a.length*2)); } - static private int[] noInts = {}; + protected static int[] realloc(int[] a, int len) { if (len == 0) return noInts; if (a == null) return new int[len]; @@ -2665,7 +2668,7 @@ protected static int[] realloc(int[] a) { return realloc(a, Math.max(10, a.length*2)); } - static private byte[] noBytes = {}; + protected static byte[] realloc(byte[] a, int len) { if (len == 0) return noBytes; if (a == null) return new byte[len];
--- a/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java Thu Jan 13 15:03:27 2011 -0800 @@ -38,19 +38,20 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.Map; +import static com.sun.java.util.jar.pack.Constants.*; /** * Reader for a class file that is being incorporated into a package. * @author John Rose */ -class ClassReader implements Constants { +class ClassReader { int verbose; Package pkg; Class cls; long inPos; DataInputStream in; - Map attrDefs; + Map<Attribute.Layout, Attribute> attrDefs; Map attrCommands; String unknownAttrCommand = "error";; @@ -77,7 +78,7 @@ }); } - public void setAttrDefs(Map attrDefs) { + public void setAttrDefs(Map<Attribute.Layout, Attribute> attrDefs) { this.attrDefs = attrDefs; } @@ -211,27 +212,23 @@ break; case CONSTANT_Integer: { - Comparable val = new Integer(in.readInt()); - cpMap[i] = ConstantPool.getLiteralEntry(val); + cpMap[i] = ConstantPool.getLiteralEntry(in.readInt()); } break; case CONSTANT_Float: { - Comparable val = new Float(in.readFloat()); - cpMap[i] = ConstantPool.getLiteralEntry(val); + cpMap[i] = ConstantPool.getLiteralEntry(in.readFloat()); } break; case CONSTANT_Long: { - Comparable val = new Long(in.readLong()); - cpMap[i] = ConstantPool.getLiteralEntry(val); + cpMap[i] = ConstantPool.getLiteralEntry(in.readLong()); cpMap[++i] = null; } break; case CONSTANT_Double: { - Comparable val = new Double(in.readDouble()); - cpMap[i] = ConstantPool.getLiteralEntry(val); + cpMap[i] = ConstantPool.getLiteralEntry(in.readDouble()); cpMap[++i] = null; } break; @@ -353,17 +350,18 @@ if (attrCommands != null) { Object lkey = Attribute.keyForLookup(ctype, name); String cmd = (String) attrCommands.get(lkey); - if (cmd == "pass") { - String message = "passing attribute bitwise in "+h; - throw new Attribute.FormatException(message, ctype, name, - cmd); - } else if (cmd == "error") { - String message = "attribute not allowed in "+h; - throw new Attribute.FormatException(message, ctype, name, - cmd); - } else if (cmd == "strip") { - skip(length, name+" attribute in "+h); - continue; + if (cmd != null) { + switch (cmd) { + case "pass": + String message1 = "passing attribute bitwise in " + h; + throw new Attribute.FormatException(message1, ctype, name, cmd); + case "error": + String message2 = "attribute not allowed in " + h; + throw new Attribute.FormatException(message2, ctype, name, cmd); + case "strip": + skip(length, name + " attribute in " + h); + continue; + } } } // Find canonical instance of the requested attribute. @@ -408,7 +406,7 @@ String message = "unsupported StackMap variant in "+h; throw new Attribute.FormatException(message, ctype, name, "pass"); - } else if (unknownAttrCommand == "strip") { + } else if ("strip".equals(unknownAttrCommand)) { // Skip the unknown attribute. skip(length, "unknown "+name+" attribute in "+h); continue; @@ -422,7 +420,7 @@ a.layout() == Package.attrInnerClassesEmpty) { // These are hardwired. long pos0 = inPos; - if (a.name() == "Code") { + if ("Code".equals(a.name())) { Class.Method m = (Class.Method) h; m.code = new Code(m); try { @@ -471,7 +469,7 @@ void readInnerClasses(Class cls) throws IOException { int nc = readUnsignedShort(); - ArrayList ics = new ArrayList(nc); + ArrayList<InnerClass> ics = new ArrayList<>(nc); for (int i = 0; i < nc; i++) { InnerClass ic = new InnerClass(readClassRef(),
--- a/src/share/classes/com/sun/java/util/jar/pack/ClassWriter.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/ClassWriter.java Thu Jan 13 15:03:27 2011 -0800 @@ -38,12 +38,12 @@ import java.io.OutputStream; import java.util.Iterator; import java.util.List; - +import static com.sun.java.util.jar.pack.Constants.*; /** * Writer for a class file that is incorporated into a package. * @author John Rose */ -class ClassWriter implements Constants { +class ClassWriter { int verbose; Package pkg; @@ -196,8 +196,7 @@ return; } writeShort(h.attributes.size()); - for (Iterator i = h.attributes.iterator(); i.hasNext(); ) { - Attribute a = (Attribute) i.next(); + for (Attribute a : h.attributes) { a.finishRefs(cpIndex); writeRef(a.getNameRef()); if (a.layout() == Package.attrCodeEmpty || @@ -207,7 +206,7 @@ assert(out != bufOut); buf.reset(); out = bufOut; - if (a.name() == "Code") { + if ("Code".equals(a.name())) { Class.Method m = (Class.Method) h; writeCode(m.code); } else { @@ -246,10 +245,9 @@ } void writeInnerClasses(Class cls) throws IOException { - List ics = cls.getInnerClasses(); + List<InnerClass> ics = cls.getInnerClasses(); writeShort(ics.size()); - for (Iterator i = ics.iterator(); i.hasNext(); ) { - InnerClass ic = (InnerClass) i.next(); + for (InnerClass ic : ics) { writeRef(ic.thisClass); writeRef(ic.outerClass); writeRef(ic.name);
--- a/src/share/classes/com/sun/java/util/jar/pack/Code.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/Code.java Thu Jan 13 15:03:27 2011 -0800 @@ -29,12 +29,13 @@ import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.Collection; +import static com.sun.java.util.jar.pack.Constants.*; /** * Represents a chunk of bytecodes. * @author John Rose */ -class Code extends Attribute.Holder implements Constants { +class Code extends Attribute.Holder { Class.Method m; public Code(Class.Method m) { @@ -141,15 +142,12 @@ super.trimToSize(); } - protected void visitRefs(int mode, Collection refs) { + protected void visitRefs(int mode, Collection<ConstantPool.Entry> refs) { int verbose = getPackage().verbose; if (verbose > 2) System.out.println("Reference scan "+this); Class cls = thisClass(); - Package pkg = cls.getPackage(); - for (int i = 0; i < handler_class.length; i++) { - refs.add(handler_class[i]); - } + refs.addAll(Arrays.asList(handler_class)); if (fixups != null) { fixups.visitRefs(refs); } else { @@ -196,11 +194,8 @@ map[mapLen] = (short)(PClimit + Short.MIN_VALUE); return map; } else { - int[] map = new int[mapLen+1]; - for (int i = 0; i < mapLen; i++) { - map[i] = (int) insnMap[i]; - } - map[mapLen] = (int) PClimit; + int[] map = Arrays.copyOf(insnMap, mapLen + 1); + map[mapLen] = PClimit; return map; } } @@ -220,10 +215,7 @@ } } else { int[] map = (int[]) map0; - imap = new int[map.length-1]; - for (int i = 0; i < imap.length; i++) { - imap[i] = map[i]; - } + imap = Arrays.copyOfRange(map, 0, map.length - 1); } return imap; } @@ -266,7 +258,7 @@ } else { int[] map = (int[]) map0; len = map.length; - i = Arrays.binarySearch(map, (int)bci); + i = Arrays.binarySearch(map, bci); } assert(i != -1); assert(i != 0); @@ -322,7 +314,7 @@ len = map.length; if (bciCode < len) return map[bciCode]; - i = Arrays.binarySearch(map, (int)bciCode); + i = Arrays.binarySearch(map, bciCode); if (i < 0) i = -i-1; int key = bciCode-len; for (;; i--) {
--- a/src/share/classes/com/sun/java/util/jar/pack/Coding.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/Coding.java Thu Jan 13 15:03:27 2011 -0800 @@ -29,14 +29,15 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; - +import java.util.Map; +import static com.sun.java.util.jar.pack.Constants.*; /** * Define the conversions between sequences of small integers and raw bytes. * This is a schema of encodings which incorporates varying lengths, * varying degrees of length variability, and varying amounts of signed-ness. * @author John Rose */ -class Coding implements Constants, Comparable, CodingMethod, Histogram.BitMetric { +class Coding implements Comparable, CodingMethod, Histogram.BitMetric { /* Coding schema for single integers, parameterized by (B,H,S): @@ -191,7 +192,9 @@ if (S == 0 || range >= (long)1<<32) return saturate32(range-1); long maxPos = range-1; - while (isNegativeCode(maxPos, S)) --maxPos; + while (isNegativeCode(maxPos, S)) { + --maxPos; + } if (maxPos < 0) return -1; // No positive codings at all. int smax = decodeSign32(maxPos, S); // check for 32-bit wraparound: @@ -213,9 +216,10 @@ if (S == 0) { return 0; } - int Smask = (1<<S)-1; long maxNeg = range-1; - while (!isNegativeCode(maxNeg, S)) --maxNeg; + while (!isNegativeCode(maxNeg, S)) + --maxNeg; + if (maxNeg < 0) return 0; // No negative codings at all. return decodeSign32(maxNeg, S); } @@ -395,12 +399,12 @@ return (del<<14)+(S<<11)+(B<<8)+(H<<0); } - private static HashMap codeMap; + private static Map<Coding, Coding> codeMap; private static synchronized Coding of(int B, int H, int S, int del) { - if (codeMap == null) codeMap = new HashMap(); + if (codeMap == null) codeMap = new HashMap<>(); Coding x0 = new Coding(B, H, S, del); - Coding x1 = (Coding) codeMap.get(x0); + Coding x1 = codeMap.get(x0); if (x1 == null) codeMap.put(x0, x1 = x0); return x1; } @@ -462,6 +466,7 @@ // %%% use byte[] buffer for (int i = start; i < end; i++) a[i] = readFrom(in); + for (int dstep = 0; dstep < del; dstep++) { long state = 0; for (int i = start; i < end; i++) { @@ -750,14 +755,14 @@ if (len == 0) return true; if (isFullRange()) return true; // Calculate max, min: - int max = values[start]; - int min = max; + int lmax = values[start]; + int lmin = lmax; for (int i = 1; i < len; i++) { int value = values[start+i]; - if (max < value) max = value; - if (min > value) min = value; + if (lmax < value) lmax = value; + if (lmin > value) lmin = value; } - return canRepresent(min, max); + return canRepresent(lmin, lmax); } public double getBitLength(int value) { // implements BitMetric @@ -800,21 +805,20 @@ //return Coding.of(B, H, S).getLength(deltas, 0, len); values = deltas; start = 0; - end = values.length; } int sum = len; // at least 1 byte per // add extra bytes for extra-long values for (int n = 1; n <= B; n++) { // what is the coding interval [min..max] for n bytes? - int max = byteMax[n-1]; - int min = byteMin[n-1]; + int lmax = byteMax[n-1]; + int lmin = byteMin[n-1]; int longer = 0; // count of guys longer than n bytes for (int i = 0; i < len; i++) { int value = values[start+i]; if (value >= 0) { - if (value > max) longer++; + if (value > lmax) longer++; } else { - if (value < min) longer++; + if (value < lmin) longer++; } } if (longer == 0) break; // no more passes needed
--- a/src/share/classes/com/sun/java/util/jar/pack/CodingChooser.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/CodingChooser.java Thu Jan 13 15:03:27 2011 -0800 @@ -34,15 +34,16 @@ import java.util.Iterator; import java.util.List; import java.util.Random; +import java.util.Set; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; - +import static com.sun.java.util.jar.pack.Constants.*; /** * Heuristic chooser of basic encodings. * Runs "zip" to measure the apparent information content after coding. * @author John Rose */ -class CodingChooser implements Constants { +class CodingChooser { int verbose; int effort; boolean optUseHistogram = true; @@ -124,10 +125,10 @@ = !p200.getBoolean(Utils.COM_PREFIX+"no.population.coding"); this.optUseAdaptiveCoding = !p200.getBoolean(Utils.COM_PREFIX+"no.adaptive.coding"); - int stress + int lstress = p200.getInteger(Utils.COM_PREFIX+"stress.coding"); - if (stress != 0) - this.stress = new Random(stress); + if (lstress != 0) + this.stress = new Random(lstress); } this.effort = effort; @@ -376,9 +377,9 @@ " fewer bytes than regular "+regular+ "; win="+pct(zipSize1-bestZipSize, zipSize1)); } - CodingMethod bestMethod = this.bestMethod; + CodingMethod lbestMethod = this.bestMethod; reset(null, 0, 0); // for GC - return bestMethod; + return lbestMethod; } CodingMethod choose(int[] values, int start, int end, Coding regular) { return choose(values, start, end, regular, null); @@ -742,9 +743,9 @@ // Steps 1/2/3 are interdependent, and may be iterated. // Steps 4 and 5 may be decided independently afterward. int[] LValuesCoded = PopulationCoding.LValuesCoded; - ArrayList bestFits = new ArrayList(); - ArrayList fullFits = new ArrayList(); - ArrayList longFits = new ArrayList(); + List<Coding> bestFits = new ArrayList<>(); + List<Coding> fullFits = new ArrayList<>(); + List<Coding> longFits = new ArrayList<>(); final int PACK_TO_MAX_S = 1; if (bestPopFVC <= 255) { bestFits.add(BandStructure.BYTE1); @@ -776,16 +777,16 @@ } } // interleave all B greater than bestB with best and full fits - for (Iterator i = bestFits.iterator(); i.hasNext(); ) { - Coding c = (Coding) i.next(); + for (Iterator<Coding> i = bestFits.iterator(); i.hasNext(); ) { + Coding c = i.next(); if (c.B() > bestB) { i.remove(); longFits.add(0, c); } } } - ArrayList allFits = new ArrayList(); - for (Iterator i = bestFits.iterator(), + List<Coding> allFits = new ArrayList<>(); + for (Iterator<Coding> i = bestFits.iterator(), j = fullFits.iterator(), k = longFits.iterator(); i.hasNext() || j.hasNext() || k.hasNext(); ) { @@ -812,8 +813,7 @@ } if (verbose > 3) Utils.log.info("allFits: "+allFits); - for (Iterator i = allFits.iterator(); i.hasNext(); ) { - Coding tc = (Coding) i.next(); + for (Coding tc : allFits) { boolean packToMax = false; if (tc.S() == PACK_TO_MAX_S) { // Kludge: setS(PACK_TO_MAX_S) means packToMax here. @@ -910,7 +910,7 @@ " tc="+pop.tokenCoding+ " uc="+pop.unfavoredCoding); //pop.hist.print("pop-hist", null, System.out); - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("fv = {"); for (int i = 1; i <= fVlen; i++) { if ((i % 10) == 0) @@ -949,20 +949,20 @@ // run occupies too much space. ("Too much" means, say 5% more // than the average integer size of the band as a whole.) // Try to find a better coding for those segments. - int start = this.start; - int end = this.end; - int[] values = this.values; - int len = end-start; + int lstart = this.start; + int lend = this.end; + int[] lvalues = this.values; + int len = lend-lstart; if (plainCoding.isDelta()) { - values = getDeltas(0,0); //%%% not quite right! - start = 0; - end = values.length; + lvalues = getDeltas(0,0); //%%% not quite right! + lstart = 0; + lend = lvalues.length; } int[] sizes = new int[len+1]; int fillp = 0; int totalSize = 0; - for (int i = start; i < end; i++) { - int val = values[i]; + for (int i = lstart; i < lend; i++) { + int val = lvalues[i]; sizes[fillp++] = totalSize; int size = plainCoding.getLength(val); assert(size < Integer.MAX_VALUE); @@ -1013,22 +1013,23 @@ double[] fuzzes = new double[meshes.length]; for (int i = 0; i < meshes.length; i++) { int mesh = meshes[i]; - double fuzz; + double lfuzz; if (mesh < 10) - fuzz = sizeFuzz3; + lfuzz = sizeFuzz3; else if (mesh < 100) - fuzz = sizeFuzz2; + lfuzz = sizeFuzz2; else - fuzz = sizeFuzz; - fuzzes[i] = fuzz; - threshes[i] = BAND_HEADER + (int)Math.ceil(mesh * avgSize * fuzz); + lfuzz = sizeFuzz; + fuzzes[i] = lfuzz; + threshes[i] = BAND_HEADER + (int)Math.ceil(mesh * avgSize * lfuzz); } if (verbose > 1) { System.out.print("tryAdaptiveCoding ["+len+"]"+ " avgS="+avgSize+" fuzz="+sizeFuzz+ " meshes: {"); - for (int i = 0; i < meshes.length; i++) - System.out.print(" "+meshes[i]+"("+threshes[i]+")"); + for (int i = 0; i < meshes.length; i++) { + System.out.print(" " + meshes[i] + "(" + threshes[i] + ")"); + } Utils.log.info(" }"); } if (runHelper == null) { @@ -1229,20 +1230,19 @@ Histogram hist = getValueHistogram(); int fVlen = stressLen(hist.getTotalLength()); if (fVlen == 0) return coding; - List popvals = new ArrayList(); + List<Integer> popvals = new ArrayList<>(); if (stress.nextBoolean()) { // Build the population from the value list. - HashSet popset = new HashSet(); + Set<Integer> popset = new HashSet<>(); for (int i = start; i < end; i++) { - Integer val = new Integer(values[i]); - if (popset.add(val)) popvals.add(val); + if (popset.add(values[i])) popvals.add(values[i]); } } else { int[][] matrix = hist.getMatrix(); for (int mrow = 0; mrow < matrix.length; mrow++) { int[] row = matrix[mrow]; for (int mcol = 1; mcol < row.length; mcol++) { - popvals.add(new Integer(row[mcol])); + popvals.add(row[mcol]); } } } @@ -1269,7 +1269,7 @@ fVlen = popvals.size(); int[] fvals = new int[1+fVlen]; for (int i = 0; i < fVlen; i++) { - fvals[1+i] = ((Integer)popvals.get(i)).intValue(); + fvals[1+i] = (popvals.get(i)).intValue(); } PopulationCoding pop = new PopulationCoding(); pop.setFavoredValues(fvals, fVlen); @@ -1283,13 +1283,13 @@ } } if (pop.tokenCoding == null) { - int min = fvals[1], max = min; + int lmin = fvals[1], lmax = lmin; for (int i = 2; i <= fVlen; i++) { int val = fvals[i]; - if (min > val) min = val; - if (max < val) max = val; + if (lmin > val) lmin = val; + if (lmax < val) lmax = val; } - pop.tokenCoding = stressCoding(min, max); + pop.tokenCoding = stressCoding(lmin, lmax); } computePopSizePrivate(pop, valueCoding, valueCoding); @@ -1310,13 +1310,13 @@ try { assert(!disableRunCoding); disableRunCoding = true; // temporary, while I decide spans - int[] allValues = (int[]) values.clone(); + int[] allValues = values.clone(); CodingMethod result = null; int scan = this.end; - int start = this.start; - for (int split; scan > start; scan = split) { + int lstart = this.start; + for (int split; scan > lstart; scan = split) { int thisspan; - int rand = (scan - start < 100)? -1: stress.nextInt(); + int rand = (scan - lstart < 100)? -1: stress.nextInt(); if ((rand & 7) != 0) { thisspan = (spanlen==1? spanlen: stressLen(spanlen-1)+1); } else { @@ -1325,7 +1325,7 @@ int KB = (rand >>>= 3) & AdaptiveCoding.KB_MAX; for (;;) { thisspan = AdaptiveCoding.decodeK(KX, KB); - if (thisspan <= scan - start) break; + if (thisspan <= scan - lstart) break; // Try smaller and smaller codings: if (KB != AdaptiveCoding.KB_DEFAULT) KB = AdaptiveCoding.KB_DEFAULT; @@ -1335,11 +1335,13 @@ //System.out.println("KX="+KX+" KB="+KB+" K="+thisspan); assert(AdaptiveCoding.isCodableLength(thisspan)); } - if (thisspan > scan - start) thisspan = scan - start; - while (!AdaptiveCoding.isCodableLength(thisspan)) --thisspan; + if (thisspan > scan - lstart) thisspan = scan - lstart; + while (!AdaptiveCoding.isCodableLength(thisspan)) { + --thisspan; + } split = scan - thisspan; assert(split < scan); - assert(split >= start); + assert(split >= lstart); // Choose a coding for the span [split..scan). CodingMethod sc = choose(allValues, split, scan, plainCoding); if (result == null) { @@ -1420,7 +1422,7 @@ case StreamTokenizer.TT_EOF: throw new NoSuchElementException(); case StreamTokenizer.TT_NUMBER: - return new Integer((int) in.nval); + return Integer.valueOf((int) in.nval); default: assert(false); return null;
--- a/src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java Thu Jan 13 15:03:27 2011 -0800 @@ -33,13 +33,14 @@ import java.util.ListIterator; import java.util.Map; import java.util.Set; +import static com.sun.java.util.jar.pack.Constants.*; /** * Representation of constant pool entries and indexes. * @author John Rose */ abstract -class ConstantPool implements Constants { +class ConstantPool { private ConstantPool() {} // do not instantiate static int verbose() { @@ -155,9 +156,6 @@ return null; } - public boolean sameTagAs(Object o) { - return (o instanceof Entry) && ((Entry)o).tag == tag; - } public boolean eq(Entry that) { // same reference assert(that != null); return this == that || this.equals(that); @@ -219,9 +217,9 @@ return value.hashCode(); } public boolean equals(Object o) { - if (!sameTagAs(o)) return false; // Use reference equality of interned strings: - return ((Utf8Entry)o).value == value; + return (o != null && o.getClass() == Utf8Entry.class + && ((Utf8Entry) o).value.equals(value)); } public int compareTo(Object o) { int x = superCompareTo(o); @@ -275,8 +273,9 @@ } public boolean equals(Object o) { - if (!sameTagAs(o)) return false; - return (((NumberEntry)o).value).equals(value); + return (o != null && o.getClass() == NumberEntry.class + && ((NumberEntry) o).value.equals(value)); + } public int compareTo(Object o) { int x = superCompareTo(o); @@ -310,8 +309,8 @@ return ref.hashCode() + tag; } public boolean equals(Object o) { - if (!sameTagAs(o)) return false; - return ((StringEntry)o).ref.eq(ref); + return (o != null && o.getClass() == StringEntry.class && + ((StringEntry)o).ref.eq(ref)); } public int compareTo(Object o) { int x = superCompareTo(o); @@ -342,8 +341,8 @@ hashCode(); // force computation of valueHash } public boolean equals(Object o) { - if (!sameTagAs(o)) return false; - return ((ClassEntry)o).ref.eq(ref); + return (o != null && o.getClass() == ClassEntry.class + && ((ClassEntry) o).ref.eq(ref)); } public int compareTo(Object o) { int x = superCompareTo(o); @@ -380,7 +379,9 @@ return (nameRef.hashCode() + (hc2 << 8)) ^ hc2; } public boolean equals(Object o) { - if (!sameTagAs(o)) return false; + if (o == null || o.getClass() != DescriptorEntry.class) { + return false; + } DescriptorEntry that = (DescriptorEntry)o; return this.nameRef.eq(that.nameRef) && this.typeRef.eq(that.typeRef); @@ -439,7 +440,9 @@ hashCode(); // force computation of valueHash } public boolean equals(Object o) { - if (!sameTagAs(o)) return false; + if (o == null || o.getClass() != MemberEntry.class) { + return false; + } MemberEntry that = (MemberEntry)o; return this.classRef.eq(that.classRef) && this.descRef.eq(that.descRef); @@ -511,8 +514,8 @@ } public boolean equals(Object o) { - if (!sameTagAs(o)) return false; - return ((SignatureEntry)o).value == value; + return (o != null && o.getClass() == SignatureEntry.class && + ((SignatureEntry)o).value.equals(value)); } public int compareTo(Object o) { int x = superCompareTo(o); @@ -724,7 +727,7 @@ protected static final ClassEntry[] noClassRefs = {}; /** An Index is a mapping between CP entries and small integers. */ - public static + public static final class Index extends AbstractList { protected String debugName; protected Entry[] cpMap; @@ -894,7 +897,7 @@ } public static - Index makeIndex(String debugName, Collection cpMapList) { + Index makeIndex(String debugName, Collection<Entry> cpMapList) { return new Index(debugName, cpMapList); } @@ -916,7 +919,7 @@ public static Index[] partition(Index ix, int[] keys) { // %%% Should move this into class Index. - ArrayList<List<Entry>> parts = new ArrayList<>(); + List<List<Entry>> parts = new ArrayList<>(); Entry[] cpMap = ix.cpMap; assert(keys.length == cpMap.length); for (int i = 0; i < keys.length; i++) { @@ -1094,12 +1097,12 @@ // Inverse of getOverloadingIndex public MemberEntry getOverloadingForIndex(byte tag, ClassEntry classRef, String name, int which) { - assert(name == name.intern()); + assert(name.equals(name.intern())); Index ix = getMemberIndex(tag, classRef); int ord = 0; for (int i = 0; i < ix.cpMap.length; i++) { MemberEntry e = (MemberEntry) ix.cpMap[i]; - if (e.descRef.nameRef.stringValue() == name) { + if (e.descRef.nameRef.stringValue().equals(name)) { if (ord == which) return e; ord++; } @@ -1133,10 +1136,10 @@ public static void completeReferencesIn(Set<Entry> cpRefs, boolean flattenSigs) { cpRefs.remove(null); - for (ListIterator work = - new ArrayList(cpRefs).listIterator(cpRefs.size()); + for (ListIterator<Entry> work = + new ArrayList<>(cpRefs).listIterator(cpRefs.size()); work.hasPrevious(); ) { - Entry e = (Entry) work.previous(); + Entry e = work.previous(); work.remove(); // pop stack assert(e != null); if (flattenSigs && e.tag == CONSTANT_Signature) {
--- a/src/share/classes/com/sun/java/util/jar/pack/Constants.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/Constants.java Thu Jan 13 15:03:27 2011 -0800 @@ -32,7 +32,10 @@ * Shared constants * @author John Rose */ -interface Constants { +class Constants { + + private Constants(){} + public final static int JAVA_MAGIC = 0xCAFEBABE; /*
--- a/src/share/classes/com/sun/java/util/jar/pack/Driver.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/Driver.java Thu Jan 13 15:03:27 2011 -0800 @@ -59,12 +59,11 @@ ResourceBundle.getBundle("com.sun.java.util.jar.pack.DriverResource"); public static void main(String[] ava) throws IOException { - ArrayList<String> av = new ArrayList<>(Arrays.asList(ava)); + List<String> av = new ArrayList<>(Arrays.asList(ava)); boolean doPack = true; boolean doUnpack = false; boolean doRepack = false; - boolean doForceRepack = false; boolean doZip = true; String logFile = null; String verboseProp = Utils.DEBUG_VERBOSE; @@ -72,17 +71,20 @@ { // Non-standard, undocumented "--unpack" switch enables unpack mode. String arg0 = av.isEmpty() ? "" : av.get(0); - if (arg0.equals("--pack")) { + switch (arg0) { + case "--pack": av.remove(0); - } else if (arg0.equals("--unpack")) { + break; + case "--unpack": av.remove(0); doPack = false; doUnpack = true; + break; } } // Collect engine properties here: - HashMap<String,String> engProps = new HashMap<>(); + Map<String,String> engProps = new HashMap<>(); engProps.put(verboseProp, System.getProperty(verboseProp)); String optionMap; @@ -96,7 +98,7 @@ } // Collect argument properties here: - HashMap<String,String> avProps = new HashMap<>(); + Map<String,String> avProps = new HashMap<>(); try { for (;;) { String state = parseCommandOptions(av, optionMap, avProps); @@ -146,7 +148,7 @@ } // See if there is any other action to take. - if (state == "--config-file=") { + if ("--config-file=".equals(state)) { String propFile = av.remove(0); InputStream propIn = new FileInputStream(propFile); Properties fileProps = new Properties(); @@ -157,10 +159,10 @@ for (Map.Entry<Object,Object> me : fileProps.entrySet()) { engProps.put((String) me.getKey(), (String) me.getValue()); } - } else if (state == "--version") { + } else if ("--version".equals(state)) { System.out.println(MessageFormat.format(RESOURCE.getString(DriverResource.VERSION), Driver.class.getName(), "1.31, 07/05/05")); return; - } else if (state == "--help") { + } else if ("--help".equals(state)) { printUsage(doPack, true, System.out); System.exit(1); return; @@ -178,14 +180,20 @@ // Deal with remaining non-engine properties: for (String opt : avProps.keySet()) { String val = avProps.get(opt); - if (opt == "--repack") { - doRepack = true; - } else if (opt == "--no-gzip") { - doZip = (val == null); - } else if (opt == "--log-file=") { - logFile = val; - } else { - throw new InternalError(MessageFormat.format(RESOURCE.getString(DriverResource.BAD_OPTION), opt, avProps.get(opt))); + switch (opt) { + case "--repack": + doRepack = true; + break; + case "--no-gzip": + doZip = (val == null); + break; + case "--log-file=": + logFile = val; + break; + default: + throw new InternalError(MessageFormat.format( + RESOURCE.getString(DriverResource.BAD_OPTION), + opt, avProps.get(opt))); } } @@ -219,7 +227,9 @@ if (packfile.toLowerCase().endsWith(".pack") || packfile.toLowerCase().endsWith(".pac") || packfile.toLowerCase().endsWith(".gz")) { - System.err.println(MessageFormat.format(RESOURCE.getString(DriverResource.BAD_REPACK_OUTPUT),packfile)); + System.err.println(MessageFormat.format( + RESOURCE.getString(DriverResource.BAD_REPACK_OUTPUT), + packfile)); printUsage(doPack, false, System.err); System.exit(2); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/com/sun/java/util/jar/pack/FixedList.java Thu Jan 13 15:03:27 2011 -0800 @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.java.util.jar.pack; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +/* + * @author ksrini + */ + +/* + * This class provides an ArrayList implementation which has a fixed size, + * thus all the operations which modifies the size have been rendered + * inoperative. This essentially allows us to use generified array + * lists in lieu of arrays. + */ +final class FixedList<E> implements List<E> { + + private final ArrayList<E> flist; + + protected FixedList(int capacity) { + flist = new ArrayList<>(capacity); + // initialize the list to null + for (int i = 0 ; i < capacity ; i++) { + flist.add(null); + } + } + @Override + public int size() { + return flist.size(); + } + + @Override + public boolean isEmpty() { + return flist.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return flist.contains(o); + } + + @Override + public Iterator<E> iterator() { + return flist.iterator(); + } + + @Override + public Object[] toArray() { + return flist.toArray(); + } + + @Override + public <T> T[] toArray(T[] a) { + return flist.toArray(a); + } + + @Override + public boolean add(E e) throws UnsupportedOperationException { + throw new UnsupportedOperationException("operation not permitted"); + } + + @Override + public boolean remove(Object o) throws UnsupportedOperationException { + throw new UnsupportedOperationException("operation not permitted"); + } + + @Override + public boolean containsAll(Collection<?> c) { + return flist.containsAll(c); + } + + @Override + public boolean addAll(Collection<? extends E> c) throws UnsupportedOperationException { + throw new UnsupportedOperationException("operation not permitted"); + } + + @Override + public boolean addAll(int index, Collection<? extends E> c) throws UnsupportedOperationException { + throw new UnsupportedOperationException("operation not permitted"); + } + + @Override + public boolean removeAll(Collection<?> c) throws UnsupportedOperationException { + throw new UnsupportedOperationException("operation not permitted"); + } + + @Override + public boolean retainAll(Collection<?> c) throws UnsupportedOperationException { + throw new UnsupportedOperationException("operation not permitted"); + } + + @Override + public void clear() throws UnsupportedOperationException { + throw new UnsupportedOperationException("operation not permitted"); + } + + @Override + public E get(int index) { + return flist.get(index); + } + + @Override + public E set(int index, E element) { + return flist.set(index, element); + } + + @Override + public void add(int index, E element) throws UnsupportedOperationException { + throw new UnsupportedOperationException("operation not permitted"); + } + + @Override + public E remove(int index) throws UnsupportedOperationException { + throw new UnsupportedOperationException("operation not permitted"); + } + + @Override + public int indexOf(Object o) { + return flist.indexOf(o); + } + + @Override + public int lastIndexOf(Object o) { + return flist.lastIndexOf(o); + } + + @Override + public ListIterator<E> listIterator() { + return flist.listIterator(); + } + + @Override + public ListIterator<E> listIterator(int index) { + return flist.listIterator(index); + } + + @Override + public List<E> subList(int fromIndex, int toIndex) { + return flist.subList(fromIndex, toIndex); + } + + @Override + public String toString() { + return "FixedList{" + "plist=" + flist + '}'; + } +} +
--- a/src/share/classes/com/sun/java/util/jar/pack/Fixups.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/Fixups.java Thu Jan 13 15:03:27 2011 -0800 @@ -42,7 +42,7 @@ * * @author John Rose */ -class Fixups extends AbstractCollection implements Constants { +final class Fixups extends AbstractCollection { byte[] bytes; // the subject of the relocations int head; // desc locating first reloc int tail; // desc locating last reloc @@ -99,7 +99,7 @@ } } - public void visitRefs(Collection refs) { + public void visitRefs(Collection<Entry> refs) { for (int i = 0; i < size; i++) { refs.add(entries[i]); } @@ -124,6 +124,7 @@ return bytes; } + @SuppressWarnings("unchecked") public void setBytes(byte[] newBytes) { if (bytes == newBytes) return; ArrayList old = null; @@ -278,7 +279,7 @@ return new Fixup(nextDesc(), entries[thisIndex]); } int nextDesc() { - int thisIndex = index++; + index++; int thisDesc = next; if (index < size) { // Fetch next desc eagerly, in case this fixup gets finalized. @@ -310,6 +311,7 @@ public boolean add(Object fixup) { return add((Fixup) fixup); } + @SuppressWarnings("unchecked") public boolean addAll(Collection c) { if (c instanceof Fixups) { // Use knowledge of Itr structure to avoid building little structs. @@ -420,7 +422,7 @@ // Iterate over all the references in this set of fixups. public static - void visitRefs(Object fixups, Collection refs) { + void visitRefs(Object fixups, Collection<Entry> refs) { if (fixups == null) { } else if (!(fixups instanceof Fixups)) { // Special convention; see above.
--- a/src/share/classes/com/sun/java/util/jar/pack/Histogram.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/Histogram.java Thu Jan 13 15:03:27 2011 -0800 @@ -34,7 +34,7 @@ * Histogram derived from an integer array of events (int[]). * @author John Rose */ -class Histogram { +final class Histogram { // Compact histogram representation: 4 bytes per distinct value, // plus 5 words per distinct count. protected final int[][] matrix; // multi-row matrix {{counti,valueij...}} @@ -304,7 +304,7 @@ public String[] getRowTitles(String name) { int totalUnique = getTotalLength(); - int totalWeight = getTotalWeight(); + int ltotalWeight = getTotalWeight(); String[] histTitles = new String[matrix.length]; int cumWeight = 0; int cumUnique = 0; @@ -314,7 +314,7 @@ int weight = getRowWeight(i); cumWeight += weight; cumUnique += unique; - long wpct = ((long)cumWeight * 100 + totalWeight/2) / totalWeight; + long wpct = ((long)cumWeight * 100 + ltotalWeight/2) / ltotalWeight; long upct = ((long)cumUnique * 100 + totalUnique/2) / totalUnique; double len = getRowBitLength(i); assert(0.1 > Math.abs(len - getBitLength(matrix[i][1]))); @@ -346,14 +346,14 @@ public void print(String name, String[] histTitles, PrintStream out) { int totalUnique = getTotalLength(); - int totalWeight = getTotalWeight(); + int ltotalWeight = getTotalWeight(); double tlen = getBitLength(); - double avgLen = tlen / totalWeight; - double avg = (double) totalWeight / totalUnique; + double avgLen = tlen / ltotalWeight; + double avg = (double) ltotalWeight / totalUnique; String title = (name +" len="+round(tlen,10) +" avgLen="+round(avgLen,10) - +" weight("+totalWeight+")" + +" weight("+ltotalWeight+")" +" unique["+totalUnique+"]" +" avgWeight("+round(avg,100)+")"); if (histTitles == null) { @@ -363,9 +363,9 @@ StringBuffer buf = new StringBuffer(); for (int i = 0; i < matrix.length; i++) { buf.setLength(0); - buf.append(" "+histTitles[i]+" {"); + buf.append(" ").append(histTitles[i]).append(" {"); for (int j = 1; j < matrix[i].length; j++) { - buf.append(" "+matrix[i][j]); + buf.append(" ").append(matrix[i][j]); } buf.append(" }"); out.println(buf); @@ -603,7 +603,7 @@ private static int[] maybeSort(int[] values) { if (!isSorted(values, 0, false)) { - values = (int[]) values.clone(); + values = values.clone(); Arrays.sort(values); } return values;
--- a/src/share/classes/com/sun/java/util/jar/pack/Instruction.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/Instruction.java Thu Jan 13 15:03:27 2011 -0800 @@ -26,13 +26,15 @@ package com.sun.java.util.jar.pack; import java.io.IOException; +import java.util.Arrays; +import static com.sun.java.util.jar.pack.Constants.*; /** * A parsed bytecode instruction. * Provides accessors to various relevant bits. * @author John Rose */ -class Instruction implements Constants { +class Instruction { protected byte[] bytes; // bytecodes protected int pc; // location of this instruction protected int bc; // opcode of this instruction @@ -91,8 +93,8 @@ /** A fake instruction at this pc whose next() will be at nextpc. */ public Instruction forceNextPC(int nextpc) { - int length = nextpc - pc; - return new Instruction(bytes, pc, -1, -1, length); + int llength = nextpc - pc; + return new Instruction(bytes, pc, -1, -1, llength); } public static Instruction at(byte[] bytes, int pc) { @@ -315,12 +317,24 @@ } } - /** Two insns are equal if they have the same bytes. */ + /** Two instructions are equal if they have the same bytes. */ public boolean equals(Object o) { - return (o instanceof Instruction) && equals((Instruction)o); + return (o != null) && (o.getClass() == Instruction.class) + && equals((Instruction) o); + } + + public int hashCode() { + int hash = 3; + hash = 11 * hash + Arrays.hashCode(this.bytes); + hash = 11 * hash + this.pc; + hash = 11 * hash + this.bc; + hash = 11 * hash + this.w; + hash = 11 * hash + this.length; + return hash; } public boolean equals(Instruction that) { + if (this.pc != that.pc) return false; if (this.bc != that.bc) return false; if (this.w != that.w) return false; if (this.length != that.length) return false;
--- a/src/share/classes/com/sun/java/util/jar/pack/NativeUnpack.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/NativeUnpack.java Thu Jan 13 15:03:27 2011 -0800 @@ -170,8 +170,8 @@ void run(InputStream inRaw, JarOutputStream jstream, ByteBuffer presetInput) throws IOException { - BufferedInputStream in = new BufferedInputStream(inRaw); - this.in = in; // for readInputFn to see + BufferedInputStream in0 = new BufferedInputStream(inRaw); + this.in = in0; // for readInputFn to see _verbose = _props.getInteger(Utils.DEBUG_VERBOSE); // Fix for BugId: 4902477, -unpack.modification.time = 1059010598000 // TODO eliminate and fix in unpack.cpp @@ -224,7 +224,7 @@ if (_verbose > 0) Utils.log.info("bytes consumed = "+consumed); if (presetInput == null && - !Utils.isPackMagic(Utils.readMagic(in))) { + !Utils.isPackMagic(Utils.readMagic(in0))) { break; } if (_verbose > 0 ) {
--- a/src/share/classes/com/sun/java/util/jar/pack/Package.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/Package.java Thu Jan 13 15:03:27 2011 -0800 @@ -52,12 +52,13 @@ import java.util.Map; import java.util.Set; import java.util.jar.JarFile; +import static com.sun.java.util.jar.pack.Constants.*; /** * Define the main data structure transmitted by pack/unpack. * @author John Rose */ -class Package implements Constants { +class Package { int verbose; { PropMap pmap = Utils.currentPropMap(); @@ -109,9 +110,9 @@ public static final Attribute.Layout attrCodeEmpty; public static final Attribute.Layout attrInnerClassesEmpty; public static final Attribute.Layout attrSourceFileSpecial; - public static final Map attrDefs; + public static final Map<Attribute.Layout, Attribute> attrDefs; static { - HashMap<Layout, Attribute> ad = new HashMap<>(3); + Map<Layout, Attribute> ad = new HashMap<>(3); attrCodeEmpty = Attribute.define(ad, ATTR_CONTEXT_METHOD, "Code", "").layout(); attrInnerClassesEmpty = Attribute.define(ad, ATTR_CONTEXT_CLASS, @@ -130,8 +131,7 @@ */ int getHighestClassVersion() { int res = 0; // initial low value - for (Iterator i = classes.iterator(); i.hasNext(); ) { - Class cls = (Class) i.next(); + for (Class cls : classes) { int ver = cls.getVersion(); if (res < ver) res = ver; } @@ -187,7 +187,7 @@ return classes; } - public + public final class Class extends Attribute.Holder implements Comparable { public Package getPackage() { return Package.this; } @@ -232,8 +232,8 @@ initFile(newStub(classFile)); } - List getFields() { return fields == null ? noFields : fields; } - List getMethods() { return methods == null ? noMethods : methods; } + List<Field> getFields() { return fields == null ? noFields : fields; } + List<Method> getMethods() { return methods == null ? noMethods : methods; } public String getName() { return thisClass.stringValue(); @@ -264,7 +264,7 @@ if (olda == null) return; // no SourceFile attr. String obvious = getObviousSourceFile(); - ArrayList ref = new ArrayList(1); + List<Entry> ref = new ArrayList<>(1); olda.visitRefs(this, VRM_PACKAGE, ref); Utf8Entry sfName = (Utf8Entry) ref.get(0); Attribute a = olda; @@ -322,7 +322,7 @@ } public void setInnerClasses(Collection<InnerClass> ics) { - innerClasses = (ics == null) ? null : new ArrayList<InnerClass>(ics); + innerClasses = (ics == null) ? null : new ArrayList<>(ics); // Edit the attribute list, if necessary. Attribute a = getAttribute(attrInnerClassesEmpty); if (innerClasses != null && a == null) @@ -341,7 +341,7 @@ * with that of Package.this.allInnerClasses. */ public List<InnerClass> computeGloballyImpliedICs() { - HashSet<Entry> cpRefs = new HashSet<>(); + Set<Entry> cpRefs = new HashSet<>(); { // This block temporarily displaces this.innerClasses. ArrayList<InnerClass> innerClassesSaved = innerClasses; innerClasses = null; // ignore for the moment @@ -350,7 +350,7 @@ } ConstantPool.completeReferencesIn(cpRefs, true); - HashSet<Entry> icRefs = new HashSet<>(); + Set<Entry> icRefs = new HashSet<>(); for (Entry e : cpRefs) { // Restrict cpRefs to InnerClasses entries only. if (!(e instanceof ClassEntry)) continue; @@ -390,7 +390,7 @@ List<InnerClass> impliedICs = computeGloballyImpliedICs(); List<InnerClass> actualICs = getInnerClasses(); if (actualICs == null) - actualICs = Collections.EMPTY_LIST; + actualICs = Collections.emptyList(); // Symmetric difference is calculated from I, A like this: // diff = (I+A) - (I*A) @@ -409,7 +409,7 @@ // Diff is A since I is empty. } // (I*A) is non-trivial - HashSet<InnerClass> center = new HashSet<>(actualICs); + Set<InnerClass> center = new HashSet<>(actualICs); center.retainAll(new HashSet<>(impliedICs)); impliedICs.addAll(actualICs); impliedICs.removeAll(center); @@ -443,7 +443,7 @@ } else if (actualICs == null) { // No local IC attribute, even though some are implied. // Signal with trivial attribute. - localICs = Collections.EMPTY_LIST; + localICs = Collections.emptyList(); } else { // Transmit a non-empty diff, which will create // a local ICs attribute. @@ -588,7 +588,7 @@ } public void strip(String attrName) { - if (attrName == "Code") + if ("Code".equals(attrName)) code = null; if (code != null) code.strip(attrName); @@ -622,7 +622,7 @@ } public void strip(String attrName) { - if (attrName == "InnerClass") + if ("InnerClass".equals(attrName)) innerClasses = null; for (int isM = 0; isM <= 1; isM++) { ArrayList members = (isM == 0) ? fields : methods; @@ -639,9 +639,7 @@ if (verbose > 2) Utils.log.fine("visitRefs "+this); refs.add(thisClass); refs.add(superClass); - for (int i = 0; i < interfaces.length; i++) { - refs.add(interfaces[i]); - } + refs.addAll(Arrays.asList(interfaces)); for (int isM = 0; isM <= 1; isM++) { ArrayList members = (isM == 0) ? fields : methods; if (members == null) continue; @@ -741,7 +739,7 @@ } public List<File> getClassStubs() { - ArrayList<File> classStubs = new ArrayList<>(classes.size()); + List<File> classStubs = new ArrayList<>(classes.size()); for (Class cls : classes) { assert(cls.file.isClassStub()); classStubs.add(cls.file); @@ -749,8 +747,7 @@ return classStubs; } - public - class File implements Comparable { + public final class File implements Comparable { String nameString; // true name of this file Utf8Entry name; int modtime = NO_MODTIME; @@ -792,8 +789,10 @@ // The nameString is the key. Ignore other things. // (Note: The name might be "", in the case of a trivial class stub.) public boolean equals(Object o) { + if (o == null || (o.getClass() != File.class)) + return false; File that = (File)o; - return that.nameString == this.nameString; + return that.nameString.equals(this.nameString); } public int hashCode() { return nameString.hashCode(); @@ -816,9 +815,9 @@ return getFileName(null); } public java.io.File getFileName(java.io.File parent) { - String name = this.nameString; + String lname = this.nameString; //if (name.startsWith("./")) name = name.substring(2); - String fname = name.replace('/', java.io.File.separatorChar); + String fname = lname.replace('/', java.io.File.separatorChar); return new java.io.File(parent, fname); } @@ -834,7 +833,7 @@ } public long getFileLength() { long len = 0; - if (prepend == null && append == null) return 0; + if (prepend == null || append == null) return 0; for (Iterator i = prepend.iterator(); i.hasNext(); ) { byte[] block = (byte[]) i.next(); len += block.length; @@ -843,7 +842,7 @@ return len; } public void writeTo(OutputStream out) throws IOException { - if (prepend == null && append == null) return; + if (prepend == null || append == null) return; for (Iterator i = prepend.iterator(); i.hasNext(); ) { byte[] block = (byte[]) i.next(); out.write(block); @@ -859,8 +858,8 @@ } public InputStream getInputStream() { InputStream in = new ByteArrayInputStream(append.toByteArray()); - if (prepend.size() == 0) return in; - ArrayList<InputStream> isa = new ArrayList<>(prepend.size()+1); + if (prepend.isEmpty()) return in; + List<InputStream> isa = new ArrayList<>(prepend.size()+1); for (Iterator i = prepend.iterator(); i.hasNext(); ) { byte[] bytes = (byte[]) i.next(); isa.add(new ByteArrayInputStream(bytes)); @@ -897,11 +896,11 @@ } // Is there a globally declared table of inner classes? - ArrayList<InnerClass> allInnerClasses = new ArrayList<>(); - HashMap<ClassEntry, InnerClass> allInnerClassesByThis; + List<InnerClass> allInnerClasses = new ArrayList<>(); + Map<ClassEntry, InnerClass> allInnerClassesByThis; public - List getAllInnerClasses() { + List<InnerClass> getAllInnerClasses() { return allInnerClasses; } @@ -955,16 +954,17 @@ if (parse == null) return false; String pkgOuter = parse[0]; //String number = parse[1]; - String name = parse[2]; + String lname = parse[2]; String haveName = (this.name == null) ? null : this.name.stringValue(); String haveOuter = (outerClass == null) ? null : outerClass.stringValue(); - boolean predictable = (name == haveName && pkgOuter == haveOuter); + boolean lpredictable = (lname == haveName && pkgOuter == haveOuter); //System.out.println("computePredictable => "+predictable); - return predictable; + return lpredictable; } public boolean equals(Object o) { - if (o == null) return false; + if (o == null || o.getClass() != InnerClass.class) + return false; InnerClass that = (InnerClass)o; return eq(this.thisClass, that.thisClass) && eq(this.outerClass, that.outerClass) @@ -999,7 +999,7 @@ // Helper for building InnerClasses attributes. static private - void visitInnerClassRefs(Collection innerClasses, int mode, Collection<Entry> refs) { + void visitInnerClassRefs(Collection<InnerClass> innerClasses, int mode, Collection<Entry> refs) { if (innerClasses == null) { return; // no attribute; nothing to do } @@ -1008,8 +1008,7 @@ } if (innerClasses.size() > 0) { // Count the entries themselves: - for (Iterator i = innerClasses.iterator(); i.hasNext(); ) { - InnerClass c = (InnerClass) i.next(); + for (InnerClass c : innerClasses) { c.visitRefs(mode, refs); } } @@ -1117,43 +1116,43 @@ // what is one of { Debug, Compile, Constant, Exceptions, InnerClasses } if (verbose > 0) Utils.log.info("Stripping "+what.toLowerCase()+" data and attributes..."); - if (what == "Debug") { - strip("SourceFile"); - strip("LineNumberTable"); - strip("LocalVariableTable"); - strip("LocalVariableTypeTable"); - } - if (what == "Compile") { - // Keep the inner classes normally. - // Although they have no effect on execution, - // the Reflection API exposes them, and JCK checks them. - // NO: // strip("InnerClasses"); - strip("Deprecated"); - strip("Synthetic"); - } - if (what == "Exceptions") { - // Keep the exceptions normally. - // Although they have no effect on execution, - // the Reflection API exposes them, and JCK checks them. - strip("Exceptions"); - } - if (what == "Constant") { - stripConstantFields(); + switch (what) { + case "Debug": + strip("SourceFile"); + strip("LineNumberTable"); + strip("LocalVariableTable"); + strip("LocalVariableTypeTable"); + break; + case "Compile": + // Keep the inner classes normally. + // Although they have no effect on execution, + // the Reflection API exposes them, and JCK checks them. + // NO: // strip("InnerClasses"); + strip("Deprecated"); + strip("Synthetic"); + break; + case "Exceptions": + // Keep the exceptions normally. + // Although they have no effect on execution, + // the Reflection API exposes them, and JCK checks them. + strip("Exceptions"); + break; + case "Constant": + stripConstantFields(); + break; } } public void trimToSize() { classes.trimToSize(); - for (Iterator i = classes.iterator(); i.hasNext(); ) { - Class c = (Class)i.next(); + for (Class c : classes) { c.trimToSize(); } files.trimToSize(); } public void strip(String attrName) { - for (Iterator i = classes.iterator(); i.hasNext(); ) { - Class c = (Class)i.next(); + for (Class c : classes) { c.strip(attrName); } } @@ -1166,10 +1165,9 @@ } public void stripConstantFields() { - for (Iterator i = classes.iterator(); i.hasNext(); ) { - Class c = (Class) i.next(); - for (Iterator j = c.fields.iterator(); j.hasNext(); ) { - Class.Field f = (Class.Field) j.next(); + for (Class c : classes) { + for (Iterator<Class.Field> j = c.fields.iterator(); j.hasNext(); ) { + Class.Field f = j.next(); if (Modifier.isFinal(f.flags) // do not strip non-static finals: && Modifier.isStatic(f.flags) @@ -1189,8 +1187,7 @@ c.visitRefs(mode, refs); } if (mode != VRM_CLASSIC) { - for (Iterator i = files.iterator(); i.hasNext(); ) { - File f = (File)i.next(); + for (File f : files) { f.visitRefs(mode, refs); } visitInnerClassRefs(allInnerClasses, mode, refs); @@ -1202,6 +1199,7 @@ // compress better. It also moves classes to the end of the // file order. It also removes JAR directory entries, which // are useless. + @SuppressWarnings("unchecked") void reorderFiles(boolean keepClassOrder, boolean stripDirectories) { // First reorder the classes, if that is allowed. if (!keepClassOrder) { @@ -1214,9 +1212,9 @@ // modtimes and options are not transmitted, and the stub files // for class files do not need to be transmitted at all. // Also - List stubs = getClassStubs(); - for (Iterator i = files.iterator(); i.hasNext(); ) { - File file = (File) i.next(); + List<File> stubs = getClassStubs(); + for (Iterator<File> i = files.iterator(); i.hasNext(); ) { + File file = i.next(); if (file.isClassStub() || (stripDirectories && file.isDirectory())) { i.remove(); @@ -1259,8 +1257,8 @@ void trimStubs() { // Restore enough non-trivial stubs to carry the needed class modtimes. - for (ListIterator i = files.listIterator(files.size()); i.hasPrevious(); ) { - File file = (File) i.previous(); + for (ListIterator<File> i = files.listIterator(files.size()); i.hasPrevious(); ) { + File file = i.previous(); if (!file.isTrivialClassStub()) { if (verbose > 1) Utils.log.fine("Keeping last non-trivial "+file); @@ -1309,7 +1307,7 @@ // Use this before writing the class files. void ensureAllClassFiles() { - HashSet<File> fileSet = new HashSet<>(files); + Set<File> fileSet = new HashSet<>(files); for (Class cls : classes) { // Add to the end of ths list: if (!fileSet.contains(cls.file)) @@ -1317,8 +1315,8 @@ } } - static final List noObjects = Arrays.asList(new Object[0]); - static final List noFields = Arrays.asList(new Class.Field[0]); - static final List noMethods = Arrays.asList(new Class.Method[0]); - static final List noInnerClasses = Arrays.asList(new InnerClass[0]); + static final List<Object> noObjects = Arrays.asList(new Object[0]); + static final List<Class.Field> noFields = Arrays.asList(new Class.Field[0]); + static final List<Class.Method> noMethods = Arrays.asList(new Class.Method[0]); + static final List<InnerClass> noInnerClasses = Arrays.asList(new InnerClass[0]); }
--- a/src/share/classes/com/sun/java/util/jar/pack/PackageReader.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/PackageReader.java Thu Jan 13 15:03:27 2011 -0800 @@ -32,11 +32,28 @@ import com.sun.java.util.jar.pack.ConstantPool.MemberEntry; import com.sun.java.util.jar.pack.ConstantPool.SignatureEntry; import com.sun.java.util.jar.pack.ConstantPool.Utf8Entry; -import java.io.*; -import java.util.*; import com.sun.java.util.jar.pack.Package.Class; import com.sun.java.util.jar.pack.Package.File; import com.sun.java.util.jar.pack.Package.InnerClass; +import java.io.ByteArrayOutputStream; +import java.io.EOFException; +import java.io.PrintStream; +import java.io.FilterInputStream; +import java.io.BufferedInputStream; +import java.io.InputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Map; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashSet; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Set; +import static com.sun.java.util.jar.pack.Constants.*; /** * Reader for a package file. @@ -418,7 +435,7 @@ cp_Int.readFrom(in); for (int i = 0; i < cpMap.length; i++) { int x = cp_Int.getInt(); // coding handles signs OK - cpMap[i] = ConstantPool.getLiteralEntry(new Integer(x)); + cpMap[i] = ConstantPool.getLiteralEntry(x); } cp_Int.doneDisbursing(); break; @@ -428,7 +445,7 @@ for (int i = 0; i < cpMap.length; i++) { int x = cp_Float.getInt(); float fx = Float.intBitsToFloat(x); - cpMap[i] = ConstantPool.getLiteralEntry(new Float(fx)); + cpMap[i] = ConstantPool.getLiteralEntry(fx); } cp_Float.doneDisbursing(); break; @@ -444,7 +461,7 @@ long hi = cp_Long_hi.getInt(); long lo = cp_Long_lo.getInt(); long x = (hi << 32) + ((lo << 32) >>> 32); - cpMap[i] = ConstantPool.getLiteralEntry(new Long(x)); + cpMap[i] = ConstantPool.getLiteralEntry(x); } cp_Long_hi.doneDisbursing(); cp_Long_lo.doneDisbursing(); @@ -462,7 +479,7 @@ long lo = cp_Double_lo.getInt(); long x = (hi << 32) + ((lo << 32) >>> 32); double dx = Double.longBitsToDouble(x); - cpMap[i] = ConstantPool.getLiteralEntry(new Double(dx)); + cpMap[i] = ConstantPool.getLiteralEntry(dx); } cp_Double_hi.doneDisbursing(); cp_Double_lo.doneDisbursing(); @@ -645,7 +662,7 @@ cp_Utf8_big_suffix.doneDisbursing(); } - HashMap utf8Signatures; // Utf8Entry->SignatureEntry + Map<Utf8Entry, SignatureEntry> utf8Signatures; void readSignatureBands(Entry[] cpMap) throws IOException { // cp_Signature: @@ -663,7 +680,7 @@ cp_Signature_classes.expectLength(getIntTotal(numSigClasses)); cp_Signature_classes.readFrom(in); cp_Signature_classes.setIndex(getCPIndex(CONSTANT_Class)); - utf8Signatures = new HashMap(); + utf8Signatures = new HashMap<>(); for (int i = 0; i < cpMap.length; i++) { Utf8Entry formRef = (Utf8Entry) cp_Signature_form.getRef(); ClassEntry[] classRefs = new ClassEntry[numSigClasses[i]]; @@ -863,7 +880,7 @@ ic_name.expectLength(longICCount); ic_name.readFrom(in); ic_flags.resetForSecondPass(); - ArrayList icList = new ArrayList(numInnerClasses); + List<InnerClass> icList = new ArrayList<>(numInnerClasses); for (int i = 0; i < numInnerClasses; i++) { int flags = ic_flags.getInt(); boolean longForm = (flags & ACC_IC_LONG_FORM) != 0; @@ -876,7 +893,7 @@ thisName = (Utf8Entry) ic_name.getRef(); } else { String n = thisClass.stringValue(); - String[] parse = pkg.parseInnerClassName(n); + String[] parse = Package.parseInnerClassName(n); assert(parse != null); String pkgOuter = parse[0]; //String number = parse[1]; @@ -905,7 +922,7 @@ void readLocalInnerClasses(Class cls) throws IOException { int nc = class_InnerClasses_N.getInt(); - ArrayList localICs = new ArrayList(nc); + List<InnerClass> localICs = new ArrayList<>(nc); for (int i = 0; i < nc; i++) { ClassEntry thisClass = (ClassEntry) class_InnerClasses_RC.getRef(); int flags = class_InnerClasses_F.getInt(); @@ -994,10 +1011,8 @@ return -1; } - Comparator entryOutputOrder = new Comparator() { - public int compare(Object o0, Object o1) { - Entry e0 = (Entry) o0; - Entry e1 = (Entry) o1; + Comparator<Entry> entryOutputOrder = new Comparator<>() { + public int compare(Entry e0, Entry e1) { int k0 = getOutputIndex(e0); int k1 = getOutputIndex(e1); if (k0 >= 0 && k1 >= 0) @@ -1034,9 +1049,8 @@ } Entry[] reconstructLocalCPMap(Class cls) { - HashSet ldcRefs = (HashSet) ldcRefMap.get(cls); - HashSet cpRefs = new HashSet(); - HashSet sigSet = new HashSet(); + Set<Entry> ldcRefs = ldcRefMap.get(cls); + Set<Entry> cpRefs = new HashSet<>(); // look for constant pool entries: cls.visitRefs(VRM_CLASSIC, cpRefs); @@ -1064,8 +1078,7 @@ // construct a local constant pool int numDoubles = 0; - for (Iterator i = cpRefs.iterator(); i.hasNext(); ) { - Entry e = (Entry) i.next(); + for (Entry e : cpRefs) { if (e.isDoubleWord()) numDoubles++; assert(e.tag != CONSTANT_Signature) : (e); } @@ -1075,8 +1088,7 @@ // Add all ldc operands first. if (ldcRefs != null) { assert(cpRefs.containsAll(ldcRefs)); - for (Iterator i = ldcRefs.iterator(); i.hasNext(); ) { - Entry e = (Entry) i.next(); + for (Entry e : ldcRefs) { cpMap[fillp++] = e; } assert(fillp == 1+ldcRefs.size()); @@ -1085,11 +1097,10 @@ } // Next add all the two-byte references. - HashSet wideRefs = cpRefs; + Set<Entry> wideRefs = cpRefs; cpRefs = null; // do not use! int narrowLimit = fillp; - for (Iterator i = wideRefs.iterator(); i.hasNext(); ) { - Entry e = (Entry) i.next(); + for (Entry e : wideRefs) { cpMap[fillp++] = e; } assert(fillp == narrowLimit+wideRefs.size()); @@ -1144,7 +1155,7 @@ method_descr.expectLength(totalNM); if (verbose > 1) Utils.log.fine("expecting #fields="+totalNF+" and #methods="+totalNM+" in #classes="+numClasses); - ArrayList fields = new ArrayList(totalNF); + List<Class.Field> fields = new ArrayList<>(totalNF); field_descr.readFrom(in); for (int i = 0; i < classes.length; i++) { Class c = classes[i]; @@ -1160,7 +1171,7 @@ countAndReadAttrs(ATTR_CONTEXT_FIELD, fields); fields = null; // release to GC - ArrayList methods = new ArrayList(totalNM); + List<Class.Method> methods = new ArrayList<>(totalNM); method_descr.readFrom(in); for (int i = 0; i < classes.length; i++) { Class c = classes[i]; @@ -1182,13 +1193,12 @@ } Code[] allCodes; - List codesWithFlags; - HashMap ldcRefMap = new HashMap(); // HashMap<Class, HashSet<Entry>> + List<Code> codesWithFlags; + Map<Class, Set<Entry>> ldcRefMap = new HashMap<>(); - Code[] buildCodeAttrs(List methods) { - ArrayList codes = new ArrayList(methods.size()); - for (Iterator i = methods.iterator(); i.hasNext(); ) { - Class.Method m = (Class.Method) i.next(); + Code[] buildCodeAttrs(List<Class.Method> methods) { + List<Code> codes = new ArrayList<>(methods.size()); + for (Class.Method m : methods) { if (m.getAttribute(attrCodeEmpty) != null) { m.code = new Code(m); codes.add(m.code); @@ -1211,7 +1221,7 @@ boolean attrsOK = testBit(archiveOptions, AO_HAVE_ALL_CODE_FLAGS); code_headers.expectLength(allCodes.length); code_headers.readFrom(in); - ArrayList longCodes = new ArrayList(allCodes.length / 10); + List<Code> longCodes = new ArrayList<>(allCodes.length / 10); for (int i = 0; i < allCodes.length; i++) { Code c = allCodes[i]; int sc = code_headers.getByte(); @@ -1238,8 +1248,7 @@ code_max_stack.readFrom(in); code_max_na_locals.readFrom(in); code_handler_count.readFrom(in); - for (Iterator i = longCodes.iterator(); i.hasNext(); ) { - Code c = (Code) i.next(); + for (Code c : longCodes) { c.setMaxStack( code_max_stack.getInt() ); c.setMaxNALocals( code_max_na_locals.getInt() ); c.setHandlerCount( code_handler_count.getInt() ); @@ -1386,8 +1395,9 @@ // Fetch the attribute layout definitions which govern the bands // we are about to read. - Attribute.Layout[] defs = new Attribute.Layout[attrDefs[ctype].size()]; - attrDefs[ctype].toArray(defs); + List<Attribute.Layout> defList = attrDefs.get(ctype); + Attribute.Layout[] defs = new Attribute.Layout[defList.size()]; + defList.toArray(defs); IntBand xxx_flags_hi = getAttrBand(xxx_attr_bands, AB_FLAGS_HI); IntBand xxx_flags_lo = getAttrBand(xxx_attr_bands, AB_FLAGS_LO); IntBand xxx_attr_count = getAttrBand(xxx_attr_bands, AB_ATTR_COUNT); @@ -1450,7 +1460,7 @@ bits -= (1L<<ai); nfa += 1; } - ArrayList ha = new ArrayList(nfa + noa); + List<Attribute> ha = new ArrayList<>(nfa + noa); h.attributes = ha; bits = attrBits; // iterate again for (int ai = 0; bits != 0; ai++) { @@ -1516,7 +1526,7 @@ if (predef != isPredefinedAttr(ctype, ai)) continue; // wrong pass int totalCount = totalCounts[ai]; - Band[] ab = (Band[]) attrBandTable.get(def); + Band[] ab = attrBandTable.get(def); if (def == attrInnerClassesEmpty) { // Special case. // Size the bands as if using the following layout: @@ -1571,15 +1581,16 @@ ATTR_CONTEXT_NAME[ctype]+" attribute"); } + @SuppressWarnings("unchecked") void readAttrs(int ctype, Collection holders) throws IOException { // Decode band values into attributes. - HashSet sawDefs = new HashSet(); + Set<Attribute.Layout> sawDefs = new HashSet<>(); ByteArrayOutputStream buf = new ByteArrayOutputStream(); for (Iterator i = holders.iterator(); i.hasNext(); ) { final Attribute.Holder h = (Attribute.Holder) i.next(); if (h.attributes == null) continue; - for (ListIterator j = h.attributes.listIterator(); j.hasNext(); ) { - Attribute a = (Attribute) j.next(); + for (ListIterator<Attribute> j = h.attributes.listIterator(); j.hasNext(); ) { + Attribute a = j.next(); Attribute.Layout def = a.layout(); if (def.bandCount == 0) { if (def == attrInnerClassesEmpty) { @@ -1595,7 +1606,7 @@ if (isCV) setConstantValueIndex((Class.Field)h); if (verbose > 2) Utils.log.fine("read "+a+" in "+h); - final Band[] ab = (Band[]) attrBandTable.get(def); + final Band[] ab = attrBandTable.get(def); // Read one attribute of type def from ab into a byte array. buf.reset(); Object fixups = a.unparse(new Attribute.ValueStream() { @@ -1617,10 +1628,9 @@ } // Mark the bands we just used as done disbursing. - for (Iterator i = sawDefs.iterator(); i.hasNext(); ) { - Attribute.Layout def = (Attribute.Layout) i.next(); + for (Attribute.Layout def : sawDefs) { if (def == null) continue; // unused index - Band[] ab = (Band[]) attrBandTable.get(def); + Band[] ab = attrBandTable.get(def); for (int j = 0; j < ab.length; j++) { ab[j].doneDisbursing(); } @@ -1778,7 +1788,7 @@ // scratch buffer for collecting code:: byte[] buf = new byte[1<<12]; // record of all switch opcodes (these are variable-length) - ArrayList allSwitchOps = new ArrayList(); + List<Integer> allSwitchOps = new ArrayList<>(); for (int k = 0; k < allCodes.length; k++) { Code c = allCodes[k]; scanOneMethod: @@ -1798,7 +1808,7 @@ case _tableswitch: case _lookupswitch: bc_case_count.expectMoreLength(1); - allSwitchOps.add(new Integer(bc)); + allSwitchOps.add(bc); break; case _iinc: bc_local.expectMoreLength(1); @@ -1866,8 +1876,8 @@ // To size instruction bands correctly, we need info on switches: bc_case_count.readFrom(in); - for (Iterator i = allSwitchOps.iterator(); i.hasNext(); ) { - int bc = ((Integer)i.next()).intValue(); + for (Integer i : allSwitchOps) { + int bc = i.intValue(); int caseCount = bc_case_count.getInt(); bc_label.expectMoreLength(1+caseCount); // default label + cases bc_case_value.expectMoreLength(bc == _tableswitch ? 1 : caseCount); @@ -1892,9 +1902,9 @@ Class curClass = code.thisClass(); - HashSet ldcRefSet = (HashSet) ldcRefMap.get(curClass); + Set<Entry> ldcRefSet = ldcRefMap.get(curClass); if (ldcRefSet == null) - ldcRefMap.put(curClass, ldcRefSet = new HashSet()); + ldcRefMap.put(curClass, ldcRefSet = new HashSet<>()); ClassEntry thisClass = curClass.thisClass; ClassEntry superClass = curClass.superClass;
--- a/src/share/classes/com/sun/java/util/jar/pack/PackageWriter.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/PackageWriter.java Thu Jan 13 15:03:27 2011 -0800 @@ -45,10 +45,10 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; -import java.util.ListIterator; import java.util.Map; +import java.util.Set; +import static com.sun.java.util.jar.pack.Constants.*; /** * Writer for a package file. @@ -111,12 +111,12 @@ } } - HashSet requiredEntries; // for the CP - HashMap backCountTable; // for layout callables + Set<Entry> requiredEntries; // for the CP + Map<Attribute.Layout, int[]> backCountTable; // for layout callables int[][] attrCounts; // count attr. occurences void setup() { - requiredEntries = new HashSet(); + requiredEntries = new HashSet<>(); setArchiveOptions(); trimClassAttributes(); collectAttributeLayouts(); @@ -139,9 +139,7 @@ // Import defaults from package (deflate hint, etc.). archiveOptions |= pkg.default_options; - for (Iterator i = pkg.files.iterator(); i.hasNext(); ) { - File file = (File) i.next(); - + for (File file : pkg.files) { int modtime = file.modtime; int options = file.options; @@ -178,16 +176,15 @@ } } // Decide on default version number (majority rule). - HashMap verCounts = new HashMap(); + Map<Integer, int[]> verCounts = new HashMap<>(); int bestCount = 0; int bestVersion = -1; - for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) { - Class cls = (Class) i.next(); + for (Class cls : pkg.classes) { int version = cls.getVersion(); - int[] var = (int[]) verCounts.get(new Integer(version)); + int[] var = verCounts.get(version); if (var == null) { var = new int[1]; - verCounts.put(new Integer(version), var); + verCounts.put(version, var); } int count = (var[0] += 1); //System.out.println("version="+version+" count="+count); @@ -210,9 +207,7 @@ Package.versionStringOf(pkg.getHighestClassVersion())); // Now add explicit pseudo-attrs. to classes with odd versions. - for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) { - Class cls = (Class) i.next(); - + for (Class cls : pkg.classes) { if (cls.getVersion() != bestVersion) { Attribute a = makeClassFileVersionAttr(cls.minver, cls.majver); if (verbose > 1) { @@ -228,8 +223,7 @@ } // Decide if we are transmitting a huge resource file: - for (Iterator i = pkg.files.iterator(); i.hasNext(); ) { - File file = (File) i.next(); + for (File file : pkg.files) { long len = file.getFileLength(); if (len != (int)len) { archiveOptions |= AO_HAVE_FILE_SIZE_HI; @@ -244,10 +238,8 @@ // we must declare unconditional presence of code flags. int cost0 = 0; int cost1 = 0; - for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) { - Class cls = (Class) i.next(); - for (Iterator j = cls.getMethods().iterator(); j.hasNext(); ) { - Class.Method m = (Class.Method) j.next(); + for (Class cls : pkg.classes) { + for (Class.Method m : cls.getMethods()) { if (m.code != null) { if (m.code.attributeSize() == 0) { // cost of a useless unconditional flags byte @@ -352,7 +344,7 @@ archive_header_1.putInt(pkg.default_modtime); archive_header_1.putInt(pkg.files.size()); } else { - assert(pkg.files.size() == 0); + assert(pkg.files.isEmpty()); } if (haveSpecial) { @@ -697,8 +689,7 @@ boolean haveModtime = testBit(options, AO_HAVE_FILE_MODTIME); boolean haveOptions = testBit(options, AO_HAVE_FILE_OPTIONS); if (!haveOptions) { - for (Iterator i = pkg.files.iterator(); i.hasNext(); ) { - File file = (File) i.next(); + for (File file : pkg.files) { if (file.isClassStub()) { haveOptions = true; options |= AO_HAVE_FILE_OPTIONS; @@ -711,9 +702,7 @@ options |= AO_HAVE_FILE_HEADERS; archiveOptions = options; } - - for (Iterator i = pkg.files.iterator(); i.hasNext(); ) { - File file = (File) i.next(); + for (File file : pkg.files) { file_name.putRef(file.name); long len = file.getFileLength(); file_size_lo.putInt((int)len); @@ -731,22 +720,20 @@ Utils.log.info("Wrote "+numFiles+" resource files"); } + @SuppressWarnings("unchecked") void collectAttributeLayouts() { maxFlags = new int[ATTR_CONTEXT_LIMIT]; - allLayouts = new HashMap[ATTR_CONTEXT_LIMIT]; + allLayouts = new FixedList<>(ATTR_CONTEXT_LIMIT); for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) { - allLayouts[i] = new HashMap(); + allLayouts.set(i, new HashMap<Attribute.Layout, int[]>()); } // Collect maxFlags and allLayouts. - for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) { - Class cls = (Class) i.next(); + for (Class cls : pkg.classes) { visitAttributeLayoutsIn(ATTR_CONTEXT_CLASS, cls); - for (Iterator j = cls.getFields().iterator(); j.hasNext(); ) { - Class.Field f = (Class.Field) j.next(); + for (Class.Field f : cls.getFields()) { visitAttributeLayoutsIn(ATTR_CONTEXT_FIELD, f); } - for (Iterator j = cls.getMethods().iterator(); j.hasNext(); ) { - Class.Method m = (Class.Method) j.next(); + for (Class.Method m : cls.getMethods()) { visitAttributeLayoutsIn(ATTR_CONTEXT_METHOD, m); if (m.code != null) { visitAttributeLayoutsIn(ATTR_CONTEXT_CODE, m.code); @@ -755,7 +742,7 @@ } // If there are many species of attributes, use 63-bit flags. for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) { - int nl = allLayouts[i].size(); + int nl = allLayouts.get(i).size(); boolean haveLongFlags = haveFlagsHi(i); final int TOO_MANY_ATTRS = 32 /*int flag size*/ - 12 /*typical flag bits in use*/ @@ -781,7 +768,7 @@ } // Collect counts for both predefs. and custom defs. // Decide on custom, local attribute definitions. - backCountTable = new HashMap(); + backCountTable = new HashMap<>(); attrCounts = new int[ATTR_CONTEXT_LIMIT][]; for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) { // Now the remaining defs in allLayouts[i] need attr. indexes. @@ -793,11 +780,12 @@ assert(attrIndexLimit[i] < 64); // all bits fit into a Java long avHiBits &= (1L<<attrIndexLimit[i])-1; int nextLoBit = 0; - Map.Entry[] layoutsAndCounts = new Map.Entry[allLayouts[i].size()]; - allLayouts[i].entrySet().toArray(layoutsAndCounts); + Map<Attribute.Layout, int[]> defMap = allLayouts.get(i); + Map.Entry[] layoutsAndCounts = new Map.Entry[defMap.size()]; + defMap.entrySet().toArray(layoutsAndCounts); // Sort by count, most frequent first. // Predefs. participate in this sort, though it does not matter. - Arrays.sort(layoutsAndCounts, new Comparator() { + Arrays.sort(layoutsAndCounts, new Comparator<>() { public int compare(Object o0, Object o1) { Map.Entry e0 = (Map.Entry) o0; Map.Entry e1 = (Map.Entry) o1; @@ -814,7 +802,7 @@ Attribute.Layout def = (Attribute.Layout) e.getKey(); int count = ((int[])e.getValue())[0]; int index; - Integer predefIndex = (Integer) attrIndexTable.get(def); + Integer predefIndex = attrIndexTable.get(def); if (predefIndex != null) { // The index is already set. index = predefIndex.intValue(); @@ -872,29 +860,32 @@ // Scratch variables for processing attributes and flags. int[] maxFlags; - HashMap[] allLayouts; + List<Map<Attribute.Layout, int[]>> allLayouts; void visitAttributeLayoutsIn(int ctype, Attribute.Holder h) { // Make note of which flags appear in the class file. // Set them in maxFlags. maxFlags[ctype] |= h.flags; - for (Iterator i = h.getAttributes().iterator(); i.hasNext(); ) { - Attribute a = (Attribute) i.next(); + for (Attribute a : h.getAttributes()) { Attribute.Layout def = a.layout(); - int[] count = (int[]) allLayouts[ctype].get(def); - if (count == null) - allLayouts[ctype].put(def, count = new int[1]); - if (count[0] < Integer.MAX_VALUE) + Map<Attribute.Layout, int[]> defMap = allLayouts.get(ctype); + int[] count = defMap.get(def); + if (count == null) { + defMap.put(def, count = new int[1]); + } + if (count[0] < Integer.MAX_VALUE) { count[0] += 1; + } } } Attribute.Layout[] attrDefsWritten; + @SuppressWarnings("unchecked") void writeAttrDefs() throws IOException { - ArrayList defList = new ArrayList(); + List<Object[]> defList = new ArrayList<>(); for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) { - int limit = attrDefs[i].size(); + int limit = attrDefs.get(i).size(); for (int j = 0; j < limit; j++) { int header = i; // ctype if (j < attrIndexLimit[i]) { @@ -906,9 +897,9 @@ continue; } } - Attribute.Layout def = (Attribute.Layout) attrDefs[i].get(j); - defList.add(new Object[]{ new Integer(header), def }); - assert(new Integer(j).equals(attrIndexTable.get(def))); + Attribute.Layout def = attrDefs.get(i).get(j); + defList.add(new Object[]{ Integer.valueOf(header), def }); + assert(Integer.valueOf(j).equals(attrIndexTable.get(def))); } } // Sort the new attr defs into some "natural" order. @@ -934,10 +925,7 @@ attrDefsWritten = new Attribute.Layout[numAttrDefs]; PrintStream dump = !optDumpBands ? null : new PrintStream(getDumpStream(attr_definition_headers, ".def")); - int[] indexForDebug = new int[ATTR_CONTEXT_LIMIT]; - for (int i = 0; i < ATTR_CONTEXT_LIMIT; i++) { - indexForDebug[i] = attrIndexLimit[i]; - } + int[] indexForDebug = Arrays.copyOf(attrIndexLimit, ATTR_CONTEXT_LIMIT); for (int i = 0; i < defs.length; i++) { int header = ((Integer)defs[i][0]).intValue(); Attribute.Layout def = (Attribute.Layout) defs[i][1]; @@ -953,7 +941,7 @@ if (debug) { int hdrIndex = (header >> ADH_BIT_SHIFT) - ADH_BIT_IS_LSB; if (hdrIndex < 0) hdrIndex = indexForDebug[def.ctype()]++; - int realIndex = ((Integer) attrIndexTable.get(def)).intValue(); + int realIndex = (attrIndexTable.get(def)).intValue(); assert(hdrIndex == realIndex); } if (dump != null) { @@ -969,8 +957,8 @@ for (int ctype = 0; ctype < ATTR_CONTEXT_LIMIT; ctype++) { MultiBand xxx_attr_bands = attrBands[ctype]; IntBand xxx_attr_calls = getAttrBand(xxx_attr_bands, AB_ATTR_CALLS); - Attribute.Layout[] defs = new Attribute.Layout[attrDefs[ctype].size()]; - attrDefs[ctype].toArray(defs); + Attribute.Layout[] defs = new Attribute.Layout[attrDefs.get(ctype).size()]; + attrDefs.get(ctype).toArray(defs); for (boolean predef = true; ; predef = false) { for (int ai = 0; ai < defs.length; ai++) { Attribute.Layout def = defs[ai]; @@ -980,7 +968,7 @@ int totalCount = attrCounts[ctype][ai]; if (totalCount == 0) continue; // irrelevant - int[] bc = (int[]) backCountTable.get(def); + int[] bc = backCountTable.get(def); for (int j = 0; j < bc.length; j++) { if (bc[j] >= 0) { int backCount = bc[j]; @@ -998,8 +986,7 @@ } void trimClassAttributes() { - for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) { - Class cls = (Class) i.next(); + for (Class cls : pkg.classes) { // Replace "obvious" SourceFile attrs by null. cls.minimizeSourceFile(); } @@ -1008,14 +995,12 @@ void collectInnerClasses() { // Capture inner classes, removing them from individual classes. // Irregular inner classes must stay local, though. - HashMap allICMap = new HashMap(); + Map<ClassEntry, InnerClass> allICMap = new HashMap<>(); // First, collect a consistent global set. - for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) { - Class cls = (Class) i.next(); + for (Class cls : pkg.classes) { if (!cls.hasInnerClasses()) continue; - for (Iterator j = cls.getInnerClasses().iterator(); j.hasNext(); ) { - InnerClass ic = (InnerClass) j.next(); - InnerClass pic = (InnerClass) allICMap.put(ic.thisClass, ic); + for (InnerClass ic : cls.getInnerClasses()) { + InnerClass pic = allICMap.put(ic.thisClass, ic); if (pic != null && !pic.equals(ic) && pic.predictable) { // Different ICs. Choose the better to make global. allICMap.put(pic.thisClass, pic); @@ -1036,15 +1021,13 @@ // Next, empty out of every local set the consistent entries. // Calculate whether there is any remaining need to have a local // set, and whether it needs to be locked. - for (Iterator i = pkg.classes.iterator(); i.hasNext(); ) { - Class cls = (Class) i.next(); + for (Class cls : pkg.classes) { cls.minimizeLocalICs(); } } void writeInnerClasses() throws IOException { - for (Iterator i = pkg.getAllInnerClasses().iterator(); i.hasNext(); ) { - InnerClass ic = (InnerClass) i.next(); + for (InnerClass ic : pkg.getAllInnerClasses()) { int flags = ic.flags; assert((flags & ACC_IC_LONG_FORM) == 0); if (!ic.predictable) { @@ -1064,10 +1047,9 @@ * local attribute. This is expected to be rare. */ void writeLocalInnerClasses(Class cls) throws IOException { - List localICs = cls.getInnerClasses(); + List<InnerClass> localICs = cls.getInnerClasses(); class_InnerClasses_N.putInt(localICs.size()); - for (Iterator i = localICs.iterator(); i.hasNext(); ) { - InnerClass ic = (InnerClass) i.next(); + for(InnerClass ic : localICs) { class_InnerClasses_RC.putRef(ic.thisClass); // Is it redundant with the global version? if (ic.equals(pkg.getGlobalInnerClass(ic.thisClass))) { @@ -1121,18 +1103,16 @@ } void writeMembers(Class cls) throws IOException { - List fields = cls.getFields(); + List<Class.Field> fields = cls.getFields(); class_field_count.putInt(fields.size()); - for (Iterator i = fields.iterator(); i.hasNext(); ) { - Class.Field f = (Class.Field) i.next(); + for (Class.Field f : fields) { field_descr.putRef(f.getDescriptor()); writeAttrs(ATTR_CONTEXT_FIELD, f, cls); } - List methods = cls.getMethods(); + List<Class.Method> methods = cls.getMethods(); class_method_count.putInt(methods.size()); - for (Iterator i = methods.iterator(); i.hasNext(); ) { - Class.Method m = (Class.Method) i.next(); + for (Class.Method m : methods) { method_descr.putRef(m.getDescriptor()); writeAttrs(ATTR_CONTEXT_METHOD, m, cls); assert((m.code != null) == (m.getAttribute(attrCodeEmpty) != null)); @@ -1206,11 +1186,10 @@ long flagMask = attrFlagMask[ctype]; // which flags are attr bits? long flagsToAdd = 0; int overflowCount = 0; - for (ListIterator j = h.attributes.listIterator(); j.hasNext(); ) { - Attribute a = (Attribute) j.next(); + for (Attribute a : h.attributes) { Attribute.Layout def = a.layout(); - int index = ((Integer)attrIndexTable.get(def)).intValue(); - assert(attrDefs[ctype].get(index) == def); + int index = (attrIndexTable.get(def)).intValue(); + assert(attrDefs.get(ctype).get(index) == def); if (verbose > 3) Utils.log.fine("add attr @"+index+" "+a+" in "+h); if (index < attrIndexLimit[ctype] && testBit(flagMask, 1L<<index)) { @@ -1239,10 +1218,10 @@ continue; } assert(a.fixups == null); - final Band[] ab = (Band[]) attrBandTable.get(def); + final Band[] ab = attrBandTable.get(def); assert(ab != null); assert(ab.length == def.bandCount); - final int[] bc = (int[]) backCountTable.get(def); + final int[] bc = backCountTable.get(def); assert(bc != null); assert(bc.length == def.getCallables().length); // Write one attribute of type def into ab. @@ -1306,7 +1285,7 @@ private int initOpVariant(Instruction i, Entry newClass) { if (i.getBC() != _invokespecial) return -1; MemberEntry ref = (MemberEntry) i.getCPRef(curCPMap); - if (ref.descRef.nameRef.stringValue() != "<init>") + if ("<init>".equals(ref.descRef.nameRef.stringValue()) == false) return -1; ClassEntry refClass = ref.classRef; if (refClass == curClass.thisClass) @@ -1618,14 +1597,16 @@ String count = "" + codeHist[bc]; count = " ".substring(count.length()) + count; String pct = "" + (codeHist[bc] * 10000 / totalBytes); - while (pct.length() < 4) pct = "0" + pct; + while (pct.length() < 4) { + pct = "0" + pct; + } pct = pct.substring(0, pct.length()-2) + "." + pct.substring(pct.length()-2); hist[bc] = count + " " + pct + "% " + iname; } Arrays.sort(hist); System.out.println("Bytecode histogram ["+totalBytes+"]"); for (int i = hist.length; --i >= 0; ) { - if (hist[i] == "") continue; + if ("".equals(hist[i])) continue; System.out.println(hist[i]); } for (int tag = 0; tag < ldcHist.length; tag++) {
--- a/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/PackerImpl.java Thu Jan 13 15:03:27 2011 -0800 @@ -69,7 +69,8 @@ * Get the set of options for the pack and unpack engines. * @return A sorted association of option key strings to option values. */ - public SortedMap<String, String> properties() { + @SuppressWarnings("unchecked") + public SortedMap properties() { return props; } @@ -155,8 +156,8 @@ // All the worker bees..... - // The packer worker. + @SuppressWarnings("unchecked") private class DoPack { final int verbose = props.getInteger(Utils.DEBUG_VERBOSE); @@ -179,11 +180,11 @@ unknownAttrCommand = uaMode.intern(); } - final HashMap attrDefs; - final HashMap attrCommands; + final Map<Attribute.Layout, Attribute> attrDefs; + final Map<Attribute.Layout, String> attrCommands; { - HashMap attrDefs = new HashMap(); - HashMap attrCommands = new HashMap(); + Map<Attribute.Layout, Attribute> lattrDefs = new HashMap<>(); + Map<Attribute.Layout, String> lattrCommands = new HashMap<>(); String[] keys = { Pack200.Packer.CLASS_ATTRIBUTE_PFX, Pack200.Packer.FIELD_ATTRIBUTE_PFX, @@ -198,8 +199,9 @@ }; for (int i = 0; i < ctypes.length; i++) { String pfx = keys[i]; - Map<String, String> map = props.prefixMap(pfx); - for (String key : map.keySet()) { + Map<Object, Object> map = props.prefixMap(pfx); + for (Object k : map.keySet()) { + String key = (String)k; assert(key.startsWith(pfx)); String name = key.substring(pfx.length()); String layout = props.getProperty(key); @@ -207,24 +209,18 @@ if (Pack200.Packer.STRIP.equals(layout) || Pack200.Packer.PASS.equals(layout) || Pack200.Packer.ERROR.equals(layout)) { - attrCommands.put(lkey, layout.intern()); + lattrCommands.put(lkey, layout.intern()); } else { - Attribute.define(attrDefs, ctypes[i], name, layout); + Attribute.define(lattrDefs, ctypes[i], name, layout); if (verbose > 1) { Utils.log.fine("Added layout for "+Constants.ATTR_CONTEXT_NAME[i]+" attribute "+name+" = "+layout); } - assert(attrDefs.containsKey(lkey)); + assert(lattrDefs.containsKey(lkey)); } } } - if (attrDefs.size() > 0) - this.attrDefs = attrDefs; - else - this.attrDefs = null; - if (attrCommands.size() > 0) - this.attrCommands = attrCommands; - else - this.attrCommands = null; + this.attrDefs = (lattrDefs.isEmpty()) ? null : lattrDefs; + this.attrCommands = (lattrCommands.isEmpty()) ? null : lattrCommands; } final boolean keepFileOrder @@ -275,8 +271,8 @@ { // Which class files will be passed through? passFiles = props.getProperties(Pack200.Packer.PASS_FILE_PFX); - for (ListIterator i = passFiles.listIterator(); i.hasNext(); ) { - String file = (String) i.next(); + for (ListIterator<String> i = passFiles.listIterator(); i.hasNext(); ) { + String file = i.next(); if (file == null) { i.remove(); continue; } file = Utils.getJarEntryName(file); // normalize '\\' to '/' if (file.endsWith("/")) @@ -333,7 +329,7 @@ pkg.reset(); } - class InFile { + final class InFile { final String name; final JarFile jf; final JarEntry je; @@ -596,8 +592,8 @@ // Package builder must have created a stub for each class. assert(pkg.files.containsAll(pkg.getClassStubs())); // Order of stubs in file list must agree with classes. - List res = pkg.files; - assert((res = new ArrayList(pkg.files)) + List<Package.File> res = pkg.files; + assert((res = new ArrayList<>(pkg.files)) .retainAll(pkg.getClassStubs()) || true); assert(res.equals(pkg.getClassStubs())); }
--- a/src/share/classes/com/sun/java/util/jar/pack/PopulationCoding.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/PopulationCoding.java Thu Jan 13 15:03:27 2011 -0800 @@ -31,6 +31,8 @@ import java.io.OutputStream; import java.util.Arrays; import java.util.HashSet; +import java.util.Set; +import static com.sun.java.util.jar.pack.Constants.*; /** * Population-based coding. @@ -38,7 +40,7 @@ * @author John Rose */ // This tactic alone reduces the final zipped rt.jar by about a percent. -class PopulationCoding implements Constants, CodingMethod { +class PopulationCoding implements CodingMethod { Histogram vHist; // histogram of all values int[] fValues; // list of favored values int fVlen; // inclusive max index @@ -62,8 +64,8 @@ } } public void setFavoredValues(int[] fValues) { - int fVlen = fValues.length-1; - setFavoredValues(fValues, fVlen); + int lfVlen = fValues.length-1; + setFavoredValues(fValues, lfVlen); } public void setHistogram(Histogram vHist) { this.vHist = vHist; @@ -103,7 +105,7 @@ if (tokenCoding instanceof Coding && fValues != null) { Coding tc = (Coding) tokenCoding; if (tc == fitTokenCoding(fVlen, tc.L())) - this.L = tc.L();; + this.L = tc.L(); // Otherwise, it's a non-default coding. } } @@ -217,13 +219,13 @@ } private long[] makeSymtab() { - long[] symtab = new long[fVlen]; + long[] lsymtab = new long[fVlen]; for (int token = 1; token <= fVlen; token++) { - symtab[token-1] = ((long)fValues[token] << 32) | token; + lsymtab[token-1] = ((long)fValues[token] << 32) | token; } // Index by value: - Arrays.sort(symtab); - return symtab; + Arrays.sort(lsymtab); + return lsymtab; } private Coding getTailCoding(CodingMethod c) { @@ -302,12 +304,12 @@ } int[] readFavoredValuesFrom(InputStream in, int maxForDebug) throws IOException { - int[] fValues = new int[1000]; // realloc as needed + int[] lfValues = new int[1000]; // realloc as needed // The set uniqueValuesForDebug records all favored values. // As each new value is added, we assert that the value // was not already in the set. - HashSet uniqueValuesForDebug = null; - assert((uniqueValuesForDebug = new HashSet()) != null); + Set<Integer> uniqueValuesForDebug = null; + assert((uniqueValuesForDebug = new HashSet<>()) != null); int fillp = 1; maxForDebug += fillp; int min = Integer.MIN_VALUE; // farthest from the center @@ -317,13 +319,14 @@ while (fcm instanceof AdaptiveCoding) { AdaptiveCoding ac = (AdaptiveCoding) fcm; int len = ac.headLength; - while (fillp + len > fValues.length) - fValues = BandStructure.realloc(fValues); + while (fillp + len > lfValues.length) { + lfValues = BandStructure.realloc(lfValues); + } int newFillp = fillp + len; - ac.headCoding.readArrayFrom(in, fValues, fillp, newFillp); + ac.headCoding.readArrayFrom(in, lfValues, fillp, newFillp); while (fillp < newFillp) { - int val = fValues[fillp++]; - assert(uniqueValuesForDebug.add(new Integer(val))); + int val = lfValues[fillp++]; + assert(uniqueValuesForDebug.add(val)); assert(fillp <= maxForDebug); last = val; min = moreCentral(min, val); @@ -344,10 +347,10 @@ state = val; if (fillp > 1 && (val == last || val == min)) //|| val == min2 break; - if (fillp == fValues.length) - fValues = BandStructure.realloc(fValues); - fValues[fillp++] = val; - assert(uniqueValuesForDebug.add(new Integer(val))); + if (fillp == lfValues.length) + lfValues = BandStructure.realloc(lfValues); + lfValues[fillp++] = val; + assert(uniqueValuesForDebug.add(val)); assert(fillp <= maxForDebug); last = val; min = moreCentral(min, val); @@ -358,17 +361,17 @@ int val = fc.readFrom(in); if (fillp > 1 && (val == last || val == min)) //|| val == min2 break; - if (fillp == fValues.length) - fValues = BandStructure.realloc(fValues); - fValues[fillp++] = val; - assert(uniqueValuesForDebug.add(new Integer(val))); + if (fillp == lfValues.length) + lfValues = BandStructure.realloc(lfValues); + lfValues[fillp++] = val; + assert(uniqueValuesForDebug.add(val)); assert(fillp <= maxForDebug); last = val; min = moreCentral(min, val); //min2 = moreCentral2(min2, val, min); } } - return BandStructure.realloc(fValues, fillp); + return BandStructure.realloc(lfValues, fillp); } private static int moreCentral(int x, int y) { @@ -478,7 +481,7 @@ boolean verbose = (p200 != null && p200.getBoolean(Utils.COM_PREFIX+"verbose.pop")); - StringBuffer res = new StringBuffer(100); + StringBuilder res = new StringBuilder(100); res.append("pop(").append("fVlen=").append(fVlen); if (verbose && fValues != null) { res.append(" fV=[");
--- a/src/share/classes/com/sun/java/util/jar/pack/PropMap.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/PropMap.java Thu Jan 13 15:03:27 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003,2010 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,8 +34,8 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; @@ -46,36 +46,36 @@ /** * Control block for publishing Pack200 options to the other classes. */ -class PropMap extends TreeMap { - ArrayList _listeners = new ArrayList(1); + +final class PropMap implements SortedMap<Object, Object> { + private final TreeMap<Object, Object> theMap = new TreeMap<>();; + private final List<PropertyChangeListener> listenerList = new ArrayList<>(1); void addListener(PropertyChangeListener listener) { - _listeners.add(listener); + listenerList.add(listener); } void removeListener(PropertyChangeListener listener) { - _listeners.remove(listener); + listenerList.remove(listener); } - void addListeners(ArrayList listeners) { - _listeners.addAll(listeners); + void addListeners(ArrayList<PropertyChangeListener> listeners) { + listenerList.addAll(listeners); } - void removeListeners(ArrayList listeners) { - _listeners.removeAll(listeners); + void removeListeners(ArrayList<PropertyChangeListener> listeners) { + listenerList.removeAll(listeners); } // Override: public Object put(Object key, Object value) { - Object oldValue = super.put(key, value); - if (value != oldValue && _listeners.size() > 0) { + Object oldValue = theMap.put(key, value); + if (value != oldValue && !listenerList.isEmpty()) { // Post the property change event. PropertyChangeEvent event = new PropertyChangeEvent(this, (String) key, oldValue, value); - for (Iterator i = _listeners.iterator(); i.hasNext(); ) { - PropertyChangeListener listener = - (PropertyChangeListener) i.next(); + for (PropertyChangeListener listener : listenerList) { listener.propertyChange(event); } } @@ -85,7 +85,7 @@ // All this other stuff is private to the current package. // Outide clients of Pack200 do not need to use it; they can // get by with generic SortedMap functionality. - private static Map defaultProps; + private static Map<Object, Object> defaultProps; static { Properties props = new Properties(); @@ -122,13 +122,12 @@ // Define certain attribute layouts by default. // Do this after the previous props are put in place, // to allow override if necessary. + InputStream propStr = null; try { String propFile = "intrinsic.properties"; - InputStream propStr = PackerImpl.class.getResourceAsStream(propFile); + propStr = PackerImpl.class.getResourceAsStream(propFile); props.load(new BufferedInputStream(propStr)); - propStr.close(); - for (Iterator i = props.entrySet().iterator(); i.hasNext(); ) { - Map.Entry e = (Map.Entry) i.next(); + for (Map.Entry<Object, Object> e : props.entrySet()) { String key = (String) e.getKey(); String val = (String) e.getValue(); if (key.startsWith("attribute.")) { @@ -137,19 +136,25 @@ } } catch (IOException ee) { throw new RuntimeException(ee); + } finally { + try { + if (propStr != null) { + propStr.close(); + } + } catch (IOException ignore) {} } - defaultProps = (new HashMap(props)); // shrink to fit + defaultProps = (new HashMap<>(props)); // shrink to fit } PropMap() { - putAll(defaultProps); + theMap.putAll(defaultProps); } // Return a view of this map which includes only properties // that begin with the given prefix. This is easy because // the map is sorted, and has a subMap accessor. - SortedMap prefixMap(String prefix) { + SortedMap<Object, Object> prefixMap(String prefix) { int len = prefix.length(); if (len == 0) return this; @@ -174,8 +179,8 @@ // Get sequence of props for "prefix", and "prefix.*". List getProperties(String prefix) { - Collection values = prefixMap(prefix).values(); - ArrayList res = new ArrayList(values.size()); + Collection<Object> values = prefixMap(prefix).values(); + List<Object> res = new ArrayList<>(values.size()); res.addAll(values); while (res.remove(null)); return res; @@ -240,11 +245,97 @@ void list(PrintWriter out) { out.println("#"+Utils.PACK_ZIP_ARCHIVE_MARKER_COMMENT+"["); Set defaults = defaultProps.entrySet(); - for (Iterator i = entrySet().iterator(); i.hasNext(); ) { - Map.Entry e = (Map.Entry) i.next(); + for (Map.Entry e : theMap.entrySet()) { if (defaults.contains(e)) continue; out.println(" " + e.getKey() + " = " + e.getValue()); } out.println("#]"); } + + @Override + public int size() { + return theMap.size(); + } + + @Override + public boolean isEmpty() { + return theMap.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return theMap.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return theMap.containsValue(value); + } + + @Override + public Object get(Object key) { + return theMap.get(key); + } + + @Override + public Object remove(Object key) { + return theMap.remove(key); + } + + @Override + @SuppressWarnings("unchecked") + public void putAll(Map m) { + theMap.putAll(m); + } + + @Override + public void clear() { + theMap.clear(); + } + + @Override + public Set<Object> keySet() { + return theMap.keySet(); + } + + @Override + public Collection<Object> values() { + return theMap.values(); + } + + @Override + public Set<Map.Entry<Object, Object>> entrySet() { + return theMap.entrySet(); + } + + @Override + @SuppressWarnings("unchecked") + public Comparator<Object> comparator() { + return (Comparator<Object>) theMap.comparator(); + } + + @Override + public SortedMap<Object, Object> subMap(Object fromKey, Object toKey) { + return theMap.subMap(fromKey, toKey); + } + + @Override + public SortedMap<Object, Object> headMap(Object toKey) { + return theMap.headMap(toKey); + } + + @Override + public SortedMap<Object, Object> tailMap(Object fromKey) { + return theMap.tailMap(fromKey); + } + + @Override + public Object firstKey() { + return theMap.firstKey(); + } + + @Override + public Object lastKey() { + return theMap.lastKey(); + } }
--- a/src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java Thu Jan 13 15:03:27 2011 -0800 @@ -34,7 +34,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.HashSet; -import java.util.Iterator; +import java.util.Set; import java.util.SortedMap; import java.util.TimeZone; import java.util.jar.JarEntry; @@ -81,7 +81,8 @@ * Get the set of options for the pack and unpack engines. * @return A sorted association of option key strings to option values. */ - public SortedMap<String, String> properties() { + @SuppressWarnings("unchecked") + public SortedMap properties() { return props; } @@ -225,9 +226,8 @@ props.setProperty(java.util.jar.Pack200.Unpacker.PROGRESS,"50"); pkg.ensureAllClassFiles(); // Now write out the files. - HashSet<Package.Class> classesToWrite = new HashSet<>(pkg.getClasses()); - for (Iterator i = pkg.getFiles().iterator(); i.hasNext(); ) { - Package.File file = (Package.File) i.next(); + Set<Package.Class> classesToWrite = new HashSet<>(pkg.getClasses()); + for (Package.File file : pkg.getFiles()) { String name = file.nameString; JarEntry je = new JarEntry(Utils.getJarEntryName(name)); boolean deflate;
--- a/src/share/classes/com/sun/java/util/jar/pack/Utils.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/java/util/jar/pack/Utils.java Thu Jan 13 15:03:27 2011 -0800 @@ -297,7 +297,7 @@ (int)( (1.0 - ((double)ze.getCompressedSize()/(double)ze.getSize()))*100 ) : 0 ; // Follow unzip -lv output - return (long)ze.getSize() + "\t" + ze.getMethod() + return ze.getSize() + "\t" + ze.getMethod() + "\t" + ze.getCompressedSize() + "\t" + store + "%\t" + new Date(ze.getTime()) + "\t"
--- a/src/share/classes/com/sun/media/sound/DirectAudioDevice.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/media/sound/DirectAudioDevice.java Thu Jan 13 15:03:27 2011 -0800 @@ -1393,8 +1393,11 @@ public void run() { if (Printer.trace) Printer.trace(">>> DirectClip: run() threadID="+Thread.currentThread().getId()); while (thread != null) { - if (!doIO) { - synchronized(lock) { + // doIO is volatile, but we could check it, then get + // pre-empted while another thread changes doIO and notifies, + // before we wait (so we sleep in wait forever). + synchronized(lock) { + if (!doIO) { try { lock.wait(); } catch(InterruptedException ie) {}
--- a/src/share/classes/com/sun/script/javascript/RhinoScriptEngine.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/script/javascript/RhinoScriptEngine.java Thu Jan 13 15:03:27 2011 -0800 @@ -61,26 +61,43 @@ private ScriptEngineFactory factory; private InterfaceImplementor implementor; + private static final int languageVersion = getLanguageVersion(); + private static final int optimizationLevel = getOptimizationLevel(); static { ContextFactory.initGlobal(new ContextFactory() { protected Context makeContext() { Context cx = super.makeContext(); + cx.setLanguageVersion(languageVersion); + cx.setOptimizationLevel(optimizationLevel); cx.setClassShutter(RhinoClassShutter.getInstance()); cx.setWrapFactory(RhinoWrapFactory.getInstance()); return cx; } - - public boolean hasFeature(Context cx, int feature) { - // we do not support E4X (ECMAScript for XML)! - if (feature == Context.FEATURE_E4X) { - return false; - } else { - return super.hasFeature(cx, feature); - } - } }); } + private static final String RHINO_JS_VERSION = "rhino.js.version"; + private static int getLanguageVersion() { + int version; + String tmp = java.security.AccessController.doPrivileged( + new sun.security.action.GetPropertyAction(RHINO_JS_VERSION)); + if (tmp != null) { + version = Integer.parseInt((String)tmp); + } else { + version = Context.VERSION_1_8; + } + return version; + } + + private static final String RHINO_OPT_LEVEL = "rhino.opt.level"; + private static int getOptimizationLevel() { + int optLevel = -1; + // disable optimizer under security manager, for now. + if (System.getSecurityManager() == null) { + optLevel = Integer.getInteger(RHINO_OPT_LEVEL, -1); + } + return optLevel; + } /** * Creates a new instance of RhinoScriptEngine @@ -333,6 +350,7 @@ return result instanceof Undefined ? null : result; } + /* public static void main(String[] args) throws Exception { if (args.length == 0) { System.out.println("No file specified"); @@ -347,4 +365,5 @@ engine.eval(r); System.out.println(engine.get("x")); } + */ }
--- a/src/share/classes/com/sun/script/javascript/RhinoScriptEngineFactory.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/script/javascript/RhinoScriptEngineFactory.java Thu Jan 13 15:03:27 2011 -0800 @@ -58,11 +58,11 @@ } else if (key.equals(ScriptEngine.ENGINE)) { return "Mozilla Rhino"; } else if (key.equals(ScriptEngine.ENGINE_VERSION)) { - return "1.6 release 2"; + return "1.7 release 3 PRERELEASE"; } else if (key.equals(ScriptEngine.LANGUAGE)) { return "ECMAScript"; } else if (key.equals(ScriptEngine.LANGUAGE_VERSION)) { - return "1.6"; + return "1.8"; } else if (key.equals("THREADING")) { return "MULTITHREADED"; } else { @@ -128,10 +128,12 @@ return ret; } + /* public static void main(String[] args) { RhinoScriptEngineFactory fact = new RhinoScriptEngineFactory(); System.out.println(fact.getParameter(ScriptEngine.ENGINE_VERSION)); } + */ private static List<String> names; private static List<String> mimeTypes;
--- a/src/share/classes/com/sun/script/javascript/RhinoTopLevel.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/script/javascript/RhinoTopLevel.java Thu Jan 13 15:03:27 2011 -0800 @@ -37,15 +37,6 @@ * @since 1.6 */ public final class RhinoTopLevel extends ImporterTopLevel { - - // variables defined always to help Java access from JavaScript - private static final String builtinVariables = - "var com = Packages.com; \n" + - "var edu = Packages.edu; \n" + - "var javax = Packages.javax; \n" + - "var net = Packages.net; \n" + - "var org = Packages.org; \n"; - RhinoTopLevel(Context cx, RhinoScriptEngine engine) { super(cx); this.engine = engine; @@ -67,9 +58,6 @@ String names[] = { "bindings", "scope", "sync" }; defineFunctionProperties(names, RhinoTopLevel.class, ScriptableObject.DONTENUM); - - // define built-in variables - cx.evaluateString(this, builtinVariables, "<builtin>", 1, null); } /**
--- a/src/share/classes/com/sun/tools/script/shell/init.js Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/com/sun/tools/script/shell/init.js Thu Jan 13 15:03:27 2011 -0800 @@ -311,9 +311,9 @@ try { engine.eval(reader); } finally { - engine.put(engine.FILENAME, oldFilename); + engine.put(engine.FILENAME, oldFilename); + streamClose(stream); } - streamClose(stream); } // file system utilities
--- a/src/share/classes/java/awt/SplashScreen.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/awt/SplashScreen.java Thu Jan 13 15:03:27 2011 -0800 @@ -33,27 +33,17 @@ import sun.awt.image.SunWritableRaster; /** - * The splash screen can be created at application startup, before the + * The splash screen can be displayed at application startup, before the * Java Virtual Machine (JVM) starts. The splash screen is displayed as an - * undecorated window containing an image. You can use GIF, JPEG, and PNG files - * for the image. Animation (for GIF) and transparency (for GIF, PNG) are - * supported. The window is positioned at the center of the screen (the - * position on multi-monitor systems is not specified - it is platform and - * implementation dependent). - * The window is closed automatically as soon as the first window is displayed by - * Swing/AWT (may be also closed manually using the Java API, see below). + * undecorated window containing an image. You can use GIF, JPEG, or PNG files + * for the image. Animation is supported for the GIF format, while transparency + * is supported both for GIF and PNG. The window is positioned at the center + * of the screen. The position on multi-monitor systems is not specified. It is + * platform and implementation dependent. The splash screen window is closed + * automatically as soon as the first window is displayed by Swing/AWT (may be + * also closed manually using the Java API, see below). * <P> - * There are two ways to show the native splash screen: - * <P> - * <UL> - * <LI>If your application is run from the command line or from a shortcut, - * use the "-splash:" Java application launcher option to show a splash screen. - * <BR> - * For example: - * <PRE> - * java -splash:filename.gif Test - * </PRE> - * <LI>If your application is packaged in a jar file, you can use the + * If your application is packaged in a jar file, you can use the * "SplashScreen-Image" option in a manifest file to show a splash screen. * Place the image in the jar archive and specify the path in the option. * The path should not have a leading slash. @@ -64,18 +54,39 @@ * Main-Class: Test * SplashScreen-Image: filename.gif * </PRE> + * <P> + * If the Java implementation provides the command-line interface and you run + * your application by using the command line or a shortcut, use the Java + * application launcher option to show a splash screen. The Oracle reference + * implementation allows you to specify the splash screen image location with + * the {@code -splash:} option. + * <BR> + * For example: + * <PRE> + * java -splash:filename.gif Test + * </PRE> * The command line interface has higher precedence over the manifest * setting. - * </UL> + * <p> + * The splash screen will be displayed as faithfully as possible to present the + * whole splash screen image given the limitations of the target platform and + * display. + * <p> + * It is implied that the specified image is presented on the screen "as is", + * i.e. preserving the exact color values as specified in the image file. Under + * certain circumstances, though, the presented image may differ, e.g. when + * applying color dithering to present a 32 bits per pixel (bpp) image on a 16 + * or 8 bpp screen. The native platform display configuration may also affect + * the colors of the displayed image (e.g. color profiles, etc.) * <p> * The {@code SplashScreen} class provides the API for controlling the splash * screen. This class may be used to close the splash screen, change the splash - * screen image, get the image position/size and paint in the splash screen. It - * cannot be used to create the splash screen; you should use the command line or manifest - * file option for that. + * screen image, get the splash screen native window position/size, and paint + * in the splash screen. It cannot be used to create the splash screen. You + * should use the options provided by the Java implementation for that. * <p> * This class cannot be instantiated. Only a single instance of this class - * can exist, and it may be obtained using the {@link #getSplashScreen()} + * can exist, and it may be obtained by using the {@link #getSplashScreen()} * static method. In case the splash screen has not been created at * application startup via the command line or manifest file option, * the <code>getSplashScreen</code> method returns <code>null</code>. @@ -91,7 +102,7 @@ /** * Returns the {@code SplashScreen} object used for - * Java startup splash screen control. + * Java startup splash screen control on systems that support display. * * @throws UnsupportedOperationException if the splash screen feature is not * supported by the current toolkit @@ -219,6 +230,9 @@ * <p> * You cannot control the size or position of the splash screen. * The splash screen size is adjusted automatically when the image changes. + * <p> + * The image may contain transparent areas, and thus the reported bounds may + * be larger than the visible splash screen image on the screen. * * @return a {@code Rectangle} containing the splash screen bounds * @throws IllegalStateException if the splash screen has already been closed @@ -237,6 +251,9 @@ * <p> * You cannot control the size or position of the splash screen. * The splash screen size is adjusted automatically when the image changes. + * <p> + * The image may contain transparent areas, and thus the reported size may + * be larger than the visible splash screen image on the screen. * * @return a {@link Dimension} object indicating the splash screen size * @throws IllegalStateException if the splash screen has already been closed @@ -254,6 +271,10 @@ * screen window. You should call {@code update()} on the * <code>SplashScreen</code> when you want the splash screen to be * updated immediately. + * <p> + * The pixel (0, 0) in the coordinate space of the graphics context + * corresponds to the origin of the splash screen native window bounds (see + * {@link #getBounds()}). * * @return graphics context for the splash screen overlay surface * @throws IllegalStateException if the splash screen has already been closed @@ -334,6 +355,11 @@ * Determines whether the splash screen is visible. The splash screen may * be hidden using {@link #close()}, it is also hidden automatically when * the first AWT/Swing window is made visible. + * <p> + * Note that the native platform may delay presenting the splash screen + * native window on the screen. The return value of {@code true} for this + * method only guarantees that the conditions to hide the splash screen + * window have not occurred yet. * * @return true if the splash screen is visible (has not been closed yet), * false otherwise
--- a/src/share/classes/java/awt/font/NumericShaper.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/awt/font/NumericShaper.java Thu Jan 13 15:03:27 2011 -0800 @@ -58,20 +58,20 @@ * It is also possible to perform numeric shaping explicitly using instances * of <code>NumericShaper</code>, as this code snippet demonstrates:<br> * <blockquote><pre> - * char[] text = ...; - * // shape all EUROPEAN digits (except zero) to ARABIC digits - * NumericShaper shaper = NumericShaper.getShaper(NumericShaper.ARABIC); - * shaper.shape(text, start, count); + * char[] text = ...; + * // shape all EUROPEAN digits (except zero) to ARABIC digits + * NumericShaper shaper = NumericShaper.getShaper(NumericShaper.ARABIC); + * shaper.shape(text, start, count); * - * // shape European digits to ARABIC digits if preceding text is Arabic, or - * // shape European digits to TAMIL digits if preceding text is Tamil, or - * // leave European digits alone if there is no preceding text, or - * // preceding text is neither Arabic nor Tamil - * NumericShaper shaper = - * NumericShaper.getContextualShaper(NumericShaper.ARABIC | - * NumericShaper.TAMIL, - * NumericShaper.EUROPEAN); - * shaper.shape(text, start, count); + * // shape European digits to ARABIC digits if preceding text is Arabic, or + * // shape European digits to TAMIL digits if preceding text is Tamil, or + * // leave European digits alone if there is no preceding text, or + * // preceding text is neither Arabic nor Tamil + * NumericShaper shaper = + * NumericShaper.getContextualShaper(NumericShaper.ARABIC | + * NumericShaper.TAMIL, + * NumericShaper.EUROPEAN); + * shaper.shape(text, start, count); * </pre></blockquote> * * <p><b>Bit mask- and enum-based Unicode ranges</b></p> @@ -99,6 +99,37 @@ * values are specified, such as {@code NumericShaper.Range.BALINESE}, * those ranges are ignored. * + * <p><b>Decimal Digits Precedence</b></p> + * + * <p>A Unicode range may have more than one set of decimal digits. If + * multiple decimal digits sets are specified for the same Unicode + * range, one of the sets will take precedence as follows. + * + * <table border=1 cellspacing=3 cellpadding=0 summary="NumericShaper constants precedence."> + * <tr> + * <th class="TableHeadingColor">Unicode Range</th> + * <th class="TableHeadingColor"><code>NumericShaper</code> Constants</th> + * <th class="TableHeadingColor">Precedence</th> + * </tr> + * <tr> + * <td rowspan="2">Arabic</td> + * <td>{@link NumericShaper#ARABIC NumericShaper.ARABIC}<br> + * {@link NumericShaper#EASTERN_ARABIC NumericShaper.EASTERN_ARABIC}</td> + * <td>{@link NumericShaper#EASTERN_ARABIC NumericShaper.EASTERN_ARABIC}</td> + * </tr> + * <tr> + * <td>{@link NumericShaper.Range#ARABIC}<br> + * {@link NumericShaper.Range#EASTERN_ARABIC}</td> + * <td>{@link NumericShaper.Range#EASTERN_ARABIC}</td> + * </tr> + * <tr> + * <td>Tai Tham</td> + * <td>{@link NumericShaper.Range#TAI_THAM_HORA}<br> + * {@link NumericShaper.Range#TAI_THAM_THAM}</td> + * <td>{@link NumericShaper.Range#TAI_THAM_THAM}</td> + * </tr> + * </table> + * * @since 1.4 */
--- a/src/share/classes/java/awt/image/IndexColorModel.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/awt/image/IndexColorModel.java Thu Jan 13 15:03:27 2011 -0800 @@ -625,7 +625,7 @@ } nBits[0] = nBits[1] = nBits[2] = 8; } - return nBits; + return nBits.clone(); } /**
--- a/src/share/classes/java/awt/image/SampleModel.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/awt/image/SampleModel.java Thu Jan 13 15:03:27 2011 -0800 @@ -121,7 +121,7 @@ */ public SampleModel(int dataType, int w, int h, int numBands) { - float size = (float)w*h; + long size = (long)w * h; if (w <= 0 || h <= 0) { throw new IllegalArgumentException("Width ("+w+") and height ("+ h+") must be > 0");
--- a/src/share/classes/java/awt/image/SinglePixelPackedSampleModel.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/awt/image/SinglePixelPackedSampleModel.java Thu Jan 13 15:03:27 2011 -0800 @@ -92,7 +92,8 @@ * Constructs a SinglePixelPackedSampleModel with bitMasks.length bands. * Each sample is stored in a data array element in the position of * its corresponding bit mask. Each bit mask must be contiguous and - * masks must not overlap. + * masks must not overlap. Bit masks exceeding data type capacity are + * truncated. * @param dataType The data type for storing samples. * @param w The width (in pixels) of the region of the * image data described. @@ -120,7 +121,8 @@ * and a scanline stride equal to scanlineStride data array elements. * Each sample is stored in a data array element in the position of * its corresponding bit mask. Each bit mask must be contiguous and - * masks must not overlap. + * masks must not overlap. Bit masks exceeding data type capacity are + * truncated. * @param dataType The data type for storing samples. * @param w The width (in pixels) of the region of * image data described. @@ -153,11 +155,13 @@ this.bitOffsets = new int[numBands]; this.bitSizes = new int[numBands]; + int maxMask = (int)((1L << DataBuffer.getDataTypeSize(dataType)) - 1); + this.maxBitSize = 0; for (int i=0; i<numBands; i++) { int bitOffset = 0, bitSize = 0, mask; - mask = bitMasks[i]; - + this.bitMasks[i] &= maxMask; + mask = this.bitMasks[i]; if (mask != 0) { while ((mask & 1) == 0) { mask = mask >>> 1; @@ -243,30 +247,12 @@ /** Returns the number of bits per sample for all bands. */ public int[] getSampleSize() { - int mask; - int sampleSize[] = new int [numBands]; - for (int i=0; i<numBands; i++) { - sampleSize[i] = 0; - mask = bitMasks[i] >>> bitOffsets[i]; - while ((mask & 1) != 0) { - sampleSize[i] ++; - mask = mask >>> 1; - } - } - - return sampleSize; + return bitSizes.clone(); } /** Returns the number of bits per sample for the specified band. */ public int getSampleSize(int band) { - int sampleSize = 0; - int mask = bitMasks[band] >>> bitOffsets[band]; - while ((mask & 1) != 0) { - sampleSize ++; - mask = mask >>> 1; - } - - return sampleSize; + return bitSizes[band]; } /** Returns the offset (in data array elements) of pixel (x,y).
--- a/src/share/classes/java/io/DeleteOnExitHook.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/io/DeleteOnExitHook.java Thu Jan 13 15:03:27 2011 -0800 @@ -34,7 +34,7 @@ */ class DeleteOnExitHook { - private static LinkedHashSet<String> files = new LinkedHashSet<String>(); + private static LinkedHashSet<String> files = new LinkedHashSet<>(); static { // DeleteOnExitHook must be the last shutdown hook to be invoked. // Application shutdown hooks may add the first file to the @@ -71,7 +71,7 @@ files = null; } - ArrayList<String> toBeDeleted = new ArrayList<String>(theFiles); + ArrayList<String> toBeDeleted = new ArrayList<>(theFiles); // reverse the list to maintain previous jdk deletion order. // Last in first deleted.
--- a/src/share/classes/java/io/File.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/io/File.java Thu Jan 13 15:03:27 2011 -0800 @@ -1067,7 +1067,7 @@ if ((names == null) || (filter == null)) { return names; } - List<String> v = new ArrayList<String>(); + List<String> v = new ArrayList<>(); for (int i = 0 ; i < names.length ; i++) { if (filter.accept(this, names[i])) { v.add(names[i]); @@ -1158,7 +1158,7 @@ public File[] listFiles(FilenameFilter filter) { String ss[] = list(); if (ss == null) return null; - ArrayList<File> files = new ArrayList<File>(); + ArrayList<File> files = new ArrayList<>(); for (String s : ss) if ((filter == null) || filter.accept(this, s)) files.add(new File(s, this)); @@ -1195,7 +1195,7 @@ public File[] listFiles(FileFilter filter) { String ss[] = list(); if (ss == null) return null; - ArrayList<File> files = new ArrayList<File>(); + ArrayList<File> files = new ArrayList<>(); for (String s : ss) { File f = new File(s, this); if ((filter == null) || filter.accept(f))
--- a/src/share/classes/java/io/FileInputStream.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/io/FileInputStream.java Thu Jan 13 15:03:27 2011 -0800 @@ -56,7 +56,7 @@ private volatile boolean closed = false; private static final ThreadLocal<Boolean> runningFinalize = - new ThreadLocal<Boolean>(); + new ThreadLocal<>(); private static boolean isRunningFinalize() { Boolean val;
--- a/src/share/classes/java/io/FileOutputStream.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/io/FileOutputStream.java Thu Jan 13 15:03:27 2011 -0800 @@ -69,7 +69,7 @@ private final Object closeLock = new Object(); private volatile boolean closed = false; private static final ThreadLocal<Boolean> runningFinalize = - new ThreadLocal<Boolean>(); + new ThreadLocal<>(); private static boolean isRunningFinalize() { Boolean val;
--- a/src/share/classes/java/io/FilePermission.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/io/FilePermission.java Thu Jan 13 15:03:27 2011 -0800 @@ -725,7 +725,7 @@ */ public FilePermissionCollection() { - perms = new ArrayList<Permission>(); + perms = new ArrayList<>(); } /** @@ -830,7 +830,7 @@ // Don't call out.defaultWriteObject() // Write out Vector - Vector<Permission> permissions = new Vector<Permission>(perms.size()); + Vector<Permission> permissions = new Vector<>(perms.size()); synchronized (this) { permissions.addAll(perms); } @@ -853,7 +853,7 @@ // Get the one we want Vector<Permission> permissions = (Vector<Permission>)gfields.get("permissions", null); - perms = new ArrayList<Permission>(permissions.size()); + perms = new ArrayList<>(permissions.size()); perms.addAll(permissions); } }
--- a/src/share/classes/java/io/ObjectInputStream.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/io/ObjectInputStream.java Thu Jan 13 15:03:27 2011 -0800 @@ -213,7 +213,7 @@ /** table mapping primitive type names to corresponding class objects */ private static final HashMap<String, Class<?>> primClasses - = new HashMap<String, Class<?>>(8, 1.0F); + = new HashMap<>(8, 1.0F); static { primClasses.put("boolean", boolean.class); primClasses.put("byte", byte.class); @@ -229,11 +229,11 @@ private static class Caches { /** cache of subclass security audit results */ static final ConcurrentMap<WeakClassKey,Boolean> subclassAudits = - new ConcurrentHashMap<WeakClassKey,Boolean>(); + new ConcurrentHashMap<>(); /** queue for WeakReferences to audited subclasses */ static final ReferenceQueue<Class<?>> subclassAuditsQueue = - new ReferenceQueue<Class<?>>(); + new ReferenceQueue<>(); } /** filter stream for handling block data conversion */
--- a/src/share/classes/java/io/ObjectOutputStream.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/io/ObjectOutputStream.java Thu Jan 13 15:03:27 2011 -0800 @@ -165,11 +165,11 @@ private static class Caches { /** cache of subclass security audit results */ static final ConcurrentMap<WeakClassKey,Boolean> subclassAudits = - new ConcurrentHashMap<WeakClassKey,Boolean>(); + new ConcurrentHashMap<>(); /** queue for WeakReferences to audited subclasses */ static final ReferenceQueue<Class<?>> subclassAuditsQueue = - new ReferenceQueue<Class<?>>(); + new ReferenceQueue<>(); } /** filter stream for handling block data conversion */ @@ -2413,7 +2413,7 @@ private final List<String> stack; DebugTraceInfoStack() { - stack = new ArrayList<String>(); + stack = new ArrayList<>(); } /**
--- a/src/share/classes/java/io/ObjectStreamClass.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/io/ObjectStreamClass.java Thu Jan 13 15:03:27 2011 -0800 @@ -84,18 +84,18 @@ private static class Caches { /** cache mapping local classes -> descriptors */ static final ConcurrentMap<WeakClassKey,Reference<?>> localDescs = - new ConcurrentHashMap<WeakClassKey,Reference<?>>(); + new ConcurrentHashMap<>(); /** cache mapping field group/local desc pairs -> field reflectors */ static final ConcurrentMap<FieldReflectorKey,Reference<?>> reflectors = - new ConcurrentHashMap<FieldReflectorKey,Reference<?>>(); + new ConcurrentHashMap<>(); /** queue for WeakReferences to local classes */ private static final ReferenceQueue<Class<?>> localDescsQueue = - new ReferenceQueue<Class<?>>(); + new ReferenceQueue<>(); /** queue for WeakReferences to field reflectors keys */ private static final ReferenceQueue<Class<?>> reflectorsQueue = - new ReferenceQueue<Class<?>>(); + new ReferenceQueue<>(); } /** class associated with this descriptor (if any) */ @@ -290,7 +290,7 @@ EntryFuture future = null; if (entry == null) { EntryFuture newEntry = new EntryFuture(); - Reference<?> newRef = new SoftReference<EntryFuture>(newEntry); + Reference<?> newRef = new SoftReference<>(newEntry); do { if (ref != null) { Caches.localDescs.remove(key, ref); @@ -329,7 +329,7 @@ entry = th; } if (future.set(entry)) { - Caches.localDescs.put(key, new SoftReference<Object>(entry)); + Caches.localDescs.put(key, new SoftReference<>(entry)); } else { // nested lookup call already set future entry = future.get(); @@ -1130,7 +1130,7 @@ private ClassDataSlot[] getClassDataLayout0() throws InvalidClassException { - ArrayList<ClassDataSlot> slots = new ArrayList<ClassDataSlot>(); + ArrayList<ClassDataSlot> slots = new ArrayList<>(); Class<?> start = cl, end = cl; // locate closest non-serializable superclass @@ -1566,7 +1566,7 @@ ObjectStreamField[] boundFields = new ObjectStreamField[serialPersistentFields.length]; - Set<String> fieldNames = new HashSet<String>(serialPersistentFields.length); + Set<String> fieldNames = new HashSet<>(serialPersistentFields.length); for (int i = 0; i < serialPersistentFields.length; i++) { ObjectStreamField spf = serialPersistentFields[i]; @@ -1604,7 +1604,7 @@ */ private static ObjectStreamField[] getDefaultSerialFields(Class<?> cl) { Field[] clFields = cl.getDeclaredFields(); - ArrayList<ObjectStreamField> list = new ArrayList<ObjectStreamField>(); + ArrayList<ObjectStreamField> list = new ArrayList<>(); int mask = Modifier.STATIC | Modifier.TRANSIENT; for (int i = 0; i < clFields.length; i++) { @@ -1855,8 +1855,8 @@ writeKeys = new long[nfields]; offsets = new int[nfields]; typeCodes = new char[nfields]; - ArrayList<Class<?>> typeList = new ArrayList<Class<?>>(); - Set<Long> usedKeys = new HashSet<Long>(); + ArrayList<Class<?>> typeList = new ArrayList<>(); + Set<Long> usedKeys = new HashSet<>(); for (int i = 0; i < nfields; i++) { @@ -2092,7 +2092,7 @@ EntryFuture future = null; if (entry == null) { EntryFuture newEntry = new EntryFuture(); - Reference<?> newRef = new SoftReference<EntryFuture>(newEntry); + Reference<?> newRef = new SoftReference<>(newEntry); do { if (ref != null) { Caches.reflectors.remove(key, ref); @@ -2118,7 +2118,7 @@ entry = th; } future.set(entry); - Caches.reflectors.put(key, new SoftReference<Object>(entry)); + Caches.reflectors.put(key, new SoftReference<>(entry)); } if (entry instanceof FieldReflector) {
--- a/src/share/classes/java/lang/ApplicationShutdownHooks.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/ApplicationShutdownHooks.java Thu Jan 13 15:03:27 2011 -0800 @@ -47,7 +47,7 @@ } } ); - hooks = new IdentityHashMap<Thread, Thread>(); + hooks = new IdentityHashMap<>(); } catch (IllegalStateException e) { // application shutdown hooks cannot be added if // shutdown is in progress.
--- a/src/share/classes/java/lang/Character.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/Character.java Thu Jan 13 15:03:27 2011 -0800 @@ -648,8 +648,7 @@ */ public static final class UnicodeBlock extends Subset { - private static Map<String, UnicodeBlock> map - = new HashMap<String, UnicodeBlock>(256); + private static Map<String, UnicodeBlock> map = new HashMap<>(256); /** * Creates a UnicodeBlock with the given identifier name. @@ -4178,7 +4177,7 @@ private static HashMap<String, Character.UnicodeScript> aliases; static { - aliases = new HashMap<String, UnicodeScript>(128); + aliases = new HashMap<>(128); aliases.put("ARAB", ARABIC); aliases.put("ARMI", IMPERIAL_ARAMAIC); aliases.put("ARMN", ARMENIAN);
--- a/src/share/classes/java/lang/CharacterName.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/CharacterName.java Thu Jan 13 15:03:27 2011 -0800 @@ -81,7 +81,7 @@ } while (cpOff < cpEnd); strPool = new byte[total - cpEnd]; dis.readFully(strPool); - refStrPool = new SoftReference<byte[]>(strPool); + refStrPool = new SoftReference<>(strPool); } catch (Exception x) { throw new InternalError(x.getMessage()); } finally {
--- a/src/share/classes/java/lang/Class.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/Class.java Thu Jan 13 15:03:27 2011 -0800 @@ -1306,7 +1306,7 @@ return java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<Class<?>[]>() { public Class[] run() { - List<Class<?>> list = new ArrayList<Class<?>>(); + List<Class<?>> list = new ArrayList<>(); Class<?> currentClass = Class.this; while (currentClass != null) { Class<?>[] members = currentClass.getDeclaredClasses(); @@ -2306,9 +2306,9 @@ res = Reflection.filterFields(this, getDeclaredFields0(publicOnly)); if (useCaches) { if (publicOnly) { - declaredPublicFields = new SoftReference<Field[]>(res); + declaredPublicFields = new SoftReference<>(res); } else { - declaredFields = new SoftReference<Field[]>(res); + declaredFields = new SoftReference<>(res); } } return res; @@ -2330,9 +2330,9 @@ // No cached value available; compute value recursively. // Traverse in correct order for getField(). - List<Field> fields = new ArrayList<Field>(); + List<Field> fields = new ArrayList<>(); if (traversedInterfaces == null) { - traversedInterfaces = new HashSet<Class<?>>(); + traversedInterfaces = new HashSet<>(); } // Local fields @@ -2358,7 +2358,7 @@ res = new Field[fields.size()]; fields.toArray(res); if (useCaches) { - publicFields = new SoftReference<Field[]>(res); + publicFields = new SoftReference<>(res); } return res; } @@ -2403,9 +2403,9 @@ } if (useCaches) { if (publicOnly) { - publicConstructors = new SoftReference<Constructor<T>[]>(res); + publicConstructors = new SoftReference<>(res); } else { - declaredConstructors = new SoftReference<Constructor<T>[]>(res); + declaredConstructors = new SoftReference<>(res); } } return res; @@ -2440,9 +2440,9 @@ res = Reflection.filterMethods(this, getDeclaredMethods0(publicOnly)); if (useCaches) { if (publicOnly) { - declaredPublicMethods = new SoftReference<Method[]>(res); + declaredPublicMethods = new SoftReference<>(res); } else { - declaredMethods = new SoftReference<Method[]>(res); + declaredMethods = new SoftReference<>(res); } } return res; @@ -2598,7 +2598,7 @@ methods.compactAndTrim(); res = methods.getArray(); if (useCaches) { - publicMethods = new SoftReference<Method[]>(res); + publicMethods = new SoftReference<>(res); } return res; } @@ -2977,7 +2977,7 @@ if (universe == null) throw new IllegalArgumentException( getName() + " is not an enum type"); - Map<String, T> m = new HashMap<String, T>(2 * universe.length); + Map<String, T> m = new HashMap<>(2 * universe.length); for (T constant : universe) m.put(((Enum<?>)constant).name(), constant); enumConstantDirectory = m; @@ -3090,7 +3090,7 @@ if (superClass == null) { annotations = declaredAnnotations; } else { - annotations = new HashMap<Class<? extends Annotation>, Annotation>(); + annotations = new HashMap<>(); superClass.initAnnotationsIfNecessary(); for (Map.Entry<Class<? extends Annotation>, Annotation> e : superClass.annotations.entrySet()) { Class<? extends Annotation> annotationClass = e.getKey();
--- a/src/share/classes/java/lang/ClassLoader.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/ClassLoader.java Thu Jan 13 15:03:27 2011 -0800 @@ -247,7 +247,7 @@ // The classes loaded by this class loader. The only purpose of this table // is to keep the classes from being GC'ed until the loader is GC'ed. - private final Vector<Class<?>> classes = new Vector<Class<?>>(); + private final Vector<Class<?>> classes = new Vector<>(); // The "default" domain. Set as the default ProtectionDomain on newly // created classes. @@ -266,8 +266,7 @@ // The packages defined in this class loader. Each package name is mapped // to its corresponding Package object. // @GuardedBy("itself") - private final HashMap<String, Package> packages = - new HashMap<String, Package>(); + private final HashMap<String, Package> packages = new HashMap<>(); private static Void checkCreateClassLoader() { SecurityManager security = System.getSecurityManager(); @@ -280,16 +279,16 @@ private ClassLoader(Void unused, ClassLoader parent) { this.parent = parent; if (ParallelLoaders.isRegistered(this.getClass())) { - parallelLockMap = new ConcurrentHashMap<String, Object>(); - package2certs = new ConcurrentHashMap<String, Certificate[]>(); + parallelLockMap = new ConcurrentHashMap<>(); + package2certs = new ConcurrentHashMap<>(); domains = Collections.synchronizedSet(new HashSet<ProtectionDomain>()); assertionLock = new Object(); } else { // no finer-grained lock; lock on the classloader instance parallelLockMap = null; - package2certs = new Hashtable<String, Certificate[]>(); - domains = new HashSet<ProtectionDomain>(); + package2certs = new Hashtable<>(); + domains = new HashSet<>(); assertionLock = this; } } @@ -1182,7 +1181,7 @@ } tmp[1] = findResources(name); - return new CompoundEnumeration<URL>(tmp); + return new CompoundEnumeration<>(tmp); } /** @@ -1657,7 +1656,7 @@ protected Package[] getPackages() { Map<String, Package> map; synchronized (packages) { - map = new HashMap<String, Package>(packages); + map = new HashMap<>(packages); } Package[] pkgs; if (parent != null) { @@ -1764,20 +1763,17 @@ } // All native library names we've loaded. - private static Vector<String> loadedLibraryNames - = new Vector<String>(); + private static Vector<String> loadedLibraryNames = new Vector<>(); // Native libraries belonging to system classes. private static Vector<NativeLibrary> systemNativeLibraries - = new Vector<NativeLibrary>(); + = new Vector<>(); // Native libraries associated with the class loader. - private Vector<NativeLibrary> nativeLibraries - = new Vector<NativeLibrary>(); + private Vector<NativeLibrary> nativeLibraries = new Vector<>(); // native libraries being loaded/unloaded. - private static Stack<NativeLibrary> nativeLibraryContext - = new Stack<NativeLibrary>(); + private static Stack<NativeLibrary> nativeLibraryContext = new Stack<>(); // The paths searched for libraries private static String usr_paths[]; @@ -2101,8 +2097,8 @@ * them to empty maps, effectively ignoring any present settings. */ synchronized (assertionLock) { - classAssertionStatus = new HashMap<String, Boolean>(); - packageAssertionStatus = new HashMap<String, Boolean>(); + classAssertionStatus = new HashMap<>(); + packageAssertionStatus = new HashMap<>(); defaultAssertionStatus = false; } } @@ -2164,8 +2160,8 @@ private void initializeJavaAssertionMaps() { // assert Thread.holdsLock(assertionLock); - classAssertionStatus = new HashMap<String, Boolean>(); - packageAssertionStatus = new HashMap<String, Boolean>(); + classAssertionStatus = new HashMap<>(); + packageAssertionStatus = new HashMap<>(); AssertionStatusDirectives directives = retrieveDirectives(); for(int i = 0; i < directives.classes.length; i++)
--- a/src/share/classes/java/lang/Package.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/Package.java Thu Jan 13 15:03:27 2011 -0800 @@ -588,16 +588,13 @@ } // The map of loaded system packages - private static Map<String, Package> pkgs - = new HashMap<String, Package>(31); + private static Map<String, Package> pkgs = new HashMap<>(31); // Maps each directory or zip file name to its corresponding url - private static Map<String, URL> urls - = new HashMap<String, URL>(10); + private static Map<String, URL> urls = new HashMap<>(10); // Maps each code source url for a jar file to its manifest - private static Map<String, Manifest> mans - = new HashMap<String, Manifest>(10); + private static Map<String, Manifest> mans = new HashMap<>(10); private static native String getSystemPackage0(String name); private static native String[] getSystemPackages0();
--- a/src/share/classes/java/lang/ProcessBuilder.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/ProcessBuilder.java Thu Jan 13 15:03:27 2011 -0800 @@ -214,7 +214,7 @@ * @param command a string array containing the program and its arguments */ public ProcessBuilder(String... command) { - this.command = new ArrayList<String>(command.length); + this.command = new ArrayList<>(command.length); for (String arg : command) this.command.add(arg); } @@ -251,7 +251,7 @@ * @return this process builder */ public ProcessBuilder command(String... command) { - this.command = new ArrayList<String>(command.length); + this.command = new ArrayList<>(command.length); for (String arg : command) this.command.add(arg); return this;
--- a/src/share/classes/java/lang/String.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/String.java Thu Jan 13 15:03:27 2011 -0800 @@ -2330,7 +2330,7 @@ int off = 0; int next = 0; boolean limited = limit > 0; - ArrayList<String> list = new ArrayList<String>(); + ArrayList<String> list = new ArrayList<>(); while ((next = indexOf(ch, off)) != -1) { if (!limited || list.size() < limit - 1) { list.add(substring(off, next));
--- a/src/share/classes/java/lang/StringCoding.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/StringCoding.java Thu Jan 13 15:03:27 2011 -0800 @@ -53,9 +53,9 @@ /** The cached coders for each thread */ private final static ThreadLocal<SoftReference<StringDecoder>> decoder = - new ThreadLocal<SoftReference<StringDecoder>>(); + new ThreadLocal<>(); private final static ThreadLocal<SoftReference<StringEncoder>> encoder = - new ThreadLocal<SoftReference<StringEncoder>>(); + new ThreadLocal<>(); private static boolean warnUnsupportedCharset = true; @@ -67,7 +67,7 @@ } private static <T> void set(ThreadLocal<SoftReference<T>> tl, T ob) { - tl.set(new SoftReference<T>(ob)); + tl.set(new SoftReference<>(ob)); } // Trim the given byte array to the given length
--- a/src/share/classes/java/lang/Thread.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/Thread.java Thu Jan 13 15:03:27 2011 -0800 @@ -1642,8 +1642,7 @@ // Get a snapshot of the list of all threads Thread[] threads = getThreads(); StackTraceElement[][] traces = dumpThreads(threads); - Map<Thread, StackTraceElement[]> m - = new HashMap<Thread, StackTraceElement[]>(threads.length); + Map<Thread, StackTraceElement[]> m = new HashMap<>(threads.length); for (int i = 0; i < threads.length; i++) { StackTraceElement[] stackTrace = traces[i]; if (stackTrace != null) { @@ -1664,11 +1663,11 @@ private static class Caches { /** cache of subclass security audit results */ static final ConcurrentMap<WeakClassKey,Boolean> subclassAudits = - new ConcurrentHashMap<WeakClassKey,Boolean>(); + new ConcurrentHashMap<>(); /** queue for WeakReferences to audited subclasses */ static final ReferenceQueue<Class<?>> subclassAuditsQueue = - new ReferenceQueue<Class<?>>(); + new ReferenceQueue<>(); } /**
--- a/src/share/classes/java/lang/Throwable.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/Throwable.java Thu Jan 13 15:03:27 2011 -0800 @@ -828,7 +828,7 @@ // Use the sentinel for a zero-length list suppressed = SUPPRESSED_SENTINEL; } else { // Copy Throwables to new list - suppressed = new ArrayList<Throwable>(1); + suppressed = new ArrayList<>(1); for (Throwable t : suppressedExceptions) { // Enforce constraints on suppressed exceptions in // case of corrupt or malicious stream. @@ -911,7 +911,7 @@ return; if (suppressedExceptions == SUPPRESSED_SENTINEL) - suppressedExceptions = new ArrayList<Throwable>(1); + suppressedExceptions = new ArrayList<>(1); assert suppressedExceptions != SUPPRESSED_SENTINEL;
--- a/src/share/classes/java/lang/management/ManagementFactory.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/management/ManagementFactory.java Thu Jan 13 15:03:27 2011 -0800 @@ -794,7 +794,7 @@ */ public static List<Class<? extends PlatformManagedObject>> getAllPlatformMXBeanInterfaces() { List<Class<? extends PlatformManagedObject>> result = - new ArrayList<Class<? extends PlatformManagedObject>>(); + new ArrayList<>(); for (PlatformComponent component: PlatformComponent.values()) { result.add(component.getMXBeanInterface()); }
--- a/src/share/classes/java/lang/management/PlatformComponent.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/management/PlatformComponent.java Thu Jan 13 15:03:27 2011 -0800 @@ -267,7 +267,7 @@ List<T> getGcMXBeanList(Class<T> gcMXBeanIntf) { List<GarbageCollectorMXBean> list = ManagementFactoryHelper.getGarbageCollectorMXBeans(); - List<T> result = new ArrayList<T>(list.size()); + List<T> result = new ArrayList<>(list.size()); for (GarbageCollectorMXBean m : list) { if (gcMXBeanIntf.isInstance(m)) { result.add(gcMXBeanIntf.cast(m)); @@ -330,7 +330,7 @@ } private static Set<String> keyProperties(String... keyNames) { - Set<String> set = new HashSet<String>(); + Set<String> set = new HashSet<>(); set.add("type"); for (String s : keyNames) { set.add(s); @@ -364,7 +364,7 @@ List<T> getMXBeans(MBeanServerConnection mbs, Class<T> mxbeanInterface) throws java.io.IOException { - List<T> result = new ArrayList<T>(); + List<T> result = new ArrayList<>(); for (ObjectName on : getObjectNames(mbs)) { result.add(ManagementFactory. newPlatformMXBeanProxy(mbs,
--- a/src/share/classes/java/lang/reflect/Constructor.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/reflect/Constructor.java Thu Jan 13 15:03:27 2011 -0800 @@ -144,7 +144,7 @@ // which implicitly requires that new java.lang.reflect // objects be fabricated for each reflective call on Class // objects.) - Constructor<T> res = new Constructor<T>(clazz, + Constructor<T> res = new Constructor<>(clazz, parameterTypes, exceptionTypes, modifiers, slot, signature,
--- a/src/share/classes/java/lang/reflect/Proxy.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/reflect/Proxy.java Thu Jan 13 15:03:27 2011 -0800 @@ -232,7 +232,7 @@ /** maps a class loader to the proxy class cache for that loader */ private static Map<ClassLoader, Map<List<String>, Object>> loaderToCache - = new WeakHashMap<ClassLoader, Map<List<String>, Object>>(); + = new WeakHashMap<>(); /** marks that a particular proxy class is currently being generated */ private static Object pendingGenerationMarker = new Object(); @@ -356,7 +356,7 @@ String[] interfaceNames = new String[interfaces.length]; // for detecting duplicates - Set<Class<?>> interfaceSet = new HashSet<Class<?>>(); + Set<Class<?>> interfaceSet = new HashSet<>(); for (int i = 0; i < interfaces.length; i++) { /* @@ -413,7 +413,7 @@ synchronized (loaderToCache) { cache = loaderToCache.get(loader); if (cache == null) { - cache = new HashMap<List<String>, Object>(); + cache = new HashMap<>(); loaderToCache.put(loader, cache); } /*
--- a/src/share/classes/java/lang/reflect/ReflectAccess.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/lang/reflect/ReflectAccess.java Thu Jan 13 15:03:27 2011 -0800 @@ -84,7 +84,7 @@ byte[] annotations, byte[] parameterAnnotations) { - return new Constructor<T>(declaringClass, + return new Constructor<>(declaringClass, parameterTypes, checkedExceptions, modifiers,
--- a/src/share/classes/java/sql/DriverManager.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/sql/DriverManager.java Thu Jan 13 15:03:27 2011 -0800 @@ -364,7 +364,7 @@ * @return the list of JDBC Drivers loaded by the caller's class loader */ public static java.util.Enumeration<Driver> getDrivers() { - java.util.Vector<Driver> result = new java.util.Vector<Driver>(); + java.util.Vector<Driver> result = new java.util.Vector<>(); java.util.Vector drivers = null; if (!initialized) {
--- a/src/share/classes/java/sql/Statement.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/sql/Statement.java Thu Jan 13 15:03:27 2011 -0800 @@ -577,7 +577,7 @@ * * @see #addBatch * @see DatabaseMetaData#supportsBatchUpdates - * @since 1.3 + * @since 1.2 */ int[] executeBatch() throws SQLException;
--- a/src/share/classes/java/text/MessageFormat.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/text/MessageFormat.java Thu Jan 13 15:03:27 2011 -0800 @@ -93,73 +93,65 @@ * currency * percent * <i>SubformatPattern</i> - * - * <i>String:</i> - * <i>StringPart<sub>opt</sub></i> - * <i>String</i> <i>StringPart</i> - * - * <i>StringPart:</i> - * '' - * ' <i>QuotedString</i> ' - * <i>UnquotedString</i> - * - * <i>SubformatPattern:</i> - * <i>SubformatPatternPart<sub>opt</sub></i> - * <i>SubformatPattern</i> <i>SubformatPatternPart</i> - * - * <i>SubFormatPatternPart:</i> - * ' <i>QuotedPattern</i> ' - * <i>UnquotedPattern</i> * </pre></blockquote> * - * <p> - * Within a <i>String</i>, <code>"''"</code> represents a single - * quote. A <i>QuotedString</i> can contain arbitrary characters - * except single quotes; the surrounding single quotes are removed. - * An <i>UnquotedString</i> can contain arbitrary characters - * except single quotes and left curly brackets. Thus, a string that - * should result in the formatted message "'{0}'" can be written as - * <code>"'''{'0}''"</code> or <code>"'''{0}'''"</code>. - * <p> - * Within a <i>SubformatPattern</i>, different rules apply. - * A <i>QuotedPattern</i> can contain arbitrary characters - * except single quotes; but the surrounding single quotes are - * <strong>not</strong> removed, so they may be interpreted by the - * subformat. For example, <code>"{1,number,$'#',##}"</code> will - * produce a number format with the pound-sign quoted, with a result - * such as: "$#31,45". - * An <i>UnquotedPattern</i> can contain arbitrary characters - * except single quotes, but curly braces within it must be balanced. - * For example, <code>"ab {0} de"</code> and <code>"ab '}' de"</code> - * are valid subformat patterns, but <code>"ab {0'}' de"</code> and - * <code>"ab } de"</code> are not. + * <p>Within a <i>String</i>, a pair of single quotes can be used to + * quote any arbitrary characters except single quotes. For example, + * pattern string <code>"'{0}'"</code> represents string + * <code>"{0}"</code>, not a <i>FormatElement</i>. A single quote itself + * must be represented by doubled single quotes {@code ''} throughout a + * <i>String</i>. For example, pattern string <code>"'{''}'"</code> is + * interpreted as a sequence of <code>'{</code> (start of quoting and a + * left curly brace), <code>''</code> (a single quote), and + * <code>}'</code> (a right curly brace and end of quoting), + * <em>not</em> <code>'{'</code> and <code>'}'</code> (quoted left and + * right curly braces): representing string <code>"{'}"</code>, + * <em>not</em> <code>"{}"</code>. + * + * <p>A <i>SubformatPattern</i> is interpreted by its corresponding + * subformat, and subformat-dependent pattern rules apply. For example, + * pattern string <code>"{1,number,<u>$'#',##</u>}"</code> + * (<i>SubformatPattern</i> with underline) will produce a number format + * with the pound-sign quoted, with a result such as: {@code + * "$#31,45"}. Refer to each {@code Format} subclass documentation for + * details. + * + * <p>Any unmatched quote is treated as closed at the end of the given + * pattern. For example, pattern string {@code "'{0}"} is treated as + * pattern {@code "'{0}'"}. + * + * <p>Any curly braces within an unquoted pattern must be balanced. For + * example, <code>"ab {0} de"</code> and <code>"ab '}' de"</code> are + * valid patterns, but <code>"ab {0'}' de"</code>, <code>"ab } de"</code> + * and <code>"''{''"</code> are not. + * * <p> * <dl><dt><b>Warning:</b><dd>The rules for using quotes within message * format patterns unfortunately have shown to be somewhat confusing. * In particular, it isn't always obvious to localizers whether single * quotes need to be doubled or not. Make sure to inform localizers about * the rules, and tell them (for example, by using comments in resource - * bundle source files) which strings will be processed by MessageFormat. + * bundle source files) which strings will be processed by {@code MessageFormat}. * Note that localizers may need to use single quotes in translated * strings where the original version doesn't have them. * </dl> * <p> * The <i>ArgumentIndex</i> value is a non-negative integer written - * using the digits '0' through '9', and represents an index into the - * <code>arguments</code> array passed to the <code>format</code> methods - * or the result array returned by the <code>parse</code> methods. + * using the digits {@code '0'} through {@code '9'}, and represents an index into the + * {@code arguments} array passed to the {@code format} methods + * or the result array returned by the {@code parse} methods. * <p> * The <i>FormatType</i> and <i>FormatStyle</i> values are used to create - * a <code>Format</code> instance for the format element. The following - * table shows how the values map to Format instances. Combinations not + * a {@code Format} instance for the format element. The following + * table shows how the values map to {@code Format} instances. Combinations not * shown in the table are illegal. A <i>SubformatPattern</i> must - * be a valid pattern string for the Format subclass used. + * be a valid pattern string for the {@code Format} subclass used. * <p> * <table border=1 summary="Shows how FormatType and FormatStyle values map to Format instances"> * <tr> - * <th id="ft">Format Type - * <th id="fs">Format Style - * <th id="sc">Subformat Created + * <th id="ft" class="TableHeadingColor">FormatType + * <th id="fs" class="TableHeadingColor">FormatStyle + * <th id="sc" class="TableHeadingColor">Subformat Created * <tr> * <td headers="ft"><i>(none)</i> * <td headers="fs"><i>(none)</i> @@ -167,61 +159,61 @@ * <tr> * <td headers="ft" rowspan=5><code>number</code> * <td headers="fs"><i>(none)</i> - * <td headers="sc"><code>NumberFormat.getInstance(getLocale())</code> + * <td headers="sc">{@link NumberFormat#getInstance(Locale) NumberFormat.getInstance}{@code (getLocale())} * <tr> * <td headers="fs"><code>integer</code> - * <td headers="sc"><code>NumberFormat.getIntegerInstance(getLocale())</code> + * <td headers="sc">{@link NumberFormat#getIntegerInstance(Locale) NumberFormat.getIntegerInstance}{@code (getLocale())} * <tr> * <td headers="fs"><code>currency</code> - * <td headers="sc"><code>NumberFormat.getCurrencyInstance(getLocale())</code> + * <td headers="sc">{@link NumberFormat#getCurrencyInstance(Locale) NumberFormat.getCurrencyInstance}{@code (getLocale())} * <tr> * <td headers="fs"><code>percent</code> - * <td headers="sc"><code>NumberFormat.getPercentInstance(getLocale())</code> + * <td headers="sc">{@link NumberFormat#getPercentInstance(Locale) NumberFormat.getPercentInstance}{@code (getLocale())} * <tr> * <td headers="fs"><i>SubformatPattern</i> - * <td headers="sc"><code>new DecimalFormat(subformatPattern, DecimalFormatSymbols.getInstance(getLocale()))</code> + * <td headers="sc">{@code new} {@link DecimalFormat#DecimalFormat(String,DecimalFormatSymbols) DecimalFormat}{@code (subformatPattern,} {@link DecimalFormatSymbols#getInstance(Locale) DecimalFormatSymbols.getInstance}{@code (getLocale()))} * <tr> * <td headers="ft" rowspan=6><code>date</code> * <td headers="fs"><i>(none)</i> - * <td headers="sc"><code>DateFormat.getDateInstance(DateFormat.DEFAULT, getLocale())</code> + * <td headers="sc">{@link DateFormat#getDateInstance(int,Locale) DateFormat.getDateInstance}{@code (}{@link DateFormat#DEFAULT}{@code , getLocale())} * <tr> * <td headers="fs"><code>short</code> - * <td headers="sc"><code>DateFormat.getDateInstance(DateFormat.SHORT, getLocale())</code> + * <td headers="sc">{@link DateFormat#getDateInstance(int,Locale) DateFormat.getDateInstance}{@code (}{@link DateFormat#SHORT}{@code , getLocale())} * <tr> * <td headers="fs"><code>medium</code> - * <td headers="sc"><code>DateFormat.getDateInstance(DateFormat.DEFAULT, getLocale())</code> + * <td headers="sc">{@link DateFormat#getDateInstance(int,Locale) DateFormat.getDateInstance}{@code (}{@link DateFormat#DEFAULT}{@code , getLocale())} * <tr> * <td headers="fs"><code>long</code> - * <td headers="sc"><code>DateFormat.getDateInstance(DateFormat.LONG, getLocale())</code> + * <td headers="sc">{@link DateFormat#getDateInstance(int,Locale) DateFormat.getDateInstance}{@code (}{@link DateFormat#LONG}{@code , getLocale())} * <tr> * <td headers="fs"><code>full</code> - * <td headers="sc"><code>DateFormat.getDateInstance(DateFormat.FULL, getLocale())</code> + * <td headers="sc">{@link DateFormat#getDateInstance(int,Locale) DateFormat.getDateInstance}{@code (}{@link DateFormat#FULL}{@code , getLocale())} * <tr> * <td headers="fs"><i>SubformatPattern</i> - * <td headers="sc"><code>new SimpleDateFormat(subformatPattern, getLocale())</code> + * <td headers="sc">{@code new} {@link SimpleDateFormat#SimpleDateFormat(String,Locale) SimpleDateFormat}{@code (subformatPattern, getLocale())} * <tr> * <td headers="ft" rowspan=6><code>time</code> * <td headers="fs"><i>(none)</i> - * <td headers="sc"><code>DateFormat.getTimeInstance(DateFormat.DEFAULT, getLocale())</code> + * <td headers="sc">{@link DateFormat#getTimeInstance(int,Locale) DateFormat.getTimeInstance}{@code (}{@link DateFormat#DEFAULT}{@code , getLocale())} * <tr> * <td headers="fs"><code>short</code> - * <td headers="sc"><code>DateFormat.getTimeInstance(DateFormat.SHORT, getLocale())</code> + * <td headers="sc">{@link DateFormat#getTimeInstance(int,Locale) DateFormat.getTimeInstance}{@code (}{@link DateFormat#SHORT}{@code , getLocale())} * <tr> * <td headers="fs"><code>medium</code> - * <td headers="sc"><code>DateFormat.getTimeInstance(DateFormat.DEFAULT, getLocale())</code> + * <td headers="sc">{@link DateFormat#getTimeInstance(int,Locale) DateFormat.getTimeInstance}{@code (}{@link DateFormat#DEFAULT}{@code , getLocale())} * <tr> * <td headers="fs"><code>long</code> - * <td headers="sc"><code>DateFormat.getTimeInstance(DateFormat.LONG, getLocale())</code> + * <td headers="sc">{@link DateFormat#getTimeInstance(int,Locale) DateFormat.getTimeInstance}{@code (}{@link DateFormat#LONG}{@code , getLocale())} * <tr> * <td headers="fs"><code>full</code> - * <td headers="sc"><code>DateFormat.getTimeInstance(DateFormat.FULL, getLocale())</code> + * <td headers="sc">{@link DateFormat#getTimeInstance(int,Locale) DateFormat.getTimeInstance}{@code (}{@link DateFormat#FULL}{@code , getLocale())} * <tr> * <td headers="fs"><i>SubformatPattern</i> - * <td headers="sc"><code>new SimpleDateFormat(subformatPattern, getLocale())</code> + * <td headers="sc">{@code new} {@link SimpleDateFormat#SimpleDateFormat(String,Locale) SimpleDateFormat}{@code (subformatPattern, getLocale())} * <tr> * <td headers="ft"><code>choice</code> * <td headers="fs"><i>SubformatPattern</i> - * <td headers="sc"><code>new ChoiceFormat(subformatPattern)</code> + * <td headers="sc">{@code new} {@link ChoiceFormat#ChoiceFormat(String) ChoiceFormat}{@code (subformatPattern)} * </table> * <p> * @@ -321,7 +313,7 @@ * </pre></blockquote> * * <p> - * Likewise, parsing with a MessageFormat object using patterns containing + * Likewise, parsing with a {@code MessageFormat} object using patterns containing * multiple occurrences of the same argument would return the last match. For * example, * <blockquote><pre> @@ -343,7 +335,11 @@ * @see Format * @see NumberFormat * @see DecimalFormat + * @see DecimalFormatSymbols * @see ChoiceFormat + * @see DateFormat + * @see SimpleDateFormat + * * @author Mark Davis */ @@ -427,18 +423,19 @@ * @exception IllegalArgumentException if the pattern is invalid */ public void applyPattern(String pattern) { - StringBuffer[] segments = new StringBuffer[4]; - for (int i = 0; i < segments.length; ++i) { - segments[i] = new StringBuffer(); - } - int part = 0; + StringBuilder[] segments = new StringBuilder[4]; + // Allocate only segments[SEG_RAW] here. The rest are + // allocated on demand. + segments[SEG_RAW] = new StringBuilder(); + + int part = SEG_RAW; int formatNumber = 0; boolean inQuote = false; int braceStack = 0; maxOffset = -1; for (int i = 0; i < pattern.length(); ++i) { char ch = pattern.charAt(i); - if (part == 0) { + if (part == SEG_RAW) { if (ch == '\'') { if (i + 1 < pattern.length() && pattern.charAt(i+1) == '\'') { @@ -448,43 +445,61 @@ inQuote = !inQuote; } } else if (ch == '{' && !inQuote) { - part = 1; + part = SEG_INDEX; + if (segments[SEG_INDEX] == null) { + segments[SEG_INDEX] = new StringBuilder(); + } } else { segments[part].append(ch); } - } else if (inQuote) { // just copy quotes in parts - segments[part].append(ch); - if (ch == '\'') { - inQuote = false; - } - } else { - switch (ch) { - case ',': - if (part < 3) - part += 1; - else + } else { + if (inQuote) { // just copy quotes in parts + segments[part].append(ch); + if (ch == '\'') { + inQuote = false; + } + } else { + switch (ch) { + case ',': + if (part < SEG_MODIFIER) { + if (segments[++part] == null) { + segments[part] = new StringBuilder(); + } + } else { + segments[part].append(ch); + } + break; + case '{': + ++braceStack; segments[part].append(ch); - break; - case '{': - ++braceStack; - segments[part].append(ch); - break; - case '}': - if (braceStack == 0) { - part = 0; - makeFormat(i, formatNumber, segments); - formatNumber++; - } else { - --braceStack; + break; + case '}': + if (braceStack == 0) { + part = SEG_RAW; + makeFormat(i, formatNumber, segments); + formatNumber++; + // throw away other segments + segments[SEG_INDEX] = null; + segments[SEG_TYPE] = null; + segments[SEG_MODIFIER] = null; + } else { + --braceStack; + segments[part].append(ch); + } + break; + case ' ': + // Skip any leading space chars for SEG_TYPE. + if (part != SEG_TYPE || segments[SEG_TYPE].length() > 0) { + segments[part].append(ch); + } + break; + case '\'': + inQuote = true; + // fall through, so we keep quotes in other parts + default: segments[part].append(ch); + break; } - break; - case '\'': - inQuote = true; - // fall through, so we keep quotes in other parts - default: - segments[part].append(ch); - break; } } } @@ -506,65 +521,57 @@ public String toPattern() { // later, make this more extensible int lastOffset = 0; - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); for (int i = 0; i <= maxOffset; ++i) { - copyAndFixQuotes(pattern, lastOffset, offsets[i],result); + copyAndFixQuotes(pattern, lastOffset, offsets[i], result); lastOffset = offsets[i]; - result.append('{'); - result.append(argumentNumbers[i]); - if (formats[i] == null) { + result.append('{').append(argumentNumbers[i]); + Format fmt = formats[i]; + if (fmt == null) { // do nothing, string format - } else if (formats[i] instanceof DecimalFormat) { - if (formats[i].equals(NumberFormat.getInstance(locale))) { + } else if (fmt instanceof NumberFormat) { + if (fmt.equals(NumberFormat.getInstance(locale))) { result.append(",number"); - } else if (formats[i].equals(NumberFormat.getCurrencyInstance(locale))) { + } else if (fmt.equals(NumberFormat.getCurrencyInstance(locale))) { result.append(",number,currency"); - } else if (formats[i].equals(NumberFormat.getPercentInstance(locale))) { + } else if (fmt.equals(NumberFormat.getPercentInstance(locale))) { result.append(",number,percent"); - } else if (formats[i].equals(NumberFormat.getIntegerInstance(locale))) { + } else if (fmt.equals(NumberFormat.getIntegerInstance(locale))) { result.append(",number,integer"); } else { - result.append(",number," + - ((DecimalFormat)formats[i]).toPattern()); + if (fmt instanceof DecimalFormat) { + result.append(",number,").append(((DecimalFormat)fmt).toPattern()); + } else if (fmt instanceof ChoiceFormat) { + result.append(",choice,").append(((ChoiceFormat)fmt).toPattern()); + } else { + // UNKNOWN + } } - } else if (formats[i] instanceof SimpleDateFormat) { - if (formats[i].equals(DateFormat.getDateInstance( - DateFormat.DEFAULT,locale))) { - result.append(",date"); - } else if (formats[i].equals(DateFormat.getDateInstance( - DateFormat.SHORT,locale))) { - result.append(",date,short"); - } else if (formats[i].equals(DateFormat.getDateInstance( - DateFormat.DEFAULT,locale))) { - result.append(",date,medium"); - } else if (formats[i].equals(DateFormat.getDateInstance( - DateFormat.LONG,locale))) { - result.append(",date,long"); - } else if (formats[i].equals(DateFormat.getDateInstance( - DateFormat.FULL,locale))) { - result.append(",date,full"); - } else if (formats[i].equals(DateFormat.getTimeInstance( - DateFormat.DEFAULT,locale))) { - result.append(",time"); - } else if (formats[i].equals(DateFormat.getTimeInstance( - DateFormat.SHORT,locale))) { - result.append(",time,short"); - } else if (formats[i].equals(DateFormat.getTimeInstance( - DateFormat.DEFAULT,locale))) { - result.append(",time,medium"); - } else if (formats[i].equals(DateFormat.getTimeInstance( - DateFormat.LONG,locale))) { - result.append(",time,long"); - } else if (formats[i].equals(DateFormat.getTimeInstance( - DateFormat.FULL,locale))) { - result.append(",time,full"); - } else { - result.append(",date," - + ((SimpleDateFormat)formats[i]).toPattern()); + } else if (fmt instanceof DateFormat) { + int index; + for (index = MODIFIER_DEFAULT; index < DATE_TIME_MODIFIERS.length; index++) { + DateFormat df = DateFormat.getDateInstance(DATE_TIME_MODIFIERS[index], + locale); + if (fmt.equals(df)) { + result.append(",date"); + break; + } + df = DateFormat.getTimeInstance(DATE_TIME_MODIFIERS[index], + locale); + if (fmt.equals(df)) { + result.append(",time"); + break; + } } - } else if (formats[i] instanceof ChoiceFormat) { - result.append(",choice," - + ((ChoiceFormat)formats[i]).toPattern()); + if (index >= DATE_TIME_MODIFIERS.length) { + if (fmt instanceof SimpleDateFormat) { + result.append(",date,").append(((SimpleDateFormat)fmt).toPattern()); + } else { + // UNKNOWN + } + } else if (index != MODIFIER_DEFAULT) { + result.append(',').append(DATE_TIME_MODIFIER_KEYWORDS[index]); + } } else { //result.append(", unknown"); } @@ -678,7 +685,7 @@ * * @param formatElementIndex the index of a format element within the pattern * @param newFormat the format to use for the specified format element - * @exception ArrayIndexOutOfBoundsException if formatElementIndex is equal to or + * @exception ArrayIndexOutOfBoundsException if {@code formatElementIndex} is equal to or * larger than the number of format elements in the pattern string */ public void setFormat(int formatElementIndex, Format newFormat) { @@ -972,7 +979,8 @@ if (patternOffset >= tempLength) { next = source.length(); }else{ - next = source.indexOf( pattern.substring(patternOffset,tempLength), sourceOffset); + next = source.indexOf(pattern.substring(patternOffset, tempLength), + sourceOffset); } if (next < 0) { @@ -1226,7 +1234,7 @@ lastOffset = offsets[i]; int argumentNumber = argumentNumbers[i]; if (arguments == null || argumentNumber >= arguments.length) { - result.append("{" + argumentNumber + "}"); + result.append('{').append(argumentNumber).append('}'); continue; } // int argRecursion = ((recursionProtection >> (argumentNumber*2)) & 0x3); @@ -1338,25 +1346,83 @@ } } - private static final String[] typeList = - {"", "", "number", "", "date", "", "time", "", "choice"}; - private static final String[] modifierList = - {"", "", "currency", "", "percent", "", "integer"}; - private static final String[] dateModifierList = - {"", "", "short", "", "medium", "", "long", "", "full"}; + // Indices for segments + private static final int SEG_RAW = 0; + private static final int SEG_INDEX = 1; + private static final int SEG_TYPE = 2; + private static final int SEG_MODIFIER = 3; // modifier or subformat + + // Indices for type keywords + private static final int TYPE_NULL = 0; + private static final int TYPE_NUMBER = 1; + private static final int TYPE_DATE = 2; + private static final int TYPE_TIME = 3; + private static final int TYPE_CHOICE = 4; + + private static final String[] TYPE_KEYWORDS = { + "", + "number", + "date", + "time", + "choice" + }; + + // Indices for number modifiers + private static final int MODIFIER_DEFAULT = 0; // common in number and date-time + private static final int MODIFIER_CURRENCY = 1; + private static final int MODIFIER_PERCENT = 2; + private static final int MODIFIER_INTEGER = 3; + + private static final String[] NUMBER_MODIFIER_KEYWORDS = { + "", + "currency", + "percent", + "integer" + }; + + // Indices for date-time modifiers + private static final int MODIFIER_SHORT = 1; + private static final int MODIFIER_MEDIUM = 2; + private static final int MODIFIER_LONG = 3; + private static final int MODIFIER_FULL = 4; + + private static final String[] DATE_TIME_MODIFIER_KEYWORDS = { + "", + "short", + "medium", + "long", + "full" + }; + + // Date-time style values corresponding to the date-time modifiers. + private static final int[] DATE_TIME_MODIFIERS = { + DateFormat.DEFAULT, + DateFormat.SHORT, + DateFormat.MEDIUM, + DateFormat.LONG, + DateFormat.FULL, + }; private void makeFormat(int position, int offsetNumber, - StringBuffer[] segments) + StringBuilder[] textSegments) { + String[] segments = new String[textSegments.length]; + for (int i = 0; i < textSegments.length; i++) { + StringBuilder oneseg = textSegments[i]; + segments[i] = (oneseg != null) ? oneseg.toString() : ""; + } + // get the argument number int argumentNumber; try { - argumentNumber = Integer.parseInt(segments[1].toString()); // always unlocalized! + argumentNumber = Integer.parseInt(segments[SEG_INDEX]); // always unlocalized! } catch (NumberFormatException e) { - throw new IllegalArgumentException("can't parse argument number: " + segments[1]); + throw new IllegalArgumentException("can't parse argument number: " + + segments[SEG_INDEX], e); } if (argumentNumber < 0) { - throw new IllegalArgumentException("negative argument number: " + argumentNumber); + throw new IllegalArgumentException("negative argument number: " + + argumentNumber); } // resize format information arrays if necessary @@ -1374,120 +1440,129 @@ } int oldMaxOffset = maxOffset; maxOffset = offsetNumber; - offsets[offsetNumber] = segments[0].length(); + offsets[offsetNumber] = segments[SEG_RAW].length(); argumentNumbers[offsetNumber] = argumentNumber; // now get the format Format newFormat = null; - switch (findKeyword(segments[2].toString(), typeList)) { - case 0: - break; - case 1: case 2:// number - switch (findKeyword(segments[3].toString(), modifierList)) { - case 0: // default; - newFormat = NumberFormat.getInstance(locale); + if (segments[SEG_TYPE].length() != 0) { + int type = findKeyword(segments[SEG_TYPE], TYPE_KEYWORDS); + switch (type) { + case TYPE_NULL: + // Type "" is allowed. e.g., "{0,}", "{0,,}", and "{0,,#}" + // are treated as "{0}". break; - case 1: case 2:// currency - newFormat = NumberFormat.getCurrencyInstance(locale); + + case TYPE_NUMBER: + switch (findKeyword(segments[SEG_MODIFIER], NUMBER_MODIFIER_KEYWORDS)) { + case MODIFIER_DEFAULT: + newFormat = NumberFormat.getInstance(locale); + break; + case MODIFIER_CURRENCY: + newFormat = NumberFormat.getCurrencyInstance(locale); + break; + case MODIFIER_PERCENT: + newFormat = NumberFormat.getPercentInstance(locale); + break; + case MODIFIER_INTEGER: + newFormat = NumberFormat.getIntegerInstance(locale); + break; + default: // DecimalFormat pattern + try { + newFormat = new DecimalFormat(segments[SEG_MODIFIER], + DecimalFormatSymbols.getInstance(locale)); + } catch (IllegalArgumentException e) { + maxOffset = oldMaxOffset; + throw e; + } + break; + } break; - case 3: case 4:// percent - newFormat = NumberFormat.getPercentInstance(locale); + + case TYPE_DATE: + case TYPE_TIME: + int mod = findKeyword(segments[SEG_MODIFIER], DATE_TIME_MODIFIER_KEYWORDS); + if (mod >= 0 && mod < DATE_TIME_MODIFIER_KEYWORDS.length) { + if (type == TYPE_DATE) { + newFormat = DateFormat.getDateInstance(DATE_TIME_MODIFIERS[mod], + locale); + } else { + newFormat = DateFormat.getTimeInstance(DATE_TIME_MODIFIERS[mod], + locale); + } + } else { + // SimpleDateFormat pattern + try { + newFormat = new SimpleDateFormat(segments[SEG_MODIFIER], locale); + } catch (IllegalArgumentException e) { + maxOffset = oldMaxOffset; + throw e; + } + } break; - case 5: case 6:// integer - newFormat = NumberFormat.getIntegerInstance(locale); + + case TYPE_CHOICE: + try { + // ChoiceFormat pattern + newFormat = new ChoiceFormat(segments[SEG_MODIFIER]); + } catch (Exception e) { + maxOffset = oldMaxOffset; + throw new IllegalArgumentException("Choice Pattern incorrect: " + + segments[SEG_MODIFIER], e); + } break; - default: // pattern - newFormat = new DecimalFormat(segments[3].toString(), DecimalFormatSymbols.getInstance(locale)); - break; + + default: + maxOffset = oldMaxOffset; + throw new IllegalArgumentException("unknown format type: " + + segments[SEG_TYPE]); } - break; - case 3: case 4: // date - switch (findKeyword(segments[3].toString(), dateModifierList)) { - case 0: // default - newFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale); - break; - case 1: case 2: // short - newFormat = DateFormat.getDateInstance(DateFormat.SHORT, locale); - break; - case 3: case 4: // medium - newFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale); - break; - case 5: case 6: // long - newFormat = DateFormat.getDateInstance(DateFormat.LONG, locale); - break; - case 7: case 8: // full - newFormat = DateFormat.getDateInstance(DateFormat.FULL, locale); - break; - default: - newFormat = new SimpleDateFormat(segments[3].toString(), locale); - break; - } - break; - case 5: case 6:// time - switch (findKeyword(segments[3].toString(), dateModifierList)) { - case 0: // default - newFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale); - break; - case 1: case 2: // short - newFormat = DateFormat.getTimeInstance(DateFormat.SHORT, locale); - break; - case 3: case 4: // medium - newFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale); - break; - case 5: case 6: // long - newFormat = DateFormat.getTimeInstance(DateFormat.LONG, locale); - break; - case 7: case 8: // full - newFormat = DateFormat.getTimeInstance(DateFormat.FULL, locale); - break; - default: - newFormat = new SimpleDateFormat(segments[3].toString(), locale); - break; - } - break; - case 7: case 8:// choice - try { - newFormat = new ChoiceFormat(segments[3].toString()); - } catch (Exception e) { - maxOffset = oldMaxOffset; - throw new IllegalArgumentException( - "Choice Pattern incorrect"); - } - break; - default: - maxOffset = oldMaxOffset; - throw new IllegalArgumentException("unknown format type: " + - segments[2].toString()); } formats[offsetNumber] = newFormat; - segments[1].setLength(0); // throw away other segments - segments[2].setLength(0); - segments[3].setLength(0); } private static final int findKeyword(String s, String[] list) { - s = s.trim().toLowerCase(); for (int i = 0; i < list.length; ++i) { if (s.equals(list[i])) return i; } + + // Try trimmed lowercase. + String ls = s.trim().toLowerCase(Locale.ROOT); + if (ls != s) { + for (int i = 0; i < list.length; ++i) { + if (ls.equals(list[i])) + return i; + } + } return -1; } - private static final void copyAndFixQuotes( - String source, int start, int end, StringBuffer target) { + private static final void copyAndFixQuotes(String source, int start, int end, + StringBuilder target) { + boolean quoted = false; + for (int i = start; i < end; ++i) { char ch = source.charAt(i); if (ch == '{') { - target.append("'{'"); - } else if (ch == '}') { - target.append("'}'"); + if (!quoted) { + target.append('\''); + quoted = true; + } + target.append(ch); } else if (ch == '\'') { target.append("''"); } else { + if (quoted) { + target.append('\''); + quoted = false; + } target.append(ch); } } + if (quoted) { + target.append('\''); + } } /**
--- a/src/share/classes/java/text/SimpleDateFormat.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/text/SimpleDateFormat.java Thu Jan 13 15:03:27 2011 -0800 @@ -1663,6 +1663,81 @@ } /** + * Parses numeric forms of time zone offset, such as "hh:mm", and + * sets calb to the parsed value. + * + * @param text the text to be parsed + * @param start the character position to start parsing + * @param sign 1: positive; -1: negative + * @param count 0: 'Z' or "GMT+hh:mm" parsing; 1 - 3: the number of 'X's + * @param colon true - colon required between hh and mm; false - no colon required + * @param calb a CalendarBuilder in which the parsed value is stored + * @return updated parsed position, or its negative value to indicate a parsing error + */ + private int subParseNumericZone(String text, int start, int sign, int count, + boolean colon, CalendarBuilder calb) { + int index = start; + + parse: + try { + char c = text.charAt(index++); + // Parse hh + int hours; + if (!isDigit(c)) { + break parse; + } + hours = c - '0'; + c = text.charAt(index++); + if (isDigit(c)) { + hours = hours * 10 + (c - '0'); + } else { + // If no colon in RFC 822 or 'X' (ISO), two digits are + // required. + if (count > 0 || !colon) { + break parse; + } + --index; + } + if (hours > 23) { + break parse; + } + int minutes = 0; + if (count != 1) { + // Proceed with parsing mm + c = text.charAt(index++); + if (colon) { + if (c != ':') { + break parse; + } + c = text.charAt(index++); + } + if (!isDigit(c)) { + break parse; + } + minutes = c - '0'; + c = text.charAt(index++); + if (!isDigit(c)) { + break parse; + } + minutes = minutes * 10 + (c - '0'); + if (minutes > 59) { + break parse; + } + } + minutes += hours * 60; + calb.set(Calendar.ZONE_OFFSET, minutes * MILLIS_PER_MINUTE * sign) + .set(Calendar.DST_OFFSET, 0); + return index; + } catch (IndexOutOfBoundsException e) { + } + return 1 - index; // -(index - 1) + } + + private boolean isDigit(char c) { + return c >= '0' && c <= '9'; + } + + /** * Private member function that converts the parsed date strings into * timeFields. Returns -start (for ParsePosition) if failed. * @param text the time text to be parsed. @@ -1907,248 +1982,95 @@ case PATTERN_ZONE_NAME: // 'z' case PATTERN_ZONE_VALUE: // 'Z' - // First try to parse generic forms such as GMT-07:00. Do this first - // in case localized TimeZoneNames contains the string "GMT" - // for a zone; in that case, we don't want to match the first three - // characters of GMT+/-hh:mm etc. { int sign = 0; - int offset; + try { + char c = text.charAt(pos.index); + if (c == '+') { + sign = 1; + } else if (c == '-') { + sign = -1; + } + if (sign == 0) { + // Try parsing a custom time zone "GMT+hh:mm" or "GMT". + if ((c == 'G' || c == 'g') + && (text.length() - start) >= GMT.length() + && text.regionMatches(true, start, GMT, 0, GMT.length())) { + pos.index = start + GMT.length(); - // For time zones that have no known names, look for strings - // of the form: - // GMT[+-]hours:minutes or - // GMT. - if ((text.length() - start) >= GMT.length() && - text.regionMatches(true, start, GMT, 0, GMT.length())) { - int num; - calb.set(Calendar.DST_OFFSET, 0); - pos.index = start + GMT.length(); + if ((text.length() - pos.index) > 0) { + c = text.charAt(pos.index); + if (c == '+') { + sign = 1; + } else if (c == '-') { + sign = -1; + } + } - try { // try-catch for "GMT" only time zone string - char c = text.charAt(pos.index); - if (c == '+') { - sign = 1; - } else if (c == '-') { - sign = -1; - } - } - catch(StringIndexOutOfBoundsException e) {} + if (sign == 0) { /* "GMT" without offset */ + calb.set(Calendar.ZONE_OFFSET, 0) + .set(Calendar.DST_OFFSET, 0); + return pos.index; + } - if (sign == 0) { /* "GMT" without offset */ - calb.set(Calendar.ZONE_OFFSET, 0); - return pos.index; - } - - // Look for hours. - try { - char c = text.charAt(++pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - num = c - '0'; - - if (text.charAt(++pos.index) != ':') { - c = text.charAt(pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - num *= 10; - num += c - '0'; - pos.index++; - } - if (num > 23) { - --pos.index; - break parsing; - } - if (text.charAt(pos.index) != ':') { - break parsing; - } - - // Look for minutes. - offset = num * 60; - c = text.charAt(++pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - num = c - '0'; - c = text.charAt(++pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - num *= 10; - num += c - '0'; - - if (num > 59) { - break parsing; - } - } catch (StringIndexOutOfBoundsException e) { - break parsing; - } - offset += num; - // Fall through for final processing below of 'offset' and 'sign'. - } else { - // If the first character is a sign, look for numeric timezones of - // the form [+-]hhmm as specified by RFC 822. Otherwise, check - // for named time zones by looking through the locale data from - // the TimeZoneNames strings. - try { - char c = text.charAt(pos.index); - if (c == '+') { - sign = 1; - } else if (c == '-') { - sign = -1; - } else { - // Try parsing the text as a time zone name (abbr). - int i = subParseZoneString(text, pos.index, calb); - if (i != 0) { + // Parse the rest as "hh:mm" + int i = subParseNumericZone(text, ++pos.index, + sign, 0, true, calb); + if (i > 0) { return i; } - break parsing; + pos.index = -i; + } else { + // Try parsing the text as a time zone + // name or abbreviation. + int i = subParseZoneString(text, pos.index, calb); + if (i > 0) { + return i; + } + pos.index = -i; } - - // Parse the text as an RFC 822 time zone string. This code is - // actually a little more permissive than RFC 822. It will - // try to do its best with numbers that aren't strictly 4 - // digits long. - - // Look for hh. - int hours = 0; - c = text.charAt(++pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; + } else { + // Parse the rest as "hhmm" (RFC 822) + int i = subParseNumericZone(text, ++pos.index, + sign, 0, false, calb); + if (i > 0) { + return i; } - hours = c - '0'; - c = text.charAt(++pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - hours *= 10; - hours += c - '0'; - - if (hours > 23) { - break parsing; - } - - // Look for mm. - int minutes = 0; - c = text.charAt(++pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - minutes = c - '0'; - c = text.charAt(++pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - minutes *= 10; - minutes += c - '0'; - - if (minutes > 59) { - break parsing; - } - - offset = hours * 60 + minutes; - } catch (StringIndexOutOfBoundsException e) { - break parsing; + pos.index = -i; } - } - - // Do the final processing for both of the above cases. We only - // arrive here if the form GMT+/-... or an RFC 822 form was seen. - if (sign != 0) { - offset *= MILLIS_PER_MINUTE * sign; - calb.set(Calendar.ZONE_OFFSET, offset).set(Calendar.DST_OFFSET, 0); - return ++pos.index; + } catch (IndexOutOfBoundsException e) { } } break parsing; case PATTERN_ISO_ZONE: // 'X' { - int sign = 0; - int offset = 0; - - iso8601: { - try { - char c = text.charAt(pos.index); - if (c == 'Z') { - calb.set(Calendar.ZONE_OFFSET, 0).set(Calendar.DST_OFFSET, 0); - return ++pos.index; - } - - // parse text as "+/-hh[[:]mm]" based on count - if (c == '+') { - sign = 1; - } else if (c == '-') { - sign = -1; - } - // Look for hh. - int hours = 0; - c = text.charAt(++pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - hours = c - '0'; - c = text.charAt(++pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - hours *= 10; - hours += c - '0'; - if (hours > 23) { - break parsing; - } - - if (count == 1) { // "X" - offset = hours * 60; - break iso8601; - } - - c = text.charAt(++pos.index); - // Skip ':' if "XXX" - if (c == ':') { - if (count == 2) { - break parsing; - } - c = text.charAt(++pos.index); - } else { - if (count == 3) { - // missing ':' - break parsing; - } - } - - // Look for mm. - int minutes = 0; - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - minutes = c - '0'; - c = text.charAt(++pos.index); - if (c < '0' || c > '9') { /* must be from '0' to '9'. */ - break parsing; - } - minutes *= 10; - minutes += c - '0'; - - if (minutes > 59) { - break parsing; - } - - offset = hours * 60 + minutes; - } catch (StringIndexOutOfBoundsException e) { - break parsing; - } + if ((text.length() - pos.index) <= 0) { + break parsing; } - // Do the final processing for both of the above cases. We only - // arrive here if the form GMT+/-... or an RFC 822 form was seen. - if (sign != 0) { - offset *= MILLIS_PER_MINUTE * sign; - calb.set(Calendar.ZONE_OFFSET, offset).set(Calendar.DST_OFFSET, 0); + int sign = 0; + char c = text.charAt(pos.index); + if (c == 'Z') { + calb.set(Calendar.ZONE_OFFSET, 0).set(Calendar.DST_OFFSET, 0); return ++pos.index; } + + // parse text as "+/-hh[[:]mm]" based on count + if (c == '+') { + sign = 1; + } else if (c == '-') { + sign = -1; + } else { + ++pos.index; + break parsing; + } + int i = subParseNumericZone(text, ++pos.index, sign, count, + count == 3, calb); + if (i > 0) { + return i; + } + pos.index = -i; } break parsing;
--- a/src/share/classes/java/util/AbstractList.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/AbstractList.java Thu Jan 13 15:03:27 2011 -0800 @@ -482,8 +482,8 @@ */ public List<E> subList(int fromIndex, int toIndex) { return (this instanceof RandomAccess ? - new RandomAccessSubList<E>(this, fromIndex, toIndex) : - new SubList<E>(this, fromIndex, toIndex)); + new RandomAccessSubList<>(this, fromIndex, toIndex) : + new SubList<>(this, fromIndex, toIndex)); } // Comparison and hashing @@ -747,7 +747,7 @@ } public List<E> subList(int fromIndex, int toIndex) { - return new SubList<E>(this, fromIndex, toIndex); + return new SubList<>(this, fromIndex, toIndex); } private void rangeCheck(int index) { @@ -776,6 +776,6 @@ } public List<E> subList(int fromIndex, int toIndex) { - return new RandomAccessSubList<E>(this, fromIndex, toIndex); + return new RandomAccessSubList<>(this, fromIndex, toIndex); } }
--- a/src/share/classes/java/util/Arrays.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/Arrays.java Thu Jan 13 15:03:27 2011 -0800 @@ -2824,7 +2824,7 @@ * @return a list view of the specified array */ public static <T> List<T> asList(T... a) { - return new ArrayList<T>(a); + return new ArrayList<>(a); } /**
--- a/src/share/classes/java/util/Collections.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/Collections.java Thu Jan 13 15:03:27 2011 -0800 @@ -1035,7 +1035,7 @@ * @return an unmodifiable view of the specified collection. */ public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) { - return new UnmodifiableCollection<T>(c); + return new UnmodifiableCollection<>(c); } /** @@ -1109,7 +1109,7 @@ * @return an unmodifiable view of the specified set. */ public static <T> Set<T> unmodifiableSet(Set<? extends T> s) { - return new UnmodifiableSet<T>(s); + return new UnmodifiableSet<>(s); } /** @@ -1141,7 +1141,7 @@ * @return an unmodifiable view of the specified sorted set. */ public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s) { - return new UnmodifiableSortedSet<T>(s); + return new UnmodifiableSortedSet<>(s); } /** @@ -1158,13 +1158,13 @@ public Comparator<? super E> comparator() {return ss.comparator();} public SortedSet<E> subSet(E fromElement, E toElement) { - return new UnmodifiableSortedSet<E>(ss.subSet(fromElement,toElement)); + return new UnmodifiableSortedSet<>(ss.subSet(fromElement,toElement)); } public SortedSet<E> headSet(E toElement) { - return new UnmodifiableSortedSet<E>(ss.headSet(toElement)); + return new UnmodifiableSortedSet<>(ss.headSet(toElement)); } public SortedSet<E> tailSet(E fromElement) { - return new UnmodifiableSortedSet<E>(ss.tailSet(fromElement)); + return new UnmodifiableSortedSet<>(ss.tailSet(fromElement)); } public E first() {return ss.first();} @@ -1188,8 +1188,8 @@ */ public static <T> List<T> unmodifiableList(List<? extends T> list) { return (list instanceof RandomAccess ? - new UnmodifiableRandomAccessList<T>(list) : - new UnmodifiableList<T>(list)); + new UnmodifiableRandomAccessList<>(list) : + new UnmodifiableList<>(list)); } /** @@ -1250,7 +1250,7 @@ } public List<E> subList(int fromIndex, int toIndex) { - return new UnmodifiableList<E>(list.subList(fromIndex, toIndex)); + return new UnmodifiableList<>(list.subList(fromIndex, toIndex)); } /** @@ -1267,7 +1267,7 @@ */ private Object readResolve() { return (list instanceof RandomAccess - ? new UnmodifiableRandomAccessList<E>(list) + ? new UnmodifiableRandomAccessList<>(list) : this); } } @@ -1283,7 +1283,7 @@ } public List<E> subList(int fromIndex, int toIndex) { - return new UnmodifiableRandomAccessList<E>( + return new UnmodifiableRandomAccessList<>( list.subList(fromIndex, toIndex)); } @@ -1296,7 +1296,7 @@ * deserialization. */ private Object writeReplace() { - return new UnmodifiableList<E>(list); + return new UnmodifiableList<>(list); } } @@ -1315,7 +1315,7 @@ * @return an unmodifiable view of the specified map. */ public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) { - return new UnmodifiableMap<K,V>(m); + return new UnmodifiableMap<>(m); } /** @@ -1363,7 +1363,7 @@ public Set<Map.Entry<K,V>> entrySet() { if (entrySet==null) - entrySet = new UnmodifiableEntrySet<K,V>(m.entrySet()); + entrySet = new UnmodifiableEntrySet<>(m.entrySet()); return entrySet; } @@ -1400,7 +1400,7 @@ return i.hasNext(); } public Map.Entry<K,V> next() { - return new UnmodifiableEntry<K,V>(i.next()); + return new UnmodifiableEntry<>(i.next()); } public void remove() { throw new UnsupportedOperationException(); @@ -1411,7 +1411,7 @@ public Object[] toArray() { Object[] a = c.toArray(); for (int i=0; i<a.length; i++) - a[i] = new UnmodifiableEntry<K,V>((Map.Entry<K,V>)a[i]); + a[i] = new UnmodifiableEntry<>((Map.Entry<K,V>)a[i]); return a; } @@ -1422,7 +1422,7 @@ Object[] arr = c.toArray(a.length==0 ? a : Arrays.copyOf(a, 0)); for (int i=0; i<arr.length; i++) - arr[i] = new UnmodifiableEntry<K,V>((Map.Entry<K,V>)arr[i]); + arr[i] = new UnmodifiableEntry<>((Map.Entry<K,V>)arr[i]); if (arr.length > a.length) return (T[])arr; @@ -1443,7 +1443,7 @@ if (!(o instanceof Map.Entry)) return false; return c.contains( - new UnmodifiableEntry<Object,Object>((Map.Entry<?,?>) o)); + new UnmodifiableEntry<>((Map.Entry<?,?>) o)); } /** @@ -1517,7 +1517,7 @@ * @return an unmodifiable view of the specified sorted map. */ public static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K, ? extends V> m) { - return new UnmodifiableSortedMap<K,V>(m); + return new UnmodifiableSortedMap<>(m); } /** @@ -1535,13 +1535,13 @@ public Comparator<? super K> comparator() {return sm.comparator();} public SortedMap<K,V> subMap(K fromKey, K toKey) { - return new UnmodifiableSortedMap<K,V>(sm.subMap(fromKey, toKey)); + return new UnmodifiableSortedMap<>(sm.subMap(fromKey, toKey)); } public SortedMap<K,V> headMap(K toKey) { - return new UnmodifiableSortedMap<K,V>(sm.headMap(toKey)); + return new UnmodifiableSortedMap<>(sm.headMap(toKey)); } public SortedMap<K,V> tailMap(K fromKey) { - return new UnmodifiableSortedMap<K,V>(sm.tailMap(fromKey)); + return new UnmodifiableSortedMap<>(sm.tailMap(fromKey)); } public K firstKey() {return sm.firstKey();} @@ -1583,11 +1583,11 @@ * @return a synchronized view of the specified collection. */ public static <T> Collection<T> synchronizedCollection(Collection<T> c) { - return new SynchronizedCollection<T>(c); + return new SynchronizedCollection<>(c); } static <T> Collection<T> synchronizedCollection(Collection<T> c, Object mutex) { - return new SynchronizedCollection<T>(c, mutex); + return new SynchronizedCollection<>(c, mutex); } /** @@ -1686,11 +1686,11 @@ * @return a synchronized view of the specified set. */ public static <T> Set<T> synchronizedSet(Set<T> s) { - return new SynchronizedSet<T>(s); + return new SynchronizedSet<>(s); } static <T> Set<T> synchronizedSet(Set<T> s, Object mutex) { - return new SynchronizedSet<T>(s, mutex); + return new SynchronizedSet<>(s, mutex); } /** @@ -1754,7 +1754,7 @@ * @return a synchronized view of the specified sorted set. */ public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s) { - return new SynchronizedSortedSet<T>(s); + return new SynchronizedSortedSet<>(s); } /** @@ -1783,18 +1783,18 @@ public SortedSet<E> subSet(E fromElement, E toElement) { synchronized (mutex) { - return new SynchronizedSortedSet<E>( + return new SynchronizedSortedSet<>( ss.subSet(fromElement, toElement), mutex); } } public SortedSet<E> headSet(E toElement) { synchronized (mutex) { - return new SynchronizedSortedSet<E>(ss.headSet(toElement), mutex); + return new SynchronizedSortedSet<>(ss.headSet(toElement), mutex); } } public SortedSet<E> tailSet(E fromElement) { synchronized (mutex) { - return new SynchronizedSortedSet<E>(ss.tailSet(fromElement),mutex); + return new SynchronizedSortedSet<>(ss.tailSet(fromElement),mutex); } } @@ -1833,14 +1833,14 @@ */ public static <T> List<T> synchronizedList(List<T> list) { return (list instanceof RandomAccess ? - new SynchronizedRandomAccessList<T>(list) : - new SynchronizedList<T>(list)); + new SynchronizedRandomAccessList<>(list) : + new SynchronizedList<>(list)); } static <T> List<T> synchronizedList(List<T> list, Object mutex) { return (list instanceof RandomAccess ? - new SynchronizedRandomAccessList<T>(list, mutex) : - new SynchronizedList<T>(list, mutex)); + new SynchronizedRandomAccessList<>(list, mutex) : + new SynchronizedList<>(list, mutex)); } /** @@ -1903,7 +1903,7 @@ public List<E> subList(int fromIndex, int toIndex) { synchronized (mutex) { - return new SynchronizedList<E>(list.subList(fromIndex, toIndex), + return new SynchronizedList<>(list.subList(fromIndex, toIndex), mutex); } } @@ -1922,7 +1922,7 @@ */ private Object readResolve() { return (list instanceof RandomAccess - ? new SynchronizedRandomAccessList<E>(list) + ? new SynchronizedRandomAccessList<>(list) : this); } } @@ -1944,7 +1944,7 @@ public List<E> subList(int fromIndex, int toIndex) { synchronized (mutex) { - return new SynchronizedRandomAccessList<E>( + return new SynchronizedRandomAccessList<>( list.subList(fromIndex, toIndex), mutex); } } @@ -1958,7 +1958,7 @@ * deserialization. */ private Object writeReplace() { - return new SynchronizedList<E>(list); + return new SynchronizedList<>(list); } } @@ -1990,7 +1990,7 @@ * @return a synchronized view of the specified map. */ public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { - return new SynchronizedMap<K,V>(m); + return new SynchronizedMap<>(m); } /** @@ -2051,7 +2051,7 @@ public Set<K> keySet() { synchronized (mutex) { if (keySet==null) - keySet = new SynchronizedSet<K>(m.keySet(), mutex); + keySet = new SynchronizedSet<>(m.keySet(), mutex); return keySet; } } @@ -2059,7 +2059,7 @@ public Set<Map.Entry<K,V>> entrySet() { synchronized (mutex) { if (entrySet==null) - entrySet = new SynchronizedSet<Map.Entry<K,V>>(m.entrySet(), mutex); + entrySet = new SynchronizedSet<>(m.entrySet(), mutex); return entrySet; } } @@ -2067,7 +2067,7 @@ public Collection<V> values() { synchronized (mutex) { if (values==null) - values = new SynchronizedCollection<V>(m.values(), mutex); + values = new SynchronizedCollection<>(m.values(), mutex); return values; } } @@ -2129,7 +2129,7 @@ * @return a synchronized view of the specified sorted map. */ public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m) { - return new SynchronizedSortedMap<K,V>(m); + return new SynchronizedSortedMap<>(m); } @@ -2159,18 +2159,18 @@ public SortedMap<K,V> subMap(K fromKey, K toKey) { synchronized (mutex) { - return new SynchronizedSortedMap<K,V>( + return new SynchronizedSortedMap<>( sm.subMap(fromKey, toKey), mutex); } } public SortedMap<K,V> headMap(K toKey) { synchronized (mutex) { - return new SynchronizedSortedMap<K,V>(sm.headMap(toKey), mutex); + return new SynchronizedSortedMap<>(sm.headMap(toKey), mutex); } } public SortedMap<K,V> tailMap(K fromKey) { synchronized (mutex) { - return new SynchronizedSortedMap<K,V>(sm.tailMap(fromKey),mutex); + return new SynchronizedSortedMap<>(sm.tailMap(fromKey),mutex); } } @@ -2246,7 +2246,7 @@ */ public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type) { - return new CheckedCollection<E>(c, type); + return new CheckedCollection<>(c, type); } @SuppressWarnings("unchecked") @@ -2378,7 +2378,7 @@ * @since 1.5 */ public static <E> Set<E> checkedSet(Set<E> s, Class<E> type) { - return new CheckedSet<E>(s, type); + return new CheckedSet<>(s, type); } /** @@ -2424,7 +2424,7 @@ */ public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s, Class<E> type) { - return new CheckedSortedSet<E>(s, type); + return new CheckedSortedSet<>(s, type); } /** @@ -2484,8 +2484,8 @@ */ public static <E> List<E> checkedList(List<E> list, Class<E> type) { return (list instanceof RandomAccess ? - new CheckedRandomAccessList<E>(list, type) : - new CheckedList<E>(list, type)); + new CheckedRandomAccessList<>(list, type) : + new CheckedList<>(list, type)); } /** @@ -2550,7 +2550,7 @@ } public List<E> subList(int fromIndex, int toIndex) { - return new CheckedList<E>(list.subList(fromIndex, toIndex), type); + return new CheckedList<>(list.subList(fromIndex, toIndex), type); } } @@ -2567,7 +2567,7 @@ } public List<E> subList(int fromIndex, int toIndex) { - return new CheckedRandomAccessList<E>( + return new CheckedRandomAccessList<>( list.subList(fromIndex, toIndex), type); } } @@ -2609,7 +2609,7 @@ public static <K, V> Map<K, V> checkedMap(Map<K, V> m, Class<K> keyType, Class<V> valueType) { - return new CheckedMap<K,V>(m, keyType, valueType); + return new CheckedMap<>(m, keyType, valueType); } @@ -2677,15 +2677,14 @@ // - protection from malicious t // - correct behavior if t is a concurrent map Object[] entries = t.entrySet().toArray(); - List<Map.Entry<K,V>> checked = - new ArrayList<Map.Entry<K,V>>(entries.length); + List<Map.Entry<K,V>> checked = new ArrayList<>(entries.length); for (Object o : entries) { Map.Entry<?,?> e = (Map.Entry<?,?>) o; Object k = e.getKey(); Object v = e.getValue(); typeCheck(k, v); checked.add( - new AbstractMap.SimpleImmutableEntry<K,V>((K) k, (V) v)); + new AbstractMap.SimpleImmutableEntry<>((K) k, (V) v)); } for (Map.Entry<K,V> e : checked) m.put(e.getKey(), e.getValue()); @@ -2695,7 +2694,7 @@ public Set<Map.Entry<K,V>> entrySet() { if (entrySet==null) - entrySet = new CheckedEntrySet<K,V>(m.entrySet(), valueType); + entrySet = new CheckedEntrySet<>(m.entrySet(), valueType); return entrySet; } @@ -2810,7 +2809,7 @@ if (!(o instanceof Map.Entry)) return false; return s.remove(new AbstractMap.SimpleImmutableEntry - <Object, Object>((Map.Entry<?,?>)o)); + <>((Map.Entry<?,?>)o)); } public boolean removeAll(Collection<?> c) { @@ -2843,7 +2842,7 @@ static <K,V,T> CheckedEntry<K,V,T> checkedEntry(Map.Entry<K,V> e, Class<T> valueType) { - return new CheckedEntry<K,V,T>(e, valueType); + return new CheckedEntry<>(e, valueType); } /** @@ -2884,7 +2883,7 @@ if (!(o instanceof Map.Entry)) return false; return e.equals(new AbstractMap.SimpleImmutableEntry - <Object, Object>((Map.Entry<?,?>)o)); + <>((Map.Entry<?,?>)o)); } } } @@ -2927,7 +2926,7 @@ public static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K, V> m, Class<K> keyType, Class<V> valueType) { - return new CheckedSortedMap<K,V>(m, keyType, valueType); + return new CheckedSortedMap<>(m, keyType, valueType); } /** @@ -2993,7 +2992,7 @@ private static class EmptyIterator<E> implements Iterator<E> { static final EmptyIterator<Object> EMPTY_ITERATOR - = new EmptyIterator<Object>(); + = new EmptyIterator<>(); public boolean hasNext() { return false; } public E next() { throw new NoSuchElementException(); } @@ -3042,7 +3041,7 @@ implements ListIterator<E> { static final EmptyListIterator<Object> EMPTY_ITERATOR - = new EmptyListIterator<Object>(); + = new EmptyListIterator<>(); public boolean hasPrevious() { return false; } public E previous() { throw new NoSuchElementException(); } @@ -3078,7 +3077,7 @@ private static class EmptyEnumeration<E> implements Enumeration<E> { static final EmptyEnumeration<Object> EMPTY_ENUMERATION - = new EmptyEnumeration<Object>(); + = new EmptyEnumeration<>(); public boolean hasMoreElements() { return false; } public E nextElement() { throw new NoSuchElementException(); } @@ -3090,7 +3089,7 @@ * @see #emptySet() */ @SuppressWarnings("unchecked") - public static final Set EMPTY_SET = new EmptySet<Object>(); + public static final Set EMPTY_SET = new EmptySet<>(); /** * Returns the empty set (immutable). This set is serializable. @@ -3150,7 +3149,7 @@ * @see #emptyList() */ @SuppressWarnings("unchecked") - public static final List EMPTY_LIST = new EmptyList<Object>(); + public static final List EMPTY_LIST = new EmptyList<>(); /** * Returns the empty list (immutable). This list is serializable. @@ -3224,7 +3223,7 @@ * @since 1.3 */ @SuppressWarnings("unchecked") - public static final Map EMPTY_MAP = new EmptyMap<Object,Object>(); + public static final Map EMPTY_MAP = new EmptyMap<>(); /** * Returns the empty map (immutable). This map is serializable. @@ -3286,7 +3285,7 @@ * @return an immutable set containing only the specified object. */ public static <T> Set<T> singleton(T o) { - return new SingletonSet<T>(o); + return new SingletonSet<>(o); } static <E> Iterator<E> singletonIterator(final E e) { @@ -3339,7 +3338,7 @@ * @since 1.3 */ public static <T> List<T> singletonList(T o) { - return new SingletonList<T>(o); + return new SingletonList<>(o); } /** @@ -3381,7 +3380,7 @@ * @since 1.3 */ public static <K,V> Map<K,V> singletonMap(K key, V value) { - return new SingletonMap<K,V>(key, value); + return new SingletonMap<>(key, value); } /** @@ -3423,7 +3422,7 @@ public Set<Map.Entry<K,V>> entrySet() { if (entrySet==null) entrySet = Collections.<Map.Entry<K,V>>singleton( - new SimpleImmutableEntry<K,V>(k, v)); + new SimpleImmutableEntry<>(k, v)); return entrySet; } @@ -3455,7 +3454,7 @@ public static <T> List<T> nCopies(int n, T o) { if (n < 0) throw new IllegalArgumentException("List length = " + n); - return new CopiesList<T>(n, o); + return new CopiesList<>(n, o); } /** @@ -3529,7 +3528,7 @@ if (fromIndex > toIndex) throw new IllegalArgumentException("fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")"); - return new CopiesList<E>(toIndex - fromIndex, element); + return new CopiesList<>(toIndex - fromIndex, element); } } @@ -3595,7 +3594,7 @@ if (cmp instanceof ReverseComparator2) return ((ReverseComparator2<T>)cmp).cmp; - return new ReverseComparator2<T>(cmp); + return new ReverseComparator2<>(cmp); } /** @@ -3674,7 +3673,7 @@ * @see ArrayList */ public static <T> ArrayList<T> list(Enumeration<T> e) { - ArrayList<T> l = new ArrayList<T>(); + ArrayList<T> l = new ArrayList<>(); while (e.hasMoreElements()) l.add(e.nextElement()); return l; @@ -3819,7 +3818,7 @@ * @since 1.6 */ public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) { - return new SetFromMap<E>(map); + return new SetFromMap<>(map); } /** @@ -3883,7 +3882,7 @@ * @since 1.6 */ public static <T> Queue<T> asLifoQueue(Deque<T> deque) { - return new AsLIFOQueue<T>(deque); + return new AsLIFOQueue<>(deque); } /**
--- a/src/share/classes/java/util/EnumMap.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/EnumMap.java Thu Jan 13 15:03:27 2011 -0800 @@ -499,7 +499,7 @@ int j = 0; for (int i = 0; i < vals.length; i++) if (vals[i] != null) - a[j++] = new AbstractMap.SimpleEntry<K,V>( + a[j++] = new AbstractMap.SimpleEntry<>( keyUniverse[i], unmaskNull(vals[i])); return a; }
--- a/src/share/classes/java/util/EnumSet.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/EnumSet.java Thu Jan 13 15:03:27 2011 -0800 @@ -110,9 +110,9 @@ throw new ClassCastException(elementType + " not an enum"); if (universe.length <= 64) - return new RegularEnumSet<E>(elementType, universe); + return new RegularEnumSet<>(elementType, universe); else - return new JumboEnumSet<E>(elementType, universe); + return new JumboEnumSet<>(elementType, universe); } /** @@ -430,7 +430,7 @@ } Object writeReplace() { - return new SerializationProxy<E>(this); + return new SerializationProxy<>(this); } // readObject method for the serialization proxy pattern
--- a/src/share/classes/java/util/Formatter.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/Formatter.java Thu Jan 13 15:03:27 2011 -0800 @@ -2490,7 +2490,7 @@ * Finds format specifiers in the format string. */ private FormatString[] parse(String s) { - ArrayList<FormatString> al = new ArrayList<FormatString>(); + ArrayList<FormatString> al = new ArrayList<>(); Matcher m = fsPattern.matcher(s); for (int i = 0, len = s.length(); i < len; ) { if (m.find(i)) {
--- a/src/share/classes/java/util/HashMap.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/HashMap.java Thu Jan 13 15:03:27 2011 -0800 @@ -763,7 +763,7 @@ */ void addEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; - table[bucketIndex] = new Entry<K,V>(hash, key, value, e); + table[bucketIndex] = new Entry<>(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length); } @@ -778,7 +778,7 @@ */ void createEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; - table[bucketIndex] = new Entry<K,V>(hash, key, value, e); + table[bucketIndex] = new Entry<>(hash, key, value, e); size++; }
--- a/src/share/classes/java/util/HashSet.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/HashSet.java Thu Jan 13 15:03:27 2011 -0800 @@ -100,7 +100,7 @@ * default initial capacity (16) and load factor (0.75). */ public HashSet() { - map = new HashMap<E,Object>(); + map = new HashMap<>(); } /** @@ -113,7 +113,7 @@ * @throws NullPointerException if the specified collection is null */ public HashSet(Collection<? extends E> c) { - map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); + map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } @@ -127,7 +127,7 @@ * than zero, or if the load factor is nonpositive */ public HashSet(int initialCapacity, float loadFactor) { - map = new HashMap<E,Object>(initialCapacity, loadFactor); + map = new HashMap<>(initialCapacity, loadFactor); } /** @@ -139,7 +139,7 @@ * than zero */ public HashSet(int initialCapacity) { - map = new HashMap<E,Object>(initialCapacity); + map = new HashMap<>(initialCapacity); } /** @@ -156,7 +156,7 @@ * than zero, or if the load factor is nonpositive */ HashSet(int initialCapacity, float loadFactor, boolean dummy) { - map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor); + map = new LinkedHashMap<>(initialCapacity, loadFactor); } /**
--- a/src/share/classes/java/util/Hashtable.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/Hashtable.java Thu Jan 13 15:03:27 2011 -0800 @@ -455,7 +455,7 @@ // Creates the new entry. Entry<K,V> e = tab[index]; - tab[index] = new Entry<K,V>(hash, key, value, e); + tab[index] = new Entry<>(hash, key, value, e); count++; return null; } @@ -579,7 +579,7 @@ if (count == 0) { return Collections.emptyEnumeration(); } else { - return new Enumerator<T>(type, false); + return new Enumerator<>(type, false); } } @@ -587,7 +587,7 @@ if (count == 0) { return Collections.emptyIterator(); } else { - return new Enumerator<T>(type, true); + return new Enumerator<>(type, true); } } @@ -929,7 +929,7 @@ } // Creates the new entry. Entry<K,V> e = tab[index]; - tab[index] = new Entry<K,V>(hash, key, value, e); + tab[index] = new Entry<>(hash, key, value, e); count++; } @@ -950,7 +950,7 @@ } protected Object clone() { - return new Entry<K,V>(hash, key, value, + return new Entry<>(hash, key, value, (next==null ? null : (Entry<K,V>) next.clone())); }
--- a/src/share/classes/java/util/IdentityHashMap.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/IdentityHashMap.java Thu Jan 13 15:03:27 2011 -0800 @@ -1134,7 +1134,7 @@ Object[] result = new Object[size]; Iterator<Map.Entry<K,V>> it = iterator(); for (int i = 0; i < size; i++) - result[i] = new AbstractMap.SimpleEntry<K,V>(it.next()); + result[i] = new AbstractMap.SimpleEntry<>(it.next()); return result; } @@ -1146,7 +1146,7 @@ .newInstance(a.getClass().getComponentType(), size); Iterator<Map.Entry<K,V>> it = iterator(); for (int i = 0; i < size; i++) - a[i] = (T) new AbstractMap.SimpleEntry<K,V>(it.next()); + a[i] = (T) new AbstractMap.SimpleEntry<>(it.next()); if (a.length > size) a[size] = null; return a;
--- a/src/share/classes/java/util/JumboEnumSet.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/JumboEnumSet.java Thu Jan 13 15:03:27 2011 -0800 @@ -89,7 +89,7 @@ * @return an iterator over the elements contained in this set */ public Iterator<E> iterator() { - return new EnumSetIterator<E>(); + return new EnumSetIterator<>(); } private class EnumSetIterator<E extends Enum<E>> implements Iterator<E> {
--- a/src/share/classes/java/util/LinkedHashMap.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/LinkedHashMap.java Thu Jan 13 15:03:27 2011 -0800 @@ -237,7 +237,7 @@ * the chain. */ void init() { - header = new Entry<K,V>(-1, null, null, null); + header = new Entry<>(-1, null, null, null); header.before = header.after = header; } @@ -438,7 +438,7 @@ */ void createEntry(int hash, K key, V value, int bucketIndex) { HashMap.Entry<K,V> old = table[bucketIndex]; - Entry<K,V> e = new Entry<K,V>(hash, key, value, old); + Entry<K,V> e = new Entry<>(hash, key, value, old); table[bucketIndex] = e; e.addBefore(header); size++;
--- a/src/share/classes/java/util/LinkedList.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/LinkedList.java Thu Jan 13 15:03:27 2011 -0800 @@ -122,7 +122,7 @@ */ private void linkFirst(E e) { final Node<E> f = first; - final Node<E> newNode = new Node<E>(null, e, f); + final Node<E> newNode = new Node<>(null, e, f); first = newNode; if (f == null) last = newNode; @@ -137,7 +137,7 @@ */ void linkLast(E e) { final Node<E> l = last; - final Node<E> newNode = new Node<E>(l, e, null); + final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; @@ -153,7 +153,7 @@ void linkBefore(E e, Node<E> succ) { // assert succ != null; final Node<E> pred = succ.prev; - final Node<E> newNode = new Node<E>(pred, e, succ); + final Node<E> newNode = new Node<>(pred, e, succ); succ.prev = newNode; if (pred == null) first = newNode; @@ -419,7 +419,7 @@ for (Object o : a) { @SuppressWarnings("unchecked") E e = (E) o; - Node<E> newNode = new Node<E>(pred, e, null); + Node<E> newNode = new Node<>(pred, e, null); if (pred == null) first = newNode; else
--- a/src/share/classes/java/util/ListResourceBundle.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/ListResourceBundle.java Thu Jan 13 15:03:27 2011 -0800 @@ -187,7 +187,7 @@ return; Object[][] contents = getContents(); - HashMap<String,Object> temp = new HashMap<String,Object>(contents.length); + HashMap<String,Object> temp = new HashMap<>(contents.length); for (int i = 0; i < contents.length; ++i) { // key must be non-null String, value must be non-null String key = (String) contents[i][0];
--- a/src/share/classes/java/util/Locale.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/Locale.java Thu Jan 13 15:03:27 2011 -0800 @@ -1449,10 +1449,15 @@ * three-letter language abbreviation is not available for this locale. */ public String getISO3Language() throws MissingResourceException { - String language3 = getISO3Code(_baseLocale.getLanguage(), LocaleISOData.isoLanguageTable); + String lang = _baseLocale.getLanguage(); + if (lang.length() == 3) { + return lang; + } + + String language3 = getISO3Code(lang, LocaleISOData.isoLanguageTable); if (language3 == null) { throw new MissingResourceException("Couldn't find 3-letter language code for " - + _baseLocale.getLanguage(), "FormatData_" + toString(), "ShortLanguage"); + + lang, "FormatData_" + toString(), "ShortLanguage"); } return language3; }
--- a/src/share/classes/java/util/PriorityQueue.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/PriorityQueue.java Thu Jan 13 15:03:27 2011 -0800 @@ -538,7 +538,7 @@ cursor--; else { if (forgetMeNot == null) - forgetMeNot = new ArrayDeque<E>(); + forgetMeNot = new ArrayDeque<>(); forgetMeNot.add(moved); } } else if (lastRetElt != null) {
--- a/src/share/classes/java/util/Properties.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/Properties.java Thu Jan 13 15:03:27 2011 -0800 @@ -1011,7 +1011,7 @@ * @since 1.6 */ public Set<String> stringPropertyNames() { - Hashtable<String, String> h = new Hashtable<String, String>(); + Hashtable<String, String> h = new Hashtable<>(); enumerateStringProperties(h); return h.keySet(); }
--- a/src/share/classes/java/util/RegularEnumSet.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/RegularEnumSet.java Thu Jan 13 15:03:27 2011 -0800 @@ -71,7 +71,7 @@ * @return an iterator over the elements contained in this set */ public Iterator<E> iterator() { - return new EnumSetIterator<E>(); + return new EnumSetIterator<>(); } private class EnumSetIterator<E extends Enum<E>> implements Iterator<E> {
--- a/src/share/classes/java/util/ServiceLoader.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/ServiceLoader.java Thu Jan 13 15:03:27 2011 -0800 @@ -191,7 +191,7 @@ private ClassLoader loader; // Cached providers, in instantiation order - private LinkedHashMap<String,S> providers = new LinkedHashMap<String,S>(); + private LinkedHashMap<String,S> providers = new LinkedHashMap<>(); // The current lazy-lookup iterator private LazyIterator lookupIterator; @@ -291,7 +291,7 @@ { InputStream in = null; BufferedReader r = null; - ArrayList<String> names = new ArrayList<String>(); + ArrayList<String> names = new ArrayList<>(); try { in = u.openStream(); r = new BufferedReader(new InputStreamReader(in, "utf-8")); @@ -463,7 +463,7 @@ public static <S> ServiceLoader<S> load(Class<S> service, ClassLoader loader) { - return new ServiceLoader<S>(service, loader); + return new ServiceLoader<>(service, loader); } /**
--- a/src/share/classes/java/util/TimSort.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/TimSort.java Thu Jan 13 15:03:27 2011 -0800 @@ -196,7 +196,7 @@ * extending short natural runs to minRun elements, and merging runs * to maintain stack invariant. */ - TimSort<T> ts = new TimSort<T>(a, c); + TimSort<T> ts = new TimSort<>(a, c); int minRun = minRunLength(nRemaining); do { // Identify next run
--- a/src/share/classes/java/util/TreeMap.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/TreeMap.java Thu Jan 13 15:03:27 2011 -0800 @@ -533,7 +533,7 @@ // throw NullPointerException // // compare(key, key); // type check - root = new Entry<K,V>(key, value, null); + root = new Entry<>(key, value, null); size = 1; modCount++; return null; @@ -569,7 +569,7 @@ return t.setValue(value); } while (t != null); } - Entry<K,V> e = new Entry<K,V>(key, value, parent); + Entry<K,V> e = new Entry<>(key, value, parent); if (cmp < 0) parent.left = e; else @@ -1069,14 +1069,14 @@ } public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) { - return new KeySet<E>(m.subMap(fromElement, fromInclusive, + return new KeySet<>(m.subMap(fromElement, fromInclusive, toElement, toInclusive)); } public NavigableSet<E> headSet(E toElement, boolean inclusive) { - return new KeySet<E>(m.headMap(toElement, inclusive)); + return new KeySet<>(m.headMap(toElement, inclusive)); } public NavigableSet<E> tailSet(E fromElement, boolean inclusive) { - return new KeySet<E>(m.tailMap(fromElement, inclusive)); + return new KeySet<>(m.tailMap(fromElement, inclusive)); } public SortedSet<E> subSet(E fromElement, E toElement) { return subSet(fromElement, true, toElement, false); @@ -1205,7 +1205,7 @@ */ static <K,V> Map.Entry<K,V> exportEntry(TreeMap.Entry<K,V> e) { return (e == null) ? null : - new AbstractMap.SimpleImmutableEntry<K,V>(e); + new AbstractMap.SimpleImmutableEntry<>(e); } /** @@ -2406,7 +2406,7 @@ value = (defaultVal != null ? defaultVal : (V) str.readObject()); } - Entry<K,V> middle = new Entry<K,V>(key, value, null); + Entry<K,V> middle = new Entry<>(key, value, null); // color nodes in non-full bottommost level red if (level == redLevel)
--- a/src/share/classes/java/util/TreeSet.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/TreeSet.java Thu Jan 13 15:03:27 2011 -0800 @@ -138,7 +138,7 @@ * ordering} of the elements will be used. */ public TreeSet(Comparator<? super E> comparator) { - this(new TreeMap<E,Object>(comparator)); + this(new TreeMap<>(comparator)); } /** @@ -195,7 +195,7 @@ * @since 1.6 */ public NavigableSet<E> descendingSet() { - return new TreeSet<E>(m.descendingMap()); + return new TreeSet<>(m.descendingMap()); } /** @@ -322,7 +322,7 @@ */ public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) { - return new TreeSet<E>(m.subMap(fromElement, fromInclusive, + return new TreeSet<>(m.subMap(fromElement, fromInclusive, toElement, toInclusive)); } @@ -335,7 +335,7 @@ * @since 1.6 */ public NavigableSet<E> headSet(E toElement, boolean inclusive) { - return new TreeSet<E>(m.headMap(toElement, inclusive)); + return new TreeSet<>(m.headMap(toElement, inclusive)); } /** @@ -347,7 +347,7 @@ * @since 1.6 */ public NavigableSet<E> tailSet(E fromElement, boolean inclusive) { - return new TreeSet<E>(m.tailMap(fromElement, inclusive)); + return new TreeSet<>(m.tailMap(fromElement, inclusive)); } /** @@ -477,7 +477,7 @@ throw new InternalError(); } - clone.m = new TreeMap<E,Object>(m); + clone.m = new TreeMap<>(m); return clone; } @@ -524,9 +524,9 @@ // Create backing TreeMap TreeMap<E,Object> tm; if (c==null) - tm = new TreeMap<E,Object>(); + tm = new TreeMap<>(); else - tm = new TreeMap<E,Object>(c); + tm = new TreeMap<>(c); m = tm; // Read in size
--- a/src/share/classes/java/util/WeakHashMap.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/WeakHashMap.java Thu Jan 13 15:03:27 2011 -0800 @@ -171,7 +171,7 @@ /** * Reference queue for cleared WeakEntries */ - private final ReferenceQueue<Object> queue = new ReferenceQueue<Object>(); + private final ReferenceQueue<Object> queue = new ReferenceQueue<>(); /** * The number of times this WeakHashMap has been structurally modified. @@ -439,7 +439,7 @@ modCount++; Entry<K,V> e = tab[i]; - tab[i] = new Entry<K,V>(k, value, queue, h, e); + tab[i] = new Entry<>(k, value, queue, h, e); if (++size >= threshold) resize(tab.length * 2); return null; @@ -955,10 +955,9 @@ } private List<Map.Entry<K,V>> deepCopy() { - List<Map.Entry<K,V>> list = - new ArrayList<Map.Entry<K,V>>(size()); + List<Map.Entry<K,V>> list = new ArrayList<>(size()); for (Map.Entry<K,V> e : this) - list.add(new AbstractMap.SimpleEntry<K,V>(e)); + list.add(new AbstractMap.SimpleEntry<>(e)); return list; }
--- a/src/share/classes/java/util/jar/Pack200.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/jar/Pack200.java Thu Jan 13 15:03:27 2011 -0800 @@ -732,14 +732,14 @@ private synchronized static Object newInstance(String prop) { String implName = "(unknown)"; try { - Class impl = (prop == PACK_PROVIDER)? packerImpl: unpackerImpl; + Class impl = (PACK_PROVIDER.equals(prop))? packerImpl: unpackerImpl; if (impl == null) { // The first time, we must decide which class to use. implName = java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction(prop,"")); if (implName != null && !implName.equals("")) impl = Class.forName(implName); - else if (prop == PACK_PROVIDER) + else if (PACK_PROVIDER.equals(prop)) impl = com.sun.java.util.jar.pack.PackerImpl.class; else impl = com.sun.java.util.jar.pack.UnpackerImpl.class;
--- a/src/share/classes/java/util/logging/FileHandler.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/logging/FileHandler.java Thu Jan 13 15:03:27 2011 -0800 @@ -127,7 +127,7 @@ private FileOutputStream lockStream; private File files[]; private static final int MAX_LOCKS = 100; - private static java.util.HashMap<String, String> locks = new java.util.HashMap<String, String>(); + private static java.util.HashMap<String, String> locks = new java.util.HashMap<>(); // A metered stream is a subclass of OutputStream that // (a) forwards all its output to a target stream
--- a/src/share/classes/java/util/logging/Level.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/logging/Level.java Thu Jan 13 15:03:27 2011 -0800 @@ -59,7 +59,7 @@ */ public class Level implements java.io.Serializable { - private static java.util.ArrayList<Level> known = new java.util.ArrayList<Level>(); + private static java.util.ArrayList<Level> known = new java.util.ArrayList<>(); private static String defaultBundle = "sun.util.logging.resources.logging"; /**
--- a/src/share/classes/java/util/logging/LogManager.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/logging/LogManager.java Thu Jan 13 15:03:27 2011 -0800 @@ -156,8 +156,7 @@ private final static Level defaultLevel = Level.INFO; // Table of named Loggers that maps names to Loggers. - private Hashtable<String,LoggerWeakRef> namedLoggers = - new Hashtable<String,LoggerWeakRef>(); + private Hashtable<String,LoggerWeakRef> namedLoggers = new Hashtable<>(); // Tree of named Loggers private LogNode root = new LogNode(null); private Logger rootLogger; @@ -422,7 +421,7 @@ // loggerRefQueue holds LoggerWeakRef objects for Logger objects // that have been GC'ed. private final ReferenceQueue<Logger> loggerRefQueue - = new ReferenceQueue<Logger>(); + = new ReferenceQueue<>(); // Package-level inner class. // Helper class for managing WeakReferences to Logger objects. @@ -672,7 +671,7 @@ name = ""; } if (node.children == null) { - node.children = new HashMap<String,LogNode>(); + node.children = new HashMap<>(); } LogNode child = node.children.get(head); if (child == null) { @@ -856,7 +855,7 @@ } hands = hands.trim(); int ix = 0; - Vector<String> result = new Vector<String>(); + Vector<String> result = new Vector<>(); while (ix < hands.length()) { int end = ix; while (end < hands.length()) {
--- a/src/share/classes/java/util/logging/LogRecord.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/logging/LogRecord.java Thu Jan 13 15:03:27 2011 -0800 @@ -85,8 +85,7 @@ private static final AtomicInteger nextThreadId = new AtomicInteger(MIN_SEQUENTIAL_THREAD_ID); - private static final ThreadLocal<Integer> threadIds - = new ThreadLocal<Integer>(); + private static final ThreadLocal<Integer> threadIds = new ThreadLocal<>(); /** * @serial Logging message level
--- a/src/share/classes/java/util/logging/Logger.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/logging/Logger.java Thu Jan 13 15:03:27 2011 -0800 @@ -170,7 +170,7 @@ private LogManager manager; private String name; private final CopyOnWriteArrayList<Handler> handlers = - new CopyOnWriteArrayList<Handler>(); + new CopyOnWriteArrayList<>(); private String resourceBundleName; private volatile boolean useParentHandlers = true; private volatile Filter filter; @@ -1420,13 +1420,13 @@ // Set our new parent. parent = newParent; if (parent.kids == null) { - parent.kids = new ArrayList<LogManager.LoggerWeakRef>(2); + parent.kids = new ArrayList<>(2); } if (ref == null) { // we didn't have a previous parent ref = manager.new LoggerWeakRef(this); } - ref.setParentRef(new WeakReference<Logger>(parent)); + ref.setParentRef(new WeakReference<>(parent)); parent.kids.add(ref); // As a result of the reparenting, the effective level
--- a/src/share/classes/java/util/logging/Logging.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/logging/Logging.java Thu Jan 13 15:03:27 2011 -0800 @@ -56,7 +56,7 @@ public List<String> getLoggerNames() { Enumeration loggers = logManager.getLoggerNames(); - ArrayList<String> array = new ArrayList<String>(); + ArrayList<String> array = new ArrayList<>(); for (; loggers.hasMoreElements();) { array.add((String) loggers.nextElement());
--- a/src/share/classes/java/util/prefs/AbstractPreferences.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/prefs/AbstractPreferences.java Thu Jan 13 15:03:27 2011 -0800 @@ -155,8 +155,7 @@ * All known unremoved children of this node. (This "cache" is consulted * prior to calling childSpi() or getChild(). */ - private Map<String, AbstractPreferences> kidCache - = new HashMap<String, AbstractPreferences>(); + private Map<String, AbstractPreferences> kidCache = new HashMap<>(); /** * This field is used to keep track of whether or not this node has @@ -713,7 +712,7 @@ if (removed) throw new IllegalStateException("Node has been removed."); - Set<String> s = new TreeSet<String>(kidCache.keySet()); + Set<String> s = new TreeSet<>(kidCache.keySet()); for (String kid : childrenNamesSpi()) s.add(kid); return s.toArray(EMPTY_STRING_ARRAY); @@ -1442,8 +1441,7 @@ * event delivery from preference activity, greatly simplifying * locking and reducing opportunity for deadlock. */ - private static final List<EventObject> eventQueue - = new LinkedList<EventObject>(); + private static final List<EventObject> eventQueue = new LinkedList<>(); /** * These two classes are used to distinguish NodeChangeEvents on
--- a/src/share/classes/java/util/regex/Pattern.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/regex/Pattern.java Thu Jan 13 15:03:27 2011 -0800 @@ -1068,7 +1068,7 @@ public String[] split(CharSequence input, int limit) { int index = 0; boolean matchLimited = limit > 0; - ArrayList<String> matchList = new ArrayList<String>(); + ArrayList<String> matchList = new ArrayList<>(); Matcher m = matcher(input); // Add segments before each match found @@ -1566,7 +1566,7 @@ Map<String, Integer> namedGroups() { if (namedGroups == null) - namedGroups = new HashMap<String, Integer>(2); + namedGroups = new HashMap<>(2); return namedGroups; } @@ -5309,7 +5309,7 @@ } private static final HashMap<String, CharPropertyFactory> map - = new HashMap<String, CharPropertyFactory>(); + = new HashMap<>(); static { // Unicode character property aliases, defined in
--- a/src/share/classes/java/util/zip/Inflater.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/zip/Inflater.java Thu Jan 13 15:03:27 2011 -0800 @@ -382,6 +382,12 @@ throw new NullPointerException("Inflater has been closed"); } + boolean ended() { + synchronized (zsRef) { + return zsRef.address() == 0; + } + } + private native static void initIDs(); private native static long init(boolean nowrap); private native static void setDictionary(long addr, byte[] b, int off,
--- a/src/share/classes/java/util/zip/ZipFile.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/zip/ZipFile.java Thu Jan 13 15:03:27 2011 -0800 @@ -424,6 +424,8 @@ */ private void releaseInflater(Inflater inf) { synchronized (inflaters) { + if (inf.ended()) + return; inf.reset(); inflaters.add(inf); } @@ -543,7 +545,7 @@ if (streams.size() !=0) { Set<InputStream> copy = streams; - streams = new HashSet<InputStream>(); + streams = new HashSet<>(); for (InputStream is: copy) is.close(); }
--- a/src/share/classes/java/util/zip/ZipOutputStream.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/java/util/zip/ZipOutputStream.java Thu Jan 13 15:03:27 2011 -0800 @@ -52,8 +52,8 @@ } private XEntry current; - private Vector<XEntry> xentries = new Vector<XEntry>(); - private HashSet<String> names = new HashSet<String>(); + private Vector<XEntry> xentries = new Vector<>(); + private HashSet<String> names = new HashSet<>(); private CRC32 crc = new CRC32(); private long written = 0; private long locoff = 0;
--- a/src/share/classes/javax/net/ssl/X509ExtendedTrustManager.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/javax/net/ssl/X509ExtendedTrustManager.java Thu Jan 13 15:03:27 2011 -0800 @@ -63,7 +63,7 @@ * should be "RSA". Checking is case-sensitive. * <p> * If the <code>socket</code> parameter is an instance of - * {@link javax.net.SSLSocket}, and the endpoint identification + * {@link javax.net.ssl.SSLSocket}, and the endpoint identification * algorithm of the <code>SSLParameters</code> is non-empty, to prevent * man-in-the-middle attacks, the address that the <code>socket</code> * connected to should be checked against the peer's identity presented @@ -71,7 +71,7 @@ * identification algorithm. * <p> * If the <code>socket</code> parameter is an instance of - * {@link javax.net.SSLSocket}, and the algorithm constraints of the + * {@link javax.net.ssl.SSLSocket}, and the algorithm constraints of the * <code>SSLParameters</code> is non-null, for every certificate in the * certification path, fields such as subject public key, the signature * algorithm, key usage, extended key usage, etc. need to conform to the @@ -88,8 +88,8 @@ * @throws CertificateException if the certificate chain is not trusted * by this TrustManager * - * @see SSLParameters#getEndpointIdentificationProtocol - * @see SSLParameters#setEndpointIdentificationProtocol(String) + * @see SSLParameters#getEndpointIdentificationAlgorithm + * @see SSLParameters#setEndpointIdentificationAlgorithm(String) * @see SSLParameters#getAlgorithmConstraints * @see SSLParameters#setAlgorithmConstraints(AlgorithmConstraints) */ @@ -111,7 +111,7 @@ * certificate is used. Checking is case-sensitive. * <p> * If the <code>socket</code> parameter is an instance of - * {@link javax.net.SSLSocket}, and the endpoint identification + * {@link javax.net.ssl.SSLSocket}, and the endpoint identification * algorithm of the <code>SSLParameters</code> is non-empty, to prevent * man-in-the-middle attacks, the address that the <code>socket</code> * connected to should be checked against the peer's identity presented @@ -119,7 +119,7 @@ * identification algorithm. * <p> * If the <code>socket</code> parameter is an instance of - * {@link javax.net.SSLSocket}, and the algorithm constraints of the + * {@link javax.net.ssl.SSLSocket}, and the algorithm constraints of the * <code>SSLParameters</code> is non-null, for every certificate in the * certification path, fields such as subject public key, the signature * algorithm, key usage, extended key usage, etc. need to conform to the @@ -136,8 +136,8 @@ * @throws CertificateException if the certificate chain is not trusted * by this TrustManager * - * @see SSLParameters#getEndpointIdentificationProtocol - * @see SSLParameters#setEndpointIdentificationProtocol(String) + * @see SSLParameters#getEndpointIdentificationAlgorithm + * @see SSLParameters#setEndpointIdentificationAlgorithm(String) * @see SSLParameters#getAlgorithmConstraints * @see SSLParameters#setAlgorithmConstraints(AlgorithmConstraints) */ @@ -177,8 +177,8 @@ * @throws CertificateException if the certificate chain is not trusted * by this TrustManager * - * @see SSLParameters#getEndpointIdentificationProtocol - * @see SSLParameters#setEndpointIdentificationProtocol(String) + * @see SSLParameters#getEndpointIdentificationAlgorithm + * @see SSLParameters#setEndpointIdentificationAlgorithm(String) * @see SSLParameters#getAlgorithmConstraints * @see SSLParameters#setAlgorithmConstraints(AlgorithmConstraints) */ @@ -223,8 +223,8 @@ * @throws CertificateException if the certificate chain is not trusted * by this TrustManager * - * @see SSLParameters#getEndpointIdentificationProtocol - * @see SSLParameters#setEndpointIdentificationProtocol(String) + * @see SSLParameters#getEndpointIdentificationAlgorithm + * @see SSLParameters#setEndpointIdentificationAlgorithm(String) * @see SSLParameters#getAlgorithmConstraints * @see SSLParameters#setAlgorithmConstraints(AlgorithmConstraints) */
--- a/src/share/classes/javax/print/attribute/standard/DialogTypeSelection.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/javax/print/attribute/standard/DialogTypeSelection.java Thu Jan 13 15:03:27 2011 -0800 @@ -52,6 +52,8 @@ public final class DialogTypeSelection extends EnumSyntax implements PrintRequestAttribute { + private static final long serialVersionUID = 7518682952133256029L; + /** * */
--- a/src/share/classes/javax/sound/midi/MidiSystem.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/javax/sound/midi/MidiSystem.java Thu Jan 13 15:03:27 2011 -0800 @@ -310,7 +310,7 @@ } else { transmitter = device.getTransmitter(); } - if (!(transmitter instanceof MidiDeviceReceiver)) { + if (!(transmitter instanceof MidiDeviceTransmitter)) { transmitter = new MidiDeviceTransmitterEnvelope(device, transmitter); } return transmitter;
--- a/src/share/classes/javax/swing/DefaultDesktopManager.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/javax/swing/DefaultDesktopManager.java Thu Jan 13 15:03:27 2011 -0800 @@ -359,7 +359,22 @@ f.getWidth()-1, f.getHeight()-1); } g.drawRect( newX, newY, f.getWidth()-1, f.getHeight()-1); - currentLoc = new Point (newX, newY); + /* Work around for 6635462: XOR mode may cause a SurfaceLost on first use. + * Swing doesn't expect that its XOR drawRect did + * not complete, so believes that on re-entering at + * the next update location, that there is an XOR rect + * to draw out at "currentLoc". But in fact + * its now got a new clean surface without that rect, + * so drawing it "out" in fact draws it on, leaving garbage. + * So only update/set currentLoc if the draw completed. + */ + sun.java2d.SurfaceData sData = + ((sun.java2d.SunGraphics2D)g).getSurfaceData(); + + if (!sData.isSurfaceLost()) { + currentLoc = new Point (newX, newY); + } +; g.dispose(); } } else if (dragMode == FASTER_DRAG_MODE) { @@ -412,7 +427,14 @@ g.drawRect( currentBounds.x, currentBounds.y, currentBounds.width-1, currentBounds.height-1); } g.drawRect( newX, newY, newWidth-1, newHeight-1); - currentBounds = new Rectangle (newX, newY, newWidth, newHeight); + + // Work around for 6635462, see comment in dragFrame() + sun.java2d.SurfaceData sData = + ((sun.java2d.SunGraphics2D)g).getSurfaceData(); + if (!sData.isSurfaceLost()) { + currentBounds = new Rectangle (newX, newY, newWidth, newHeight); + } + g.setPaintMode(); g.dispose(); }
--- a/src/share/classes/javax/swing/JSlider.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/javax/swing/JSlider.java Thu Jan 13 15:03:27 2011 -0800 @@ -40,7 +40,8 @@ /** * A component that lets the user graphically select a value by sliding - * a knob within a bounded interval. + * a knob within a bounded interval. The knob is always positioned + * at the points that match integer values within the specified interval. * <p> * The slider can show both * major tick marks, and minor tick marks between the major ones. The number of
--- a/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java Thu Jan 13 15:03:27 2011 -0800 @@ -908,6 +908,14 @@ int height = parent.getHeight(); Insets insets = parent.getInsets(); + + if (nextButton == null && previousButton == null) { + setBounds(editor, insets.left, insets.top, width - insets.left - insets.right, + height - insets.top - insets.bottom); + + return; + } + Dimension nextD = preferredSize(nextButton); Dimension previousD = preferredSize(previousButton); int buttonsWidth = Math.max(nextD.width, previousD.width);
--- a/src/share/classes/sun/awt/FontConfiguration.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/awt/FontConfiguration.java Thu Jan 13 15:03:27 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,10 +37,10 @@ import java.nio.charset.CharsetEncoder; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; -import java.util.Iterator; import java.util.Locale; import java.util.Map.Entry; import java.util.Properties; @@ -329,6 +329,8 @@ * tables. */ public static void saveBinary(OutputStream out) throws IOException { + sanityCheck(); + DataOutputStream dataOut = new DataOutputStream(out); writeShortTable(dataOut, head); writeShortTable(dataOut, table_scriptIDs); @@ -350,7 +352,6 @@ if (verbose) { dump(); } - sanityCheck(); } //private static boolean loadingProperties; @@ -1343,6 +1344,11 @@ private static short[] table_stringIDs; private static char[] table_stringTable; + /** + * Checks consistencies of complied fontconfig data. This method + * is called only at the build-time from + * build.tools.compilefontconfig.CompileFontConfig. + */ private static void sanityCheck() { int errors = 0; @@ -1358,12 +1364,20 @@ //componentFontNameID starts from "1" for (int ii = 1; ii < table_filenames.length; ii++) { if (table_filenames[ii] == -1) { - System.out.println("\n Warning: " - + "<filename." - + getString(table_componentFontNameIDs[ii]) - + "> entry is missing!!!"); - if (!osName.contains("Linux")) { + // The corresponding finename entry for a component + // font name is mandatory on Windows, but it's + // optional on Solaris and Linux. + if (osName.contains("Windows")) { + System.err.println("\n Error: <filename." + + getString(table_componentFontNameIDs[ii]) + + "> entry is missing!!!"); errors++; + } else { + if (verbose && !isEmpty(table_filenames)) { + System.err.println("\n Note: 'filename' entry is undefined for \"" + + getString(table_componentFontNameIDs[ii]) + + "\""); + } } } } @@ -1382,7 +1396,7 @@ int jj = iii * NUM_STYLES + iij; short ffid = table_scriptFonts[fid + jj]; if (ffid == 0) { - System.out.println("\n Error: <" + System.err.println("\n Error: <" + getFontName(iii) + "." + getStyleName(iij) + "." + getString(table_scriptIDs[ii]) @@ -1402,7 +1416,7 @@ script.contains("symbol")) { continue; } - System.out.println("\nError: " + System.err.println("\nError: " + "<awtfontpath." + script + "> entry is missing!!!"); @@ -1411,11 +1425,19 @@ } } if (errors != 0) { - System.out.println("!!THERE ARE " + errors + " ERROR(S) IN " + System.err.println("!!THERE ARE " + errors + " ERROR(S) IN " + "THE FONTCONFIG FILE, PLEASE CHECK ITS CONTENT!!\n"); System.exit(1); + } + } + private static boolean isEmpty(short[] a) { + for (short s : a) { + if (s != -1) { + return false; + } } + return true; } //dump the fontconfig data tables @@ -1652,20 +1674,16 @@ private static void writeShortTable(DataOutputStream out, short[] data) throws IOException { - for (int i = 0; i < data.length; i++) { - out.writeShort(data[i]); + for (short val : data) { + out.writeShort(val); } } - private static short[] toList(HashMap map) { + private static short[] toList(HashMap<String, Short> map) { short[] list = new short[map.size()]; - for (int i = 0; i < list.length; i++) { - list[i] = -1; - } - Iterator iterator = map.entrySet().iterator(); - while (iterator.hasNext()) { - Entry<String, Short> entry = (Entry <String, Short>)iterator.next(); - list[entry.getValue().shortValue()] = getStringID(entry.getKey()); + Arrays.fill(list, (short) -1); + for (Entry<String, Short> entry : map.entrySet()) { + list[entry.getValue()] = getStringID(entry.getKey()); } return list; } @@ -1763,25 +1781,19 @@ int len = table_scriptIDs.length + scriptFonts.size() * 20; table_scriptFonts = new short[len]; - Iterator iterator = scriptAllfonts.entrySet().iterator(); - while (iterator.hasNext()) { - Entry<Short, Short> entry = (Entry <Short, Short>)iterator.next(); - table_scriptFonts[entry.getKey().intValue()] = (short)entry.getValue().shortValue(); + for (Entry<Short, Short> entry : scriptAllfonts.entrySet()) { + table_scriptFonts[entry.getKey().intValue()] = entry.getValue(); } int off = table_scriptIDs.length; - iterator = scriptFonts.entrySet().iterator(); - while (iterator.hasNext()) { - Entry<Short, Short[]> entry = (Entry <Short, Short[]>)iterator.next(); + for (Entry<Short, Short[]> entry : scriptFonts.entrySet()) { table_scriptFonts[entry.getKey().intValue()] = (short)-off; Short[] v = entry.getValue(); - int i = 0; - while (i < 20) { + for (int i = 0; i < 20; i++) { if (v[i] != null) { - table_scriptFonts[off++] = v[i].shortValue(); + table_scriptFonts[off++] = v[i]; } else { table_scriptFonts[off++] = 0; } - i++; } } @@ -1792,9 +1804,7 @@ //(3) sequences elcID -> XXXX[1|5] -> scriptID[] head[INDEX_sequences] = (short)(head[INDEX_elcIDs] + table_elcIDs.length); table_sequences = new short[elcIDs.size() * NUM_FONTS]; - iterator = sequences.entrySet().iterator(); - while (iterator.hasNext()) { - Entry<Short, short[]> entry = (Entry <Short, short[]>)iterator.next(); + for (Entry<Short, short[]> entry : sequences.entrySet()) { //table_sequences[entry.getKey().intValue()] = (short)-off; int k = entry.getKey().intValue(); short[] v = entry.getValue(); @@ -1827,31 +1837,24 @@ //(6)componentFontNameID -> filenameID head[INDEX_filenames] = (short)(head[INDEX_componentFontNameIDs] + table_componentFontNameIDs.length); table_filenames = new short[table_componentFontNameIDs.length]; - for (int i = 0; i < table_filenames.length; i++) { - table_filenames[i] = -1; - } - iterator = filenames.entrySet().iterator(); - while (iterator.hasNext()) { - Entry<Short, Short> entry = (Entry <Short, Short>)iterator.next(); - table_filenames[entry.getKey().shortValue()] = entry.getValue().shortValue(); + Arrays.fill(table_filenames, (short) -1); + + for (Entry<Short, Short> entry : filenames.entrySet()) { + table_filenames[entry.getKey()] = entry.getValue(); } //(7)scriptID-> awtfontpath //the paths are stored as scriptID -> stringID in awtfontpahts head[INDEX_awtfontpaths] = (short)(head[INDEX_filenames] + table_filenames.length); table_awtfontpaths = new short[table_scriptIDs.length]; - iterator = awtfontpaths.entrySet().iterator(); - while (iterator.hasNext()) { - Entry<Short, Short> entry = (Entry <Short, Short>)iterator.next(); - table_awtfontpaths[entry.getKey().shortValue()] = entry.getValue().shortValue(); + for (Entry<Short, Short> entry : awtfontpaths.entrySet()) { + table_awtfontpaths[entry.getKey()] = entry.getValue(); } //(8)exclusions head[INDEX_exclusions] = (short)(head[INDEX_awtfontpaths] + table_awtfontpaths.length); table_exclusions = new short[scriptIDs.size()]; - iterator = exclusions.entrySet().iterator(); - while (iterator.hasNext()) { - Entry<Short, int[]> entry = (Entry <Short, int[]>)iterator.next(); + for (Entry<Short, int[]> entry : exclusions.entrySet()) { int[] exI = entry.getValue(); char[] exC = new char[exI.length * 2]; int j = 0; @@ -1859,17 +1862,15 @@ exC[j++] = (char) (exI[i] >> 16); exC[j++] = (char) (exI[i] & 0xffff); } - table_exclusions[entry.getKey().shortValue()] = getStringID(new String (exC)); + table_exclusions[entry.getKey()] = getStringID(new String (exC)); } //(9)proportionals head[INDEX_proportionals] = (short)(head[INDEX_exclusions] + table_exclusions.length); table_proportionals = new short[proportionals.size() * 2]; - iterator = proportionals.entrySet().iterator(); int j = 0; - while (iterator.hasNext()) { - Entry<Short, Short> entry = (Entry <Short, Short>)iterator.next(); - table_proportionals[j++] = entry.getKey().shortValue(); - table_proportionals[j++] = entry.getValue().shortValue(); + for (Entry<Short, Short> entry : proportionals.entrySet()) { + table_proportionals[j++] = entry.getKey(); + table_proportionals[j++] = entry.getValue(); } //(10) see (1) for info, the only difference is "xxx.motif" @@ -1878,22 +1879,18 @@ len = table_scriptIDs.length + scriptFontsMotif.size() * 20; table_scriptFontsMotif = new short[len]; - iterator = scriptAllfontsMotif.entrySet().iterator(); - while (iterator.hasNext()) { - Entry<Short, Short> entry = (Entry <Short, Short>)iterator.next(); + for (Entry<Short, Short> entry : scriptAllfontsMotif.entrySet()) { table_scriptFontsMotif[entry.getKey().intValue()] = - (short)entry.getValue().shortValue(); + (short)entry.getValue(); } off = table_scriptIDs.length; - iterator = scriptFontsMotif.entrySet().iterator(); - while (iterator.hasNext()) { - Entry<Short, Short[]> entry = (Entry <Short, Short[]>)iterator.next(); + for (Entry<Short, Short[]> entry : scriptFontsMotif.entrySet()) { table_scriptFontsMotif[entry.getKey().intValue()] = (short)-off; Short[] v = entry.getValue(); int i = 0; while (i < 20) { if (v[i] != null) { - table_scriptFontsMotif[off++] = v[i].shortValue(); + table_scriptFontsMotif[off++] = v[i]; } else { table_scriptFontsMotif[off++] = 0; } @@ -1907,12 +1904,10 @@ //(11)short[] alphabeticSuffix head[INDEX_alphabeticSuffix] = (short)(head[INDEX_scriptFontsMotif] + table_scriptFontsMotif.length); table_alphabeticSuffix = new short[alphabeticSuffix.size() * 2]; - iterator = alphabeticSuffix.entrySet().iterator(); j = 0; - while (iterator.hasNext()) { - Entry<Short, Short> entry = (Entry <Short, Short>)iterator.next(); - table_alphabeticSuffix[j++] = entry.getKey().shortValue(); - table_alphabeticSuffix[j++] = entry.getValue().shortValue(); + for (Entry<Short, Short> entry : alphabeticSuffix.entrySet()) { + table_alphabeticSuffix[j++] = entry.getKey(); + table_alphabeticSuffix[j++] = entry.getValue(); } //(15)short[] fallbackScriptIDs; just put the ID in head
--- a/src/share/classes/sun/awt/SunToolkit.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/awt/SunToolkit.java Thu Jan 13 15:03:27 2011 -0800 @@ -102,26 +102,6 @@ public final static int MAX_BUTTONS_SUPPORTED = 20; public SunToolkit() { - /* If awt.threadgroup is set to class name the instance of - * this class is created (should be subclass of ThreadGroup) - * and EventDispatchThread is created inside of it - * - * If loaded class overrides uncaughtException instance - * handles all uncaught exception on EventDispatchThread - */ - ThreadGroup threadGroup = null; - String tgName = System.getProperty("awt.threadgroup", ""); - - if (tgName.length() != 0) { - try { - Constructor ctor = Class.forName(tgName). - getConstructor(new Class[] {String.class}); - threadGroup = (ThreadGroup)ctor.newInstance(new Object[] {"AWT-ThreadGroup"}); - } catch (Exception e) { - System.err.println("Failed loading " + tgName + ": " + e); - } - } - Runnable initEQ = new Runnable() { public void run () { EventQueue eventQueue; @@ -144,17 +124,7 @@ } }; - if (threadGroup != null) { - Thread eqInitThread = new Thread(threadGroup, initEQ, "EventQueue-Init"); - eqInitThread.start(); - try { - eqInitThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } else { - initEQ.run(); - } + initEQ.run(); } public boolean useBufferPerWindow() {
--- a/src/share/classes/sun/dc/DuctusRenderingEngine.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/dc/DuctusRenderingEngine.java Thu Jan 13 15:03:27 2011 -0800 @@ -635,6 +635,88 @@ return r; } + /** + * {@inheritDoc} + */ + @Override + public AATileGenerator getAATileGenerator(double x, double y, + double dx1, double dy1, + double dx2, double dy2, + double lw1, double lw2, + Region clip, + int bbox[]) + { + // REMIND: Deal with large coordinates! + double ldx1, ldy1, ldx2, ldy2; + boolean innerpgram = (lw1 > 0 && lw2 > 0); + + if (innerpgram) { + ldx1 = dx1 * lw1; + ldy1 = dy1 * lw1; + ldx2 = dx2 * lw2; + ldy2 = dy2 * lw2; + x -= (ldx1 + ldx2) / 2.0; + y -= (ldy1 + ldy2) / 2.0; + dx1 += ldx1; + dy1 += ldy1; + dx2 += ldx2; + dy2 += ldy2; + if (lw1 > 1 && lw2 > 1) { + // Inner parallelogram was entirely consumed by stroke... + innerpgram = false; + } + } else { + ldx1 = ldy1 = ldx2 = ldy2 = 0; + } + + Rasterizer r = getRasterizer(); + + r.setUsage(Rasterizer.EOFILL); + + r.beginPath(); + r.beginSubpath((float) x, (float) y); + r.appendLine((float) (x+dx1), (float) (y+dy1)); + r.appendLine((float) (x+dx1+dx2), (float) (y+dy1+dy2)); + r.appendLine((float) (x+dx2), (float) (y+dy2)); + r.closedSubpath(); + if (innerpgram) { + x += ldx1 + ldx2; + y += ldy1 + ldy2; + dx1 -= 2.0 * ldx1; + dy1 -= 2.0 * ldy1; + dx2 -= 2.0 * ldx2; + dy2 -= 2.0 * ldy2; + r.beginSubpath((float) x, (float) y); + r.appendLine((float) (x+dx1), (float) (y+dy1)); + r.appendLine((float) (x+dx1+dx2), (float) (y+dy1+dy2)); + r.appendLine((float) (x+dx2), (float) (y+dy2)); + r.closedSubpath(); + } + + try { + r.endPath(); + r.getAlphaBox(bbox); + clip.clipBoxToBounds(bbox); + if (bbox[0] >= bbox[2] || bbox[1] >= bbox[3]) { + dropRasterizer(r); + return null; + } + r.setOutputArea(bbox[0], bbox[1], + bbox[2] - bbox[0], + bbox[3] - bbox[1]); + } catch (PRException e) { + /* + * This exeption is thrown from the native part of the Ductus + * (only in case of a debug build) to indicate that some + * segments of the path have very large coordinates. + * See 4485298 for more info. + */ + System.err.println("DuctusRenderingEngine.getAATileGenerator: "+e); + } + + return r; + } + private void feedConsumer(PathConsumer consumer, PathIterator pi) { try { consumer.beginPath();
--- a/src/share/classes/sun/font/FileFontStrike.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/font/FileFontStrike.java Thu Jan 13 15:03:27 2011 -0800 @@ -58,10 +58,10 @@ private static final int SEGINTARRAY = 3; private static final int SEGLONGARRAY = 4; - private int glyphCacheFormat = UNINITIALISED; + private volatile int glyphCacheFormat = UNINITIALISED; - /* segmented arrays are blocks of 256 */ - private static final int SEGSHIFT = 8; + /* segmented arrays are blocks of 32 */ + private static final int SEGSHIFT = 5; private static final int SEGSIZE = 1 << SEGSHIFT; private boolean segmentedCache; @@ -171,7 +171,7 @@ mapper = fileFont.getMapper(); int numGlyphs = mapper.getNumGlyphs(); - /* Always segment for fonts with > 2K glyphs, but also for smaller + /* Always segment for fonts with > 256 glyphs, but also for smaller * fonts with non-typical sizes and transforms. * Segmenting for all non-typical pt sizes helps to minimise memory * usage when very many distinct strikes are created. @@ -522,32 +522,33 @@ } /* Called only from synchronized code or constructor */ - private void initGlyphCache() { + private synchronized void initGlyphCache() { int numGlyphs = mapper.getNumGlyphs(); - + int tmpFormat = UNINITIALISED; if (segmentedCache) { int numSegments = (numGlyphs + SEGSIZE-1)/SEGSIZE; if (longAddresses) { - glyphCacheFormat = SEGLONGARRAY; + tmpFormat = SEGLONGARRAY; segLongGlyphImages = new long[numSegments][]; this.disposer.segLongGlyphImages = segLongGlyphImages; } else { - glyphCacheFormat = SEGINTARRAY; + tmpFormat = SEGINTARRAY; segIntGlyphImages = new int[numSegments][]; this.disposer.segIntGlyphImages = segIntGlyphImages; } } else { if (longAddresses) { - glyphCacheFormat = LONGARRAY; + tmpFormat = LONGARRAY; longGlyphImages = new long[numGlyphs]; this.disposer.longGlyphImages = longGlyphImages; } else { - glyphCacheFormat = INTARRAY; + tmpFormat = INTARRAY; intGlyphImages = new int[numGlyphs]; this.disposer.intGlyphImages = intGlyphImages; } } + glyphCacheFormat = tmpFormat; } float getGlyphAdvance(int glyphCode) {
--- a/src/share/classes/sun/font/Font2D.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/font/Font2D.java Thu Jan 13 15:03:27 2011 -0800 @@ -343,7 +343,21 @@ } strike = createStrike(desc); //StrikeCache.addStrike(); - strikeRef = StrikeCache.getStrikeRef(strike); + /* If we are creating many strikes on this font which + * involve non-quadrant rotations, or more general + * transforms which include shears, then force the use + * of weak references rather than soft references. + * This means that it won't live much beyond the next GC, + * which is what we want for what is likely a transient strike. + */ + int txType = desc.glyphTx.getType(); + if (txType == AffineTransform.TYPE_GENERAL_TRANSFORM || + (txType & AffineTransform.TYPE_GENERAL_ROTATION) != 0 && + strikeCache.size() > 10) { + strikeRef = StrikeCache.getStrikeRef(strike, true); + } else { + strikeRef = StrikeCache.getStrikeRef(strike); + } strikeCache.put(desc, strikeRef); //strike.lastlookupTime = System.currentTimeMillis(); lastFontStrike = new SoftReference(strike);
--- a/src/share/classes/sun/io/Converters.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/io/Converters.java Thu Jan 13 15:03:27 2011 -0800 @@ -120,7 +120,7 @@ private static Class<?> cache(int type, Object encoding, Class<?> c) { SoftReference<Object[]>[] srs = classCache[type]; - srs[CACHE_SIZE - 1] = new SoftReference<Object[]>(new Object[] { c, encoding }); + srs[CACHE_SIZE - 1] = new SoftReference<>(new Object[] { c, encoding }); moveToFront(srs, CACHE_SIZE - 1); return c; }
--- a/src/share/classes/sun/java2d/SurfaceData.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/java2d/SurfaceData.java Thu Jan 13 15:03:27 2011 -0800 @@ -367,16 +367,17 @@ public static final TextPipe aaTextRenderer; public static final TextPipe lcdTextRenderer; - protected static final CompositePipe colorPipe; + protected static final AlphaColorPipe colorPipe; protected static final PixelToShapeConverter colorViaShape; protected static final PixelToParallelogramConverter colorViaPgram; protected static final TextPipe colorText; protected static final CompositePipe clipColorPipe; protected static final TextPipe clipColorText; protected static final AAShapePipe AAColorShape; - protected static final PixelToShapeConverter AAColorViaShape; + protected static final PixelToParallelogramConverter AAColorViaShape; + protected static final PixelToParallelogramConverter AAColorViaPgram; protected static final AAShapePipe AAClipColorShape; - protected static final PixelToShapeConverter AAClipColorViaShape; + protected static final PixelToParallelogramConverter AAClipColorViaShape; protected static final CompositePipe paintPipe; protected static final SpanShapeRenderer paintShape; @@ -385,9 +386,9 @@ protected static final CompositePipe clipPaintPipe; protected static final TextPipe clipPaintText; protected static final AAShapePipe AAPaintShape; - protected static final PixelToShapeConverter AAPaintViaShape; + protected static final PixelToParallelogramConverter AAPaintViaShape; protected static final AAShapePipe AAClipPaintShape; - protected static final PixelToShapeConverter AAClipPaintViaShape; + protected static final PixelToParallelogramConverter AAClipPaintViaShape; protected static final CompositePipe compPipe; protected static final SpanShapeRenderer compShape; @@ -396,9 +397,9 @@ protected static final CompositePipe clipCompPipe; protected static final TextPipe clipCompText; protected static final AAShapePipe AACompShape; - protected static final PixelToShapeConverter AACompViaShape; + protected static final PixelToParallelogramConverter AACompViaShape; protected static final AAShapePipe AAClipCompShape; - protected static final PixelToShapeConverter AAClipCompViaShape; + protected static final PixelToParallelogramConverter AAClipCompViaShape; protected static final DrawImagePipe imagepipe; @@ -427,6 +428,22 @@ } } + private static PixelToParallelogramConverter + makeConverter(AAShapePipe renderer, + ParallelogramPipe pgrampipe) + { + return new PixelToParallelogramConverter(renderer, + pgrampipe, + 1.0/8.0, 0.499, + false); + } + + private static PixelToParallelogramConverter + makeConverter(AAShapePipe renderer) + { + return makeConverter(renderer, renderer); + } + static { colorPrimitives = new LoopPipe(); @@ -445,9 +462,10 @@ clipColorPipe = new SpanClipRenderer(colorPipe); clipColorText = new TextRenderer(clipColorPipe); AAColorShape = new AAShapePipe(colorPipe); - AAColorViaShape = new PixelToShapeConverter(AAColorShape); + AAColorViaShape = makeConverter(AAColorShape); + AAColorViaPgram = makeConverter(AAColorShape, colorPipe); AAClipColorShape = new AAShapePipe(clipColorPipe); - AAClipColorViaShape = new PixelToShapeConverter(AAClipColorShape); + AAClipColorViaShape = makeConverter(AAClipColorShape); paintPipe = new AlphaPaintPipe(); paintShape = new SpanShapeRenderer.Composite(paintPipe); @@ -456,9 +474,9 @@ clipPaintPipe = new SpanClipRenderer(paintPipe); clipPaintText = new TextRenderer(clipPaintPipe); AAPaintShape = new AAShapePipe(paintPipe); - AAPaintViaShape = new PixelToShapeConverter(AAPaintShape); + AAPaintViaShape = makeConverter(AAPaintShape); AAClipPaintShape = new AAShapePipe(clipPaintPipe); - AAClipPaintViaShape = new PixelToShapeConverter(AAClipPaintShape); + AAClipPaintViaShape = makeConverter(AAClipPaintShape); compPipe = new GeneralCompositePipe(); compShape = new SpanShapeRenderer.Composite(compPipe); @@ -467,9 +485,9 @@ clipCompPipe = new SpanClipRenderer(compPipe); clipCompText = new TextRenderer(clipCompPipe); AACompShape = new AAShapePipe(compPipe); - AACompViaShape = new PixelToShapeConverter(AACompShape); + AACompViaShape = makeConverter(AACompShape); AAClipCompShape = new AAShapePipe(clipCompPipe); - AAClipCompViaShape = new PixelToShapeConverter(AAClipCompShape); + AAClipCompViaShape = makeConverter(AAClipCompShape); imagepipe = new DrawImage(); } @@ -591,12 +609,12 @@ if (sg2d.clipState == sg2d.CLIP_SHAPE) { sg2d.drawpipe = AAClipCompViaShape; sg2d.fillpipe = AAClipCompViaShape; - sg2d.shapepipe = AAClipCompShape; + sg2d.shapepipe = AAClipCompViaShape; sg2d.textpipe = clipCompText; } else { sg2d.drawpipe = AACompViaShape; sg2d.fillpipe = AACompViaShape; - sg2d.shapepipe = AACompShape; + sg2d.shapepipe = AACompViaShape; sg2d.textpipe = compText; } } else { @@ -616,13 +634,17 @@ if (sg2d.clipState == sg2d.CLIP_SHAPE) { sg2d.drawpipe = AAClipColorViaShape; sg2d.fillpipe = AAClipColorViaShape; - sg2d.shapepipe = AAClipColorShape; + sg2d.shapepipe = AAClipColorViaShape; sg2d.textpipe = clipColorText; } else { - sg2d.drawpipe = AAColorViaShape; - sg2d.fillpipe = AAColorViaShape; - sg2d.shapepipe = AAColorShape; - if (sg2d.paintState > sg2d.PAINT_OPAQUECOLOR || + PixelToParallelogramConverter converter = + (sg2d.alphafill.canDoParallelograms() + ? AAColorViaPgram + : AAColorViaShape); + sg2d.drawpipe = converter; + sg2d.fillpipe = converter; + sg2d.shapepipe = converter; + if (sg2d.paintState > sg2d.PAINT_ALPHACOLOR || sg2d.compositeState > sg2d.COMP_ISCOPY) { sg2d.textpipe = colorText; @@ -634,12 +656,12 @@ if (sg2d.clipState == sg2d.CLIP_SHAPE) { sg2d.drawpipe = AAClipPaintViaShape; sg2d.fillpipe = AAClipPaintViaShape; - sg2d.shapepipe = AAClipPaintShape; + sg2d.shapepipe = AAClipPaintViaShape; sg2d.textpipe = clipPaintText; } else { sg2d.drawpipe = AAPaintViaShape; sg2d.fillpipe = AAPaintViaShape; - sg2d.shapepipe = AAPaintShape; + sg2d.shapepipe = AAPaintViaShape; sg2d.textpipe = paintText; } } @@ -793,6 +815,18 @@ } } + private static CompositeType getFillCompositeType(SunGraphics2D sg2d) { + CompositeType compType = sg2d.imageComp; + if (sg2d.compositeState == sg2d.COMP_ISCOPY) { + if (compType == CompositeType.SrcOverNoEa) { + compType = CompositeType.OpaqueSrcOverNoEa; + } else { + compType = CompositeType.SrcNoEa; + } + } + return compType; + } + /** * Returns a MaskFill object that can be used on this destination * with the source (paint) and composite types determined by the given @@ -802,9 +836,10 @@ * surface) before returning a specific MaskFill object. */ protected MaskFill getMaskFill(SunGraphics2D sg2d) { - return MaskFill.getFromCache(getPaintSurfaceType(sg2d), - sg2d.imageComp, - getSurfaceType()); + SurfaceType src = getPaintSurfaceType(sg2d); + CompositeType comp = getFillCompositeType(sg2d); + SurfaceType dst = getSurfaceType(); + return MaskFill.getFromCache(src, comp, dst); } private static RenderCache loopcache = new RenderCache(30); @@ -816,9 +851,7 @@ */ public RenderLoops getRenderLoops(SunGraphics2D sg2d) { SurfaceType src = getPaintSurfaceType(sg2d); - CompositeType comp = (sg2d.compositeState == sg2d.COMP_ISCOPY - ? CompositeType.SrcNoEa - : sg2d.imageComp); + CompositeType comp = getFillCompositeType(sg2d); SurfaceType dst = sg2d.getSurfaceData().getSurfaceType(); Object o = loopcache.get(src, comp, dst);
--- a/src/share/classes/sun/java2d/loops/CompositeType.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/java2d/loops/CompositeType.java Thu Jan 13 15:03:27 2011 -0800 @@ -27,6 +27,7 @@ import java.awt.image.BufferedImage; import java.awt.AlphaComposite; +import java.util.HashMap; /** * A CompositeType object provides a chained description of a type of @@ -51,6 +52,11 @@ * the indicated algorithm if all of the more specific searches fail. */ public final class CompositeType { + + private static int unusedUID = 1; + private static final HashMap<String,Integer> compositeUIDMap = + new HashMap<String,Integer>(100); + /* * CONSTANTS USED BY ALL PRIMITIVES TO DESCRIBE THE COMPOSITING * ALGORITHMS THEY CAN PERFORM @@ -153,6 +159,22 @@ SrcOverNoEa = SrcOver.deriveSubType(DESC_SRC_OVER_NO_EA); /* + * A special CompositeType for the case where we are filling in + * SrcOverNoEa mode with an opaque color. In that case then the + * best loop for us to use would be a SrcNoEa loop, but what if + * there is no such loop? In that case then we would end up + * backing off to a Src loop (which should still be fine) or an + * AnyAlpha loop which would be slower than a SrcOver loop in + * most cases. + * The fix is to use the following chain which looks for loops + * in the following order: + * SrcNoEa, Src, SrcOverNoEa, SrcOver, AnyAlpha + */ + public static final CompositeType + OpaqueSrcOverNoEa = SrcOverNoEa.deriveSubType(DESC_SRC) + .deriveSubType(DESC_SRC_NO_EA); + + /* * END OF CompositeType OBJECTS FOR THE VARIOUS CONSTANTS */ @@ -210,7 +232,6 @@ } } - private static int unusedUID = 1; private int uniqueID; private String desc; private CompositeType next; @@ -218,14 +239,20 @@ private CompositeType(CompositeType parent, String desc) { next = parent; this.desc = desc; - this.uniqueID = makeUniqueID(); + this.uniqueID = makeUniqueID(desc); } - private synchronized static final int makeUniqueID() { - if (unusedUID > 255) { - throw new InternalError("composite type id overflow"); + public synchronized static final int makeUniqueID(String desc) { + Integer i = compositeUIDMap.get(desc); + + if (i == null) { + if (unusedUID > 255) { + throw new InternalError("composite type id overflow"); + } + i = unusedUID++; + compositeUIDMap.put(desc, i); } - return unusedUID++; + return i; } public int getUniqueID() {
--- a/src/share/classes/sun/java2d/loops/MaskFill.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/java2d/loops/MaskFill.java Thu Jan 13 15:03:27 2011 -0800 @@ -50,6 +50,10 @@ public class MaskFill extends GraphicsPrimitive { public static final String methodSignature = "MaskFill(...)".toString(); + public static final String fillPgramSignature = + "FillAAPgram(...)".toString(); + public static final String drawPgramSignature = + "DrawAAPgram(...)".toString(); public static final int primTypeID = makePrimTypeID(); @@ -92,6 +96,14 @@ return fill; } + protected MaskFill(String alternateSignature, + SurfaceType srctype, + CompositeType comptype, + SurfaceType dsttype) + { + super(alternateSignature, primTypeID, srctype, comptype, dsttype); + } + protected MaskFill(SurfaceType srctype, CompositeType comptype, SurfaceType dsttype) @@ -115,6 +127,23 @@ int x, int y, int w, int h, byte[] mask, int maskoff, int maskscan); + public native void FillAAPgram(SunGraphics2D sg2d, SurfaceData sData, + Composite comp, + double x, double y, + double dx1, double dy1, + double dx2, double dy2); + + public native void DrawAAPgram(SunGraphics2D sg2d, SurfaceData sData, + Composite comp, + double x, double y, + double dx1, double dy1, + double dx2, double dy2, + double lw1, double lw2); + + public boolean canDoParallelograms() { + return (getNativePrim() != 0); + } + static { GraphicsPrimitiveMgr.registerGeneral(new MaskFill(null, null, null)); } @@ -182,12 +211,22 @@ private static class TraceMaskFill extends MaskFill { MaskFill target; + MaskFill fillPgramTarget; + MaskFill drawPgramTarget; public TraceMaskFill(MaskFill target) { super(target.getSourceType(), target.getCompositeType(), target.getDestType()); this.target = target; + this.fillPgramTarget = new MaskFill(fillPgramSignature, + target.getSourceType(), + target.getCompositeType(), + target.getDestType()); + this.drawPgramTarget = new MaskFill(drawPgramSignature, + target.getSourceType(), + target.getCompositeType(), + target.getDestType()); } public GraphicsPrimitive traceWrap() { @@ -203,5 +242,32 @@ target.MaskFill(sg2d, sData, comp, x, y, w, h, mask, maskoff, maskscan); } + + public void FillAAPgram(SunGraphics2D sg2d, SurfaceData sData, + Composite comp, + double x, double y, + double dx1, double dy1, + double dx2, double dy2) + { + tracePrimitive(fillPgramTarget); + target.FillAAPgram(sg2d, sData, comp, + x, y, dx1, dy1, dx2, dy2); + } + + public void DrawAAPgram(SunGraphics2D sg2d, SurfaceData sData, + Composite comp, + double x, double y, + double dx1, double dy1, + double dx2, double dy2, + double lw1, double lw2) + { + tracePrimitive(drawPgramTarget); + target.DrawAAPgram(sg2d, sData, comp, + x, y, dx1, dy1, dx2, dy2, lw1, lw2); + } + + public boolean canDoParallelograms() { + return target.canDoParallelograms(); + } } }
--- a/src/share/classes/sun/java2d/pipe/AAShapePipe.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/java2d/pipe/AAShapePipe.java Thu Jan 13 15:03:27 2011 -0800 @@ -28,6 +28,7 @@ import java.awt.BasicStroke; import java.awt.Rectangle; import java.awt.Shape; +import java.awt.geom.Rectangle2D; import java.awt.geom.PathIterator; import sun.awt.SunHints; import sun.java2d.SunGraphics2D; @@ -39,7 +40,9 @@ * This class sets up the Generator and computes the alpha tiles * and then passes them on to a CompositePipe object for painting. */ -public class AAShapePipe implements ShapeDrawPipe { +public class AAShapePipe + implements ShapeDrawPipe, ParallelogramPipe +{ static RenderingEngine renderengine = RenderingEngine.getInstance(); CompositePipe outpipe; @@ -65,6 +68,59 @@ renderPath(sg, s, null); } + private static Rectangle2D computeBBox(double x, double y, + double dx1, double dy1, + double dx2, double dy2) + { + double lox, loy, hix, hiy; + lox = hix = x; + loy = hiy = y; + if (dx1 < 0) { lox += dx1; } else { hix += dx1; } + if (dy1 < 0) { loy += dy1; } else { hiy += dy1; } + if (dx2 < 0) { lox += dx2; } else { hix += dx2; } + if (dy2 < 0) { loy += dy2; } else { hiy += dy2; } + return new Rectangle2D.Double(lox, loy, hix-lox, hiy-loy); + } + + public void fillParallelogram(SunGraphics2D sg, + double x, double y, + double dx1, double dy1, + double dx2, double dy2) + { + Region clip = sg.getCompClip(); + int abox[] = new int[4]; + AATileGenerator aatg = + renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, 0, 0, + clip, abox); + if (aatg == null) { + // Nothing to render + return; + } + + renderTiles(sg, computeBBox(x, y, dx1, dy1, dx2, dy2), aatg, abox); + } + + public void drawParallelogram(SunGraphics2D sg, + double x, double y, + double dx1, double dy1, + double dx2, double dy2, + double lw1, double lw2) + { + Region clip = sg.getCompClip(); + int abox[] = new int[4]; + AATileGenerator aatg = + renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, 0, 0, + clip, abox); + if (aatg == null) { + // Nothing to render + return; + } + + // Note that bbox is of the original shape, not the wide path. + // This is appropriate for handing to Paint methods... + renderTiles(sg, computeBBox(x, y, dx1, dy1, dx2, dy2), aatg, abox); + } + private static byte[] theTile; public synchronized static byte[] getAlphaTile(int len) { @@ -85,8 +141,6 @@ boolean adjust = (bs != null && sg.strokeHint != SunHints.INTVAL_STROKE_PURE); boolean thin = (sg.strokeState <= sg.STROKE_THINDASHED); - Object context = null; - byte alpha[] = null; Region clip = sg.getCompClip(); int abox[] = new int[4]; @@ -98,6 +152,14 @@ return; } + renderTiles(sg, s, aatg, abox); + } + + public void renderTiles(SunGraphics2D sg, Shape s, + AATileGenerator aatg, int abox[]) + { + Object context = null; + byte alpha[] = null; try { context = outpipe.startSequence(sg, s, new Rectangle(abox[0], abox[1],
--- a/src/share/classes/sun/java2d/pipe/AlphaColorPipe.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/java2d/pipe/AlphaColorPipe.java Thu Jan 13 15:03:27 2011 -0800 @@ -34,7 +34,7 @@ * into a destination that supports direct alpha compositing of a solid * color, according to one of the rules in the AlphaComposite class. */ -public class AlphaColorPipe implements CompositePipe { +public class AlphaColorPipe implements CompositePipe, ParallelogramPipe { public AlphaColorPipe() { } @@ -64,4 +64,23 @@ public void endSequence(Object context) { return; } + + public void fillParallelogram(SunGraphics2D sg, + double x, double y, + double dx1, double dy1, + double dx2, double dy2) + { + sg.alphafill.FillAAPgram(sg, sg.getSurfaceData(), sg.composite, + x, y, dx1, dy1, dx2, dy2); + } + + public void drawParallelogram(SunGraphics2D sg, + double x, double y, + double dx1, double dy1, + double dx2, double dy2, + double lw1, double lw2) + { + sg.alphafill.DrawAAPgram(sg, sg.getSurfaceData(), sg.composite, + x, y, dx1, dy1, dx2, dy2, lw1, lw2); + } }
--- a/src/share/classes/sun/java2d/pipe/RenderingEngine.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/java2d/pipe/RenderingEngine.java Thu Jan 13 15:03:27 2011 -0800 @@ -281,6 +281,72 @@ int bbox[]); /** + * Construct an antialiased tile generator for the given parallelogram + * store the bounds of the tile iteration in the bbox parameter. + * The parallelogram is specified as a starting point and 2 delta + * vectors that indicate the slopes of the 2 pairs of sides of the + * parallelogram. + * The 4 corners of the parallelogram are defined by the 4 points: + * <ul> + * <li> {@code x}, {@code y} + * <li> {@code x+dx1}, {@code y+dy1} + * <li> {@code x+dx1+dx2}, {@code y+dy1+dy2} + * <li> {@code x+dx2}, {@code y+dy2} + * </ul> + * The {@code lw1} and {@code lw2} parameters provide a specification + * for an optionally stroked parallelogram if they are positive numbers. + * The {@code lw1} parameter is the ratio of the length of the {@code dx1}, + * {@code dx2} delta vector to half of the line width in that same + * direction. + * The {@code lw2} parameter provides the same ratio for the other delta + * vector. + * If {@code lw1} and {@code lw2} are both greater than zero, then + * the parallelogram figure is doubled by both expanding and contracting + * each delta vector by its corresponding {@code lw} value. + * If either (@code lw1) or {@code lw2} are also greater than 1, then + * the inner (contracted) parallelogram disappears and the figure is + * simply a single expanded parallelogram. + * The {@code clip} parameter specifies the current clip in effect + * in device coordinates and can be used to prune the data for the + * operation, but the renderer is not required to perform any + * clipping. + * <p> + * Upon returning, this method will fill the {@code bbox} parameter + * with 4 values indicating the bounds of the iteration of the + * tile generator. + * The iteration order of the tiles will be as specified by the + * pseudo-code: + * <pre> + * for (y = bbox[1]; y < bbox[3]; y += tileheight) { + * for (x = bbox[0]; x < bbox[2]; x += tilewidth) { + * } + * } + * </pre> + * If there is no output to be rendered, this method may return + * null. + * + * @param x the X coordinate of the first corner of the parallelogram + * @param y the Y coordinate of the first corner of the parallelogram + * @param dx1 the X coordinate delta of the first leg of the parallelogram + * @param dy1 the Y coordinate delta of the first leg of the parallelogram + * @param dx2 the X coordinate delta of the second leg of the parallelogram + * @param dy2 the Y coordinate delta of the second leg of the parallelogram + * @param lw1 the line width ratio for the first leg of the parallelogram + * @param lw2 the line width ratio for the second leg of the parallelogram + * @param clip the current clip in effect in device coordinates + * @param bbox returns the bounds of the iteration + * @return the {@code AATileGenerator} instance to be consulted + * for tile coverages, or null if there is no output to render + * @since 1.7 + */ + public abstract AATileGenerator getAATileGenerator(double x, double y, + double dx1, double dy1, + double dx2, double dy2, + double lw1, double lw2, + Region clip, + int bbox[]); + + /** * Returns the minimum pen width that the antialiasing rasterizer * can represent without dropouts occuring. * @since 1.7 @@ -393,5 +459,24 @@ bs, thin, normalize, bbox); } + public AATileGenerator getAATileGenerator(double x, double y, + double dx1, double dy1, + double dx2, double dy2, + double lw1, double lw2, + Region clip, + int bbox[]) + { + System.out.println(name+".getAATileGenerator("+ + x+", "+y+", "+ + dx1+", "+dy1+", "+ + dx2+", "+dy2+", "+ + lw1+", "+lw2+", "+ + clip+")"); + return target.getAATileGenerator(x, y, + dx1, dy1, + dx2, dy2, + lw1, lw2, + clip, bbox); + } } }
--- a/src/share/classes/sun/java2d/pisces/PiscesRenderingEngine.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/java2d/pisces/PiscesRenderingEngine.java Thu Jan 13 15:03:27 2011 -0800 @@ -557,6 +557,69 @@ return ptg; } + public AATileGenerator getAATileGenerator(double x, double y, + double dx1, double dy1, + double dx2, double dy2, + double lw1, double lw2, + Region clip, + int bbox[]) + { + // REMIND: Deal with large coordinates! + double ldx1, ldy1, ldx2, ldy2; + boolean innerpgram = (lw1 > 0 && lw2 > 0); + + if (innerpgram) { + ldx1 = dx1 * lw1; + ldy1 = dy1 * lw1; + ldx2 = dx2 * lw2; + ldy2 = dy2 * lw2; + x -= (ldx1 + ldx2) / 2.0; + y -= (ldy1 + ldy2) / 2.0; + dx1 += ldx1; + dy1 += ldy1; + dx2 += ldx2; + dy2 += ldy2; + if (lw1 > 1 && lw2 > 1) { + // Inner parallelogram was entirely consumed by stroke... + innerpgram = false; + } + } else { + ldx1 = ldy1 = ldx2 = ldy2 = 0; + } + + Renderer r = new Renderer(3, 3, + clip.getLoX(), clip.getLoY(), + clip.getWidth(), clip.getHeight(), + PathIterator.WIND_EVEN_ODD); + + r.moveTo((float) x, (float) y); + r.lineTo((float) (x+dx1), (float) (y+dy1)); + r.lineTo((float) (x+dx1+dx2), (float) (y+dy1+dy2)); + r.lineTo((float) (x+dx2), (float) (y+dy2)); + r.closePath(); + + if (innerpgram) { + x += ldx1 + ldx2; + y += ldy1 + ldy2; + dx1 -= 2.0 * ldx1; + dy1 -= 2.0 * ldy1; + dx2 -= 2.0 * ldx2; + dy2 -= 2.0 * ldy2; + r.moveTo((float) x, (float) y); + r.lineTo((float) (x+dx1), (float) (y+dy1)); + r.lineTo((float) (x+dx1+dx2), (float) (y+dy1+dy2)); + r.lineTo((float) (x+dx2), (float) (y+dy2)); + r.closePath(); + } + + r.pathDone(); + + r.endRendering(); + PiscesTileGenerator ptg = new PiscesTileGenerator(r, r.MAX_AA_ALPHA); + ptg.getBbox(bbox); + return ptg; + } + /** * Returns the minimum pen width that the antialiasing rasterizer * can represent without dropouts occuring.
--- a/src/share/classes/sun/launcher/LauncherHelper.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/launcher/LauncherHelper.java Thu Jan 13 15:03:27 2011 -0800 @@ -45,15 +45,18 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.math.BigDecimal; -import java.math.MathContext; import java.math.RoundingMode; import java.util.ResourceBundle; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Locale; +import java.util.Locale.Category; import java.util.Properties; +import java.util.Set; +import java.util.TreeSet; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; @@ -73,11 +76,6 @@ private static final String PROP_SETTINGS = "Property settings:"; private static final String LOCALE_SETTINGS = "Locale settings:"; - private static final long K = 1024; - private static final long M = K * K; - private static final long G = M * K; - private static final long T = G * K; - private static synchronized ResourceBundle getLauncherResourceBundle() { if (javarb == null) { javarb = ResourceBundle.getBundle(defaultBundleName); @@ -96,14 +94,20 @@ * optionFlag: specifies which options to print default is all other * possible values are vm, properties, locale. * + * initialHeapSize: in bytes, as set by the launcher, a zero-value indicates + * this code should determine this value, using a suitable method or + * the line could be omitted. + * * maxHeapSize: in bytes, as set by the launcher, a zero-value indicates * this code should determine this value, using a suitable method. * * stackSize: in bytes, as set by the launcher, a zero-value indicates - * this code determine this value, using a suitable method. + * this code determine this value, using a suitable method or omit the + * line entirely. */ static void showSettings(boolean printToStderr, String optionFlag, - long maxHeapSize, long stackSize, boolean isServer) { + long initialHeapSize, long maxHeapSize, long stackSize, + boolean isServer) { PrintStream ostream = (printToStderr) ? System.err : System.out; String opts[] = optionFlag.split(":"); @@ -112,7 +116,8 @@ : "all"; switch (optStr) { case "vm": - printVmSettings(ostream, maxHeapSize, stackSize, isServer); + printVmSettings(ostream, initialHeapSize, maxHeapSize, + stackSize, isServer); break; case "properties": printProperties(ostream); @@ -121,7 +126,8 @@ printLocale(ostream); break; default: - printVmSettings(ostream, maxHeapSize, stackSize, isServer); + printVmSettings(ostream, initialHeapSize, maxHeapSize, + stackSize, isServer); printProperties(ostream); printLocale(ostream); break; @@ -131,18 +137,25 @@ /* * prints the main vm settings subopt/section */ - private static void printVmSettings(PrintStream ostream, long maxHeapSize, + private static void printVmSettings(PrintStream ostream, + long initialHeapSize, long maxHeapSize, long stackSize, boolean isServer) { ostream.println(VM_SETTINGS); if (stackSize != 0L) { - ostream.println(INDENT + "Stack Size: " + scaleValue(stackSize)); + ostream.println(INDENT + "Stack Size: " + + SizePrefix.scaleValue(stackSize)); + } + if (initialHeapSize != 0L) { + ostream.println(INDENT + "Min. Heap Size: " + + SizePrefix.scaleValue(initialHeapSize)); } if (maxHeapSize != 0L) { - ostream.println(INDENT + "Max. Heap Size: " + scaleValue(maxHeapSize)); + ostream.println(INDENT + "Max. Heap Size: " + + SizePrefix.scaleValue(maxHeapSize)); } else { ostream.println(INDENT + "Max. Heap Size (Estimated): " - + scaleValue(Runtime.getRuntime().maxMemory())); + + SizePrefix.scaleValue(Runtime.getRuntime().maxMemory())); } ostream.println(INDENT + "Ergonomics Machine Class: " + ((isServer) ? "server" : "client")); @@ -152,28 +165,6 @@ } /* - * scale the incoming values to a human readable form, represented as - * K, M, G and T, see java.c parse_size for the scaled values and - * suffixes. - */ - - private static String scaleValue(double v) { - MathContext mc2 = new MathContext(3, RoundingMode.HALF_EVEN); - - if (v >= K && v < M) { - return (new BigDecimal(v / K, mc2)).toPlainString() + "K"; - } else if (v >= M && v < G) { - return (new BigDecimal(v / M, mc2)).toPlainString() + "M"; - } else if (v >= G && v < T) { - return (new BigDecimal(v / G, mc2)).toPlainString() + "G"; - } else if (v >= T) { - return (new BigDecimal(v / T, mc2)).toPlainString() + "T"; - } else { - return String.format("%.0f", v); - } - } - - /* * prints the properties subopt/section */ private static void printProperties(PrintStream ostream) { @@ -196,16 +187,17 @@ String key, String value) { ostream.print(INDENT + key + " = "); if (key.equals("line.separator")) { - byte[] bytes = value.getBytes(); - for (byte b : bytes) { + for (byte b : value.getBytes()) { switch (b) { case 0xd: - ostream.print("CR "); + ostream.print("\\r "); break; case 0xa: - ostream.print("LF "); + ostream.print("\\n "); break; default: + // print any bizzare line separators in hex, but really + // shouldn't happen. ostream.printf("0x%02X", b & 0xff); break; } @@ -217,15 +209,14 @@ ostream.println(value); return; } - // pretty print the path values as a list String[] values = value.split(System.getProperty("path.separator")); - int len = values.length; - for (int i = 0 ; i < len ; i++) { - if (i == 0) { // first line treated specially - ostream.println(values[i]); + boolean first = true; + for (String s : values) { + if (first) { // first line treated specially + ostream.println(s); + first = false; } else { // following lines prefix with indents - ostream.print(INDENT + INDENT); - ostream.println(values[i]); + ostream.println(INDENT + INDENT + s); } } } @@ -236,21 +227,35 @@ private static void printLocale(PrintStream ostream) { Locale locale = Locale.getDefault(); ostream.println(LOCALE_SETTINGS); - ostream.println(INDENT + "default locale = " + locale.getDisplayLanguage()); + ostream.println(INDENT + "default locale = " + + locale.getDisplayLanguage()); + ostream.println(INDENT + "default display locale = " + + Locale.getDefault(Category.DISPLAY).getDisplayName()); + ostream.println(INDENT + "default format locale = " + + Locale.getDefault(Category.FORMAT).getDisplayName()); printLocales(ostream); ostream.println(); } private static void printLocales(PrintStream ostream) { - Locale[] locales = Locale.getAvailableLocales(); - final int len = locales == null ? 0 : locales.length; + Locale[] tlocales = Locale.getAvailableLocales(); + final int len = tlocales == null ? 0 : tlocales.length; if (len < 1 ) { return; } + // Locale does not implement Comparable so we convert it to String + // and sort it for pretty printing. + Set<String> sortedSet = new TreeSet<>(); + for (Locale l : tlocales) { + sortedSet.add(l.toString()); + } + ostream.print(INDENT + "available locales = "); - final int last = len - 1 ; - for (int i = 0; i < last ; i++) { - ostream.print(locales[i]); + Iterator<String> iter = sortedSet.iterator(); + final int last = len - 1; + for (int i = 0 ; iter.hasNext() ; i++) { + String s = iter.next(); + ostream.print(s); if (i != last) { ostream.print(", "); } @@ -260,7 +265,42 @@ ostream.print(INDENT + INDENT); } } - ostream.println(locales[last]); + } + + private enum SizePrefix { + + KILO(1024, "K"), + MEGA(1024 * 1024, "M"), + GIGA(1024 * 1024 * 1024, "G"), + TERA(1024L * 1024L * 1024L * 1024L, "T"); + long size; + String abbrev; + + SizePrefix(long size, String abbrev) { + this.size = size; + this.abbrev = abbrev; + } + + private static String scale(long v, SizePrefix prefix) { + return BigDecimal.valueOf(v).divide(BigDecimal.valueOf(prefix.size), + 2, RoundingMode.HALF_EVEN).toPlainString() + prefix.abbrev; + } + /* + * scale the incoming values to a human readable form, represented as + * K, M, G and T, see java.c parse_size for the scaled values and + * suffixes. The lowest possible scaled value is Kilo. + */ + static String scaleValue(long v) { + if (v < MEGA.size) { + return scale(v, KILO); + } else if (v < GIGA.size) { + return scale(v, MEGA); + } else if (v < TERA.size) { + return scale(v, GIGA); + } else { + return scale(v, TERA); + } + } } /**
--- a/src/share/classes/sun/security/jgss/krb5/CipherHelper.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/security/jgss/krb5/CipherHelper.java Thu Jan 13 15:03:27 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -710,29 +710,21 @@ * where HMAC is on {16-byte confounder | plaintext | 16-byte token_header} * HMAC is not encrypted; it is appended at the end. */ - void encryptData(WrapToken_v2 token, byte[] confounder, byte[] tokenHeader, - byte[] plaintext, int start, int len, int key_usage, OutputStream os) - throws GSSException, IOException { + byte[] encryptData(WrapToken_v2 token, byte[] confounder, byte[] tokenHeader, + byte[] plaintext, int start, int len, int key_usage) + throws GSSException { - byte[] ctext = null; switch (etype) { - case EncryptedData.ETYPE_AES128_CTS_HMAC_SHA1_96: - ctext = aes128Encrypt(confounder, tokenHeader, - plaintext, start, len, key_usage); - break; - case EncryptedData.ETYPE_AES256_CTS_HMAC_SHA1_96: - ctext = aes256Encrypt(confounder, tokenHeader, - plaintext, start, len, key_usage); - break; - default: - throw new GSSException(GSSException.FAILURE, -1, - "Unsupported etype: " + etype); + case EncryptedData.ETYPE_AES128_CTS_HMAC_SHA1_96: + return aes128Encrypt(confounder, tokenHeader, + plaintext, start, len, key_usage); + case EncryptedData.ETYPE_AES256_CTS_HMAC_SHA1_96: + return aes256Encrypt(confounder, tokenHeader, + plaintext, start, len, key_usage); + default: + throw new GSSException(GSSException.FAILURE, -1, + "Unsupported etype: " + etype); } - - // Krb5Token.debug("EncryptedData = " + - // Krb5Token.getHexBytes(ctext) + "\n"); - // Write to stream - os.write(ctext); } void encryptData(WrapToken token, byte[] confounder, byte[] plaintext,
--- a/src/share/classes/sun/security/jgss/krb5/MessageToken_v2.java Thu Jan 06 20:10:32 2011 -0800 +++ b/src/share/classes/sun/security/jgss/krb5/MessageToken_v2.java Thu Jan 13 15:03:27 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,42 +26,40 @@ package sun.security.jgss.krb5; import org.ietf.jgss.*; -import sun.security.jgss.*; -import sun.security.krb5.*; import java.io.InputStream; import java.io.OutputStream; import java.io.IOException; import java.io.ByteArrayInputStream; -import java.security.GeneralSecurityException; +import java.io.ByteArrayOutputStream; import java.security.MessageDigest; +import java.util.Arrays; /** * This class is a base class for new GSS token definitions, as defined - * in draft-ietf-krb-wg-gssapi-cfx-07.txt, that pertain to per-message - * GSS-API calls. Conceptually GSS-API has two types of per-message tokens: - * WrapToken and MicToken. They differ in the respect that a WrapToken - * carries additional plaintext or ciphertext application data besides - * just the sequence number and checksum. This class encapsulates the - * commonality in the structure of the WrapToken and the MicToken. - * This structure can be represented as: + * in RFC 4121, that pertain to per-message GSS-API calls. Conceptually + * GSS-API has two types of per-message tokens: WrapToken and MicToken. + * They differ in the respect that a WrapToken carries additional plaintext + * or ciphertext application data besides just the sequence number and + * checksum. This class encapsulates the commonality in the structure of + * the WrapToken and the MicToken. This structure can be represented as: