Mercurial > hg > release > icedtea7-forest-2.4 > jdk
changeset 6747:60d52db33828 jdk7u40-b30
Merge
author | asaha |
---|---|
date | Mon, 17 Jun 2013 22:27:38 -0700 |
parents | 9062acbc098c (current diff) 39bd470724e2 (diff) |
children | db5a29c812ee 7d92b04dc65a b9532dc6ffc3 9b734892dae6 |
files | src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java src/macosx/native/sun/awt/AWTWindow.m src/share/lib/security/java.security-linux src/share/lib/security/java.security-macosx src/share/lib/security/java.security-solaris src/share/lib/security/java.security-windows src/solaris/native/sun/xawt/XlibWrapper.c |
diffstat | 72 files changed, 2968 insertions(+), 478 deletions(-) [+] |
line wrap: on
line diff
--- a/make/common/Defs.gmk Sun Jun 16 22:18:54 2013 -0700 +++ b/make/common/Defs.gmk Mon Jun 17 22:27:38 2013 -0700 @@ -431,7 +431,12 @@ # namely jni.h, jvm.h, and jni_utils.h, plus their platform-specific # relatives. # -VPATH0.h = $(PLATFORM_SRC)/javavm/export$(CLASSPATH_SEPARATOR)$(SHARE_SRC)/javavm/export +ifeq ($(PLATFORM), macosx) + VPATH0.h = $(PLATFORM_SRC_MACOS)/javavm/export$(CLASSPATH_SEPARATOR)$(SHARE_SRC)/javavm/export +else + VPATH0.h = $(PLATFORM_SRC)/javavm/export$(CLASSPATH_SEPARATOR)$(SHARE_SRC)/javavm/export +endif + ifdef OPENJDK VPATH.h = $(VPATH0.h) else
--- a/make/sun/jawt/Makefile Sun Jun 16 22:18:54 2013 -0700 +++ b/make/sun/jawt/Makefile Mon Jun 17 22:27:38 2013 -0700 @@ -30,6 +30,9 @@ include $(BUILDDIR)/common/Defs.gmk +# default to PLATFORM_SRC to copy export headers from +PLATFORM_EXPORT_BASE = $(PLATFORM_SRC) + # # Files # @@ -37,6 +40,8 @@ FILES_cpp = jawt.cpp else ifeq ($(PLATFORM), macosx) # PLATFORM FILES_objc = jawt.m +# pick up the correct export headers for Mac OS X +PLATFORM_EXPORT_BASE = $(PLATFORM_SRC_MACOS) else # PLATFORM FILES_c = jawt.c endif # PLATFORM @@ -160,7 +165,7 @@ # $(INCLUDEDIR)/%.h: $(SHARE_SRC)/javavm/export/%.h $(install-file) -$(PLATFORM_INCLUDE)/%.h: $(PLATFORM_SRC)/javavm/export/%.h +$(PLATFORM_INCLUDE)/%.h: $(PLATFORM_EXPORT_BASE)/javavm/export/%.h $(install-file)
--- a/src/macosx/bin/java_md_macosx.c Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/bin/java_md_macosx.c Mon Jun 17 22:27:38 2013 -0700 @@ -44,7 +44,6 @@ #include <Cocoa/Cocoa.h> #include <objc/objc-runtime.h> #include <objc/objc-auto.h> -#include <dispatch/dispatch.h> #include <errno.h> #include <spawn.h> @@ -1001,6 +1000,32 @@ setenv(envVar, "1", 1); } +/* This class is made for performSelectorOnMainThread when java main + * should be launched on main thread. + * We cannot use dispatch_sync here, because it blocks the main dispatch queue + * which is used inside Cocoa + */ +@interface JavaLaunchHelper : NSObject { + int _returnValue; +} +- (void) launchJava:(NSValue*)argsValue; +- (int) getReturnValue; +@end + +@implementation JavaLaunchHelper + +- (void) launchJava:(NSValue*)argsValue +{ + _returnValue = JavaMain([argsValue pointerValue]); +} + +- (int) getReturnValue +{ + return _returnValue; +} + +@end + // MacOSX we may continue in the same thread int JVMInit(InvocationFunctions* ifn, jlong threadStackSize, @@ -1010,16 +1035,22 @@ JLI_TraceLauncher("In same thread\n"); // need to block this thread against the main thread // so signals get caught correctly - __block int rslt; - dispatch_sync(dispatch_get_main_queue(), ^(void) { - JavaMainArgs args; - args.argc = argc; - args.argv = argv; - args.mode = mode; - args.what = what; - args.ifn = *ifn; - rslt = JavaMain((void*)&args); - }); + JavaMainArgs args; + args.argc = argc; + args.argv = argv; + args.mode = mode; + args.what = what; + args.ifn = *ifn; + int rslt; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + { + JavaLaunchHelper* launcher = [[[JavaLaunchHelper alloc] init] autorelease]; + [launcher performSelectorOnMainThread:@selector(launchJava:) + withObject:[NSValue valueWithPointer:(void*)&args] + waitUntilDone:YES]; + rslt = [launcher getReturnValue]; + } + [pool drain]; return rslt; } else { return ContinueInNewThread(ifn, threadStackSize, argc, argv, mode, what, ret);
--- a/src/macosx/classes/sun/font/CCharToGlyphMapper.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/classes/sun/font/CCharToGlyphMapper.java Mon Jun 17 22:27:38 2013 -0700 @@ -130,6 +130,15 @@ } public synchronized int charToGlyph(int unicode) { + if (unicode >= 0x10000) { + int[] glyphs = new int[2]; + char[] surrogates = new char[2]; + int base = unicode - 0x10000; + surrogates[0] = (char)((base >>> 10) + HI_SURROGATE_START); + surrogates[1] = (char)((base % 0x400) + LO_SURROGATE_START); + charsToGlyphs(2, surrogates, glyphs); + return glyphs[0]; + } else return charToGlyph((char)unicode); } @@ -138,9 +147,9 @@ } public synchronized void charsToGlyphs(int count, int[] unicodes, int[] glyphs) { - final char[] unicodeChars = new char[count]; - for (int i = 0; i < count; i++) unicodeChars[i] = (char)unicodes[i]; - cache.get(count, unicodeChars, glyphs); + for (int i = 0; i < count; i++) { + glyphs[i] = charToGlyph(unicodes[i]); + }; } // This mapper returns either the glyph code, or if the character can be @@ -166,7 +175,7 @@ firstLayerCache[1] = 1; } - public int get(final char index) { + public synchronized int get(final int index) { if (index < FIRST_LAYER_SIZE) { // catch common glyphcodes return firstLayerCache[index]; @@ -179,12 +188,12 @@ } if (generalCache == null) return 0; - final Integer value = generalCache.get(new Integer(index)); + final Integer value = generalCache.get(index); if (value == null) return 0; return value.intValue(); } - public void put(final char index, final int value) { + public synchronized void put(final int index, final int value) { if (index < FIRST_LAYER_SIZE) { // catch common glyphcodes firstLayerCache[index] = value; @@ -204,7 +213,7 @@ generalCache = new HashMap<Integer, Integer>(); } - generalCache.put(new Integer(index), new Integer(value)); + generalCache.put(index, value); } private class SparseBitShiftingTwoLayerArray { @@ -220,14 +229,14 @@ this.secondLayerLength = size >> shift; } - public int get(final char index) { + public int get(final int index) { final int firstIndex = index >> shift; final int[] firstLayerRow = cache[firstIndex]; if (firstLayerRow == null) return 0; return firstLayerRow[index - (firstIndex * (1 << shift))]; } - public void put(final char index, final int value) { + public void put(final int index, final int value) { final int firstIndex = index >> shift; int[] firstLayerRow = cache[firstIndex]; if (firstLayerRow == null) { @@ -237,77 +246,81 @@ } } - public void get(int count, char[] indicies, int[] values){ + public synchronized void get(int count, char[] indicies, int[] values) + { + // "missed" is the count of 'char' that are not mapped. + // Surrogates count for 2. + // unmappedChars is the unique list of these chars. + // unmappedCharIndices is the location in the original array int missed = 0; - for(int i = 0; i < count; i++){ - char code = indicies[i]; + char[] unmappedChars = null; + int [] unmappedCharIndices = null; + + for (int i = 0; i < count; i++){ + int code = indicies[i]; + if (code >= HI_SURROGATE_START && + code <= HI_SURROGATE_END && i < count - 1) + { + char low = indicies[i + 1]; + if (low >= LO_SURROGATE_START && low <= LO_SURROGATE_END) { + code = (code - HI_SURROGATE_START) * 0x400 + + low - LO_SURROGATE_START + 0x10000; + } + } final int value = get(code); - if(value != 0){ + if (value != 0 && value != -1) { values[i] = value; - }else{ - // zero this element out, because the caller does not - // promise to keep it clean + if (code >= 0x10000) { + values[i+1] = INVISIBLE_GLYPH_ID; + i++; + } + } else { values[i] = 0; + put(code, -1); + if (unmappedChars == null) { + // This is likely to be longer than we need, + // but is the simplest and cheapest option. + unmappedChars = new char[indicies.length]; + unmappedCharIndices = new int[indicies.length]; + } + unmappedChars[missed] = indicies[i]; + unmappedCharIndices[missed] = i; + if (code >= 0x10000) { // was a surrogate pair + unmappedChars[++missed] = indicies[++i]; + } missed++; } } - if (missed == 0) return; // horray! everything is already cached! - - final char[] filteredCodes = new char[missed]; // all index codes requested (partially filled) - final int[] filteredIndicies = new int[missed]; // local indicies into filteredCodes array (totally filled) - - // scan, mark, and store the index codes again to send into native - int j = 0; - int dupes = 0; - for (int i = 0; i < count; i++){ - if (values[i] != 0L) continue; // already filled - - final char code = indicies[i]; - - // we have already promised to fill this code - this is a dupe - if (get(code) == -1){ - filteredIndicies[j] = -1; - dupes++; - j++; - continue; - } - - // this is a code we have not obtained before - // mark this one as "promise to get" in the global cache with a -1 - final int k = j - dupes; - filteredCodes[k] = code; - put(code, -1); - filteredIndicies[j] = k; - j++; + if (missed == 0) { + return; } - final int filteredRunLen = j - dupes; - final int[] filteredValues = new int[filteredRunLen]; - - // bulk call to fill in the distinct values - nativeCharsToGlyphs(fFont.getNativeFontPtr(), filteredRunLen, filteredCodes, filteredValues); + final int[] glyphCodes = new int[missed]; - // scan the requested list, and fill in values from our - // distinct code list which has been filled from "getDistinct" - j = 0; - for (int i = 0; i < count; i++){ - if (values[i] != 0L && values[i] != -1L) continue; // already placed + // bulk call to fill in the unmapped code points. + nativeCharsToGlyphs(fFont.getNativeFontPtr(), + missed, unmappedChars, glyphCodes); - final int k = filteredIndicies[j]; // index into filteredImages array - final char code = indicies[i]; - if(k == -1L){ - // we should have already filled the cache with this value - values[i] = get(code); - }else{ - // fill the particular code request, and store in the cache - final int ptr = filteredValues[k]; - values[i] = ptr; - put(code, ptr); + for (int m = 0; m < missed; m++){ + int i = unmappedCharIndices[m]; + int code = unmappedChars[m]; + if (code >= HI_SURROGATE_START && + code <= HI_SURROGATE_END && m < missed - 1) + { + char low = indicies[m + 1]; + if (low >= LO_SURROGATE_START && low <= LO_SURROGATE_END) { + code = (code - HI_SURROGATE_START) * 0x400 + + low - LO_SURROGATE_START + 0x10000; + } } - - j++; + values[i] = glyphCodes[m]; + put(code, values[i]); + if (code >= 0x10000) { + m++; + values[i + 1] = INVISIBLE_GLYPH_ID; + } } } }
--- a/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, 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 @@ -115,6 +115,8 @@ static final int RESIZABLE = 1 << 9; // both a style bit and prop bit static final int NONACTIVATING = 1 << 24; + static final int IS_DIALOG = 1 << 25; + static final int IS_MODAL = 1 << 26; static final int _STYLE_PROP_BITMASK = DECORATED | TEXTURED | UNIFIED | UTILITY | HUD | SHEET | CLOSEABLE | MINIMIZABLE | RESIZABLE; @@ -375,6 +377,13 @@ } } + if (isDialog) { + styleBits = SET(styleBits, IS_DIALOG, true); + if (((Dialog) target).isModal()) { + styleBits = SET(styleBits, IS_MODAL, true); + } + } + peer.setTextured(IS(TEXTURED, styleBits)); return styleBits;
--- a/src/macosx/classes/sun/lwawt/macosx/CPrinterJob.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/classes/sun/lwawt/macosx/CPrinterJob.java Mon Jun 17 22:27:38 2013 -0700 @@ -209,7 +209,6 @@ * the end of the document. Note that firstPage * and lastPage are 0 based page indices. */ - int numPages = mDocument.getNumberOfPages(); int firstPage = getFirstPage(); int lastPage = getLastPage(); @@ -226,38 +225,49 @@ userCancelled = false; } - if (EventQueue.isDispatchThread()) { - // This is an AWT EventQueue, and this print rendering loop needs to block it. + //Add support for PageRange + PageRanges pr = (attributes == null) ? null + : (PageRanges)attributes.get(PageRanges.class); + int[][] prMembers = (pr == null) ? new int[0][0] : pr.getMembers(); + int loopi = 0; + do { + if (EventQueue.isDispatchThread()) { + // This is an AWT EventQueue, and this print rendering loop needs to block it. - onEventThread = true; + onEventThread = true; - try { - // Fire off the print rendering loop on the AppKit thread, and don't have - // it wait and block this thread. - if (printLoop(false, firstPage, lastPage)) { - // Fire off the EventConditional that will what until the condition is met, - // but will still process AWTEvent's as they occur. - new EventDispatchAccess() { - public boolean evaluate() { - return performingPrinting; - } - }.pumpEventsAndWait(); + try { + // Fire off the print rendering loop on the AppKit thread, and don't have + // it wait and block this thread. + if (printLoop(false, firstPage, lastPage)) { + // Fire off the EventConditional that will what until the condition is met, + // but will still process AWTEvent's as they occur. + new EventDispatchAccess() { + public boolean evaluate() { + return performingPrinting; + } + }.pumpEventsAndWait(); + } + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); + } else { + // Fire off the print rendering loop on the AppKit, and block this thread + // until it is done. + // But don't actually block... we need to come back here! + onEventThread = false; + + try { + printLoop(true, firstPage, lastPage); + } catch (Exception e) { + e.printStackTrace(); + } } - } else { - // Fire off the print rendering loop on the AppKit, and block this thread - // until it is done. - // But don't actually block... we need to come back here! - onEventThread = false; - - try { - printLoop(true, firstPage, lastPage); - } catch (Exception e) { - e.printStackTrace(); + if (++loopi < prMembers.length) { + firstPage = prMembers[loopi][0]-1; + lastPage = prMembers[loopi][1] -1; } - } + } while (loopi < prMembers.length); } finally { synchronized (this) { // NOTE: Native code shouldn't allow exceptions out while
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/macosx/javavm/export/jawt_md.h Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,110 @@ +/* + * Copyright (c) 1999, 2013 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. + */ + +#ifndef _JAVASOFT_JAWT_MD_H_ +#define _JAVASOFT_JAWT_MD_H_ + +/* + * To use jawt_X11DrawingSurfaceInfo you must define XAWT before including this header + * file. You must also have the X11 headers installed on your system. + */ +#ifdef XAWT +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Intrinsic.h> +#endif // XAWT + +#include "jawt.h" + +#ifdef __OBJC__ +#import <QuartzCore/CALayer.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Mac OS X specific declarations for AWT native interface. + * See notes in jawt.h for an example of use. + */ + +/* + * When calling JAWT_GetAWT with a JAWT version less than 1.7, you must pass this + * flag or you will not be able to get a valid drawing surface and JAWT_GetAWT will + * return false. This is to maintain compatibility with applications that used the + * interface with Java 6 which had multiple rendering models. This flag is not necessary + * when JAWT version 1.7 or greater is used as this is the only supported rendering mode. + * + * Example: + * JAWT awt; + * awt.version = JAWT_VERSION_1_4 | JAWT_MACOSX_USE_CALAYER; + * jboolean success = JAWT_GetAWT(env, &awt); + */ +#define JAWT_MACOSX_USE_CALAYER 0x80000000 + +/* + * When the native Cocoa toolkit is in use, the pointer stored in + * JAWT_DrawingSurfaceInfo->platformInfo points to a NSObject that conforms to the + * JAWT_SurfaceLayers protocol. Setting the layer property of this object will cause the + * specified layer to be overlaid on the Components rectangle. If the window the + * Component belongs to has a CALayer attached to it, this layer will be accessible via + * the windowLayer property. + */ +#ifdef __OBJC__ +@protocol JAWT_SurfaceLayers +@property (readwrite, retain) CALayer *layer; +@property (readonly) CALayer *windowLayer; +@end +#endif + +#ifdef XAWT +/* + * X11-specific declarations for AWT native interface. + * See notes in jawt.h for an example of use. + * + * WARNING: This interface is deprecated and will be removed in a future release. + */ +typedef struct jawt_X11DrawingSurfaceInfo { + Drawable drawable; + Display* display; + VisualID visualID; + Colormap colormapID; + int depth; + /* + * Since 1.4 + * Returns a pixel value from a set of RGB values. + * This is useful for paletted color (256 color) modes. + */ + int (JNICALL *GetAWTColor)(JAWT_DrawingSurface* ds, + int r, int g, int b); +} JAWT_X11DrawingSurfaceInfo; +#endif // XAWT + +#ifdef __cplusplus +} +#endif + +#endif /* !_JAVASOFT_JAWT_MD_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/macosx/javavm/export/jni_md.h Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,41 @@ +/* + * Copyright (c) 1996, 2000, 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. + */ + +#ifndef _JAVASOFT_JNI_MD_H_ +#define _JAVASOFT_JNI_MD_H_ + +#define JNIEXPORT +#define JNIIMPORT +#define JNICALL + +typedef int jint; +#ifdef _LP64 /* 64-bit */ +typedef long jlong; +#else +typedef long long jlong; +#endif +typedef signed char jbyte; + +#endif /* !_JAVASOFT_JNI_MD_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/macosx/javavm/export/jvm_md.h Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,81 @@ +/* + * Copyright (c) 1997, 2008, 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. + */ + +#ifndef _JAVASOFT_JVM_MD_H_ +#define _JAVASOFT_JVM_MD_H_ + +/* + * This file is currently collecting Mac OS X specific dregs for the + * JNI conversion, which should be sorted out later. + */ + +#include <dirent.h> /* For DIR */ +#include <sys/param.h> /* For MAXPATHLEN */ +#include <unistd.h> /* For F_OK, R_OK, W_OK */ +#include <stddef.h> /* For ptrdiff_t */ +#include <stdint.h> /* For uintptr_t */ + +#define JNI_ONLOAD_SYMBOLS {"JNI_OnLoad"} +#define JNI_ONUNLOAD_SYMBOLS {"JNI_OnUnload"} + +#define JNI_LIB_PREFIX "lib" +#define JNI_LIB_SUFFIX ".dylib" +#define VERSIONED_JNI_LIB_NAME(NAME, VERSION) JNI_LIB_PREFIX NAME "." VERSION JNI_LIB_SUFFIX +#define JNI_LIB_NAME(NAME) JNI_LIB_PREFIX NAME JNI_LIB_SUFFIX + +#define JVM_MAXPATHLEN MAXPATHLEN + +#define JVM_R_OK R_OK +#define JVM_W_OK W_OK +#define JVM_X_OK X_OK +#define JVM_F_OK F_OK + +/* + * File I/O + */ + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/signal.h> + +/* O Flags */ + +#define JVM_O_RDONLY O_RDONLY +#define JVM_O_WRONLY O_WRONLY +#define JVM_O_RDWR O_RDWR +#define JVM_O_O_APPEND O_APPEND +#define JVM_O_EXCL O_EXCL +#define JVM_O_CREAT O_CREAT +#define JVM_O_DELETE 0x10000 + +/* Signals */ + +#define JVM_SIGINT SIGINT +#define JVM_SIGTERM SIGTERM + + +#endif /* !_JAVASOFT_JVM_MD_H_ */
--- a/src/macosx/native/sun/awt/AWTSurfaceLayers.h Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/native/sun/awt/AWTSurfaceLayers.h Mon Jun 17 22:27:38 2013 -0700 @@ -23,8 +23,7 @@ * questions. */ -// REMIND: import <jawt_md.h> -#import <JavaVM/jawt_md.h> +#import <jawt_md.h> /* * The CALayer-based rendering model returns an object conforming
--- a/src/macosx/native/sun/awt/AWTWindow.m Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/native/sun/awt/AWTWindow.m Mon Jun 17 22:27:38 2013 -0700 @@ -581,8 +581,12 @@ - (void) windowDidBecomeKey: (NSNotification *) notification { AWT_ASSERT_APPKIT_THREAD; [AWTToolkit eventCountPlusPlus]; - [CMenuBar activate:self.javaMenuBar modallyDisabled:NO]; AWTWindow *opposite = [AWTWindow lastKeyWindow]; + if (!IS(self.styleBits, IS_DIALOG)) { + [CMenuBar activate:self.javaMenuBar modallyDisabled:NO]; + } else if ((opposite != NULL) && IS(self.styleBits, IS_MODAL)) { + [CMenuBar activate:opposite->javaMenuBar modallyDisabled:YES]; + } [AWTWindow setLastKeyWindow:nil]; [self _deliverWindowFocusEvent:YES oppositeWindow: opposite];
--- a/src/macosx/native/sun/awt/CMenuComponent.h Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/native/sun/awt/CMenuComponent.h Mon Jun 17 22:27:38 2013 -0700 @@ -24,7 +24,7 @@ */ #import <AppKit/AppKit.h> -#import <JavaVM/jni.h> +#import <jni.h> @interface CMenuComponent : NSObject {
--- a/src/macosx/native/sun/awt/CTextPipe.m Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/native/sun/awt/CTextPipe.m Mon Jun 17 22:27:38 2013 -0700 @@ -138,8 +138,13 @@ // get our baseline transform and font CGContextRef cgRef = qsdo->cgRef; CGAffineTransform ctmText = CGContextGetTextMatrix(cgRef); - //CGFontRef cgFont = CGContextGetFont(cgRef); + + BOOL saved = false; + /* Save and restore of graphics context is done before the iteration. + This seems to work using our test case (see bug ID 7158350) so we are restoring it at + the end of the for loop. If we find out that save/restore outside the loop + doesn't work on all cases then we will move the Save/Restore inside the loop.*/ CGContextSaveGState(cgRef); CGAffineTransform invTx = CGAffineTransformInvert(strike->fTx); @@ -168,10 +173,19 @@ CFRelease(fallback); if (cgFallback) { + if (!saved) { + CGContextSaveGState(cgRef); + saved = true; + } CGContextSetFont(cgRef, cgFallback); CFRelease(cgFallback); } } + } else { + if (saved) { + CGContextRestoreGState(cgRef); + saved = false; + } } // if we have per-glyph transformations @@ -206,13 +220,9 @@ pt.x += advances[i].width; pt.y += advances[i].height; - // reset the font on the context after striking a unicode with CoreText - if (uniChar != 0) - { - // CGContextSetFont(cgRef, cgFont); - CGContextSaveGState(cgRef); - } } + // reset the font on the context after striking a unicode with CoreText + CGContextRestoreGState(cgRef); } // Using the Quartz Surface Data context, draw a hot-substituted character run
--- a/src/macosx/native/sun/awt/jawt.m Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/native/sun/awt/jawt.m Mon Jun 17 22:27:38 2013 -0700 @@ -24,9 +24,7 @@ */ #import <jawt.h> - -// REMIND: import <jawt_md.h> -#import <JavaVM/jawt_md.h> +#import <jawt_md.h> #import "awt_DrawingSurface.h"
--- a/src/macosx/native/sun/font/CoreTextSupport.h Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/native/sun/font/CoreTextSupport.h Mon Jun 17 22:27:38 2013 -0700 @@ -24,7 +24,7 @@ */ #import <Cocoa/Cocoa.h> -#import <JavaVM/jni.h> +#import <jni.h> #import <JavaRuntimeSupport/JavaRuntimeSupport.h> #include "AWTFont.h"
--- a/src/macosx/native/sun/osxapp/QueuingApplicationDelegate.m Sun Jun 16 22:18:54 2013 -0700 +++ b/src/macosx/native/sun/osxapp/QueuingApplicationDelegate.m Mon Jun 17 22:27:38 2013 -0700 @@ -110,8 +110,14 @@ - (void)_handleOpenURLEvent:(NSAppleEventDescriptor *)openURLEvent withReplyEvent:(NSAppleEventDescriptor *)replyEvent { + // Make an explicit copy of the passed events as they may be invalidated by the time they're processed + NSAppleEventDescriptor *openURLEventCopy = [openURLEvent copy]; + NSAppleEventDescriptor *replyEventCopy = [replyEvent copy]; + [self.queue addObject:[^(){ - [self.realDelegate _handleOpenURLEvent:openURLEvent withReplyEvent:replyEvent]; + [self.realDelegate _handleOpenURLEvent:openURLEventCopy withReplyEvent:replyEventCopy]; + [openURLEventCopy release]; + [replyEventCopy release]; } copy]]; }
--- a/src/share/classes/java/beans/XMLEncoder.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/java/beans/XMLEncoder.java Mon Jun 17 22:27:38 2013 -0700 @@ -487,6 +487,12 @@ } indentation--; + Statement statement = getMissedStatement(); + while (statement != null) { + outputStatement(statement, this, false); + statement = getMissedStatement(); + } + try { out.flush(); } @@ -503,6 +509,17 @@ targetToStatementList.clear(); } + Statement getMissedStatement() { + for (List<Statement> statements : this.targetToStatementList.values()) { + for (int i = 0; i < statements.size(); i++) { + if (Statement.class == statements.get(i).getClass()) { + return statements.remove(i); + } + } + } + return null; + } + /** * This method calls <code>flush</code>, writes the closing @@ -597,7 +614,7 @@ "methodName") + " should not be null"); } - if (target instanceof Field && methodName.equals("get")) { + if (isArgument && target instanceof Field && methodName.equals("get")) { Field f = (Field)target; writeln("<object class=" + quote(f.getDeclaringClass().getName()) + " field=" + quote(f.getName()) + "/>");
--- a/src/share/classes/java/io/File.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/java/io/File.java Mon Jun 17 22:27:38 2013 -0700 @@ -1876,14 +1876,20 @@ // file name generation private static final SecureRandom random = new SecureRandom(); - static File generateFile(String prefix, String suffix, File dir) { + static File generateFile(String prefix, String suffix, File dir) + throws IOException + { long n = random.nextLong(); if (n == Long.MIN_VALUE) { n = 0; // corner case } else { n = Math.abs(n); } - return new File(dir, prefix + Long.toString(n) + suffix); + String name = prefix + Long.toString(n) + suffix; + File f = new File(dir, name); + if (!name.equals(f.getName())) + throw new IOException("Unable to create temporary file"); + return f; } } @@ -1965,25 +1971,21 @@ if (suffix == null) suffix = ".tmp"; - File tmpdir = (directory != null) ? directory : TempDirectory.location(); - SecurityManager sm = System.getSecurityManager(); + File tmpdir = (directory != null) ? directory + : TempDirectory.location(); File f; - do { - f = TempDirectory.generateFile(prefix, suffix, tmpdir); - if (sm != null) { - try { - sm.checkWrite(f.getPath()); - } catch (SecurityException se) { - // don't reveal temporary directory location - if (directory == null) - throw new SecurityException("Unable to create temporary file"); - throw se; - } - } - if (f.isInvalid()) { + try { + do { + f = TempDirectory.generateFile(prefix, suffix, tmpdir); + } while (f.exists()); + if (!f.createNewFile()) throw new IOException("Unable to create temporary file"); - } - } while (!fs.createFileExclusively(f.getPath())); + } catch (SecurityException se) { + // don't reveal temporary directory location + if (directory == null) + throw new SecurityException("Unable to create temporary file"); + throw se; + } return f; }
--- a/src/share/classes/java/lang/Throwable.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/java/lang/Throwable.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2013, 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 @@ -453,9 +453,10 @@ */ public synchronized Throwable initCause(Throwable cause) { if (this.cause != this) - throw new IllegalStateException("Can't overwrite cause"); + throw new IllegalStateException("Can't overwrite cause with " + + Objects.toString(cause, "a null"), this); if (cause == this) - throw new IllegalArgumentException("Self-causation not permitted"); + throw new IllegalArgumentException("Self-causation not permitted", this); this.cause = cause; return this; } @@ -1039,7 +1040,7 @@ */ public final synchronized void addSuppressed(Throwable exception) { if (exception == this) - throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE); + throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE, exception); if (exception == null) throw new NullPointerException(NULL_CAUSE_MESSAGE);
--- a/src/share/classes/java/util/EnumMap.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/java/util/EnumMap.java Mon Jun 17 22:27:38 2013 -0700 @@ -729,6 +729,7 @@ throw new AssertionError(); } result.vals = result.vals.clone(); + result.entrySet = null; return result; }
--- a/src/share/classes/java/util/concurrent/FutureTask.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/java/util/concurrent/FutureTask.java Mon Jun 17 22:27:38 2013 -0700 @@ -34,51 +34,111 @@ */ package java.util.concurrent; -import java.util.concurrent.locks.*; +import java.util.concurrent.locks.LockSupport; /** * A cancellable asynchronous computation. This class provides a base * implementation of {@link Future}, with methods to start and cancel * a computation, query to see if the computation is complete, and * retrieve the result of the computation. The result can only be - * retrieved when the computation has completed; the <tt>get</tt> - * method will block if the computation has not yet completed. Once + * retrieved when the computation has completed; the {@code get} + * methods will block if the computation has not yet completed. Once * the computation has completed, the computation cannot be restarted - * or cancelled. + * or cancelled (unless the computation is invoked using + * {@link #runAndReset}). * - * <p>A <tt>FutureTask</tt> can be used to wrap a {@link Callable} or - * {@link java.lang.Runnable} object. Because <tt>FutureTask</tt> - * implements <tt>Runnable</tt>, a <tt>FutureTask</tt> can be - * submitted to an {@link Executor} for execution. + * <p>A {@code FutureTask} can be used to wrap a {@link Callable} or + * {@link Runnable} object. Because {@code FutureTask} implements + * {@code Runnable}, a {@code FutureTask} can be submitted to an + * {@link Executor} for execution. * * <p>In addition to serving as a standalone class, this class provides - * <tt>protected</tt> functionality that may be useful when creating + * {@code protected} functionality that may be useful when creating * customized task classes. * * @since 1.5 * @author Doug Lea - * @param <V> The result type returned by this FutureTask's <tt>get</tt> method + * @param <V> The result type returned by this FutureTask's {@code get} methods */ public class FutureTask<V> implements RunnableFuture<V> { - /** Synchronization control for FutureTask */ - private final Sync sync; + /* + * Revision notes: This differs from previous versions of this + * class that relied on AbstractQueuedSynchronizer, mainly to + * avoid surprising users about retaining interrupt status during + * cancellation races. Sync control in the current design relies + * on a "state" field updated via CAS to track completion, along + * with a simple Treiber stack to hold waiting threads. + * + * Style note: As usual, we bypass overhead of using + * AtomicXFieldUpdaters and instead directly use Unsafe intrinsics. + */ /** - * Creates a <tt>FutureTask</tt> that will, upon running, execute the - * given <tt>Callable</tt>. + * The run state of this task, initially NEW. The run state + * transitions to a terminal state only in methods set, + * setException, and cancel. During completion, state may take on + * transient values of COMPLETING (while outcome is being set) or + * INTERRUPTING (only while interrupting the runner to satisfy a + * cancel(true)). Transitions from these intermediate to final + * states use cheaper ordered/lazy writes because values are unique + * and cannot be further modified. + * + * Possible state transitions: + * NEW -> COMPLETING -> NORMAL + * NEW -> COMPLETING -> EXCEPTIONAL + * NEW -> CANCELLED + * NEW -> INTERRUPTING -> INTERRUPTED + */ + private volatile int state; + private static final int NEW = 0; + private static final int COMPLETING = 1; + private static final int NORMAL = 2; + private static final int EXCEPTIONAL = 3; + private static final int CANCELLED = 4; + private static final int INTERRUPTING = 5; + private static final int INTERRUPTED = 6; + + /** The underlying callable; nulled out after running */ + private Callable<V> callable; + /** The result to return or exception to throw from get() */ + private Object outcome; // non-volatile, protected by state reads/writes + /** The thread running the callable; CASed during run() */ + private volatile Thread runner; + /** Treiber stack of waiting threads */ + private volatile WaitNode waiters; + + /** + * Returns result or throws exception for completed task. + * + * @param s completed state value + */ + @SuppressWarnings("unchecked") + private V report(int s) throws ExecutionException { + Object x = outcome; + if (s == NORMAL) + return (V)x; + if (s >= CANCELLED) + throw new CancellationException(); + throw new ExecutionException((Throwable)x); + } + + /** + * Creates a {@code FutureTask} that will, upon running, execute the + * given {@code Callable}. * * @param callable the callable task - * @throws NullPointerException if callable is null + * @throws NullPointerException if the callable is null */ public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); - sync = new Sync(callable); + this.callable = callable; + this.state = NEW; // ensure visibility of callable } /** - * Creates a <tt>FutureTask</tt> that will, upon running, execute the - * given <tt>Runnable</tt>, and arrange that <tt>get</tt> will return the + * Creates a {@code FutureTask} that will, upon running, execute the + * given {@code Runnable}, and arrange that {@code get} will return the * given result on successful completion. * * @param runnable the runnable task @@ -86,29 +146,46 @@ * you don't need a particular result, consider using * constructions of the form: * {@code Future<?> f = new FutureTask<Void>(runnable, null)} - * @throws NullPointerException if runnable is null + * @throws NullPointerException if the runnable is null */ public FutureTask(Runnable runnable, V result) { - sync = new Sync(Executors.callable(runnable, result)); + this.callable = Executors.callable(runnable, result); + this.state = NEW; // ensure visibility of callable } public boolean isCancelled() { - return sync.innerIsCancelled(); + return state >= CANCELLED; } public boolean isDone() { - return sync.innerIsDone(); + return state != NEW; } public boolean cancel(boolean mayInterruptIfRunning) { - return sync.innerCancel(mayInterruptIfRunning); + if (state != NEW) + return false; + if (mayInterruptIfRunning) { + if (!UNSAFE.compareAndSwapInt(this, stateOffset, NEW, INTERRUPTING)) + return false; + Thread t = runner; + if (t != null) + t.interrupt(); + UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED); // final state + } + else if (!UNSAFE.compareAndSwapInt(this, stateOffset, NEW, CANCELLED)) + return false; + finishCompletion(); + return true; } /** * @throws CancellationException {@inheritDoc} */ public V get() throws InterruptedException, ExecutionException { - return sync.innerGet(); + int s = state; + if (s <= COMPLETING) + s = awaitDone(false, 0L); + return report(s); } /** @@ -116,12 +193,18 @@ */ public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - return sync.innerGet(unit.toNanos(timeout)); + if (unit == null) + throw new NullPointerException(); + int s = state; + if (s <= COMPLETING && + (s = awaitDone(true, unit.toNanos(timeout))) <= COMPLETING) + throw new TimeoutException(); + return report(s); } /** * Protected method invoked when this task transitions to state - * <tt>isDone</tt> (whether normally or via cancellation). The + * {@code isDone} (whether normally or via cancellation). The * default implementation does nothing. Subclasses may override * this method to invoke completion callbacks or perform * bookkeeping. Note that you can query status inside the @@ -131,230 +214,269 @@ protected void done() { } /** - * Sets the result of this Future to the given value unless + * Sets the result of this future to the given value unless * this future has already been set or has been cancelled. - * This method is invoked internally by the <tt>run</tt> method + * + * <p>This method is invoked internally by the {@link #run} method * upon successful completion of the computation. + * * @param v the value */ protected void set(V v) { - sync.innerSet(v); + if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { + outcome = v; + UNSAFE.putOrderedInt(this, stateOffset, NORMAL); // final state + finishCompletion(); + } } /** - * Causes this future to report an <tt>ExecutionException</tt> - * with the given throwable as its cause, unless this Future has + * Causes this future to report an {@link ExecutionException} + * with the given throwable as its cause, unless this future has * already been set or has been cancelled. - * This method is invoked internally by the <tt>run</tt> method + * + * <p>This method is invoked internally by the {@link #run} method * upon failure of the computation. + * * @param t the cause of failure */ protected void setException(Throwable t) { - sync.innerSetException(t); + if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { + outcome = t; + UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final state + finishCompletion(); + } } - // The following (duplicated) doc comment can be removed once - // - // 6270645: Javadoc comments should be inherited from most derived - // superinterface or superclass - // is fixed. - /** - * Sets this Future to the result of its computation - * unless it has been cancelled. - */ public void run() { - sync.innerRun(); + if (state != NEW || + !UNSAFE.compareAndSwapObject(this, runnerOffset, + null, Thread.currentThread())) + return; + try { + Callable<V> c = callable; + if (c != null && state == NEW) { + V result; + boolean ran; + try { + result = c.call(); + ran = true; + } catch (Throwable ex) { + result = null; + ran = false; + setException(ex); + } + if (ran) + set(result); + } + } finally { + // runner must be non-null until state is settled to + // prevent concurrent calls to run() + runner = null; + // state must be re-read after nulling runner to prevent + // leaked interrupts + int s = state; + if (s >= INTERRUPTING) + handlePossibleCancellationInterrupt(s); + } } /** * Executes the computation without setting its result, and then - * resets this Future to initial state, failing to do so if the + * resets this future to initial state, failing to do so if the * computation encounters an exception or is cancelled. This is * designed for use with tasks that intrinsically execute more * than once. + * * @return true if successfully run and reset */ protected boolean runAndReset() { - return sync.innerRunAndReset(); + if (state != NEW || + !UNSAFE.compareAndSwapObject(this, runnerOffset, + null, Thread.currentThread())) + return false; + boolean ran = false; + int s = state; + try { + Callable<V> c = callable; + if (c != null && s == NEW) { + try { + c.call(); // don't set result + ran = true; + } catch (Throwable ex) { + setException(ex); + } + } + } finally { + // runner must be non-null until state is settled to + // prevent concurrent calls to run() + runner = null; + // state must be re-read after nulling runner to prevent + // leaked interrupts + s = state; + if (s >= INTERRUPTING) + handlePossibleCancellationInterrupt(s); + } + return ran && s == NEW; + } + + /** + * Ensures that any interrupt from a possible cancel(true) is only + * delivered to a task while in run or runAndReset. + */ + private void handlePossibleCancellationInterrupt(int s) { + // It is possible for our interrupter to stall before getting a + // chance to interrupt us. Let's spin-wait patiently. + if (s == INTERRUPTING) + while (state == INTERRUPTING) + Thread.yield(); // wait out pending interrupt + + // assert state == INTERRUPTED; + + // We want to clear any interrupt we may have received from + // cancel(true). However, it is permissible to use interrupts + // as an independent mechanism for a task to communicate with + // its caller, and there is no way to clear only the + // cancellation interrupt. + // + // Thread.interrupted(); + } + + /** + * Simple linked list nodes to record waiting threads in a Treiber + * stack. See other classes such as Phaser and SynchronousQueue + * for more detailed explanation. + */ + static final class WaitNode { + volatile Thread thread; + volatile WaitNode next; + WaitNode() { thread = Thread.currentThread(); } } /** - * Synchronization control for FutureTask. Note that this must be - * a non-static inner class in order to invoke the protected - * <tt>done</tt> method. For clarity, all inner class support - * methods are same as outer, prefixed with "inner". - * - * Uses AQS sync state to represent run status + * Removes and signals all waiting threads, invokes done(), and + * nulls out callable. */ - private final class Sync extends AbstractQueuedSynchronizer { - private static final long serialVersionUID = -7828117401763700385L; - - /** State value representing that task is ready to run */ - private static final int READY = 0; - /** State value representing that task is running */ - private static final int RUNNING = 1; - /** State value representing that task ran */ - private static final int RAN = 2; - /** State value representing that task was cancelled */ - private static final int CANCELLED = 4; - - /** The underlying callable */ - private final Callable<V> callable; - /** The result to return from get() */ - private V result; - /** The exception to throw from get() */ - private Throwable exception; - - /** - * The thread running task. When nulled after set/cancel, this - * indicates that the results are accessible. Must be - * volatile, to ensure visibility upon completion. - */ - private volatile Thread runner; - - Sync(Callable<V> callable) { - this.callable = callable; - } - - private boolean ranOrCancelled(int state) { - return (state & (RAN | CANCELLED)) != 0; - } - - /** - * Implements AQS base acquire to succeed if ran or cancelled - */ - protected int tryAcquireShared(int ignore) { - return innerIsDone() ? 1 : -1; - } - - /** - * Implements AQS base release to always signal after setting - * final done status by nulling runner thread. - */ - protected boolean tryReleaseShared(int ignore) { - runner = null; - return true; - } - - boolean innerIsCancelled() { - return getState() == CANCELLED; - } - - boolean innerIsDone() { - return ranOrCancelled(getState()) && runner == null; - } - - V innerGet() throws InterruptedException, ExecutionException { - acquireSharedInterruptibly(0); - if (getState() == CANCELLED) - throw new CancellationException(); - if (exception != null) - throw new ExecutionException(exception); - return result; - } - - V innerGet(long nanosTimeout) throws InterruptedException, ExecutionException, TimeoutException { - if (!tryAcquireSharedNanos(0, nanosTimeout)) - throw new TimeoutException(); - if (getState() == CANCELLED) - throw new CancellationException(); - if (exception != null) - throw new ExecutionException(exception); - return result; - } - - void innerSet(V v) { - for (;;) { - int s = getState(); - if (s == RAN) - return; - if (s == CANCELLED) { - // aggressively release to set runner to null, - // in case we are racing with a cancel request - // that will try to interrupt runner - releaseShared(0); - return; + private void finishCompletion() { + // assert state > COMPLETING; + for (WaitNode q; (q = waiters) != null;) { + if (UNSAFE.compareAndSwapObject(this, waitersOffset, q, null)) { + for (;;) { + Thread t = q.thread; + if (t != null) { + q.thread = null; + LockSupport.unpark(t); + } + WaitNode next = q.next; + if (next == null) + break; + q.next = null; // unlink to help gc + q = next; } - if (compareAndSetState(s, RAN)) { - result = v; - releaseShared(0); - done(); - return; - } + break; } } - void innerSetException(Throwable t) { - for (;;) { - int s = getState(); - if (s == RAN) - return; - if (s == CANCELLED) { - // aggressively release to set runner to null, - // in case we are racing with a cancel request - // that will try to interrupt runner - releaseShared(0); - return; - } - if (compareAndSetState(s, RAN)) { - exception = t; - releaseShared(0); - done(); - return; - } + done(); + + callable = null; // to reduce footprint + } + + /** + * Awaits completion or aborts on interrupt or timeout. + * + * @param timed true if use timed waits + * @param nanos time to wait, if timed + * @return state upon completion + */ + private int awaitDone(boolean timed, long nanos) + throws InterruptedException { + final long deadline = timed ? System.nanoTime() + nanos : 0L; + WaitNode q = null; + boolean queued = false; + for (;;) { + if (Thread.interrupted()) { + removeWaiter(q); + throw new InterruptedException(); } - } - boolean innerCancel(boolean mayInterruptIfRunning) { - for (;;) { - int s = getState(); - if (ranOrCancelled(s)) - return false; - if (compareAndSetState(s, CANCELLED)) - break; - } - if (mayInterruptIfRunning) { - Thread r = runner; - if (r != null) - r.interrupt(); + int s = state; + if (s > COMPLETING) { + if (q != null) + q.thread = null; + return s; } - releaseShared(0); - done(); - return true; - } - - void innerRun() { - if (!compareAndSetState(READY, RUNNING)) - return; - - runner = Thread.currentThread(); - if (getState() == RUNNING) { // recheck after setting thread - V result; - try { - result = callable.call(); - } catch (Throwable ex) { - setException(ex); - return; + else if (s == COMPLETING) // cannot time out yet + Thread.yield(); + else if (q == null) + q = new WaitNode(); + else if (!queued) + queued = UNSAFE.compareAndSwapObject(this, waitersOffset, + q.next = waiters, q); + else if (timed) { + nanos = deadline - System.nanoTime(); + if (nanos <= 0L) { + removeWaiter(q); + return state; } - set(result); - } else { - releaseShared(0); // cancel + LockSupport.parkNanos(this, nanos); } + else + LockSupport.park(this); } + } - boolean innerRunAndReset() { - if (!compareAndSetState(READY, RUNNING)) - return false; - try { - runner = Thread.currentThread(); - if (getState() == RUNNING) - callable.call(); // don't set result - runner = null; - return compareAndSetState(RUNNING, READY); - } catch (Throwable ex) { - setException(ex); - return false; + /** + * Tries to unlink a timed-out or interrupted wait node to avoid + * accumulating garbage. Internal nodes are simply unspliced + * without CAS since it is harmless if they are traversed anyway + * by releasers. To avoid effects of unsplicing from already + * removed nodes, the list is retraversed in case of an apparent + * race. This is slow when there are a lot of nodes, but we don't + * expect lists to be long enough to outweigh higher-overhead + * schemes. + */ + private void removeWaiter(WaitNode node) { + if (node != null) { + node.thread = null; + retry: + for (;;) { // restart on removeWaiter race + for (WaitNode pred = null, q = waiters, s; q != null; q = s) { + s = q.next; + if (q.thread != null) + pred = q; + else if (pred != null) { + pred.next = s; + if (pred.thread == null) // check for race + continue retry; + } + else if (!UNSAFE.compareAndSwapObject(this, waitersOffset, + q, s)) + continue retry; + } + break; } } } + + // Unsafe mechanics + private static final sun.misc.Unsafe UNSAFE; + private static final long stateOffset; + private static final long runnerOffset; + private static final long waitersOffset; + static { + try { + UNSAFE = sun.misc.Unsafe.getUnsafe(); + Class<?> k = FutureTask.class; + stateOffset = UNSAFE.objectFieldOffset + (k.getDeclaredField("state")); + runnerOffset = UNSAFE.objectFieldOffset + (k.getDeclaredField("runner")); + waitersOffset = UNSAFE.objectFieldOffset + (k.getDeclaredField("waiters")); + } catch (Exception e) { + throw new Error(e); + } + } + }
--- a/src/share/classes/javax/swing/DefaultComboBoxModel.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/javax/swing/DefaultComboBoxModel.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2013, 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 @@ -55,8 +55,7 @@ * @param items an array of Object objects */ public DefaultComboBoxModel(final E items[]) { - objects = new Vector<E>(); - objects.ensureCapacity( items.length ); + objects = new Vector<E>(items.length); int i,c; for ( i=0,c=items.length;i<c;i++ )
--- a/src/share/classes/javax/swing/KeyboardManager.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/javax/swing/KeyboardManager.java Mon Jun 17 22:27:38 2013 -0700 @@ -285,10 +285,11 @@ while (iter.hasMoreElements()) { JMenuBar mb = (JMenuBar)iter.nextElement(); if ( mb.isShowing() && mb.isEnabled() ) { // don't want to give these out - if( !(ks.equals(ksE)) ) { + boolean extended = (ksE != null) && !ksE.equals(ks); + if (extended) { fireBinding(mb, ksE, e, pressed); } - if(ks.equals(ksE) || !e.isConsumed()) { + if (!extended || !e.isConsumed()) { fireBinding(mb, ks, e, pressed); } if (e.isConsumed()) {
--- a/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java Mon Jun 17 22:27:38 2013 -0700 @@ -692,9 +692,9 @@ */ protected void installComponents() { arrowButton = createArrowButton(); - comboBox.add( arrowButton ); if (arrowButton != null) { + comboBox.add(arrowButton); configureArrowButton(); }
--- a/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, 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 @@ -419,7 +419,7 @@ } } else { - if (!(table.getParent().getParent() instanceof + if (!(SwingUtilities.getUnwrappedParent(table).getParent() instanceof JScrollPane)) { return; } @@ -1431,7 +1431,7 @@ } // install the scrollpane border - Container parent = table.getParent(); // should be viewport + Container parent = SwingUtilities.getUnwrappedParent(table); // should be viewport if (parent != null) { parent = parent.getParent(); // should be the scrollpane if (parent != null && parent instanceof JScrollPane) {
--- a/src/share/classes/javax/swing/text/View.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/javax/swing/text/View.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, 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 @@ -1174,6 +1174,7 @@ // formed by added elements (i.e. they will be updated // by initialization. index0 = Math.max(index0, 0); + index1 = Math.max((getViewCount() - 1), 0); for (int i = index0; i <= index1; i++) { if (! ((i >= hole0) && (i <= hole1))) { v = getView(i);
--- a/src/share/classes/sun/font/FileFontStrike.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/sun/font/FileFontStrike.java Mon Jun 17 22:27:38 2013 -0700 @@ -747,14 +747,9 @@ return origMinX; } - long pixelData; - if (StrikeCache.nativeAddressSize == 4) { - pixelData = 0xffffffff & - StrikeCache.unsafe.getInt(ptr + StrikeCache.pixelDataOffset); - } else { - pixelData = - StrikeCache.unsafe.getLong(ptr + StrikeCache.pixelDataOffset); - } + long pixelData = + StrikeCache.unsafe.getAddress(ptr + StrikeCache.pixelDataOffset); + if (pixelData == 0L) { return origMinX; }
--- a/src/share/classes/sun/font/GlyphList.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/sun/font/GlyphList.java Mon Jun 17 22:27:38 2013 -0700 @@ -361,16 +361,10 @@ graybits = new byte[len]; } } - long pixelDataAddress; - if (StrikeCache.nativeAddressSize == 4) { - pixelDataAddress = 0xffffffff & - StrikeCache.unsafe.getInt(images[glyphindex] + + long pixelDataAddress = + StrikeCache.unsafe.getAddress(images[glyphindex] + StrikeCache.pixelDataOffset); - } else { - pixelDataAddress = - StrikeCache.unsafe.getLong(images[glyphindex] + - StrikeCache.pixelDataOffset); - } + if (pixelDataAddress == 0L) { return graybits; }
--- a/src/share/classes/sun/java2d/loops/MaskFill.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/sun/java2d/loops/MaskFill.java Mon Jun 17 22:27:38 2013 -0700 @@ -36,6 +36,7 @@ import sun.java2d.loops.GraphicsPrimitive; import sun.java2d.SunGraphics2D; import sun.java2d.SurfaceData; +import sun.java2d.pipe.Region; /** * MaskFill @@ -194,10 +195,13 @@ // REMIND: This is not pretty. It would be nicer if we // passed a "FillData" object to the Pixel loops, instead // of a SunGraphics2D parameter... + Region clip = sg2d.clipRegion; + sg2d.clipRegion = null; int pixel = sg2d.pixel; sg2d.pixel = tmpData.pixelFor(sg2d.getColor()); fillop.FillRect(sg2d, tmpData, 0, 0, w, h); sg2d.pixel = pixel; + sg2d.clipRegion = clip; maskop.MaskBlit(tmpData, sData, comp, null, 0, 0, x, y, w, h,
--- a/src/share/classes/sun/management/jdp/JdpPacketWriter.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/classes/sun/management/jdp/JdpPacketWriter.java Mon Jun 17 22:27:38 2013 -0700 @@ -60,9 +60,12 @@ */ public void addEntry(String entry) throws IOException { - pkt.writeShort(entry.length()); - byte[] b = entry.getBytes("UTF-8"); - pkt.write(b); + /* DataOutputStream.writeUTF() do essentially + * the same as: + * pkt.writeShort(entry.getBytes("UTF-8").length); + * pkt.write(entry.getBytes("UTF-8")); + */ + pkt.writeUTF(entry); } /**
--- a/src/share/javavm/export/jawt.h Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/javavm/export/jawt.h Mon Jun 17 22:27:38 2013 -0700 @@ -154,7 +154,9 @@ /* * Pointer to the platform-specific information. This can be safely * cast to a JAWT_Win32DrawingSurfaceInfo on Windows or a - * JAWT_X11DrawingSurfaceInfo on Solaris. See jawt_md.h for details. + * JAWT_X11DrawingSurfaceInfo on Solaris. On Mac OS X, when using the + * native Cocoa toolkit this is a pointer to a NSObject that conforms + * to the JAWT_SurfaceLayers protocol. See jawt_md.h for details. */ void* platformInfo; /* Cached pointer to the underlying drawing surface */
--- a/src/share/lib/security/java.security-linux Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/lib/security/java.security-linux Mon Jun 17 22:27:38 2013 -0700 @@ -124,6 +124,7 @@ # corresponding RuntimePermission ("accessClassInPackage."+package) has # been granted. package.access=sun.,\ + com.sun.corba.se.impl.,\ com.sun.xml.internal.,\ com.sun.imageio.,\ com.sun.istack.internal.,\ @@ -161,6 +162,7 @@ # checkPackageDefinition. # package.definition=sun.,\ + com.sun.corba.se.impl.,\ com.sun.xml.internal.,\ com.sun.imageio.,\ com.sun.istack.internal.,\
--- a/src/share/lib/security/java.security-macosx Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/lib/security/java.security-macosx Mon Jun 17 22:27:38 2013 -0700 @@ -125,6 +125,7 @@ # corresponding RuntimePermission ("accessClassInPackage."+package) has # been granted. package.access=sun.,\ + com.sun.corba.se.impl.,\ com.sun.xml.internal.,\ com.sun.imageio.,\ com.sun.istack.internal.,\ @@ -164,6 +165,7 @@ # checkPackageDefinition. # package.definition=sun.,\ + com.sun.corba.se.impl.,\ com.sun.xml.internal.,\ com.sun.imageio.,\ com.sun.istack.internal.,\
--- a/src/share/lib/security/java.security-solaris Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/lib/security/java.security-solaris Mon Jun 17 22:27:38 2013 -0700 @@ -126,6 +126,7 @@ # corresponding RuntimePermission ("accessClassInPackage."+package) has # been granted. package.access=sun.,\ + com.sun.corba.se.impl.,\ com.sun.xml.internal.,\ com.sun.imageio.,\ com.sun.istack.internal.,\ @@ -164,6 +165,7 @@ # checkPackageDefinition. # package.definition=sun.,\ + com.sun.corba.se.impl.,\ com.sun.xml.internal.,\ com.sun.imageio.,\ com.sun.istack.internal.,\
--- a/src/share/lib/security/java.security-windows Sun Jun 16 22:18:54 2013 -0700 +++ b/src/share/lib/security/java.security-windows Mon Jun 17 22:27:38 2013 -0700 @@ -125,6 +125,7 @@ # corresponding RuntimePermission ("accessClassInPackage."+package) has # been granted. package.access=sun.,\ + com.sun.corba.se.impl.,\ com.sun.xml.internal.,\ com.sun.imageio.,\ com.sun.istack.internal.,\ @@ -164,6 +165,7 @@ # checkPackageDefinition. # package.definition=sun.,\ + com.sun.corba.se.impl.,\ com.sun.xml.internal.,\ com.sun.imageio.,\ com.sun.istack.internal.,\
--- a/src/solaris/classes/sun/font/XRGlyphCacheEntry.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/solaris/classes/sun/font/XRGlyphCacheEntry.java Mon Jun 17 22:27:38 2013 -0700 @@ -69,11 +69,28 @@ } public static int getGlyphID(long glyphInfoPtr) { - return (int) StrikeCache.unsafe.getInt(glyphInfoPtr + StrikeCache.cacheCellOffset); + // We need to access the GlyphID with Unsafe.getAddress() because the + // corresponding field in the underlying C data-structure is of type + // 'void*' (see field 'cellInfo' of struct 'GlyphInfo' + // in src/share/native/sun/font/fontscalerdefs.h). + // On 64-bit Big-endian architectures it would be wrong to access this + // field with Unsafe.getInt(). + return (int) StrikeCache.unsafe.getAddress(glyphInfoPtr + + StrikeCache.cacheCellOffset); } public static void setGlyphID(long glyphInfoPtr, int id) { - StrikeCache.unsafe.putInt(glyphInfoPtr + StrikeCache.cacheCellOffset, id); + // We need to access the GlyphID with Unsafe.putAddress() because the + // corresponding field in the underlying C data-structure is of type + // 'void*' (see field 'cellInfo' of struct 'GlyphInfo' in + // src/share/native/sun/font/fontscalerdefs.h). + // On 64-bit Big-endian architectures it would be wrong to write this + // field with Unsafe.putInt() because it is also accessed from native + // code as a 'long'. + // See Java_sun_java2d_xr_XRBackendNative_XRAddGlyphsNative() + // in src/solaris/native/sun/java2d/x11/XRBackendNative.c + StrikeCache.unsafe.putAddress(glyphInfoPtr + + StrikeCache.cacheCellOffset, (long)id); } public int getGlyphID() { @@ -105,12 +122,9 @@ } public void writePixelData(ByteArrayOutputStream os, boolean uploadAsLCD) { - long pixelDataAddress; - if (StrikeCache.nativeAddressSize == 4) { - pixelDataAddress = 0xffffffff & StrikeCache.unsafe.getInt(glyphInfoPtr + StrikeCache.pixelDataOffset); - } else { - pixelDataAddress = StrikeCache.unsafe.getLong(glyphInfoPtr + StrikeCache.pixelDataOffset); - } + long pixelDataAddress = + StrikeCache.unsafe.getAddress(glyphInfoPtr + + StrikeCache.pixelDataOffset); if (pixelDataAddress == 0L) { return; }
--- a/src/solaris/classes/sun/print/IPPPrintService.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/solaris/classes/sun/print/IPPPrintService.java Mon Jun 17 22:27:38 2013 -0700 @@ -1023,6 +1023,13 @@ // this is already supported in UnixPrintJob catList.add(Destination.class); + + // It is unfortunate that CUPS doesn't provide a way to query + // if printer supports collation but since most printers + // now supports collation and that most OS has a way + // of setting it, it is a safe assumption to just always + // include SheetCollate as supported attribute. + catList.add(SheetCollate.class); } // With the assumption that Chromaticity is equivalent to
--- a/src/solaris/classes/sun/print/UnixPrintServiceLookup.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/solaris/classes/sun/print/UnixPrintServiceLookup.java Mon Jun 17 22:27:38 2013 -0700 @@ -362,10 +362,33 @@ */ private PrintService getServiceByName(PrinterName nameAttr) { String name = nameAttr.getValue(); - PrintService printer = null; if (name == null || name.equals("") || !checkPrinterName(name)) { return null; } + /* check is all printers are already available */ + if (printServices != null) { + for (PrintService printService : printServices) { + if (printService.getName().equals(name)) { + return printService; + } + } + } + /* take CUPS into account first */ + if (CUPSPrinter.isCupsRunning()) { + try { + return new IPPPrintService(name, + new URL("http://"+ + CUPSPrinter.getServer()+":"+ + CUPSPrinter.getPort()+"/"+ + name)); + } catch (Exception e) { + IPPPrintService.debug_println(debugPrefix+ + " getServiceByName Exception "+ + e); + } + } + /* fallback if nothing not having a printer at this point */ + PrintService printer = null; if (isMac() || isSysV()) { printer = getNamedPrinterNameSysV(name); } else {
--- a/src/solaris/native/sun/java2d/x11/XRBackendNative.c Sun Jun 16 22:18:54 2013 -0700 +++ b/src/solaris/native/sun/java2d/x11/XRBackendNative.c Mon Jun 17 22:27:38 2013 -0700 @@ -742,7 +742,12 @@ for (i=0; i < glyphCnt; i++) { GlyphInfo *jginfo = (GlyphInfo *) jlong_to_ptr(glyphInfoPtrs[i]); - gid[i] = (Glyph) (0x0ffffffffL & ((unsigned long)(jginfo->cellInfo))); + // 'jginfo->cellInfo' is of type 'void*' + // (see definition of 'GlyphInfo' in fontscalerdefs.h) + // 'Glyph' is typedefed to 'unsigned long' + // (see http://www.x.org/releases/X11R7.7/doc/libXrender/libXrender.txt) + // Maybe we should assert that (sizeof(void*) == sizeof(Glyph)) ? + gid[i] = (Glyph) (jginfo->cellInfo); xginfo[i].x = (-jginfo->topLeftX); xginfo[i].y = (-jginfo->topLeftY); xginfo[i].width = jginfo->width;
--- a/src/solaris/native/sun/xawt/XlibWrapper.c Sun Jun 16 22:18:54 2013 -0700 +++ b/src/solaris/native/sun/xawt/XlibWrapper.c Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2013, 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 @@ -1947,13 +1947,16 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent(JNIEnv *env, jclass clazz, jlong display, jlong ptr) { + uint32_t timeout = 1; + AWT_CHECK_HAVE_LOCK(); exitSecondaryLoop = False; while (!exitSecondaryLoop) { if (XCheckIfEvent((Display*) jlong_to_ptr(display), (XEvent*) jlong_to_ptr(ptr), secondary_loop_event, NULL)) { return JNI_TRUE; } - AWT_WAIT(AWT_SECONDARY_LOOP_TIMEOUT); + timeout = (timeout < AWT_SECONDARY_LOOP_TIMEOUT) ? (timeout << 1) : AWT_SECONDARY_LOOP_TIMEOUT; + AWT_WAIT(timeout); } return JNI_FALSE; }
--- a/src/windows/classes/sun/nio/fs/WindowsFileCopy.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/windows/classes/sun/nio/fs/WindowsFileCopy.java Mon Jun 17 22:27:38 2013 -0700 @@ -224,7 +224,7 @@ String linkTarget = WindowsLinkSupport.readLink(source); int flags = SYMBOLIC_LINK_FLAG_DIRECTORY; CreateSymbolicLink(targetPath, - addPrefixIfNeeded(linkTarget), + WindowsPath.addPrefixIfNeeded(linkTarget), flags); } } catch (WindowsException x) { @@ -414,7 +414,7 @@ } else { String linkTarget = WindowsLinkSupport.readLink(source); CreateSymbolicLink(targetPath, - addPrefixIfNeeded(linkTarget), + WindowsPath.addPrefixIfNeeded(linkTarget), SYMBOLIC_LINK_FLAG_DIRECTORY); } } catch (WindowsException x) { @@ -502,18 +502,4 @@ priv.drop(); } } - - /** - * Add long path prefix to path if required - */ - private static String addPrefixIfNeeded(String path) { - if (path.length() > 248) { - if (path.startsWith("\\\\")) { - path = "\\\\?\\UNC" + path.substring(1, path.length()); - } else { - path = "\\\\?\\" + path; - } - } - return path; - } }
--- a/src/windows/classes/sun/nio/fs/WindowsLinkSupport.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/windows/classes/sun/nio/fs/WindowsLinkSupport.java Mon Jun 17 22:27:38 2013 -0700 @@ -231,7 +231,7 @@ int end = (next == -1) ? path.length() : next; String search = sb.toString() + path.substring(curr, end); try { - FirstFile fileData = FindFirstFile(addLongPathPrefixIfNeeded(search)); + FirstFile fileData = FindFirstFile(WindowsPath.addPrefixIfNeeded(search)); FindClose(fileData.handle()); // if a reparse point is encountered then we must return the @@ -406,20 +406,6 @@ } /** - * Add long path prefix to path if required. - */ - private static String addLongPathPrefixIfNeeded(String path) { - if (path.length() > 248) { - if (path.startsWith("\\\\")) { - path = "\\\\?\\UNC" + path.substring(1, path.length()); - } else { - path = "\\\\?\\" + path; - } - } - return path; - } - - /** * Strip long path or symbolic link prefix from path */ private static String stripPrefix(String path) {
--- a/src/windows/classes/sun/nio/fs/WindowsPath.java Sun Jun 16 22:18:54 2013 -0700 +++ b/src/windows/classes/sun/nio/fs/WindowsPath.java Mon Jun 17 22:27:38 2013 -0700 @@ -283,7 +283,7 @@ // Add long path prefix to path if required static String addPrefixIfNeeded(String path) { - if (path.length() > 248) { + if (path.length() > MAX_PATH) { if (path.startsWith("\\\\")) { path = "\\\\?\\UNC" + path.substring(1, path.length()); } else {
--- a/src/windows/native/java/io/WinNTFileSystem_md.c Sun Jun 16 22:18:54 2013 -0700 +++ b/src/windows/native/java/io/WinNTFileSystem_md.c Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2013, 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 @@ -199,7 +199,7 @@ /** * If the given attributes are the attributes of a reparse point, then - * read and return the attributes of the final target. + * read and return the attributes of the special cases. */ DWORD getFinalAttributesIfReparsePoint(WCHAR *path, DWORD a) { @@ -213,6 +213,28 @@ return a; } +/** + * Take special cases into account when retrieving the attributes + * of path + */ +DWORD getFinalAttributes(WCHAR *path) +{ + DWORD attr = INVALID_FILE_ATTRIBUTES; + + WIN32_FILE_ATTRIBUTE_DATA wfad; + WIN32_FIND_DATAW wfd; + HANDLE h; + + if (GetFileAttributesExW(path, GetFileExInfoStandard, &wfad)) { + attr = getFinalAttributesIfReparsePoint(path, wfad.dwFileAttributes); + } else if (GetLastError() == ERROR_SHARING_VIOLATION && + (h = FindFirstFileW(path, &wfd)) != INVALID_HANDLE_VALUE) { + attr = getFinalAttributesIfReparsePoint(path, wfd.dwFileAttributes); + FindClose(h); + } + return attr; +} + JNIEXPORT jstring JNICALL Java_java_io_WinNTFileSystem_canonicalize0(JNIEnv *env, jobject this, jstring pathname) @@ -337,38 +359,21 @@ Java_java_io_WinNTFileSystem_getBooleanAttributes(JNIEnv *env, jobject this, jobject file) { - jint rv = 0; jint pathlen; - /* both pagefile.sys and hiberfil.sys have length 12 */ -#define SPECIALFILE_NAMELEN 12 - WCHAR *pathbuf = fileToNTPath(env, file, ids.path); - WIN32_FILE_ATTRIBUTE_DATA wfad; if (pathbuf == NULL) return rv; if (!isReservedDeviceNameW(pathbuf)) { - if (GetFileAttributesExW(pathbuf, GetFileExInfoStandard, &wfad)) { - DWORD a = getFinalAttributesIfReparsePoint(pathbuf, wfad.dwFileAttributes); - if (a != INVALID_FILE_ATTRIBUTES) { - rv = (java_io_FileSystem_BA_EXISTS - | ((a & FILE_ATTRIBUTE_DIRECTORY) - ? java_io_FileSystem_BA_DIRECTORY - : java_io_FileSystem_BA_REGULAR) - | ((a & FILE_ATTRIBUTE_HIDDEN) - ? java_io_FileSystem_BA_HIDDEN : 0)); - } - } else { /* pagefile.sys is a special case */ - if (GetLastError() == ERROR_SHARING_VIOLATION) { - rv = java_io_FileSystem_BA_EXISTS; - if ((pathlen = (jint)wcslen(pathbuf)) >= SPECIALFILE_NAMELEN && - (_wcsicmp(pathbuf + pathlen - SPECIALFILE_NAMELEN, - L"pagefile.sys") == 0) || - (_wcsicmp(pathbuf + pathlen - SPECIALFILE_NAMELEN, - L"hiberfil.sys") == 0)) - rv |= java_io_FileSystem_BA_REGULAR; - } + DWORD a = getFinalAttributes(pathbuf); + if (a != INVALID_FILE_ATTRIBUTES) { + rv = (java_io_FileSystem_BA_EXISTS + | ((a & FILE_ATTRIBUTE_DIRECTORY) + ? java_io_FileSystem_BA_DIRECTORY + : java_io_FileSystem_BA_REGULAR) + | ((a & FILE_ATTRIBUTE_HIDDEN) + ? java_io_FileSystem_BA_HIDDEN : 0)); } } free(pathbuf); @@ -536,6 +541,10 @@ WCHAR *pathbuf = pathToNTPath(env, path, JNI_FALSE); if (pathbuf == NULL) return JNI_FALSE; + if (isReservedDeviceNameW(pathbuf)) { + free(pathbuf); + return JNI_FALSE; + } h = CreateFileW( pathbuf, /* Wide char path name */ GENERIC_READ | GENERIC_WRITE, /* Read and write permission */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/com/sun/java/swing/plaf/gtk/4928019/bug4928019.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +/* + * @test + * @bug 4928019 + * @summary Makes sure all the basic classes can be created with GTK. + * @author Scott Violet + */ + +import javax.swing.*; +import javax.swing.plaf.basic.*; + +public class bug4928019 { + public static void main(String[] args) throws Throwable { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); + } catch (UnsupportedLookAndFeelException ex) { + System.err.println("GTKLookAndFeel is not supported on this platform." + + " Test is considered passed."); + return; + } catch (ClassNotFoundException ex) { + System.err.println("GTKLookAndFeel class is not found." + + " Test is considered passed."); + return; + } + new JButton() { + public void updateUI() { + setUI(new BasicButtonUI()); + } + }; + new JCheckBox() { + public void updateUI() { + setUI(new BasicCheckBoxUI()); + } + }; + new JCheckBoxMenuItem() { + public void updateUI() { + setUI(new BasicCheckBoxMenuItemUI()); + } + }; + new JColorChooser() { + public void updateUI() { + setUI(new BasicColorChooserUI()); + } + }; + new JComboBox() { + public void updateUI() { + setUI(new BasicComboBoxUI()); + } + }; + new JDesktopPane() { + public void updateUI() { + setUI(new BasicDesktopPaneUI()); + } + }; + new JEditorPane() { + public void updateUI() { + setUI(new BasicEditorPaneUI()); + } + }; + new JFileChooser() { + public void updateUI() { + setUI(new BasicFileChooserUI(null)); + } + }; + new JFormattedTextField() { + public void updateUI() { + setUI(new BasicFormattedTextFieldUI()); + } + }; + new JInternalFrame() { + public void updateUI() { + setUI(new BasicInternalFrameUI(null)); + } + }; + new JLabel() { + public void updateUI() { + setUI(new BasicLabelUI()); + } + }; + new JList() { + public void updateUI() { + setUI(new BasicListUI()); + } + }; + new JMenuBar() { + public void updateUI() { + setUI(new BasicMenuBarUI()); + } + }; + new JMenuItem() { + public void updateUI() { + setUI(new BasicMenuItemUI()); + } + }; + new JMenu() { + public void updateUI() { + setUI(new BasicMenuUI()); + } + }; + new JOptionPane() { + public void updateUI() { + setUI(new BasicOptionPaneUI()); + } + }; + new JPanel() { + public void updateUI() { + setUI(new BasicPanelUI()); + } + }; + new JPasswordField() { + public void updateUI() { + setUI(new BasicPasswordFieldUI()); + } + }; + new JPopupMenu() { + public void updateUI() { + setUI(new BasicPopupMenuUI()); + } + }; + new JProgressBar() { + public void updateUI() { + setUI(new BasicProgressBarUI()); + } + }; + new JRadioButton() { + public void updateUI() { + setUI(new BasicRadioButtonUI()); + } + }; + new JRadioButtonMenuItem() { + public void updateUI() { + setUI(new BasicRadioButtonMenuItemUI()); + } + }; + new JRootPane() { + public void updateUI() { + setUI(new BasicRootPaneUI()); + } + }; + new JScrollBar() { + public void updateUI() { + setUI(new BasicScrollBarUI()); + } + }; + new JScrollPane() { + public void updateUI() { + setUI(new BasicScrollPaneUI()); + } + }; + new JSeparator() { + public void updateUI() { + setUI(new BasicSeparatorUI()); + } + }; + new JSlider() { + public void updateUI() { + setUI(new BasicSliderUI(null)); + } + }; + new JSpinner() { + public void updateUI() { + setUI(new BasicSpinnerUI()); + } + }; + new JSplitPane() { + public void updateUI() { + setUI(new BasicSplitPaneUI()); + } + }; + new JTabbedPane() { + public void updateUI() { + setUI(new BasicTabbedPaneUI()); + } + }; + new JTable() { + public void updateUI() { + setUI(new BasicTableUI()); + } + }; + new JTextArea() { + public void updateUI() { + setUI(new BasicTextAreaUI()); + } + }; + new JTextField() { + public void updateUI() { + setUI(new BasicTextFieldUI()); + } + }; + new JTextPane() { + public void updateUI() { + setUI(new BasicTextPaneUI()); + } + }; + new JToggleButton() { + public void updateUI() { + setUI(new BasicToggleButtonUI()); + } + }; + new JToolBar() { + public void updateUI() { + setUI(new BasicToolBarUI()); + } + }; + new JToolTip() { + public void updateUI() { + setUI(new BasicToolTipUI()); + } + }; + new JTree() { + public void updateUI() { + setUI(new BasicTreeUI()); + } + }; + new JViewport() { + public void updateUI() { + setUI(new BasicViewportUI()); + } + }; + System.out.println("DONE"); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/FontClass/SurrogateTest/SuppCharTest.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +/* + * @test + * @bug 8015556 + * @summary Surrogate pairs do not render properly on MacOS X. + */ + +import java.util.Locale; +import java.awt.*; +import java.awt.font.*; +import javax.swing.*; + +public class SuppCharTest { + + static String str = "ABC\uD840\uDC01\uD840\uDC00AB"; + static String EXTB_FONT = "MingLiU-ExtB"; + + public static void main(String args[]) throws Exception { + + final Font font = new Font(EXTB_FONT, Font.PLAIN, 36); + if (!EXTB_FONT.equalsIgnoreCase(font.getFamily(Locale.ENGLISH))) { + return; + } + + SwingUtilities.invokeLater(new Runnable(){ + @Override + public void run(){ + JFrame f = new JFrame("Test Supplementary Char Support"); + Component c = new SuppCharComp(font, str); + f.add("Center", c); + JButton b = new JButton(str); + b.setFont(font); + f.add("South", b); + f.pack(); + f.setVisible(true); + } + }); + + /* If a supplementary character was found, 'invisible glyphs' + * with value 65535 will be inserted in the place of the 2nd (low) + * char index. So we are looking here to make sure such substitutions + * took place. + */ + FontRenderContext frc = new FontRenderContext(null, false, false); + GlyphVector gv = font.createGlyphVector(frc, str); + int numGlyphs = gv.getNumGlyphs(); + int[] codes = gv.getGlyphCodes(0, numGlyphs, null); + boolean foundInvisibleGlyph = false; + for (int i=0; i<numGlyphs;i++) { + if (codes[i] == 65535) { + foundInvisibleGlyph = true; + break; + } + } + + if (!foundInvisibleGlyph) { + throw new RuntimeException("No invisible glyphs"); + } + + if (font.canDisplayUpTo(str) != -1) { + throw new RuntimeException("Font can't display all chars"); + } + + } +} + +class SuppCharComp extends Component { + + static final int w=400, h=250; + public Dimension preferredSize() { + return new Dimension(w,h); + } + + String str = null; + Font font = null; + public SuppCharComp(Font font, String str) { + this.font = font; + this.str = str; + } + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D)g.create(); + g2d.setColor(Color.white); + g2d.fillRect(0,0,w,h); + g2d.setColor(Color.black); + int y = 0; + g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, + RenderingHints.VALUE_FRACTIONALMETRICS_ON); + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + + g2d.setFont(font); + g2d.drawString(str, 10, 50); + + FontRenderContext frc = g2d.getFontRenderContext(); + GlyphVector gv = font.createGlyphVector(frc, str); + g2d.drawGlyphVector(gv, 10, 100); + TextLayout tl = new TextLayout(str, font, frc); + tl.draw(g2d, 10, 150); + char[] ca = str.toCharArray(); + g2d.drawChars(ca, 0, ca.length, 10, 200); + + } + +} +
--- a/test/java/awt/Mixing/MixingInHwPanel.java Sun Jun 16 22:18:54 2013 -0700 +++ b/test/java/awt/Mixing/MixingInHwPanel.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2013, 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 @@ -22,8 +22,8 @@ */ /* - @test %W% %E% - @bug 6829858 + @test + @bug 6829858 7109977 @summary Mixing should work inside heavyweight containers @author anthony.petrov@sun.com: area=awt.mixing @library ../regtesthelpers @@ -104,7 +104,7 @@ // And click the part of the button that has been previously hidden Point bLoc = button.getLocationOnScreen(); - robot.mouseMove(bLoc.x + button.getWidth() - 6, bLoc.y + button.getHeight() / 2); + robot.mouseMove(bLoc.x + button.getWidth() - 15, bLoc.y + button.getHeight() / 2); Util.waitForIdle(robot);
--- a/test/java/awt/print/PrinterJob/Collate2DPrintingTest.java Sun Jun 16 22:18:54 2013 -0700 +++ b/test/java/awt/print/PrinterJob/Collate2DPrintingTest.java Mon Jun 17 22:27:38 2013 -0700 @@ -23,7 +23,7 @@ /** * @test - * @bug 6362683 + * @bug 6362683 8012381 * @summary Collation should work. * @run main/manual Collate2DPrintingTest */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/beans/XMLEncoder/Test6989223.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +/* + * @test + * @bug 6989223 + * @summary Tests Rectangle2D.Double encoding + * @author Sergey Malenkov + */ + +import java.awt.geom.Rectangle2D; + +public class Test6989223 extends AbstractTest { + public static void main(String[] args) { + new Test6989223().test(true); + } + + protected Object getObject() { + return new Bean(1, 2, 3, 4); + } + + @Override + protected Object getAnotherObject() { + return new Bean(1, 2, 3, 5); + } + + public static class Bean extends Rectangle2D.Double { + public Bean() { + } + + public Bean(double x, double y, double w, double h) { + super(x, y, w, h); + } + + @Override + public boolean equals(Object object) { + return super.equals(object); // to avoid recursion during validation + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/beans/XMLEncoder/Test7080156.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +/* + * @test + * @bug 7080156 7094245 + * @summary Tests beans with public arrays + * @author Sergey Malenkov + */ + +public class Test7080156 extends AbstractTest { + public static void main(String[] args) { + new Test7080156().test(true); + } + + protected Object getObject() { + Bean bean = new Bean(); + bean.setArray("something"); + return bean; + } + + @Override + protected Object getAnotherObject() { + Bean bean = new Bean(); + bean.setArray("some", "thing"); + return bean; + } + + public static class Bean { + public String[] array = {"default"}; + + public void setArray(String... array) { + this.array = array; + } + + public String[] getArray() { + return this.array; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/beans/XMLEncoder/Test8013557.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +/* + * @test + * @bug 8013557 + * @summary Tests beans with public fields + * @author Sergey Malenkov + */ + +public class Test8013557 extends AbstractTest { + public static void main(String[] args) { + new Test8013557().test(true); + } + + protected Object getObject() { + return new Bean(new Value("something")); + } + + @Override + protected Object getAnotherObject() { + return new Bean(new Value()); + } + + public static class Bean { + public Value value; + + public Bean() { + this.value = new Value(); + } + + public Bean(Value value) { + this.value = value; + } + + public void setValue(Value value) { + this.value = value; + } + + public Value getValue() { + return this.value; + } + } + + public static class Value { + private String string; + + public Value() { + this.string = "default"; + } + + public Value(String value) { + this.string = value; + } + + public void setString(String string) { + this.string = string; + } + + public String getString() { + return this.string; + } + } +}
--- a/test/java/io/File/CreateNewFile.java Sun Jun 16 22:18:54 2013 -0700 +++ b/test/java/io/File/CreateNewFile.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2013, 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 @@ -22,7 +22,7 @@ */ /* @test - @bug 4130498 4391178 + @bug 4130498 4391178 6198547 @summary Basic test for createNewFile method */ @@ -51,5 +51,20 @@ } catch (IOException e) { // Exception expected } + + testCreateExistingDir(); + } + + // Test JDK-6198547 + private static void testCreateExistingDir() throws IOException { + File tmpFile = new File("hugo"); + if (tmpFile.exists() && !tmpFile.delete()) + throw new RuntimeException("Cannot delete " + tmpFile); + if (!tmpFile.mkdir()) + throw new RuntimeException("Cannot create dir " + tmpFile); + if (!tmpFile.exists()) + throw new RuntimeException("Cannot see created dir " + tmpFile); + if (tmpFile.createNewFile()) + throw new RuntimeException("Should fail to create file " + tmpFile); } }
--- a/test/java/io/File/IsHidden.java Sun Jun 16 22:18:54 2013 -0700 +++ b/test/java/io/File/IsHidden.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2013, 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 @@ -46,6 +46,11 @@ Files.getFileAttributeView(f.toPath(), DosFileAttributeView.class).setHidden(value); } + private static void checkHidden(File f) { + if (!f.isHidden()) + throw new RuntimeException(f + " should be hidden"); + } + private static void testWin32() throws Exception { File f = new File(dir, "test"); f.deleteOnExit(); @@ -58,6 +63,11 @@ } ck(".foo", false); ck("foo", false); + + File pagefile = new File("C:\\pagefile.sys"); + File hiberfil = new File("C:\\hiberfil.sys"); + if (pagefile.exists()) checkHidden(pagefile); + if (hiberfil.exists()) checkHidden(hiberfil); } private static void testUnix() throws Exception {
--- a/test/java/io/File/NulFile.java Sun Jun 16 22:18:54 2013 -0700 +++ b/test/java/io/File/NulFile.java Mon Jun 17 22:27:38 2013 -0700 @@ -612,7 +612,7 @@ try { File.createTempFile(prefix, suffix, directory); } catch (IOException ex) { - if ("Unable to create temporary file".equals(ex.getMessage())) + if (ExceptionMsg.equals(ex.getMessage())) exceptionThrown = true; } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/io/File/createTempFile/SpecialTempFile.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +/* + * @test + * @bug 8013827 8011950 + * @summary Check whether File.createTempFile can handle special parameters + * on Windows platforms + * @author Dan Xu + */ + +import java.io.File; +import java.io.IOException; + +public class SpecialTempFile { + + private static void test(String name, String[] prefix, String[] suffix) { + if (prefix == null || suffix == null + || prefix.length != suffix.length) + { + return; + } + + final String exceptionMsg = "Unable to create temporary file"; + final String errMsg = "IOException is expected"; + + for (int i = 0; i < prefix.length; i++) { + boolean exceptionThrown = false; + File f = null; + System.out.println("In test " + name + + ", creating temp file with prefix, " + + prefix[i] + ", suffix, " + suffix[i]); + try { + f = File.createTempFile(prefix[i], suffix[i]); + } catch (IOException e) { + if (exceptionMsg.equals(e.getMessage())) + exceptionThrown = true; + else + System.out.println("Wrong error message:" + e.getMessage()); + } + if (!exceptionThrown || f != null) + throw new RuntimeException(errMsg); + } + } + + public static void main(String[] args) throws Exception { + if (!System.getProperty("os.name").startsWith("Windows")) + return; + + // Test JDK-8013827 + String[] resvPre = { "LPT1.package.zip", "com7.4.package.zip" }; + String[] resvSuf = { ".temp", ".temp" }; + test("ReservedName", resvPre, resvSuf); + + // Test JDK-8011950 + String[] slashPre = { "///..///", "temp", "///..///" }; + String[] slashSuf = { ".temp", "///..///..", "///..///.." }; + test("SlashedName", slashPre, slashSuf); + } +}
--- a/test/java/lang/SecurityManager/CheckPackageAccess.java Sun Jun 16 22:18:54 2013 -0700 +++ b/test/java/lang/SecurityManager/CheckPackageAccess.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2013, 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 @@ -23,8 +23,8 @@ /* * @test - * @bug 7146431 - * @summary Test that internal JAXP packages cannot be accessed + * @bug 7146431 8000450 + * @summary Test that internal packages cannot be accessed */ public class CheckPackageAccess { @@ -32,6 +32,7 @@ public static void main(String[] args) throws Exception { String[] pkgs = new String[] { + "com.sun.corba.se.impl.", "com.sun.org.apache.xerces.internal.utils.", "com.sun.org.apache.xalan.internal.utils." }; SecurityManager sm = new SecurityManager(); @@ -40,7 +41,11 @@ System.out.println("Checking package access for " + pkg); try { sm.checkPackageAccess(pkg); - throw new Exception("Expected SecurityException not thrown"); + throw new Exception("Expected PackageAccess SecurityException not thrown"); + } catch (SecurityException se) { } + try { + sm.checkPackageDefinition(pkg); + throw new Exception("Expected PackageDefinition SecurityException not thrown"); } catch (SecurityException se) { } } }
--- a/test/java/lang/Throwable/SuppressedExceptions.java Sun Jun 16 22:18:54 2013 -0700 +++ b/test/java/lang/Throwable/SuppressedExceptions.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2013, 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,7 +26,7 @@ /* * @test - * @bug 6911258 6962571 6963622 6991528 7005628 + * @bug 6911258 6962571 6963622 6991528 7005628 8012044 * @summary Basic tests of suppressed exceptions * @author Joseph D. Darcy */ @@ -40,6 +40,7 @@ serializationTest(); selfReference(); noModification(); + initCausePlumbing(); } private static void noSelfSuppression() { @@ -48,7 +49,9 @@ throwable.addSuppressed(throwable); throw new RuntimeException("IllegalArgumentException for self-suppresion not thrown."); } catch (IllegalArgumentException iae) { - ; // Expected + // Expected to be here + if (iae.getCause() != throwable) + throw new RuntimeException("Bad cause after self-suppresion."); } } @@ -208,4 +211,36 @@ super("The medium.", null, enableSuppression, true); } } + + private static void initCausePlumbing() { + Throwable t1 = new Throwable(); + Throwable t2 = new Throwable("message", t1); + Throwable t3 = new Throwable(); + + try { + t2.initCause(t3); + throw new RuntimeException("Shouldn't reach."); + } catch (IllegalStateException ise) { + if (ise.getCause() != t2) + throw new RuntimeException("Unexpected cause in ISE", ise); + Throwable[] suppressed = ise.getSuppressed(); + if (suppressed.length != 0) + throw new RuntimeException("Bad suppression in ISE", ise); + } + + try { + t2.initCause(null); + throw new RuntimeException("Shouldn't reach."); + } catch (IllegalStateException ise) { + ; // Expected; don't want an NPE. + } + + try { + t3.initCause(t3); + throw new RuntimeException("Shouldn't reach."); + } catch (IllegalArgumentException iae) { + if (iae.getCause() != t3) + throw new RuntimeException("Unexpected cause in ISE", iae); + } + } }
--- a/test/java/lang/management/ManagementFactory/MBeanServerMXBeanUnsupportedTest.java Sun Jun 16 22:18:54 2013 -0700 +++ b/test/java/lang/management/ManagementFactory/MBeanServerMXBeanUnsupportedTest.java Mon Jun 17 22:27:38 2013 -0700 @@ -29,7 +29,7 @@ * @author Luis-Miguel Alventosa * @run clean MBeanServerMXBeanUnsupportedTest * @run build MBeanServerMXBeanUnsupportedTest - * @run main MBeanServerMXBeanUnsupportedTest + * @run main/othervm MBeanServerMXBeanUnsupportedTest */ import java.lang.management.ManagementFactory;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/nio/file/Files/NameLimits.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +/* @test + * @bug 8011128 + * @summary Test file and directory name limits. This test is primarily + * intended to test Files.createDirectory on resolved paths at or around + * the short path limit of 248 on Windows. + */ + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class NameLimits { + + static final int MAX_PATH = 255; + static final int MIN_PATH = 8; // arbitrarily chosen + + static Path generatePath(int len) { + if (len < MIN_PATH) + throw new RuntimeException("Attempting to generate path less than MIN_PATH"); + StringBuilder sb = new StringBuilder(len); + sb.append("name"); + while (sb.length() < len) { + sb.append('X'); + } + return Paths.get(sb.toString()); + } + + static boolean tryCreateFile(int len) throws IOException { + Path name = generatePath(len); + try { + Files.createFile(name); + } catch (IOException ioe) { + System.err.format("Unable to create file of length %d (full path %d), %s%n", + name.toString().length(), name.toAbsolutePath().toString().length(), ioe); + return false; + } + Files.delete(name); + return true; + } + + static boolean tryCreateDirectory(int len) throws IOException { + Path name = generatePath(len); + try { + Files.createDirectory(name); + } catch (IOException ioe) { + System.err.format("Unable to create directory of length %d (full path %d), %s%n", + name.toString().length(), name.toAbsolutePath().toString().length(), ioe); + return false; + } + Files.delete(name); + return true; + } + + public static void main(String[] args) throws Exception { + int len; + + // find the maximum file name if MAX_PATH or less + len = MAX_PATH; + while (!tryCreateFile(len)) { + len--; + } + System.out.format("Testing createFile on paths %d .. %d%n", MIN_PATH, len); + while (len >= MIN_PATH) { + if (!tryCreateFile(len--)) + throw new RuntimeException("Test failed"); + } + + // find the maximum directory name if MAX_PATH or less + len = MAX_PATH; + while (!tryCreateDirectory(len)) { + len--; + } + System.out.format("Testing createDirectory on paths %d .. %d%n", MIN_PATH, len); + while (len >= MIN_PATH) { + if (!tryCreateDirectory(len--)) + throw new RuntimeException("Test failed"); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/util/EnumMap/ProperEntrySetOnClone.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2012, 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. + * + * 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. + */ + +/* + * @test + * @bug 7164256 + * @summary EnumMap.entrySet() returns an entrySet referencing to the cloned instance + * @author Diego Belfer + */ + +import java.util.EnumMap; + +public class ProperEntrySetOnClone { + public enum Test { + ONE, TWO + } + + public static void main(String[] args) { + EnumMap<Test, String> map1 = new EnumMap<Test, String>(Test.class); + map1.put(Test.ONE, "1"); + map1.put(Test.TWO, "2"); + + // We need to force creation of the map1.entrySet + int size = map1.entrySet().size(); + if (size != 2) { + throw new RuntimeException( + "Invalid size in original map. Expected: 2 was: " + size); + } + + EnumMap<Test, String> map2 = map1.clone(); + map2.remove(Test.ONE); + size = map2.entrySet().size(); + if (size != 1) { + throw new RuntimeException( + "Invalid size in cloned instance. Expected: 1 was: " + size); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/util/concurrent/FutureTask/DoneTimedGetLoops.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2012 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. + * + * 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. + */ + +/* + * Written by Martin Buchholz with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +/* + * @test + * @run main DoneTimedGetLoops 300 + * @summary isDone returning true guarantees that subsequent timed get + * will never throw TimeoutException. + */ + +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.*; + +@SuppressWarnings({"unchecked", "rawtypes", "deprecation"}) +public class DoneTimedGetLoops { + final long testDurationMillisDefault = 10L * 1000L; + final long testDurationMillis; + + static class PublicFutureTask extends FutureTask<Boolean> { + final static Runnable noop = new Runnable() { public void run() {} }; + PublicFutureTask() { super(noop, null); } + public void set(Boolean v) { super.set(v); } + public void setException(Throwable t) { super.setException(t); } + } + + DoneTimedGetLoops(String[] args) { + testDurationMillis = (args.length > 0) ? + Long.valueOf(args[0]) : testDurationMillisDefault; + } + + void test(String[] args) throws Throwable { + final long testDurationNanos = testDurationMillis * 1000L * 1000L; + final long quittingTimeNanos = System.nanoTime() + testDurationNanos; + final long timeoutMillis = 10L * 1000L; + + final AtomicReference<PublicFutureTask> normalRef + = new AtomicReference<PublicFutureTask>(); + final AtomicReference<PublicFutureTask> abnormalRef + = new AtomicReference<PublicFutureTask>(); + + final Throwable throwable = new Throwable(); + + abstract class CheckedThread extends Thread { + CheckedThread(String name) { + super(name); + setDaemon(true); + start(); + } + /** Polls for quitting time. */ + protected boolean quittingTime() { + return System.nanoTime() - quittingTimeNanos > 0; + } + /** Polls occasionally for quitting time. */ + protected boolean quittingTime(long i) { + return (i % 1024) == 0 && quittingTime(); + } + abstract protected void realRun() throws Exception; + public void run() { + try { realRun(); } catch (Throwable t) { unexpected(t); } + } + } + + Thread setter = new CheckedThread("setter") { + protected void realRun() { + while (! quittingTime()) { + PublicFutureTask future = new PublicFutureTask(); + normalRef.set(future); + future.set(Boolean.TRUE); + }}}; + + Thread setterException = new CheckedThread("setterException") { + protected void realRun() { + while (! quittingTime()) { + PublicFutureTask future = new PublicFutureTask(); + abnormalRef.set(future); + future.setException(throwable); + }}}; + + Thread doneTimedGetNormal = new CheckedThread("doneTimedGetNormal") { + protected void realRun() throws Exception { + while (! quittingTime()) { + PublicFutureTask future = normalRef.get(); + if (future != null) { + while (!future.isDone()) + ; + check(future.get(0L, TimeUnit.HOURS) == Boolean.TRUE); + }}}}; + + Thread doneTimedGetAbnormal = new CheckedThread("doneTimedGetAbnormal") { + protected void realRun() throws Exception { + while (! quittingTime()) { + PublicFutureTask future = abnormalRef.get(); + if (future != null) { + while (!future.isDone()) + ; + try { future.get(0L, TimeUnit.HOURS); fail(); } + catch (ExecutionException t) { + check(t.getCause() == throwable); + } + }}}}; + + for (Thread thread : new Thread[] { + setter, + setterException, + doneTimedGetNormal, + doneTimedGetAbnormal }) { + thread.join(timeoutMillis + testDurationMillis); + if (thread.isAlive()) { + System.err.printf("Hung thread: %s%n", thread.getName()); + failed++; + for (StackTraceElement e : thread.getStackTrace()) + System.err.println(e); + // Kludge alert + thread.stop(); + thread.join(timeoutMillis); + } + } + } + + //--------------------- Infrastructure --------------------------- + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void equal(Object x, Object y) { + if (x == null ? y == null : x.equals(y)) pass(); + else fail(x + " not equal to " + y);} + public static void main(String[] args) throws Throwable { + new DoneTimedGetLoops(args).instanceMain(args);} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/util/concurrent/FutureTask/ExplicitSet.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2012, 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. + * + * 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. + */ + +/* + * @test + * @bug 7132378 + * @summary Race in FutureTask if used with explicit set ( not Runnable ) + * @author Chris Hegarty + */ + +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; + +public class ExplicitSet { + + static void realMain(String[] args) throws Throwable { + for (int i = 1; i <= 10000; i++) { + //System.out.print("."); + test(); + } + } + + static void test() throws Throwable { + final SettableTask task = new SettableTask(); + + Thread thread = new Thread() { public void run() { + try { + check(task.get() != null); + } catch (Exception e) { unexpected(e); } + }}; + thread.start(); + + task.set(Boolean.TRUE); + thread.join(5000); + } + + static class SettableTask extends FutureTask<Boolean> { + SettableTask() { + super(new Callable<Boolean>() { + public Boolean call() { + fail ("The task should never be run!"); + return null; + }; + }); + } + + @Override + public void set(Boolean b) { + super.set(b); + } + } + + //--------------------- Infrastructure --------------------------- + static volatile int passed = 0, failed = 0; + static void pass() {passed++;} + static void fail() {failed++; Thread.dumpStack();} + static void fail(String msg) {System.out.println(msg); fail();} + static void unexpected(Throwable t) {failed++; t.printStackTrace();} + static void check(boolean cond) {if (cond) pass(); else fail();} + static void equal(Object x, Object y) { + if (x == null ? y == null : x.equals(y)) pass(); + else fail(x + " not equal to " + y);} + public static void main(String[] args) throws Throwable { + try {realMain(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/print/PrintServiceLookup/GetPrintServices.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +import javax.print.PrintService; +import javax.print.PrintServiceLookup; +import javax.print.attribute.AttributeSet; +import javax.print.attribute.HashAttributeSet; +import javax.print.attribute.standard.PrinterName; + +/* + * @test + * @bug 8013810 + * @summary Test that print service returned without filter are of the same class as with name filter + */ +public class GetPrintServices { + + public static void main(String[] args) throws Exception { + for (PrintService service : PrintServiceLookup.lookupPrintServices(null, null)) { + String serviceName = service.getName(); + PrintService serviceByName = lookupByName(serviceName); + if (!service.equals(serviceByName)) { + throw new RuntimeException("NOK " + serviceName + + " expected: " + service.getClass().getName() + + " got: " + serviceByName.getClass().getName()); + } + } + System.out.println("Test PASSED"); + } + + private static PrintService lookupByName(String name) { + AttributeSet attributes = new HashAttributeSet(); + attributes.add(new PrinterName(name, null)); + for (PrintService service : PrintServiceLookup.lookupPrintServices(null, attributes)) { + return service; + } + return null; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/JComboBox/6337518/bug6337518.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +/* @test + @bug 6337518 + @summary Null Arrow Button Throws Exception in BasicComboBoxUI + @author Anton Litvinov +*/ + +import javax.swing.*; +import javax.swing.plaf.basic.*; + +public class bug6337518 extends BasicComboBoxUI { + @Override + protected JButton createArrowButton() { + return null; + } + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + JComboBox comboBox = new JComboBox(); + comboBox.setUI(new bug6337518()); + } + }); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/JMenu/4692443/bug4692443.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2009, 2013, 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. + * + * 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. + */ + +/* + * @test + * @library ../../regtesthelpers + * @build Util + * @bug 4692443 7105030 + * @summary JMenu: MenuListener.menuSelected() event fired too late when using mnemonics + * @author Alexander Zuev + * @run main bug4692443 + */ + +import javax.swing.*; +import javax.swing.event.*; +import java.awt.event.*; +import java.awt.*; +import sun.awt.SunToolkit; + +public class bug4692443 { + + public static PassedListener pass; + public static FailedListener fail; + public static volatile Boolean passed; + + public static void main(String args[]) throws Throwable { + + fail = new FailedListener(); + pass = new PassedListener(); + passed = false; + Robot robo = new Robot(); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + createAndShowGUI(); + } + }); + + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + toolkit.realSync(); + + try { + robo = new Robot(); + } catch (AWTException e) { + throw new RuntimeException("Robot could not be created"); + } + int altKey = java.awt.event.KeyEvent.VK_ALT; + robo.setAutoDelay(100); + Util.hitMnemonics(robo, KeyEvent.VK_F); // Enter File menu + robo.keyPress(KeyEvent.VK_S); // Enter submenu + robo.keyRelease(KeyEvent.VK_S); + robo.keyPress(KeyEvent.VK_O); // Launch "One" action + robo.keyRelease(KeyEvent.VK_O); + robo.keyPress(KeyEvent.VK_M); // Launch "One" action + robo.keyRelease(KeyEvent.VK_M); + + toolkit.realSync(); + + if (!passed) { + throw new RuntimeException("Test failed."); + } + + } + + private static void createAndShowGUI() { + JFrame mainFrame = new JFrame("Bug 4692443"); + JMenuBar mbar = new JMenuBar(); + JMenu menu = new JMenu("File"); + menu.setMnemonic('F'); + menu.add(new JMenuItem("Menu Item 1")).setMnemonic('I'); + final JMenu submenu = new JMenu("Submenu"); + submenu.setMnemonic('S'); + submenu.addMenuListener(new MenuListener() { + public void menuSelected(MenuEvent e) { + JMenuItem item = submenu.add(new JMenuItem("One", 'O')); + item.addActionListener(pass); + submenu.add(new JMenuItem("Two", 'w')); + submenu.add(new JMenuItem("Three", 'r')); + } + public void menuDeselected(MenuEvent e) { + submenu.removeAll(); + } + public void menuCanceled(MenuEvent e) { + submenu.removeAll(); + } + }); + menu.add(submenu); + JMenuItem menuItem = menu.add(new JMenuItem("Menu Item 2")); + menuItem.setMnemonic('M'); + menuItem.addActionListener(fail); + mbar.add(menu); + mainFrame.setJMenuBar(mbar); + + mainFrame.setSize(200, 200); + mainFrame.setLocation(200, 200); + mainFrame.setVisible(true); + mainFrame.toFront(); + } + + public static class FailedListener implements ActionListener { + public void actionPerformed(ActionEvent ev) { + throw new RuntimeException("Test failed."); + } + } + + public static class PassedListener implements ActionListener { + public void actionPerformed(ActionEvent ev) { + passed = true; + } + } + +}
--- a/test/javax/swing/JTabbedPane/4624207/bug4624207.java Sun Jun 16 22:18:54 2013 -0700 +++ b/test/javax/swing/JTabbedPane/4624207/bug4624207.java Mon Jun 17 22:27:38 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, 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,6 +37,8 @@ import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; + +import sun.awt.OSInfo; import sun.awt.SunToolkit; public class bug4624207 implements ChangeListener, FocusListener { @@ -99,7 +101,7 @@ toolkit.realSync(); - if ("Aqua".equals(UIManager.getLookAndFeel().getID())) { + if (OSInfo.getOSType() == OSInfo.OSType.MACOSX) { Util.hitKeys(robot, KeyEvent.VK_CONTROL, KeyEvent.VK_ALT, KeyEvent.VK_B); } else { Util.hitKeys(robot, KeyEvent.VK_ALT, KeyEvent.VK_B);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/JTable/7068740/bug7068740.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +/* @test + @bug 7068740 + @summary JTable wrapped in JLayer can't use PGUP/PGDOWN keys + @author Vladislav Karnaukhov + @run main bug7068740 +*/ + +import sun.awt.SunToolkit; + +import javax.swing.*; +import javax.swing.plaf.LayerUI; +import javax.swing.plaf.metal.MetalLookAndFeel; +import javax.swing.table.DefaultTableModel; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.lang.reflect.InvocationTargetException; + +public class bug7068740 extends JFrame { + + private static Robot robot = null; + private static JTable table = null; + private static SunToolkit toolkit = null; + + bug7068740() { + super(); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + + DefaultTableModel model = new DefaultTableModel() { + @Override + public int getRowCount() { + return 20; + } + + @Override + public int getColumnCount() { + return 2; + } + + @Override + public Object getValueAt(int row, int column) { + return "(" + row + "," + column + ")"; + } + }; + + table = new JTable(model); + LayerUI<JComponent> layerUI = new LayerUI<>(); + JLayer<JComponent> layer = new JLayer<>(table, layerUI); + JScrollPane scrollPane = new JScrollPane(layer); + add(scrollPane); + pack(); + setLocationRelativeTo(null); + } + + private static void setUp() { + try { + if (robot == null) { + robot = new Robot(); + robot.setAutoDelay(20); + } + + if (toolkit == null) { + toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + } + + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + bug7068740 test = new bug7068740(); + test.setVisible(true); + } + }); + } catch (InterruptedException e) { + e.printStackTrace(); + throw new RuntimeException("Test failed"); + } catch (InvocationTargetException e) { + e.printStackTrace(); + throw new RuntimeException("Test failed"); + } catch (AWTException e) { + e.printStackTrace(); + throw new RuntimeException("Test failed"); + } + } + + private static void doTest() { + toolkit.realSync(); + table.setRowSelectionInterval(0, 0); + + robot.keyPress(KeyEvent.VK_PAGE_DOWN); + toolkit.realSync(); + if (table.getSelectedRow() != 19) { + throw new RuntimeException("Test failed"); + } + + robot.keyPress(KeyEvent.VK_PAGE_UP); + toolkit.realSync(); + if (table.getSelectedRow() != 0) { + throw new RuntimeException("Test failed"); + } + } + + public static void main(String[] args) { + try { + UIManager.setLookAndFeel(new MetalLookAndFeel()); + setUp(); + doTest(); + } catch (UnsupportedLookAndFeelException e) { + e.printStackTrace(); + throw new RuntimeException("Test failed"); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/KeyboardManager/8013370/Test8013370.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; + +import javax.swing.AbstractAction; +import javax.swing.InputMap; +import javax.swing.JFrame; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.KeyStroke; +import sun.awt.SunToolkit; + +import static java.awt.event.InputEvent.CTRL_DOWN_MASK; +import static javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW; +import static javax.swing.JOptionPane.showMessageDialog; +import static javax.swing.SwingUtilities.invokeAndWait; + +/* + * @test + * @bug 8013370 + * @summary Ensure that key stroke is not null + * @author Sergey Malenkov + */ + +public class Test8013370 implements Runnable { + public static void main(String[] args) throws Exception { + Test8013370 task = new Test8013370(); + invokeAndWait(task); + + Robot robot = new Robot(); + robot.waitForIdle(); + robot.keyPress(KeyEvent.VK_CONTROL); + robot.keyRelease(KeyEvent.VK_CONTROL); + robot.waitForIdle(); + + invokeAndWait(task); + task.validate(); + } + + private JFrame frame; + private boolean error; + + @Override + public void run() { + if (this.frame == null) { + JMenuBar menu = new JMenuBar() { + @Override + protected boolean processKeyBinding(KeyStroke stroke, KeyEvent event, int condition, boolean pressed) { + if (stroke == null) { + Test8013370.this.error = true; + return false; + } + return super.processKeyBinding(stroke, event, condition, pressed); + } + }; + menu.add(new JMenuItem("Menu")); + + InputMap map = menu.getInputMap(WHEN_IN_FOCUSED_WINDOW); + // We add exactly 10 actions because the ArrayTable is converted + // from a array to a hashtable when more than 8 values are added. + for (int i = 0; i < 9; i++) { + String name = " Action #" + i; + map.put(KeyStroke.getKeyStroke(KeyEvent.VK_A + i, CTRL_DOWN_MASK), name); + + menu.getActionMap().put(name, new AbstractAction(name) { + @Override + public void actionPerformed(ActionEvent event) { + showMessageDialog(null, getValue(NAME)); + } + }); + } + this.frame = new JFrame("8013370"); + this.frame.setJMenuBar(menu); + this.frame.setVisible(true); + } + else { + this.frame.dispose(); + } + } + + private void validate() { + if (this.error) { + throw new Error("KeyStroke is null"); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/text/View/8014863/bug8014863.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2007, 2013, 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. + * + * 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. + */ + +/* + * @test + * @bug 8014863 + * @summary Tests the calculation of the line breaks when a text is inserted + * @author Dmitry Markov + * @library ../../../regtesthelpers + * @build Util + * @run main bug8014863 + */ + +import sun.awt.SunToolkit; + +import javax.swing.*; +import javax.swing.text.html.HTMLEditorKit; +import java.awt.*; +import java.awt.event.KeyEvent; + +public class bug8014863 { + + private static JEditorPane editorPane; + private static Robot robot; + private static SunToolkit toolkit; + + public static void main(String[] args) throws Exception { + toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + robot = new Robot(); + + createAndShowGUI(); + + toolkit.realSync(); + + Util.hitKeys(robot, KeyEvent.VK_HOME); + Util.hitKeys(robot, KeyEvent.VK_O); + + toolkit.realSync(); + + if (3 != getNumberOfTextLines()) { + throw new RuntimeException("The number of texts lines does not meet the expectation"); + } + + Util.hitKeys(robot, KeyEvent.VK_N); + + toolkit.realSync(); + + if (3 != getNumberOfTextLines()) { + throw new RuntimeException("The number of texts lines does not meet the expectation"); + } + + Util.hitKeys(robot, KeyEvent.VK_E); + Util.hitKeys(robot, KeyEvent.VK_SPACE); + Util.hitKeys(robot, KeyEvent.VK_T); + Util.hitKeys(robot, KeyEvent.VK_W); + + toolkit.realSync(); + + if (3 != getNumberOfTextLines()) { + throw new RuntimeException("The number of texts lines does not meet the expectation"); + } + } + + private static int getNumberOfTextLines() throws Exception { + int numberOfLines = 0; + int caretPosition = getCaretPosition(); + int current = 1; + int previous; + + setCaretPosition(current); + do { + previous = current; + Util.hitKeys(robot, KeyEvent.VK_DOWN); + toolkit.realSync(); + current = getCaretPosition(); + numberOfLines++; + } while (current != previous); + + setCaretPosition(caretPosition); + return numberOfLines; + } + + private static int getCaretPosition() throws Exception { + final int[] result = new int[1]; + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + result[0] = editorPane.getCaretPosition(); + } + }); + return result[0]; + } + + private static void setCaretPosition(final int position) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + editorPane.setCaretPosition(position); + } + }); + } + + private static void createAndShowGUI() throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + try { + UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + JFrame frame = new JFrame(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + editorPane = new JEditorPane(); + HTMLEditorKit editorKit = new HTMLEditorKit(); + editorPane.setEditorKit(editorKit); + editorPane.setText("<p>qqqq <em>pp</em> qqqq <em>pp</em> " + + "qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp" + + "</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq</p>"); + editorPane.setCaretPosition(1); + + frame.add(editorPane); + frame.setSize(200, 200); + frame.setVisible(true); + } + }); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/jaxp/PrecisionDecimalDV/XPrecisionDecimalToString.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ + +import java.lang.reflect.Method; + +/** + * @test + * @bug 8013900 + * @summary More warning compiling jaxp. + * This test only test one of the methods used to implement hashCode() + * in com.sun.org.apache.xerces.internal.impl.dv.xs.PrecisionDecimalDV$XPrecisionDecimal. + * Since that method is private the test unfortunately needs to use reflection + * to invoke the method. + * @run main XPrecisionDecimalToString + * @author Daniel Fuchs + */ +public class XPrecisionDecimalToString { + + private static final String className = + "com.sun.org.apache.xerces.internal.impl.dv.xs.PrecisionDecimalDV$XPrecisionDecimal"; + private static final String methodName = "canonicalToStringForHashCode"; + private static final Class<?>[] signature = { String.class, String.class, int.class, int.class }; + private static Method method; + + // Invokes XPrecisionDecimal.canonicalToStringForHashCode through reflection, + // because the method is private... + // + // Construct a canonical String representation of this number + // for the purpose of deriving a hashCode value compliant with + // equals. + // The toString representation will be: + // NaN for NaN, INF for +infinity, -INF for -infinity, 0 for zero, + // and [1-9]\.[0-9]*[1-9]?(E[1-9][0-9]*)? for other numbers. + private static String canonicalToStringForHashCode(String ivalue, String fvalue, int sign, int pvalue) { + try { + if (method == null) { + Class<?> type = Class.forName(className); + method = type.getDeclaredMethod(methodName, signature); + method.setAccessible(true); + } + } catch (Exception x) { + throw new Error("Impossible to find '"+className+"."+methodName+"': "+ x, x); + } + try { + return (String) method.invoke(null, new Object[] {ivalue, fvalue, sign, pvalue} ); + } catch(Exception x) { + throw new Error("Failed to invoke "+className+"."+methodName+"(\""+ + ivalue+"\", \""+fvalue+"\", "+sign+", "+pvalue+"): " +x, x); + } + } + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + test("123","7890",-1,0,"-1.23789E2"); + test("0","007890",-1,0,"-7.89E-3"); + test("123","7890",1,0,"1.23789E2"); + test("0","007890",1,0,"7.89E-3"); + test("123","7890",1,10,"1.23789E12"); + test("0","007890",1,33,"7.89E30"); + test("INF","",1,0,"INF"); + test("INF","",-1,0,"-INF"); + test("NaN","",0,0,"NaN"); + test("0","",1,0,"0"); + test("00000","00000",1,10,"0"); + test("00000","00000",-1,10,"0"); + test("00000","000001",-1,-10,"-1E-16"); + } + + private static void test(String ival, String fval, int sign, int pvalue, String expected) { + final String canonical = canonicalToStringForHashCode(ival, fval, sign, pvalue); + System.out.println((sign == -1 ? "-" : "") + ival + + ("INF".equals(ival) || "NaN".equals(ival) ? "" + : ( "." + fval + "E" + pvalue)) + + " => "+ canonical); + if (!expected.equals(canonical)) { + throw new Error("expected: "+expected+" got: "+ canonical); + } + } + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/sun/java2d/loops/RenderToCustomBufferTest.java Mon Jun 17 22:27:38 2013 -0700 @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2013, 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. + * + * 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. + */ +/** + * @test + * @bug 8015606 + * @summary Test verifies whether a text is rendered correctly to + * a custom buffered image. + * + * @run main RenderToCustomBufferTest + */ + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.Transparency; +import java.awt.color.ColorSpace; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.ComponentColorModel; +import java.awt.image.DataBuffer; +import java.awt.image.WritableRaster; + +public class RenderToCustomBufferTest { + public static void main(String[] args) { + final BufferedImage dst_custom = createCustomBuffer(); + final BufferedImage dst_dcm = new BufferedImage(width, height, + BufferedImage.TYPE_INT_RGB); + + renderTo(dst_custom); + renderTo(dst_dcm); + + check(dst_custom, dst_dcm); + } + + private static void check(BufferedImage a, BufferedImage b) { + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int pa = a.getRGB(x, y); + int pb = b.getRGB(x, y); + + if (pa != pb) { + String msg = String.format( + "Point [%d, %d] has different colors: %08X and %08X", + x, y, pa, pb); + throw new RuntimeException("Test failed: " + msg); + } + } + } + } + + private static BufferedImage createCustomBuffer() { + ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); + ColorModel cm = new ComponentColorModel(cs, false, false, + Transparency.OPAQUE, DataBuffer.TYPE_FLOAT); + WritableRaster wr = cm.createCompatibleWritableRaster(width, height); + + return new BufferedImage(cm, wr, false, null); + } + + private static void renderTo(BufferedImage dst) { + System.out.println("The buffer: " + dst); + Graphics2D g = dst.createGraphics(); + + final int w = dst.getWidth(); + final int h = dst.getHeight(); + + g.setColor(Color.blue); + g.fillRect(0, 0, w, h); + + g.setColor(Color.red); + Font f = g.getFont(); + g.setFont(f.deriveFont(48f)); + + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + + // NB: this clip ctriggers the problem + g.setClip(50, 50, 200, 100); + + g.drawString("AA Text", 52, 90); + + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); + + // NB: this clip ctriggers the problem + g.setClip(50, 100, 100, 100); + g.drawString("Text", 52, 148); + + g.dispose(); + } + + private static final int width = 230; + private static final int height = 150; +}
--- a/test/sun/management/jdp/JdpUnitTest.java Sun Jun 16 22:18:54 2013 -0700 +++ b/test/sun/management/jdp/JdpUnitTest.java Mon Jun 17 22:27:38 2013 -0700 @@ -32,6 +32,12 @@ public class JdpUnitTest { + + static byte[] russian_name = {(byte)0xd0,(byte)0xbf,(byte)0xd1,(byte)0x80,(byte)0xd0,(byte)0xbe,(byte)0xd0,(byte)0xb2, + (byte)0xd0,(byte)0xb5,(byte)0xd1,(byte)0x80,(byte)0xd0,(byte)0xba,(byte)0xd0,(byte)0xb0, + (byte)0x20,(byte)0xd1,(byte)0x81,(byte)0xd0,(byte)0xb2,(byte)0xd1,(byte)0x8f,(byte)0xd0, + (byte)0xb7,(byte)0xd0,(byte)0xb8,(byte)0x0a}; + /** * This test tests that complete packet is build correctly */ @@ -42,7 +48,7 @@ { JdpJmxPacket p1 = new JdpJmxPacket(UUID.randomUUID(), "fake://unit-test"); p1.setMainClass("FakeUnitTest"); - p1.setInstanceName("Fake"); + p1.setInstanceName( new String(russian_name,"UTF-8")); byte[] b = p1.getPacketData(); JdpJmxPacket p2 = new JdpJmxPacket(b);