提交 8144c699 编写于 作者: L lana

Merge

...@@ -37,6 +37,7 @@ import java.util.Vector; ...@@ -37,6 +37,7 @@ import java.util.Vector;
import javax.swing.plaf.FontUIResource; import javax.swing.plaf.FontUIResource;
import sun.awt.FontConfiguration; import sun.awt.FontConfiguration;
import sun.awt.HeadlessToolkit;
import sun.lwawt.macosx.*; import sun.lwawt.macosx.*;
public class CFontManager extends SunFontManager { public class CFontManager extends SunFontManager {
...@@ -342,9 +343,14 @@ public class CFontManager extends SunFontManager { ...@@ -342,9 +343,14 @@ public class CFontManager extends SunFontManager {
@Override @Override
public String getFontPath(boolean noType1Fonts) { public String getFontPath(boolean noType1Fonts) {
// In the case of the Cocoa toolkit, since we go through NSFont, we dont need to register /Library/Fonts // In the case of the Cocoa toolkit, since we go through NSFont, we dont need to register /Library/Fonts
if (Toolkit.getDefaultToolkit() instanceof LWCToolkit) { Toolkit tk = Toolkit.getDefaultToolkit();
if (tk instanceof HeadlessToolkit) {
tk = ((HeadlessToolkit)tk).getUnderlyingToolkit();
}
if (tk instanceof LWCToolkit) {
return ""; return "";
} }
// X11 case // X11 case
return "/Library/Fonts"; return "/Library/Fonts";
} }
......
...@@ -134,7 +134,7 @@ final class CPlatformResponder { ...@@ -134,7 +134,7 @@ final class CPlatformResponder {
boolean postsTyped = false; boolean postsTyped = false;
char testChar = KeyEvent.CHAR_UNDEFINED; char testChar = KeyEvent.CHAR_UNDEFINED;
char testDeadChar = 0; boolean isDeadChar = (chars!= null && chars.length() == 0);
if (isFlagsChangedEvent) { if (isFlagsChangedEvent) {
int[] in = new int[] {modifierFlags, keyCode}; int[] in = new int[] {modifierFlags, keyCode};
...@@ -150,14 +150,18 @@ final class CPlatformResponder { ...@@ -150,14 +150,18 @@ final class CPlatformResponder {
testChar = chars.charAt(0); testChar = chars.charAt(0);
} }
int[] in = new int[] {testChar, testDeadChar, modifierFlags, keyCode}; int[] in = new int[] {testChar, isDeadChar ? 1 : 0, modifierFlags, keyCode};
int[] out = new int[2]; // [jkeyCode, jkeyLocation] int[] out = new int[3]; // [jkeyCode, jkeyLocation, deadChar]
postsTyped = NSEvent.nsToJavaKeyInfo(in, out); postsTyped = NSEvent.nsToJavaKeyInfo(in, out);
if (!postsTyped) { if (!postsTyped) {
testChar = KeyEvent.CHAR_UNDEFINED; testChar = KeyEvent.CHAR_UNDEFINED;
} }
if(isDeadChar){
testChar = (char) out[2];
}
jkeyCode = out[0]; jkeyCode = out[0];
jkeyLocation = out[1]; jkeyLocation = out[1];
jeventType = isNpapiCallback ? NSEvent.npToJavaEventType(eventType) : jeventType = isNpapiCallback ? NSEvent.npToJavaEventType(eventType) :
......
...@@ -536,7 +536,7 @@ public class LWCToolkit extends LWToolkit { ...@@ -536,7 +536,7 @@ public class LWCToolkit extends LWToolkit {
SunToolkit.postEvent(appContext, invocationEvent); SunToolkit.postEvent(appContext, invocationEvent);
// 3746956 - flush events from PostEventQueue to prevent them from getting stuck and causing a deadlock // 3746956 - flush events from PostEventQueue to prevent them from getting stuck and causing a deadlock
sun.awt.SunToolkitSubclass.flushPendingEvents(appContext); SunToolkit.flushPendingEvents(appContext);
} else { } else {
// This should be the equivalent to EventQueue.invokeAndWait // This should be the equivalent to EventQueue.invokeAndWait
((LWCToolkit)Toolkit.getDefaultToolkit()).getSystemEventQueueForInvokeAndWait().postEvent(invocationEvent); ((LWCToolkit)Toolkit.getDefaultToolkit()).getSystemEventQueueForInvokeAndWait().postEvent(invocationEvent);
...@@ -561,7 +561,7 @@ public class LWCToolkit extends LWToolkit { ...@@ -561,7 +561,7 @@ public class LWCToolkit extends LWToolkit {
SunToolkit.postEvent(appContext, invocationEvent); SunToolkit.postEvent(appContext, invocationEvent);
// 3746956 - flush events from PostEventQueue to prevent them from getting stuck and causing a deadlock // 3746956 - flush events from PostEventQueue to prevent them from getting stuck and causing a deadlock
sun.awt.SunToolkitSubclass.flushPendingEvents(appContext); SunToolkit.flushPendingEvents(appContext);
} else { } else {
// This should be the equivalent to EventQueue.invokeAndWait // This should be the equivalent to EventQueue.invokeAndWait
((LWCToolkit)Toolkit.getDefaultToolkit()).getSystemEventQueueForInvokeAndWait().postEvent(invocationEvent); ((LWCToolkit)Toolkit.getDefaultToolkit()).getSystemEventQueueForInvokeAndWait().postEvent(invocationEvent);
......
...@@ -33,5 +33,7 @@ void DeliverJavaKeyEvent(JNIEnv *env, NSEvent *event, jobject peer); ...@@ -33,5 +33,7 @@ void DeliverJavaKeyEvent(JNIEnv *env, NSEvent *event, jobject peer);
void DeliverJavaMouseEvent(JNIEnv *env, NSEvent *event, jobject peer); void DeliverJavaMouseEvent(JNIEnv *env, NSEvent *event, jobject peer);
void SendAdditionalJavaEvents(JNIEnv *env, NSEvent *nsEvent, jobject peer); void SendAdditionalJavaEvents(JNIEnv *env, NSEvent *nsEvent, jobject peer);
jint GetJavaMouseModifiers(NSInteger button, NSUInteger modifierFlags); jint GetJavaMouseModifiers(NSInteger button, NSUInteger modifierFlags);
jint NsKeyModifiersToJavaModifiers(NSUInteger nsFlags, BOOL isExtMods);
NSUInteger JavaModifiersToNsKeyModifiers(jint javaModifiers, BOOL isExtMods);
#endif /* __AWTEVENT_H */ #endif /* __AWTEVENT_H */
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#import <JavaNativeFoundation/JavaNativeFoundation.h> #import <JavaNativeFoundation/JavaNativeFoundation.h>
#import <JavaRuntimeSupport/JavaRuntimeSupport.h> #import <JavaRuntimeSupport/JavaRuntimeSupport.h>
#import <sys/time.h> #import <sys/time.h>
#include <Carbon/Carbon.h>
#import "LWCToolkit.h" #import "LWCToolkit.h"
#import "ThreadUtilities.h" #import "ThreadUtilities.h"
...@@ -244,6 +245,7 @@ static struct _nsKeyToJavaModifier ...@@ -244,6 +245,7 @@ static struct _nsKeyToJavaModifier
//NSUInteger cgsRightMask; //NSUInteger cgsRightMask;
unsigned short leftKeyCode; unsigned short leftKeyCode;
unsigned short rightKeyCode; unsigned short rightKeyCode;
jint javaExtMask;
jint javaMask; jint javaMask;
jint javaKey; jint javaKey;
} }
...@@ -254,6 +256,7 @@ const nsKeyToJavaModifierTable[] = ...@@ -254,6 +256,7 @@ const nsKeyToJavaModifierTable[] =
0, 0,
0, 0,
0, // no Java equivalent 0, // no Java equivalent
0, // no Java equivalent
java_awt_event_KeyEvent_VK_CAPS_LOCK java_awt_event_KeyEvent_VK_CAPS_LOCK
}, },
{ {
...@@ -263,6 +266,7 @@ const nsKeyToJavaModifierTable[] = ...@@ -263,6 +266,7 @@ const nsKeyToJavaModifierTable[] =
56, 56,
60, 60,
java_awt_event_InputEvent_SHIFT_DOWN_MASK, java_awt_event_InputEvent_SHIFT_DOWN_MASK,
java_awt_event_InputEvent_SHIFT_MASK,
java_awt_event_KeyEvent_VK_SHIFT java_awt_event_KeyEvent_VK_SHIFT
}, },
{ {
...@@ -272,6 +276,7 @@ const nsKeyToJavaModifierTable[] = ...@@ -272,6 +276,7 @@ const nsKeyToJavaModifierTable[] =
59, 59,
62, 62,
java_awt_event_InputEvent_CTRL_DOWN_MASK, java_awt_event_InputEvent_CTRL_DOWN_MASK,
java_awt_event_InputEvent_CTRL_MASK,
java_awt_event_KeyEvent_VK_CONTROL java_awt_event_KeyEvent_VK_CONTROL
}, },
{ {
...@@ -281,6 +286,7 @@ const nsKeyToJavaModifierTable[] = ...@@ -281,6 +286,7 @@ const nsKeyToJavaModifierTable[] =
58, 58,
61, 61,
java_awt_event_InputEvent_ALT_DOWN_MASK, java_awt_event_InputEvent_ALT_DOWN_MASK,
java_awt_event_InputEvent_ALT_MASK,
java_awt_event_KeyEvent_VK_ALT java_awt_event_KeyEvent_VK_ALT
}, },
{ {
...@@ -290,6 +296,7 @@ const nsKeyToJavaModifierTable[] = ...@@ -290,6 +296,7 @@ const nsKeyToJavaModifierTable[] =
55, 55,
54, 54,
java_awt_event_InputEvent_META_DOWN_MASK, java_awt_event_InputEvent_META_DOWN_MASK,
java_awt_event_InputEvent_META_MASK,
java_awt_event_KeyEvent_VK_META java_awt_event_KeyEvent_VK_META
}, },
// NSNumericPadKeyMask // NSNumericPadKeyMask
...@@ -298,10 +305,11 @@ const nsKeyToJavaModifierTable[] = ...@@ -298,10 +305,11 @@ const nsKeyToJavaModifierTable[] =
0, 0,
0, 0,
0, // no Java equivalent 0, // no Java equivalent
0, // no Java equivalent
java_awt_event_KeyEvent_VK_HELP java_awt_event_KeyEvent_VK_HELP
}, },
// NSFunctionKeyMask // NSFunctionKeyMask
{0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0}
}; };
/* /*
...@@ -371,26 +379,67 @@ NsCharToJavaChar(unichar nsChar, NSUInteger modifiers) ...@@ -371,26 +379,67 @@ NsCharToJavaChar(unichar nsChar, NSUInteger modifiers)
return nsChar; return nsChar;
} }
static unichar NsGetDeadKeyChar(unsigned short keyCode)
{
TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr);
// Carbon modifiers should be used instead of NSEvent modifiers
UInt32 modifierKeyState = (GetCurrentEventKeyModifiers() >> 8) & 0xFF;
if (keyboardLayout) {
UInt32 deadKeyState = 0;
UniCharCount maxStringLength = 255;
UniCharCount actualStringLength = 0;
UniChar unicodeString[maxStringLength];
// get the deadKeyState
OSStatus status = UCKeyTranslate(keyboardLayout,
keyCode, kUCKeyActionDown, modifierKeyState,
LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit,
&deadKeyState,
maxStringLength,
&actualStringLength, unicodeString);
if (status == noErr && deadKeyState != 0) {
// Press SPACE to get the dead key char
status = UCKeyTranslate(keyboardLayout,
kVK_Space, kUCKeyActionDown, 0,
LMGetKbdType(), 0,
&deadKeyState,
maxStringLength,
&actualStringLength, unicodeString);
if (status == noErr && actualStringLength > 0) {
return unicodeString[0];
}
}
}
return 0;
}
/* /*
* This is the function that uses the table above to take incoming * This is the function that uses the table above to take incoming
* NSEvent keyCodes and translate to the Java virtual key code. * NSEvent keyCodes and translate to the Java virtual key code.
*/ */
static void static void
NsCharToJavaVirtualKeyCode(unichar ch, unichar deadChar, NsCharToJavaVirtualKeyCode(unichar ch, BOOL isDeadChar,
NSUInteger flags, unsigned short key, NSUInteger flags, unsigned short key,
jint *keyCode, jint *keyLocation, BOOL *postsTyped) jint *keyCode, jint *keyLocation, BOOL *postsTyped, unichar *deadChar)
{ {
static size_t size = sizeof(keyTable) / sizeof(struct _key); static size_t size = sizeof(keyTable) / sizeof(struct _key);
NSInteger offset; NSInteger offset;
if (deadChar) { if (isDeadChar) {
unichar testDeadChar = NsGetDeadKeyChar(key);
const struct CharToVKEntry *map; const struct CharToVKEntry *map;
for (map = charToDeadVKTable; map->c != 0; ++map) { for (map = charToDeadVKTable; map->c != 0; ++map) {
if (deadChar == map->c) { if (testDeadChar == map->c) {
*keyCode = map->javaKey; *keyCode = map->javaKey;
*postsTyped = NO; *postsTyped = NO;
// TODO: use UNKNOWN here? // TODO: use UNKNOWN here?
*keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN; *keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN;
*deadChar = testDeadChar;
return; return;
} }
} }
...@@ -491,25 +540,51 @@ NsKeyModifiersToJavaKeyInfo(NSUInteger nsFlags, unsigned short eventKeyCode, ...@@ -491,25 +540,51 @@ NsKeyModifiersToJavaKeyInfo(NSUInteger nsFlags, unsigned short eventKeyCode,
/* /*
* This returns the java modifiers for a key NSEvent. * This returns the java modifiers for a key NSEvent.
*/ */
static jint jint NsKeyModifiersToJavaModifiers(NSUInteger nsFlags, BOOL isExtMods)
NsKeyModifiersToJavaModifiers(NSUInteger nsFlags)
{ {
jint javaModifiers = 0; jint javaModifiers = 0;
const struct _nsKeyToJavaModifier* cur; const struct _nsKeyToJavaModifier* cur;
for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) { for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) {
if ((cur->nsMask & nsFlags) != 0) { if ((cur->nsMask & nsFlags) != 0) {
javaModifiers |= cur->javaMask; javaModifiers |= isExtMods? cur->javaExtMask : cur->javaMask;
} }
} }
return javaModifiers; return javaModifiers;
} }
/*
* This returns the NSEvent flags for java key modifiers.
*/
NSUInteger JavaModifiersToNsKeyModifiers(jint javaModifiers, BOOL isExtMods)
{
NSUInteger nsFlags = 0;
const struct _nsKeyToJavaModifier* cur;
for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) {
jint mask = isExtMods? cur->javaExtMask : cur->javaMask;
if ((mask & javaModifiers) != 0) {
nsFlags |= cur->nsMask;
}
}
// special case
jint mask = isExtMods? java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK :
java_awt_event_InputEvent_ALT_GRAPH_MASK;
if ((mask & javaModifiers) != 0) {
nsFlags |= NSAlternateKeyMask;
}
return nsFlags;
}
jint GetJavaMouseModifiers(NSInteger button, NSUInteger modifierFlags) jint GetJavaMouseModifiers(NSInteger button, NSUInteger modifierFlags)
{ {
// Mousing needs the key modifiers // Mousing needs the key modifiers
jint modifiers = NsKeyModifiersToJavaModifiers(modifierFlags); jint modifiers = NsKeyModifiersToJavaModifiers(modifierFlags, YES);
/* /*
...@@ -590,7 +665,7 @@ Java_sun_lwawt_macosx_event_NSEvent_nsToJavaKeyModifiers ...@@ -590,7 +665,7 @@ Java_sun_lwawt_macosx_event_NSEvent_nsToJavaKeyModifiers
JNF_COCOA_ENTER(env); JNF_COCOA_ENTER(env);
jmodifiers = NsKeyModifiersToJavaModifiers(modifierFlags); jmodifiers = NsKeyModifiersToJavaModifiers(modifierFlags, YES);
JNF_COCOA_EXIT(env); JNF_COCOA_EXIT(env);
...@@ -615,20 +690,22 @@ JNF_COCOA_ENTER(env); ...@@ -615,20 +690,22 @@ JNF_COCOA_ENTER(env);
// in = [testChar, testDeadChar, modifierFlags, keyCode] // in = [testChar, testDeadChar, modifierFlags, keyCode]
jchar testChar = (jchar)data[0]; jchar testChar = (jchar)data[0];
jchar testDeadChar = (jchar)data[1]; BOOL isDeadChar = (data[1] != 0);
jint modifierFlags = data[2]; jint modifierFlags = data[2];
jshort keyCode = (jshort)data[3]; jshort keyCode = (jshort)data[3];
jint jkeyCode = java_awt_event_KeyEvent_VK_UNDEFINED; jint jkeyCode = java_awt_event_KeyEvent_VK_UNDEFINED;
jint jkeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN; jint jkeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN;
jchar testDeadChar = 0;
NsCharToJavaVirtualKeyCode((unichar)testChar, (unichar)testDeadChar, NsCharToJavaVirtualKeyCode((unichar)testChar, isDeadChar,
(NSUInteger)modifierFlags, (unsigned short)keyCode, (NSUInteger)modifierFlags, (unsigned short)keyCode,
&jkeyCode, &jkeyLocation, &postsTyped); &jkeyCode, &jkeyLocation, &postsTyped, &testDeadChar);
// out = [jkeyCode, jkeyLocation]; // out = [jkeyCode, jkeyLocation];
(*env)->SetIntArrayRegion(env, outData, 0, 1, &jkeyCode); (*env)->SetIntArrayRegion(env, outData, 0, 1, &jkeyCode);
(*env)->SetIntArrayRegion(env, outData, 1, 1, &jkeyLocation); (*env)->SetIntArrayRegion(env, outData, 1, 1, &jkeyLocation);
(*env)->SetIntArrayRegion(env, outData, 2, 1, (jint *)&testDeadChar);
(*env)->ReleaseIntArrayElements(env, inData, data, 0); (*env)->ReleaseIntArrayElements(env, inData, data, 0);
......
...@@ -178,8 +178,8 @@ AWT_NS_WINDOW_IMPLEMENTATION ...@@ -178,8 +178,8 @@ AWT_NS_WINDOW_IMPLEMENTATION
[self.nsWindow setDocumentEdited:IS(bits, DOCUMENT_MODIFIED)]; [self.nsWindow setDocumentEdited:IS(bits, DOCUMENT_MODIFIED)];
} }
if ([self.nsWindow respondsToSelector:@selector(toggleFullScreen:)]) { if (IS(mask, FULLSCREENABLE) && [self.nsWindow respondsToSelector:@selector(toggleFullScreen:)]) {
if (IS(mask, FULLSCREENABLE)) { if (IS(bits, FULLSCREENABLE)) {
[self.nsWindow setCollectionBehavior:(1 << 7) /*NSWindowCollectionBehaviorFullScreenPrimary*/]; [self.nsWindow setCollectionBehavior:(1 << 7) /*NSWindowCollectionBehaviorFullScreenPrimary*/];
} else { } else {
[self.nsWindow setCollectionBehavior:NSWindowCollectionBehaviorDefault]; [self.nsWindow setCollectionBehavior:NSWindowCollectionBehaviorDefault];
......
...@@ -460,7 +460,7 @@ static BOOL sNeedsEnter; ...@@ -460,7 +460,7 @@ static BOOL sNeedsEnter;
} }
// Convert fModifiers (extModifiers) to NS: // Convert fModifiers (extModifiers) to NS:
NSUInteger modifiers = [DnDUtilities mapJavaExtModifiersToNSKeyModifiers:fModifiers]; NSUInteger modifiers = JavaModifiersToNsKeyModifiers(fModifiers, TRUE);
// Just a dummy value ... // Just a dummy value ...
NSInteger eventNumber = 0; NSInteger eventNumber = 0;
...@@ -658,7 +658,7 @@ JNF_COCOA_ENTER(env); ...@@ -658,7 +658,7 @@ JNF_COCOA_ENTER(env);
} }
// b) drag actions (key modifiers) have changed: // b) drag actions (key modifiers) have changed:
jint modifiers = [DnDUtilities currentJavaExtKeyModifiers]; jint modifiers = NsKeyModifiersToJavaModifiers([NSEvent modifierFlags], YES);
if (fDragKeyModifiers != modifiers) { if (fDragKeyModifiers != modifiers) {
NSDragOperation currentOp = [DnDUtilities nsDragOperationForModifiers:[NSEvent modifierFlags]]; NSDragOperation currentOp = [DnDUtilities nsDragOperationForModifiers:[NSEvent modifierFlags]];
NSDragOperation allowedOp = [DnDUtilities mapJavaDragOperationToNS:fSourceActions] & currentOp; NSDragOperation allowedOp = [DnDUtilities mapJavaDragOperationToNS:fSourceActions] & currentOp;
......
...@@ -70,6 +70,18 @@ AWT_ASSERT_APPKIT_THREAD; ...@@ -70,6 +70,18 @@ AWT_ASSERT_APPKIT_THREAD;
JNIEnv *env = [ThreadUtilities getJNIEnv]; JNIEnv *env = [ThreadUtilities getJNIEnv];
JNF_COCOA_ENTER(env); JNF_COCOA_ENTER(env);
// If we are called as a result of user pressing a shorcut, do nothing,
// because AVTView has already sent corresponding key event to the Java
// layer from performKeyEquivalent
NSEvent *currEvent = [[NSApplication sharedApplication] currentEvent];
if ([currEvent type] == NSKeyDown) {
NSString *menuKey = [sender keyEquivalent];
NSString *eventKey = [currEvent characters];
if ([menuKey isEqualToString:eventKey]) {
return;
}
}
if (fIsCheckbox) { if (fIsCheckbox) {
static JNF_CLASS_CACHE(jc_CCheckboxMenuItem, "sun/lwawt/macosx/CCheckboxMenuItem"); static JNF_CLASS_CACHE(jc_CCheckboxMenuItem, "sun/lwawt/macosx/CCheckboxMenuItem");
static JNF_MEMBER_CACHE(jm_ckHandleAction, jc_CCheckboxMenuItem, "handleAction", "(Z)V"); static JNF_MEMBER_CACHE(jm_ckHandleAction, jc_CCheckboxMenuItem, "handleAction", "(Z)V");
...@@ -83,14 +95,8 @@ JNF_COCOA_ENTER(env); ...@@ -83,14 +95,8 @@ JNF_COCOA_ENTER(env);
static JNF_CLASS_CACHE(jc_CMenuItem, "sun/lwawt/macosx/CMenuItem"); static JNF_CLASS_CACHE(jc_CMenuItem, "sun/lwawt/macosx/CMenuItem");
static JNF_MEMBER_CACHE(jm_handleAction, jc_CMenuItem, "handleAction", "(JI)V"); // AWT_THREADING Safe (event) static JNF_MEMBER_CACHE(jm_handleAction, jc_CMenuItem, "handleAction", "(JI)V"); // AWT_THREADING Safe (event)
NSEvent *currEvent = [[NSApplication sharedApplication] currentEvent];
NSUInteger modifiers = [currEvent modifierFlags]; NSUInteger modifiers = [currEvent modifierFlags];
jint javaModifiers = 0; jint javaModifiers = NsKeyModifiersToJavaModifiers(modifiers, NO);
if ((modifiers & NSCommandKeyMask) != 0) javaModifiers |= java_awt_Event_META_MASK;
if ((modifiers & NSShiftKeyMask) != 0) javaModifiers |= java_awt_Event_SHIFT_MASK;
if ((modifiers & NSControlKeyMask) != 0) javaModifiers |= java_awt_Event_CTRL_MASK;
if ((modifiers & NSAlternateKeyMask) != 0) javaModifiers |= java_awt_Event_ALT_MASK;
JNFCallVoidMethod(env, fPeer, jm_handleAction, UTC(currEvent), javaModifiers); // AWT_THREADING Safe (event) JNFCallVoidMethod(env, fPeer, jm_handleAction, UTC(currEvent), javaModifiers); // AWT_THREADING Safe (event)
} }
...@@ -117,10 +123,7 @@ AWT_ASSERT_NOT_APPKIT_THREAD; ...@@ -117,10 +123,7 @@ AWT_ASSERT_NOT_APPKIT_THREAD;
modifiers &= ~java_awt_event_KeyEvent_SHIFT_MASK; modifiers &= ~java_awt_event_KeyEvent_SHIFT_MASK;
} }
if ((modifiers & java_awt_event_KeyEvent_SHIFT_MASK) != 0) modifierMask |= NSShiftKeyMask; modifierMask = JavaModifiersToNsKeyModifiers(modifiers, NO);
if ((modifiers & java_awt_event_KeyEvent_CTRL_MASK) != 0) modifierMask |= NSControlKeyMask;
if ((modifiers & java_awt_event_KeyEvent_ALT_MASK) != 0) modifierMask |= NSAlternateKeyMask;
if ((modifiers & java_awt_event_KeyEvent_META_MASK) != 0) modifierMask |= NSCommandKeyMask;
} }
[JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
......
...@@ -239,9 +239,22 @@ void JavaCT_DrawTextUsingQSD(JNIEnv *env, const QuartzSDOps *qsdo, const AWTStri ...@@ -239,9 +239,22 @@ void JavaCT_DrawTextUsingQSD(JNIEnv *env, const QuartzSDOps *qsdo, const AWTStri
CGContextSetTextMatrix(cgRef, CGAffineTransformIdentity); // resets the damage from CoreText CGContextSetTextMatrix(cgRef, CGAffineTransformIdentity); // resets the damage from CoreText
NSString *string = [NSString stringWithCharacters:chars length:length]; NSString *string = [NSString stringWithCharacters:chars length:length];
/*
The calls below were used previously but for unknown reason did not
render using the right font (see bug 7183516) when attribString is not
initialized with font dictionary attributes. It seems that "options"
in CTTypesetterCreateWithAttributedStringAndOptions which contains the
font dictionary is ignored.
NSAttributedString *attribString = [[NSAttributedString alloc] initWithString:string]; NSAttributedString *attribString = [[NSAttributedString alloc] initWithString:string];
CTTypesetterRef typeSetterRef = CTTypesetterCreateWithAttributedStringAndOptions((CFAttributedStringRef) attribString, (CFDictionaryRef) ctsDictionaryFor(nsFont, JRSFontStyleUsesFractionalMetrics(strike->fStyle))); CTTypesetterRef typeSetterRef = CTTypesetterCreateWithAttributedStringAndOptions((CFAttributedStringRef) attribString, (CFDictionaryRef) ctsDictionaryFor(nsFont, JRSFontStyleUsesFractionalMetrics(strike->fStyle)));
*/
NSAttributedString *attribString = [[NSAttributedString alloc]
initWithString:string
attributes:ctsDictionaryFor(nsFont, JRSFontStyleUsesFractionalMetrics(strike->fStyle))];
CTTypesetterRef typeSetterRef = CTTypesetterCreateWithAttributedString((CFAttributedStringRef) attribString);
CFRange range = {0, length}; CFRange range = {0, length};
CTLineRef lineRef = CTTypesetterCreateLine(typeSetterRef, range); CTLineRef lineRef = CTTypesetterCreateLine(typeSetterRef, range);
......
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
+ (jint)narrowJavaDropActions:(jint)actions; + (jint)narrowJavaDropActions:(jint)actions;
// Mouse and key modifiers mapping: // Mouse and key modifiers mapping:
+ (NSUInteger)mapJavaExtModifiersToNSKeyModifiers:(jint)modifiers;
+ (NSUInteger)mapJavaExtModifiersToNSMouseDownButtons:(jint)modifiers; + (NSUInteger)mapJavaExtModifiersToNSMouseDownButtons:(jint)modifiers;
+ (NSUInteger)mapJavaExtModifiersToNSMouseUpButtons:(jint)modifiers; + (NSUInteger)mapJavaExtModifiersToNSMouseUpButtons:(jint)modifiers;
...@@ -50,9 +49,6 @@ ...@@ -50,9 +49,6 @@
+ (jint)extractJavaExtKeyModifiersFromJavaExtModifiers:(jint)modifiers; + (jint)extractJavaExtKeyModifiersFromJavaExtModifiers:(jint)modifiers;
+ (jint)extractJavaExtMouseModifiersFromJavaExtModifiers:(jint)modifiers; + (jint)extractJavaExtMouseModifiersFromJavaExtModifiers:(jint)modifiers;
// Get the current keyboard modifier keys as java modifiers (for operationChanged)
+ (jint)currentJavaExtKeyModifiers;
// Getting the state of the current Drag // Getting the state of the current Drag
+ (NSDragOperation)nsDragOperationForModifiers:(NSUInteger)modifiers; + (NSDragOperation)nsDragOperationForModifiers:(NSUInteger)modifiers;
+ (jint) javaKeyModifiersForNSDragOperation:(NSDragOperation)dragOp; + (jint) javaKeyModifiersForNSDragOperation:(NSDragOperation)dragOp;
......
...@@ -161,28 +161,6 @@ There are several problems with Drag and Drop - notably, the mismatch between Ja ...@@ -161,28 +161,6 @@ There are several problems with Drag and Drop - notably, the mismatch between Ja
} }
// Mouse and key modifiers mapping: // Mouse and key modifiers mapping:
+ (NSUInteger)mapJavaExtModifiersToNSKeyModifiers:(jint)modifiers
{
NSUInteger result = 0;
if ((modifiers & java_awt_event_InputEvent_SHIFT_DOWN_MASK) != 0)
result |= NSShiftKeyMask;
if ((modifiers & java_awt_event_InputEvent_CTRL_DOWN_MASK) != 0)
result |= NSControlKeyMask;
if ((modifiers & java_awt_event_InputEvent_META_DOWN_MASK) != 0)
result |= NSCommandKeyMask;
if ((modifiers & java_awt_event_InputEvent_ALT_DOWN_MASK) != 0)
result |= NSAlternateKeyMask;
if ((modifiers & java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK) != 0)
result |= NSAlternateKeyMask;
return result;
}
+ (NSUInteger)mapJavaExtModifiersToNSMouseDownButtons:(jint)modifiers + (NSUInteger)mapJavaExtModifiersToNSMouseDownButtons:(jint)modifiers
{ {
NSUInteger result = NSLeftMouseDown; NSUInteger result = NSLeftMouseDown;
...@@ -245,32 +223,6 @@ There are several problems with Drag and Drop - notably, the mismatch between Ja ...@@ -245,32 +223,6 @@ There are several problems with Drag and Drop - notably, the mismatch between Ja
return modifiers & mask; return modifiers & mask;
} }
+ (jint)currentJavaExtKeyModifiers
{
NSUInteger modifiers = [NSEvent modifierFlags];
jint jmodifiers = 0;
if(modifiers & NSShiftKeyMask) {
jmodifiers |= java_awt_event_InputEvent_SHIFT_DOWN_MASK;
}
if(modifiers & NSControlKeyMask) {
jmodifiers |= java_awt_event_InputEvent_CTRL_DOWN_MASK;
}
if(modifiers & NSAlternateKeyMask) {
jmodifiers |= java_awt_event_InputEvent_ALT_DOWN_MASK;
}
if(modifiers & NSCommandKeyMask) {
jmodifiers |= java_awt_event_InputEvent_META_DOWN_MASK;
}
return jmodifiers;
}
+ (NSDragOperation) nsDragOperationForModifiers:(NSUInteger)modifiers { + (NSDragOperation) nsDragOperationForModifiers:(NSUInteger)modifiers {
// Java first // Java first
......
/* /*
* Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -644,6 +644,9 @@ public class WindowsLookAndFeel extends BasicLookAndFeel ...@@ -644,6 +644,9 @@ public class WindowsLookAndFeel extends BasicLookAndFeel
"released SPACE", "released" "released SPACE", "released"
}), }),
"Caret.width",
new DesktopProperty("win.caret.width", null),
"CheckBox.font", ControlFont, "CheckBox.font", ControlFont,
"CheckBox.interiorBackground", WindowBackgroundColor, "CheckBox.interiorBackground", WindowBackgroundColor,
"CheckBox.background", ControlBackgroundColor, "CheckBox.background", ControlBackgroundColor,
......
...@@ -883,7 +883,7 @@ class PackageWriter extends BandStructure { ...@@ -883,7 +883,7 @@ class PackageWriter extends BandStructure {
avHiBits &= (1L<<attrIndexLimit[i])-1; avHiBits &= (1L<<attrIndexLimit[i])-1;
int nextLoBit = 0; int nextLoBit = 0;
Map<Attribute.Layout, int[]> defMap = allLayouts.get(i); Map<Attribute.Layout, int[]> defMap = allLayouts.get(i);
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
Map.Entry<Attribute.Layout, int[]>[] layoutsAndCounts = Map.Entry<Attribute.Layout, int[]>[] layoutsAndCounts =
new Map.Entry[defMap.size()]; new Map.Entry[defMap.size()];
defMap.entrySet().toArray(layoutsAndCounts); defMap.entrySet().toArray(layoutsAndCounts);
......
...@@ -32,14 +32,15 @@ import static javax.management.openmbean.SimpleType.*; ...@@ -32,14 +32,15 @@ import static javax.management.openmbean.SimpleType.*;
import com.sun.jmx.remote.util.EnvHelp; import com.sun.jmx.remote.util.EnvHelp;
import java.beans.ConstructorProperties;
import java.io.InvalidObjectException; import java.io.InvalidObjectException;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType; import java.lang.reflect.GenericArrayType;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
...@@ -1129,14 +1130,56 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory { ...@@ -1129,14 +1130,56 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory {
to getters. */ to getters. */
private static final class CompositeBuilderViaConstructor private static final class CompositeBuilderViaConstructor
extends CompositeBuilder { extends CompositeBuilder {
static class AnnotationHelper {
private static Class<? extends Annotation> constructorPropertiesClass;
private static Method valueMethod;
static {
findConstructorPropertiesClass();
}
@SuppressWarnings("unchecked")
private static void findConstructorPropertiesClass() {
try {
constructorPropertiesClass = (Class<? extends Annotation>)
Class.forName("java.beans.ConstructorProperties", false,
DefaultMXBeanMappingFactory.class.getClassLoader());
valueMethod = constructorPropertiesClass.getMethod("value");
} catch (ClassNotFoundException cnf) {
// java.beans not present
} catch (NoSuchMethodException e) {
// should not reach here
throw new InternalError(e);
}
}
static boolean isAvailable() {
return constructorPropertiesClass != null;
}
static String[] getPropertyNames(Constructor<?> constr) {
if (!isAvailable())
return null;
Annotation a = constr.getAnnotation(constructorPropertiesClass);
if (a == null) return null;
try {
return (String[]) valueMethod.invoke(a);
} catch (InvocationTargetException e) {
throw new InternalError(e);
} catch (IllegalAccessException e) {
throw new InternalError(e);
}
}
}
CompositeBuilderViaConstructor(Class<?> targetClass, String[] itemNames) { CompositeBuilderViaConstructor(Class<?> targetClass, String[] itemNames) {
super(targetClass, itemNames); super(targetClass, itemNames);
} }
String applicable(Method[] getters) throws InvalidObjectException { String applicable(Method[] getters) throws InvalidObjectException {
if (!AnnotationHelper.isAvailable())
final Class<ConstructorProperties> propertyNamesClass = ConstructorProperties.class; return "@ConstructorProperties annotation not available";
Class<?> targetClass = getTargetClass(); Class<?> targetClass = getTargetClass();
Constructor<?>[] constrs = targetClass.getConstructors(); Constructor<?>[] constrs = targetClass.getConstructors();
...@@ -1145,7 +1188,7 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory { ...@@ -1145,7 +1188,7 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory {
List<Constructor<?>> annotatedConstrList = newList(); List<Constructor<?>> annotatedConstrList = newList();
for (Constructor<?> constr : constrs) { for (Constructor<?> constr : constrs) {
if (Modifier.isPublic(constr.getModifiers()) if (Modifier.isPublic(constr.getModifiers())
&& constr.getAnnotation(propertyNamesClass) != null) && AnnotationHelper.getPropertyNames(constr) != null)
annotatedConstrList.add(constr); annotatedConstrList.add(constr);
} }
...@@ -1174,8 +1217,7 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory { ...@@ -1174,8 +1217,7 @@ public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory {
// so we can test unambiguity. // so we can test unambiguity.
Set<BitSet> getterIndexSets = newSet(); Set<BitSet> getterIndexSets = newSet();
for (Constructor<?> constr : annotatedConstrList) { for (Constructor<?> constr : annotatedConstrList) {
String[] propertyNames = String[] propertyNames = AnnotationHelper.getPropertyNames(constr);
constr.getAnnotation(propertyNamesClass).value();
Type[] paramTypes = constr.getGenericParameterTypes(); Type[] paramTypes = constr.getGenericParameterTypes();
if (paramTypes.length != propertyNames.length) { if (paramTypes.length != propertyNames.length) {
......
...@@ -178,7 +178,7 @@ public class VMOption { ...@@ -178,7 +178,7 @@ public class VMOption {
return "VM option: " + getName() + return "VM option: " + getName() +
" value: " + value + " " + " value: " + value + " " +
" origin: " + origin + " " + " origin: " + origin + " " +
(writeable ? "(read-only)" : "(read-write)"); (writeable ? "(read-write)" : "(read-only)");
} }
/** /**
......
...@@ -154,7 +154,7 @@ public final class Init { ...@@ -154,7 +154,7 @@ public final class Init {
} }
} }
for (Node el=config.getFirstChild();el!=null;el=el.getNextSibling()) { for (Node el=config.getFirstChild();el!=null;el=el.getNextSibling()) {
if (!(el instanceof Element)) { if (el.getNodeType() != Node.ELEMENT_NODE) {
continue; continue;
} }
String tag=el.getLocalName(); String tag=el.getLocalName();
......
...@@ -205,7 +205,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -205,7 +205,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
try { try {
NameSpaceSymbTable ns=new NameSpaceSymbTable(); NameSpaceSymbTable ns=new NameSpaceSymbTable();
int nodeLevel=NODE_BEFORE_DOCUMENT_ELEMENT; int nodeLevel=NODE_BEFORE_DOCUMENT_ELEMENT;
if (rootNode instanceof Element) { if (rootNode != null && rootNode.getNodeType() == Node.ELEMENT_NODE) {
//Fills the nssymbtable with the definitions of the parent of the root subnode //Fills the nssymbtable with the definitions of the parent of the root subnode
getParentNameSpaces((Element)rootNode,ns); getParentNameSpaces((Element)rootNode,ns);
nodeLevel=NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT; nodeLevel=NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT;
...@@ -335,7 +335,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -335,7 +335,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
return; return;
sibling=parentNode.getNextSibling(); sibling=parentNode.getNextSibling();
parentNode=parentNode.getParentNode(); parentNode=parentNode.getParentNode();
if (!(parentNode instanceof Element)) { if (parentNode !=null && parentNode.getNodeType() != Node.ELEMENT_NODE) {
documentLevel=NODE_AFTER_DOCUMENT_ELEMENT; documentLevel=NODE_AFTER_DOCUMENT_ELEMENT;
parentNode=null; parentNode=null;
} }
...@@ -391,7 +391,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -391,7 +391,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
return; return;
boolean currentNodeIsVisible = false; boolean currentNodeIsVisible = false;
NameSpaceSymbTable ns=new NameSpaceSymbTable(); NameSpaceSymbTable ns=new NameSpaceSymbTable();
if (currentNode instanceof Element) if (currentNode != null && currentNode.getNodeType() == Node.ELEMENT_NODE)
getParentNameSpaces((Element)currentNode,ns); getParentNameSpaces((Element)currentNode,ns);
Node sibling=null; Node sibling=null;
Node parentNode=null; Node parentNode=null;
...@@ -512,7 +512,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -512,7 +512,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
return; return;
sibling=parentNode.getNextSibling(); sibling=parentNode.getNextSibling();
parentNode=parentNode.getParentNode(); parentNode=parentNode.getParentNode();
if (!(parentNode instanceof Element)) { if (parentNode != null && parentNode.getNodeType() != Node.ELEMENT_NODE) {
parentNode=null; parentNode=null;
documentLevel=NODE_AFTER_DOCUMENT_ELEMENT; documentLevel=NODE_AFTER_DOCUMENT_ELEMENT;
} }
...@@ -594,18 +594,14 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -594,18 +594,14 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
final void getParentNameSpaces(Element el,NameSpaceSymbTable ns) { final void getParentNameSpaces(Element el,NameSpaceSymbTable ns) {
List<Element> parents=new ArrayList<Element>(10); List<Element> parents=new ArrayList<Element>(10);
Node n1=el.getParentNode(); Node n1=el.getParentNode();
if (!(n1 instanceof Element)) { if (n1 == null || n1.getNodeType() != Node.ELEMENT_NODE) {
return; return;
} }
//Obtain all the parents of the elemnt //Obtain all the parents of the elemnt
Element parent=(Element) n1; Node parent = n1;
while (parent!=null) { while (parent!=null && parent.getNodeType() == Node.ELEMENT_NODE) {
parents.add(parent); parents.add((Element)parent);
Node n=parent.getParentNode(); parent = parent.getParentNode();
if (!(n instanceof Element )) {
break;
}
parent=(Element)n;
} }
//Visit them in reverse order. //Visit them in reverse order.
ListIterator<Element> it=parents.listIterator(parents.size()); ListIterator<Element> it=parents.listIterator(parents.size());
......
...@@ -1445,7 +1445,7 @@ public class XMLCipher { ...@@ -1445,7 +1445,7 @@ public class XMLCipher {
// The de-serialiser returns a fragment whose children we need to // The de-serialiser returns a fragment whose children we need to
// take on. // take on.
if (sourceParent instanceof Document) { if (sourceParent != null && sourceParent.getNodeType() == Node.DOCUMENT_NODE) {
// If this is a content decryption, this may have problems // If this is a content decryption, this may have problems
......
...@@ -283,7 +283,7 @@ public class RetrievalMethodResolver extends KeyResolverSpi { ...@@ -283,7 +283,7 @@ public class RetrievalMethodResolver extends KeyResolverSpi {
Element e=null; Element e=null;
while (it.hasNext()) { while (it.hasNext()) {
Node currentNode=it.next(); Node currentNode=it.next();
if (currentNode instanceof Element) { if (currentNode != null && currentNode.getNodeType() == Node.ELEMENT_NODE) {
e=(Element)currentNode; e=(Element)currentNode;
break; break;
} }
...@@ -292,14 +292,14 @@ public class RetrievalMethodResolver extends KeyResolverSpi { ...@@ -292,14 +292,14 @@ public class RetrievalMethodResolver extends KeyResolverSpi {
List<Element> parents=new ArrayList<Element>(10); List<Element> parents=new ArrayList<Element>(10);
//Obtain all the parents of the elemnt //Obtain all the parents of the elemnt
do { while (e != null) {
parents.add(e); parents.add(e);
Node n=e.getParentNode(); Node n=e.getParentNode();
if (!(n instanceof Element )) { if (n == null || n.getNodeType() != Node.ELEMENT_NODE) {
break; break;
} }
e=(Element)n; e=(Element)n;
} while (e!=null); }
//Visit them in reverse order. //Visit them in reverse order.
ListIterator<Element> it2=parents.listIterator(parents.size()-1); ListIterator<Element> it2=parents.listIterator(parents.size()-1);
Element ele=null; Element ele=null;
......
...@@ -225,7 +225,7 @@ public class IdResolver { ...@@ -225,7 +225,7 @@ public class IdResolver {
} while (sibling==null && parentNode!=null) { } while (sibling==null && parentNode!=null) {
sibling=parentNode.getNextSibling(); sibling=parentNode.getNextSibling();
parentNode=parentNode.getParentNode(); parentNode=parentNode.getParentNode();
if (!(parentNode instanceof Element)) { if (parentNode != null && parentNode.getNodeType() != Node.ELEMENT_NODE) {
parentNode=null; parentNode=null;
} }
} }
......
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -31,7 +31,6 @@ import javax.naming.*; ...@@ -31,7 +31,6 @@ import javax.naming.*;
import java.io.*; import java.io.*;
import java.math.*; import java.math.*;
import java.util.*; import java.util.*;
import java.beans.*;
import javax.sql.rowset.*; import javax.sql.rowset.*;
...@@ -83,12 +82,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -83,12 +82,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
*/ */
private ResultSetMetaData resMD; private ResultSetMetaData resMD;
/**
* The property that helps to fire the property changed event when certain
* properties are changed in the <code>JdbcRowSet</code> object. This property
* is being added to satisfy Rave requirements.
*/
private PropertyChangeSupport propertyChangeSupport;
/** /**
* The Vector holding the Match Columns * The Vector holding the Match Columns
...@@ -145,7 +138,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -145,7 +138,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
throw new RuntimeException(ioe); throw new RuntimeException(ioe);
} }
propertyChangeSupport = new PropertyChangeSupport(this);
initParams(); initParams();
...@@ -268,7 +260,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -268,7 +260,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
throw new RuntimeException(ioe); throw new RuntimeException(ioe);
} }
propertyChangeSupport = new PropertyChangeSupport(this);
initParams(); initParams();
// set the defaults // set the defaults
...@@ -343,7 +334,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -343,7 +334,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
throw new RuntimeException(ioe); throw new RuntimeException(ioe);
} }
propertyChangeSupport = new PropertyChangeSupport(this);
initParams(); initParams();
...@@ -360,10 +350,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -360,10 +350,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
setMaxRows(0); setMaxRows(0);
setMaxFieldSize(0); setMaxFieldSize(0);
// to ensure connection to a db call connect now
// and associate a conn with "this" object
// in this case.
conn = connect();
setParams(); setParams();
setReadOnly(true); setReadOnly(true);
...@@ -435,7 +421,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -435,7 +421,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
throw new RuntimeException(ioe); throw new RuntimeException(ioe);
} }
propertyChangeSupport = new PropertyChangeSupport(this);
initParams(); initParams();
...@@ -620,12 +605,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -620,12 +605,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
} }
// An alternate solution is required instead of having the private Connection connect() throws SQLException {
// connect method as protected.
// This is a work around to assist Rave Team
// :ah
protected Connection connect() throws SQLException {
// Get a JDBC connection. // Get a JDBC connection.
...@@ -4056,9 +4036,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -4056,9 +4036,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
// Added as per Rave requirements // Added as per Rave requirements
if( conn.getHoldability() != HOLD_CURSORS_OVER_COMMIT) { if( conn.getHoldability() != HOLD_CURSORS_OVER_COMMIT) {
ResultSet oldVal = rs;
rs = null; rs = null;
// propertyChangeSupport.firePropertyChange("ResultSet",oldVal,rs);
} }
} }
...@@ -4119,9 +4097,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -4119,9 +4097,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
// Makes the result ste handle null after rollback // Makes the result ste handle null after rollback
// Added as per Rave requirements // Added as per Rave requirements
ResultSet oldVal = rs;
rs = null; rs = null;
// propertyChangeSupport.firePropertyChange("ResultSet", oldVal,rs);
} }
...@@ -4247,12 +4223,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -4247,12 +4223,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
rs = resultSet; rs = resultSet;
} }
// Over riding the setCommand from BaseRowSet for
// firing the propertyChangeSupport Event for
// Rave requirements when this property's value
// changes.
/** /**
* Sets this <code>JdbcRowSet</code> object's <code>command</code> property to * Sets this <code>JdbcRowSet</code> object's <code>command</code> property to
* the given <code>String</code> object and clears the parameters, if any, * the given <code>String</code> object and clears the parameters, if any,
...@@ -4277,28 +4247,19 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -4277,28 +4247,19 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
* @see #getCommand * @see #getCommand
*/ */
public void setCommand(String command) throws SQLException { public void setCommand(String command) throws SQLException {
String oldVal;
if (getCommand() != null) { if (getCommand() != null) {
if(!getCommand().equals(command)) { if(!getCommand().equals(command)) {
oldVal = getCommand();
super.setCommand(command); super.setCommand(command);
ps = null; ps = null;
rs = null; rs = null;
propertyChangeSupport.firePropertyChange("command", oldVal,command);
} }
} }
else { else {
super.setCommand(command); super.setCommand(command);
propertyChangeSupport.firePropertyChange("command", null,command);
} }
} }
// Over riding the setDataSourceName from BaseRowSet for
// firing the propertyChangeSupport Event for
// Rave requirements when this property's values
// changes.
/** /**
* Sets the <code>dataSourceName</code> property for this <code>JdbcRowSet</code> * Sets the <code>dataSourceName</code> property for this <code>JdbcRowSet</code>
* object to the given logical name and sets this <code>JdbcRowSet</code> object's * object to the given logical name and sets this <code>JdbcRowSet</code> object's
...@@ -4329,28 +4290,20 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -4329,28 +4290,20 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
* @see #getDataSourceName * @see #getDataSourceName
*/ */
public void setDataSourceName(String dsName) throws SQLException{ public void setDataSourceName(String dsName) throws SQLException{
String oldVal;
if(getDataSourceName() != null) { if(getDataSourceName() != null) {
if(!getDataSourceName().equals(dsName)) { if(!getDataSourceName().equals(dsName)) {
oldVal = getDataSourceName();
super.setDataSourceName(dsName); super.setDataSourceName(dsName);
conn = null; conn = null;
ps = null; ps = null;
rs = null; rs = null;
propertyChangeSupport.firePropertyChange("dataSourceName",oldVal,dsName);
} }
} }
else { else {
super.setDataSourceName(dsName); super.setDataSourceName(dsName);
propertyChangeSupport.firePropertyChange("dataSourceName",null,dsName);
} }
} }
// Over riding the setUrl from BaseRowSet for
// firing the propertyChangeSupport Event for
// Rave requirements when this property's values
// changes.
/** /**
* Sets the Url property for this <code>JdbcRowSet</code> object * Sets the Url property for this <code>JdbcRowSet</code> object
...@@ -4394,29 +4347,20 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -4394,29 +4347,20 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
*/ */
public void setUrl(String url) throws SQLException { public void setUrl(String url) throws SQLException {
String oldVal;
if(getUrl() != null) { if(getUrl() != null) {
if(!getUrl().equals(url)) { if(!getUrl().equals(url)) {
oldVal = getUrl();
super.setUrl(url); super.setUrl(url);
conn = null; conn = null;
ps = null; ps = null;
rs = null; rs = null;
propertyChangeSupport.firePropertyChange("url", oldVal, url);
} }
} }
else { else {
super.setUrl(url); super.setUrl(url);
propertyChangeSupport.firePropertyChange("url", null, url);
} }
} }
// Over riding the setUsername from BaseRowSet for
// firing the propertyChangeSupport Event for
// Rave requirements when this property's values
// changes.
/** /**
* Sets the username property for this <code>JdbcRowSet</code> object * Sets the username property for this <code>JdbcRowSet</code> object
* to the given user name. Because it * to the given user name. Because it
...@@ -4438,29 +4382,20 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -4438,29 +4382,20 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
* @see #getUsername * @see #getUsername
*/ */
public void setUsername(String uname) { public void setUsername(String uname) {
String oldVal;
if( getUsername() != null) { if( getUsername() != null) {
if(!getUsername().equals(uname)) { if(!getUsername().equals(uname)) {
oldVal = getUsername();
super.setUsername(uname); super.setUsername(uname);
conn = null; conn = null;
ps = null; ps = null;
rs = null; rs = null;
propertyChangeSupport.firePropertyChange("username",oldVal,uname);
} }
} }
else{ else{
super.setUsername(uname); super.setUsername(uname);
propertyChangeSupport.firePropertyChange("username",null,uname);
} }
} }
// Over riding the setPassword from BaseRowSet for
// firing the propertyChangeSupport Event for
// Rave requirements when this property's values
// changes.
/** /**
* Sets the password property for this <code>JdbcRowSet</code> object * Sets the password property for this <code>JdbcRowSet</code> object
* to the given <code>String</code> object. Because it * to the given <code>String</code> object. Because it
...@@ -4481,21 +4416,17 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -4481,21 +4416,17 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
* that must be supplied to the database to create a connection * that must be supplied to the database to create a connection
*/ */
public void setPassword(String password) { public void setPassword(String password) {
String oldVal;
if ( getPassword() != null) { if ( getPassword() != null) {
if(!getPassword().equals(password)) { if(!getPassword().equals(password)) {
oldVal = getPassword();
super.setPassword(password); super.setPassword(password);
conn = null; conn = null;
ps = null; ps = null;
rs = null; rs = null;
propertyChangeSupport.firePropertyChange("password",oldVal,password);
} }
} }
else{ else{
super.setPassword(password); super.setPassword(password);
propertyChangeSupport.firePropertyChange("password",null,password);
} }
} }
...@@ -4528,7 +4459,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -4528,7 +4459,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
if(oldVal != type) { if(oldVal != type) {
super.setType(type); super.setType(type);
propertyChangeSupport.firePropertyChange("type",oldVal,type);
} }
} }
...@@ -4561,78 +4491,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -4561,78 +4491,6 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
if(oldVal != concur) { if(oldVal != concur) {
super.setConcurrency(concur); super.setConcurrency(concur);
propertyChangeSupport.firePropertyChange("concurrency",oldVal,concur);
}
}
/**
* Sets the transaction isolation property for this JDBC <code>RowSet</code> object to the given
* constant. The DBMS will use this transaction isolation level for
* transactions if it can.
* <p>
* For <code>RowSet</code> implementations such as
* the <code>CachedRowSet</code> that operate in a disconnected environment,
* the <code>SyncProvider</code> object being used
* offers complementary locking and data integrity options. The
* options described below are pertinent only to connected <code>RowSet</code>
* objects (<code>JdbcRowSet</code> objects).
*
* @param transIso one of the following constants, listed in ascending order:
* <code>Connection.TRANSACTION_NONE</code>,
* <code>Connection.TRANSACTION_READ_UNCOMMITTED</code>,
* <code>Connection.TRANSACTION_READ_COMMITTED</code>,
* <code>Connection.TRANSACTION_REPEATABLE_READ</code>, or
* <code>Connection.TRANSACTION_SERIALIZABLE</code>
* @throws SQLException if the given parameter is not one of the Connection
* constants
* @see javax.sql.rowset.spi.SyncFactory
* @see javax.sql.rowset.spi.SyncProvider
* @see #getTransactionIsolation
*/
public void setTransactionIsolation(int transIso) throws SQLException {
int oldVal;
try {
oldVal = getTransactionIsolation();
}catch(NullPointerException ex) {
oldVal = 0;
}
if(oldVal != transIso) {
super.setTransactionIsolation(transIso);
propertyChangeSupport.firePropertyChange("transactionIsolation",oldVal,transIso);
}
}
/**
* Sets the maximum number of rows that this <code>RowSet</code> object may contain to
* the given number. If this limit is exceeded, the excess rows are
* silently dropped.
*
* @param mRows an <code>int</code> indicating the current maximum number
* of rows; zero means that there is no limit
* @throws SQLException if an error occurs internally setting the
* maximum limit on the number of rows that a JDBC <code>RowSet</code> object
* can contain; or if <i>max</i> is less than <code>0</code>; or
* if <i>max</i> is less than the <code>fetchSize</code> of the
* <code>RowSet</code>
*/
public void setMaxRows(int mRows) throws SQLException {
int oldVal;
try {
oldVal = getMaxRows();
}catch(NullPointerException ex) {
oldVal = 0;
}
if(oldVal != mRows) {
super.setMaxRows(mRows);
propertyChangeSupport.firePropertyChange("maxRows",oldVal,mRows);
} }
} }
......
...@@ -52,7 +52,9 @@ import javax.swing.JTextField; ...@@ -52,7 +52,9 @@ import javax.swing.JTextField;
* This can be used by a JAAS application to instantiate a * This can be used by a JAAS application to instantiate a
* CallbackHandler * CallbackHandler
* @see javax.security.auth.callback * @see javax.security.auth.callback
* @deprecated This class will be removed in a future release.
*/ */
@Deprecated
public class DialogCallbackHandler implements CallbackHandler { public class DialogCallbackHandler implements CallbackHandler {
/* -- Fields -- */ /* -- Fields -- */
......
...@@ -1046,6 +1046,10 @@ public class EventQueue { ...@@ -1046,6 +1046,10 @@ public class EventQueue {
} }
final boolean detachDispatchThread(EventDispatchThread edt, boolean forceDetach) { final boolean detachDispatchThread(EventDispatchThread edt, boolean forceDetach) {
/*
* Minimize discard possibility for non-posted events
*/
SunToolkit.flushPendingEvents();
/* /*
* This synchronized block is to secure that the event dispatch * This synchronized block is to secure that the event dispatch
* thread won't die in the middle of posting a new event to the * thread won't die in the middle of posting a new event to the
...@@ -1060,11 +1064,8 @@ public class EventQueue { ...@@ -1060,11 +1064,8 @@ public class EventQueue {
/* /*
* Don't detach the thread if any events are pending. Not * Don't detach the thread if any events are pending. Not
* sure if it's a possible scenario, though. * sure if it's a possible scenario, though.
*
* Fix for 4648733. Check both the associated java event
* queue and the PostEventQueue.
*/ */
if (!forceDetach && (peekEvent() != null) || !SunToolkit.isPostEventQueueEmpty()) { if (!forceDetach && (peekEvent() != null)) {
return false; return false;
} }
dispatchThread = null; dispatchThread = null;
......
...@@ -495,6 +495,16 @@ public class IndexedPropertyDescriptor extends PropertyDescriptor { ...@@ -495,6 +495,16 @@ public class IndexedPropertyDescriptor extends PropertyDescriptor {
indexedReadMethodName = old.indexedReadMethodName; indexedReadMethodName = old.indexedReadMethodName;
} }
void updateGenericsFor(Class<?> type) {
super.updateGenericsFor(type);
try {
setIndexedPropertyType(findIndexedPropertyType(getIndexedReadMethod0(), getIndexedWriteMethod0()));
}
catch (IntrospectionException exception) {
setIndexedPropertyType(null);
}
}
/** /**
* Returns a hash code value for the object. * Returns a hash code value for the object.
* See {@link java.lang.Object#hashCode} for a complete description. * See {@link java.lang.Object#hashCode} for a complete description.
......
...@@ -574,26 +574,25 @@ public class Introspector { ...@@ -574,26 +574,25 @@ public class Introspector {
// replace existing property descriptor // replace existing property descriptor
// only if we have types to resolve // only if we have types to resolve
// in the context of this.beanClass // in the context of this.beanClass
try {
String name = pd.getName();
Method read = pd.getReadMethod(); Method read = pd.getReadMethod();
Method write = pd.getWriteMethod(); Method write = pd.getWriteMethod();
boolean cls = true; boolean cls = true;
if (read != null) cls = cls && read.getGenericReturnType() instanceof Class; if (read != null) cls = cls && read.getGenericReturnType() instanceof Class;
if (write != null) cls = cls && write.getGenericParameterTypes()[0] instanceof Class; if (write != null) cls = cls && write.getGenericParameterTypes()[0] instanceof Class;
if (pd instanceof IndexedPropertyDescriptor) { if (pd instanceof IndexedPropertyDescriptor) {
IndexedPropertyDescriptor ipd = (IndexedPropertyDescriptor)pd; IndexedPropertyDescriptor ipd = (IndexedPropertyDescriptor) pd;
Method readI = ipd.getIndexedReadMethod(); Method readI = ipd.getIndexedReadMethod();
Method writeI = ipd.getIndexedWriteMethod(); Method writeI = ipd.getIndexedWriteMethod();
if (readI != null) cls = cls && readI.getGenericReturnType() instanceof Class; if (readI != null) cls = cls && readI.getGenericReturnType() instanceof Class;
if (writeI != null) cls = cls && writeI.getGenericParameterTypes()[1] instanceof Class; if (writeI != null) cls = cls && writeI.getGenericParameterTypes()[1] instanceof Class;
if (!cls) { if (!cls) {
pd = new IndexedPropertyDescriptor(this.beanClass, name, read, write, readI, writeI); pd = new IndexedPropertyDescriptor(ipd);
pd.updateGenericsFor(this.beanClass);
} }
} else if (!cls) {
pd = new PropertyDescriptor(this.beanClass, name, read, write);
} }
} catch ( IntrospectionException e ) { else if (!cls) {
pd = new PropertyDescriptor(pd);
pd.updateGenericsFor(this.beanClass);
} }
} }
list.add(pd); list.add(pd);
......
...@@ -632,6 +632,16 @@ public class PropertyDescriptor extends FeatureDescriptor { ...@@ -632,6 +632,16 @@ public class PropertyDescriptor extends FeatureDescriptor {
constrained = old.constrained; constrained = old.constrained;
} }
void updateGenericsFor(Class<?> type) {
setClass0(type);
try {
setPropertyType(findPropertyType(getReadMethod0(), getWriteMethod0()));
}
catch (IntrospectionException exception) {
setPropertyType(null);
}
}
/** /**
* Returns the property type that corresponds to the read and write method. * Returns the property type that corresponds to the read and write method.
* The type precedence is given to the readMethod. * The type precedence is given to the readMethod.
......
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -31,10 +31,6 @@ import java.util.List; ...@@ -31,10 +31,6 @@ import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Vector; import java.util.Vector;
import java.util.Collections; import java.util.Collections;
import java.io.ObjectStreamField;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.IOException;
import sun.security.util.SecurityConstants; import sun.security.util.SecurityConstants;
/** /**
...@@ -424,7 +420,7 @@ public final class FilePermission extends Permission implements Serializable { ...@@ -424,7 +420,7 @@ public final class FilePermission extends Permission implements Serializable {
/** /**
* Converts an actions String to an actions mask. * Converts an actions String to an actions mask.
* *
* @param action the action string. * @param actions the action string.
* @return the actions mask. * @return the actions mask.
*/ */
private static int getMask(String actions) { private static int getMask(String actions) {
...@@ -435,7 +431,9 @@ public final class FilePermission extends Permission implements Serializable { ...@@ -435,7 +431,9 @@ public final class FilePermission extends Permission implements Serializable {
if (actions == null) { if (actions == null) {
return mask; return mask;
} }
// Check against use of constants (used heavily within the JDK)
// Use object identity comparison against known-interned strings for
// performance benefit (these values are used heavily within the JDK).
if (actions == SecurityConstants.FILE_READ_ACTION) { if (actions == SecurityConstants.FILE_READ_ACTION) {
return READ; return READ;
} else if (actions == SecurityConstants.FILE_WRITE_ACTION) { } else if (actions == SecurityConstants.FILE_WRITE_ACTION) {
...@@ -531,7 +529,7 @@ public final class FilePermission extends Permission implements Serializable { ...@@ -531,7 +529,7 @@ public final class FilePermission extends Permission implements Serializable {
switch(a[i-matchlen]) { switch(a[i-matchlen]) {
case ',': case ',':
seencomma = true; seencomma = true;
/*FALLTHROUGH*/ break;
case ' ': case '\r': case '\n': case ' ': case '\r': case '\n':
case '\f': case '\t': case '\f': case '\t':
break; break;
...@@ -798,7 +796,7 @@ implements Serializable { ...@@ -798,7 +796,7 @@ implements Serializable {
* @return an enumeration of all the FilePermission objects. * @return an enumeration of all the FilePermission objects.
*/ */
public Enumeration elements() { public Enumeration<Permission> elements() {
// Convert Iterator into Enumeration // Convert Iterator into Enumeration
synchronized (this) { synchronized (this) {
return Collections.enumeration(perms); return Collections.enumeration(perms);
...@@ -843,7 +841,6 @@ implements Serializable { ...@@ -843,7 +841,6 @@ implements Serializable {
/* /*
* Reads in a Vector of FilePermissions and saves them in the perms field. * Reads in a Vector of FilePermissions and saves them in the perms field.
*/ */
@SuppressWarnings("unchecked")
private void readObject(ObjectInputStream in) throws IOException, private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException { ClassNotFoundException {
// Don't call defaultReadObject() // Don't call defaultReadObject()
...@@ -852,6 +849,7 @@ implements Serializable { ...@@ -852,6 +849,7 @@ implements Serializable {
ObjectInputStream.GetField gfields = in.readFields(); ObjectInputStream.GetField gfields = in.readFields();
// Get the one we want // Get the one we want
@SuppressWarnings("unchecked")
Vector<Permission> permissions = (Vector<Permission>)gfields.get("permissions", null); Vector<Permission> permissions = (Vector<Permission>)gfields.get("permissions", null);
perms = new ArrayList<>(permissions.size()); perms = new ArrayList<>(permissions.size());
perms.addAll(permissions); perms.addAll(permissions);
......
...@@ -96,6 +96,8 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence { ...@@ -96,6 +96,8 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
* </ul> * </ul>
* If the {@code minimumCapacity} argument is nonpositive, this * If the {@code minimumCapacity} argument is nonpositive, this
* method takes no action and simply returns. * method takes no action and simply returns.
* Note that subsequent operations on this object can reduce the
* actual capacity below that requested here.
* *
* @param minimumCapacity the minimum desired capacity. * @param minimumCapacity the minimum desired capacity.
*/ */
......
...@@ -27,7 +27,7 @@ package java.lang.management; ...@@ -27,7 +27,7 @@ package java.lang.management;
import javax.management.openmbean.CompositeData; import javax.management.openmbean.CompositeData;
import java.util.concurrent.locks.*; import java.util.concurrent.locks.*;
import java.beans.ConstructorProperties; import sun.management.LockInfoCompositeData;
/** /**
* Information about a <em>lock</em>. A lock can be a built-in object monitor, * Information about a <em>lock</em>. A lock can be a built-in object monitor,
...@@ -44,8 +44,7 @@ import java.beans.ConstructorProperties; ...@@ -44,8 +44,7 @@ import java.beans.ConstructorProperties;
* *
* <h4><a name="MappedType">MXBean Mapping</a></h4> * <h4><a name="MappedType">MXBean Mapping</a></h4>
* <tt>LockInfo</tt> is mapped to a {@link CompositeData CompositeData} * <tt>LockInfo</tt> is mapped to a {@link CompositeData CompositeData}
* as specified in the <a href="../../../javax/management/MXBean.html#mapping-rules"> * as specified in the {@link #from from} method.
* type mapping rules</a> of {@linkplain javax.management.MXBean MXBeans}.
* *
* @see java.util.concurrent.locks.AbstractOwnableSynchronizer * @see java.util.concurrent.locks.AbstractOwnableSynchronizer
* @see java.util.concurrent.locks.Condition * @see java.util.concurrent.locks.Condition
...@@ -66,7 +65,6 @@ public class LockInfo { ...@@ -66,7 +65,6 @@ public class LockInfo {
* @param identityHashCode the {@link System#identityHashCode * @param identityHashCode the {@link System#identityHashCode
* identity hash code} of the lock object. * identity hash code} of the lock object.
*/ */
@ConstructorProperties({"className", "identityHashCode"})
public LockInfo(String className, int identityHashCode) { public LockInfo(String className, int identityHashCode) {
if (className == null) { if (className == null) {
throw new NullPointerException("Parameter className cannot be null"); throw new NullPointerException("Parameter className cannot be null");
...@@ -102,6 +100,50 @@ public class LockInfo { ...@@ -102,6 +100,50 @@ public class LockInfo {
return identityHashCode; return identityHashCode;
} }
/**
* Returns a {@code LockInfo} object represented by the
* given {@code CompositeData}.
* The given {@code CompositeData} must contain the following attributes:
* <blockquote>
* <table border>
* <tr>
* <th align=left>Attribute Name</th>
* <th align=left>Type</th>
* </tr>
* <tr>
* <td>className</td>
* <td><tt>java.lang.String</tt></td>
* </tr>
* <tr>
* <td>identityHashCode</td>
* <td><tt>java.lang.Integer</tt></td>
* </tr>
* </table>
* </blockquote>
*
* @param cd {@code CompositeData} representing a {@code LockInfo}
*
* @throws IllegalArgumentException if {@code cd} does not
* represent a {@code LockInfo} with the attributes described
* above.
* @return a {@code LockInfo} object represented
* by {@code cd} if {@code cd} is not {@code null};
* {@code null} otherwise.
*
* @since 1.8
*/
public static LockInfo from(CompositeData cd) {
if (cd == null) {
return null;
}
if (cd instanceof LockInfoCompositeData) {
return ((LockInfoCompositeData) cd).getLockInfo();
} else {
return LockInfoCompositeData.toLockInfo(cd);
}
}
/** /**
* Returns a string representation of a lock. The returned * Returns a string representation of a lock. The returned
* string representation consists of the name of the class of the * string representation consists of the name of the class of the
......
...@@ -696,9 +696,7 @@ public class ThreadInfo { ...@@ -696,9 +696,7 @@ public class ThreadInfo {
* <td>lockInfo</td> * <td>lockInfo</td>
* <td><tt>javax.management.openmbean.CompositeData</tt> * <td><tt>javax.management.openmbean.CompositeData</tt>
* - the mapped type for {@link LockInfo} as specified in the * - the mapped type for {@link LockInfo} as specified in the
* <a href="../../../javax/management/MXBean.html#mapping-rules"> * {@link LockInfo#from} method.
* type mapping rules</a> of
* {@linkplain javax.management.MXBean MXBeans}.
* <p> * <p>
* If <tt>cd</tt> does not contain this attribute, * If <tt>cd</tt> does not contain this attribute,
* the <tt>LockInfo</tt> object will be constructed from * the <tt>LockInfo</tt> object will be constructed from
...@@ -766,10 +764,7 @@ public class ThreadInfo { ...@@ -766,10 +764,7 @@ public class ThreadInfo {
* <td>lockedSynchronizers</td> * <td>lockedSynchronizers</td>
* <td><tt>javax.management.openmbean.CompositeData[]</tt> * <td><tt>javax.management.openmbean.CompositeData[]</tt>
* whose element type is the mapped type for * whose element type is the mapped type for
* {@link LockInfo} as specified in the * {@link LockInfo} as specified in the {@link LockInfo#from} method.
* <a href="../../../javax/management/MXBean.html#mapping-rules">
* type mapping rules</a> of
* {@linkplain javax.management.MXBean MXBeans}.
* <p> * <p>
* If <tt>cd</tt> does not contain this attribute, * If <tt>cd</tt> does not contain this attribute,
* this attribute will be set to an empty array. </td> * this attribute will be set to an empty array. </td>
...@@ -830,7 +825,6 @@ public class ThreadInfo { ...@@ -830,7 +825,6 @@ public class ThreadInfo {
* @since 1.6 * @since 1.6
*/ */
public LockInfo[] getLockedSynchronizers() { public LockInfo[] getLockedSynchronizers() {
// represents an <a href="LockInfo.html#OwnableSynchronizer">
return lockedSynchronizers; return lockedSynchronizers;
} }
......
...@@ -182,7 +182,7 @@ public final class Constructor<T> extends Executable { ...@@ -182,7 +182,7 @@ public final class Constructor<T> extends Executable {
* @since 1.5 * @since 1.5
*/ */
@Override @Override
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({"rawtypes", "unchecked"})
public TypeVariable<Constructor<T>>[] getTypeParameters() { public TypeVariable<Constructor<T>>[] getTypeParameters() {
if (getSignature() != null) { if (getSignature() != null) {
return (TypeVariable<Constructor<T>>[])getGenericInfo().getTypeParameters(); return (TypeVariable<Constructor<T>>[])getGenericInfo().getTypeParameters();
......
...@@ -194,7 +194,7 @@ public final class Method extends Executable { ...@@ -194,7 +194,7 @@ public final class Method extends Executable {
* @since 1.5 * @since 1.5
*/ */
@Override @Override
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({"rawtypes", "unchecked"})
public TypeVariable<Method>[] getTypeParameters() { public TypeVariable<Method>[] getTypeParameters() {
if (getGenericSignature() != null) if (getGenericSignature() != null)
return (TypeVariable<Method>[])getGenericInfo().getTypeParameters(); return (TypeVariable<Method>[])getGenericInfo().getTypeParameters();
......
...@@ -467,7 +467,6 @@ implements java.io.Serializable ...@@ -467,7 +467,6 @@ implements java.io.Serializable
* @param action the action string * @param action the action string
* @return the action mask * @return the action mask
*/ */
@SuppressWarnings("fallthrough")
private static int getMask(String action) { private static int getMask(String action) {
if (action == null) { if (action == null) {
...@@ -480,7 +479,8 @@ implements java.io.Serializable ...@@ -480,7 +479,8 @@ implements java.io.Serializable
int mask = NONE; int mask = NONE;
// Check against use of constants (used heavily within the JDK) // Use object identity comparison against known-interned strings for
// performance benefit (these values are used heavily within the JDK).
if (action == SecurityConstants.SOCKET_RESOLVE_ACTION) { if (action == SecurityConstants.SOCKET_RESOLVE_ACTION) {
return RESOLVE; return RESOLVE;
} else if (action == SecurityConstants.SOCKET_CONNECT_ACTION) { } else if (action == SecurityConstants.SOCKET_CONNECT_ACTION) {
...@@ -568,7 +568,7 @@ implements java.io.Serializable ...@@ -568,7 +568,7 @@ implements java.io.Serializable
switch(a[i-matchlen]) { switch(a[i-matchlen]) {
case ',': case ',':
seencomma = true; seencomma = true;
/*FALLTHROUGH*/ break;
case ' ': case '\r': case '\n': case ' ': case '\r': case '\n':
case '\f': case '\t': case '\f': case '\t':
break; break;
......
...@@ -248,7 +248,7 @@ public abstract class AsynchronousFileChannel ...@@ -248,7 +248,7 @@ public abstract class AsynchronousFileChannel
return provider.newAsynchronousFileChannel(file, options, executor, attrs); return provider.newAsynchronousFileChannel(file, options, executor, attrs);
} }
@SuppressWarnings({ "unchecked", "rawtypes" }) // generic array construction @SuppressWarnings({"unchecked", "rawtypes"}) // generic array construction
private static final FileAttribute<?>[] NO_ATTRIBUTES = new FileAttribute[0]; private static final FileAttribute<?>[] NO_ATTRIBUTES = new FileAttribute[0];
/** /**
......
...@@ -287,7 +287,7 @@ public abstract class FileChannel ...@@ -287,7 +287,7 @@ public abstract class FileChannel
return provider.newFileChannel(path, options, attrs); return provider.newFileChannel(path, options, attrs);
} }
@SuppressWarnings({ "unchecked", "rawtypes" }) // generic array construction @SuppressWarnings({"unchecked", "rawtypes"}) // generic array construction
private static final FileAttribute<?>[] NO_ATTRIBUTES = new FileAttribute[0]; private static final FileAttribute<?>[] NO_ATTRIBUTES = new FileAttribute[0];
/** /**
......
...@@ -121,6 +121,7 @@ public class ArrayDeque<E> extends AbstractCollection<E> ...@@ -121,6 +121,7 @@ public class ArrayDeque<E> extends AbstractCollection<E>
* *
* @param numElements the number of elements to hold * @param numElements the number of elements to hold
*/ */
@SuppressWarnings("unchecked")
private void allocateElements(int numElements) { private void allocateElements(int numElements) {
int initialCapacity = MIN_INITIAL_CAPACITY; int initialCapacity = MIN_INITIAL_CAPACITY;
// Find the best power of two to hold elements. // Find the best power of two to hold elements.
...@@ -152,10 +153,11 @@ public class ArrayDeque<E> extends AbstractCollection<E> ...@@ -152,10 +153,11 @@ public class ArrayDeque<E> extends AbstractCollection<E>
int newCapacity = n << 1; int newCapacity = n << 1;
if (newCapacity < 0) if (newCapacity < 0)
throw new IllegalStateException("Sorry, deque too big"); throw new IllegalStateException("Sorry, deque too big");
Object[] a = new Object[newCapacity]; @SuppressWarnings("unchecked")
E[] a = (E[]) new Object[newCapacity];
System.arraycopy(elements, p, a, 0, r); System.arraycopy(elements, p, a, 0, r);
System.arraycopy(elements, 0, a, r, p); System.arraycopy(elements, 0, a, r, p);
elements = (E[])a; elements = a;
head = 0; head = 0;
tail = n; tail = n;
} }
...@@ -182,6 +184,7 @@ public class ArrayDeque<E> extends AbstractCollection<E> ...@@ -182,6 +184,7 @@ public class ArrayDeque<E> extends AbstractCollection<E>
* Constructs an empty array deque with an initial capacity * Constructs an empty array deque with an initial capacity
* sufficient to hold 16 elements. * sufficient to hold 16 elements.
*/ */
@SuppressWarnings("unchecked")
public ArrayDeque() { public ArrayDeque() {
elements = (E[]) new Object[16]; elements = (E[]) new Object[16];
} }
...@@ -793,6 +796,7 @@ public class ArrayDeque<E> extends AbstractCollection<E> ...@@ -793,6 +796,7 @@ public class ArrayDeque<E> extends AbstractCollection<E>
* this deque * this deque
* @throws NullPointerException if the specified array is null * @throws NullPointerException if the specified array is null
*/ */
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) { public <T> T[] toArray(T[] a) {
int size = size(); int size = size();
if (a.length < size) if (a.length < size)
......
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -560,7 +560,7 @@ public class Arrays { ...@@ -560,7 +560,7 @@ public class Arrays {
* off is the offset to generate corresponding low, high in src * off is the offset to generate corresponding low, high in src
* To be removed in a future release. * To be removed in a future release.
*/ */
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
private static void mergeSort(Object[] src, private static void mergeSort(Object[] src,
Object[] dest, Object[] dest,
int low, int low,
...@@ -747,7 +747,7 @@ public class Arrays { ...@@ -747,7 +747,7 @@ public class Arrays {
* off is the offset into src corresponding to low in dest * off is the offset into src corresponding to low in dest
* To be removed in a future release. * To be removed in a future release.
*/ */
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({"rawtypes", "unchecked"})
private static void mergeSort(Object[] src, private static void mergeSort(Object[] src,
Object[] dest, Object[] dest,
int low, int high, int off, int low, int high, int off,
...@@ -2832,6 +2832,7 @@ public class Arrays { ...@@ -2832,6 +2832,7 @@ public class Arrays {
* @return a list view of the specified array * @return a list view of the specified array
*/ */
@SafeVarargs @SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) { public static <T> List<T> asList(T... a) {
return new ArrayList<>(a); return new ArrayList<>(a);
} }
......
...@@ -213,7 +213,7 @@ public class Collections { ...@@ -213,7 +213,7 @@ public class Collections {
* @throws IllegalArgumentException (optional) if the comparator is * @throws IllegalArgumentException (optional) if the comparator is
* found to violate the {@link Comparator} contract * found to violate the {@link Comparator} contract
*/ */
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
public static <T> void sort(List<T> list, Comparator<? super T> c) { public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray(); Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c); Arrays.sort(a, (Comparator)c);
...@@ -418,7 +418,7 @@ public class Collections { ...@@ -418,7 +418,7 @@ public class Collections {
* @throws UnsupportedOperationException if the specified list or * @throws UnsupportedOperationException if the specified list or
* its list-iterator does not support the <tt>set</tt> operation. * its list-iterator does not support the <tt>set</tt> operation.
*/ */
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({"rawtypes", "unchecked"})
public static void reverse(List<?> list) { public static void reverse(List<?> list) {
int size = list.size(); int size = list.size();
if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) { if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
...@@ -497,7 +497,7 @@ public class Collections { ...@@ -497,7 +497,7 @@ public class Collections {
* @throws UnsupportedOperationException if the specified list or its * @throws UnsupportedOperationException if the specified list or its
* list-iterator does not support the <tt>set</tt> operation. * list-iterator does not support the <tt>set</tt> operation.
*/ */
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({"rawtypes", "unchecked"})
public static void shuffle(List<?> list, Random rnd) { public static void shuffle(List<?> list, Random rnd) {
int size = list.size(); int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) { if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
...@@ -535,7 +535,7 @@ public class Collections { ...@@ -535,7 +535,7 @@ public class Collections {
* || j &lt; 0 || j &gt;= list.size()). * || j &lt; 0 || j &gt;= list.size()).
* @since 1.4 * @since 1.4
*/ */
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({"rawtypes", "unchecked"})
public static void swap(List<?> list, int i, int j) { public static void swap(List<?> list, int i, int j) {
// instead of using a raw type here, it's possible to capture // instead of using a raw type here, it's possible to capture
// the wildcard but it will require a call to a supplementary // the wildcard but it will require a call to a supplementary
...@@ -669,7 +669,7 @@ public class Collections { ...@@ -669,7 +669,7 @@ public class Collections {
* @throws NoSuchElementException if the collection is empty. * @throws NoSuchElementException if the collection is empty.
* @see Comparable * @see Comparable
*/ */
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp) { public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp) {
if (comp==null) if (comp==null)
return (T)min((Collection) coll); return (T)min((Collection) coll);
...@@ -740,7 +740,7 @@ public class Collections { ...@@ -740,7 +740,7 @@ public class Collections {
* @throws NoSuchElementException if the collection is empty. * @throws NoSuchElementException if the collection is empty.
* @see Comparable * @see Comparable
*/ */
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) { public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) {
if (comp==null) if (comp==null)
return (T)max((Collection) coll); return (T)max((Collection) coll);
...@@ -1403,7 +1403,7 @@ public class Collections { ...@@ -1403,7 +1403,7 @@ public class Collections {
extends UnmodifiableSet<Map.Entry<K,V>> { extends UnmodifiableSet<Map.Entry<K,V>> {
private static final long serialVersionUID = 7854390611657943733L; private static final long serialVersionUID = 7854390611657943733L;
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
UnmodifiableEntrySet(Set<? extends Map.Entry<? extends K, ? extends V>> s) { UnmodifiableEntrySet(Set<? extends Map.Entry<? extends K, ? extends V>> s) {
// Need to cast to raw in order to work around a limitation in the type system // Need to cast to raw in order to work around a limitation in the type system
super((Set)s); super((Set)s);
...@@ -3172,7 +3172,7 @@ public class Collections { ...@@ -3172,7 +3172,7 @@ public class Collections {
* *
* @see #emptySet() * @see #emptySet()
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("rawtypes")
public static final Set EMPTY_SET = new EmptySet<>(); public static final Set EMPTY_SET = new EmptySet<>();
/** /**
...@@ -3271,10 +3271,13 @@ public class Collections { ...@@ -3271,10 +3271,13 @@ public class Collections {
return new EmptySortedSet<>(); return new EmptySortedSet<>();
} }
public Comparator comparator() { @Override
public Comparator<? super E> comparator() {
return null; return null;
} }
@Override
@SuppressWarnings("unchecked")
public SortedSet<E> subSet(Object fromElement, Object toElement) { public SortedSet<E> subSet(Object fromElement, Object toElement) {
Objects.requireNonNull(fromElement); Objects.requireNonNull(fromElement);
Objects.requireNonNull(toElement); Objects.requireNonNull(toElement);
...@@ -3294,6 +3297,7 @@ public class Collections { ...@@ -3294,6 +3297,7 @@ public class Collections {
return emptySortedSet(); return emptySortedSet();
} }
@Override
public SortedSet<E> headSet(Object toElement) { public SortedSet<E> headSet(Object toElement) {
Objects.requireNonNull(toElement); Objects.requireNonNull(toElement);
...@@ -3304,6 +3308,7 @@ public class Collections { ...@@ -3304,6 +3308,7 @@ public class Collections {
return emptySortedSet(); return emptySortedSet();
} }
@Override
public SortedSet<E> tailSet(Object fromElement) { public SortedSet<E> tailSet(Object fromElement) {
Objects.requireNonNull(fromElement); Objects.requireNonNull(fromElement);
...@@ -3314,10 +3319,12 @@ public class Collections { ...@@ -3314,10 +3319,12 @@ public class Collections {
return emptySortedSet(); return emptySortedSet();
} }
@Override
public E first() { public E first() {
throw new NoSuchElementException(); throw new NoSuchElementException();
} }
@Override
public E last() { public E last() {
throw new NoSuchElementException(); throw new NoSuchElementException();
} }
...@@ -3328,7 +3335,7 @@ public class Collections { ...@@ -3328,7 +3335,7 @@ public class Collections {
* *
* @see #emptyList() * @see #emptyList()
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("rawtypes")
public static final List EMPTY_LIST = new EmptyList<>(); public static final List EMPTY_LIST = new EmptyList<>();
/** /**
...@@ -3402,7 +3409,7 @@ public class Collections { ...@@ -3402,7 +3409,7 @@ public class Collections {
* @see #emptyMap() * @see #emptyMap()
* @since 1.3 * @since 1.3
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("rawtypes")
public static final Map EMPTY_MAP = new EmptyMap<>(); public static final Map EMPTY_MAP = new EmptyMap<>();
/** /**
...@@ -3685,6 +3692,7 @@ public class Collections { ...@@ -3685,6 +3692,7 @@ public class Collections {
return a; return a;
} }
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) { public <T> T[] toArray(T[] a) {
final int n = this.n; final int n = this.n;
if (a.length < n) { if (a.length < n) {
...@@ -3731,6 +3739,7 @@ public class Collections { ...@@ -3731,6 +3739,7 @@ public class Collections {
* the <tt>Comparable</tt> interface. * the <tt>Comparable</tt> interface.
* @see Comparable * @see Comparable
*/ */
@SuppressWarnings("unchecked")
public static <T> Comparator<T> reverseOrder() { public static <T> Comparator<T> reverseOrder() {
return (Comparator<T>) ReverseComparator.REVERSE_ORDER; return (Comparator<T>) ReverseComparator.REVERSE_ORDER;
} }
......
...@@ -208,7 +208,7 @@ class ComparableTimSort { ...@@ -208,7 +208,7 @@ class ComparableTimSort {
* @param start the index of the first element in the range that is * @param start the index of the first element in the range that is
* not already known to be sorted ({@code lo <= start <= hi}) * not already known to be sorted ({@code lo <= start <= hi})
*/ */
@SuppressWarnings({ "fallthrough", "rawtypes", "unchecked" }) @SuppressWarnings({"fallthrough", "rawtypes", "unchecked"})
private static void binarySort(Object[] a, int lo, int hi, int start) { private static void binarySort(Object[] a, int lo, int hi, int start) {
assert lo <= start && start <= hi; assert lo <= start && start <= hi;
if (start == lo) if (start == lo)
...@@ -277,7 +277,7 @@ class ComparableTimSort { ...@@ -277,7 +277,7 @@ class ComparableTimSort {
* @return the length of the run beginning at the specified position in * @return the length of the run beginning at the specified position in
* the specified array * the specified array
*/ */
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
private static int countRunAndMakeAscending(Object[] a, int lo, int hi) { private static int countRunAndMakeAscending(Object[] a, int lo, int hi) {
assert lo < hi; assert lo < hi;
int runHi = lo + 1; int runHi = lo + 1;
...@@ -612,7 +612,7 @@ class ComparableTimSort { ...@@ -612,7 +612,7 @@ class ComparableTimSort {
* (must be aBase + aLen) * (must be aBase + aLen)
* @param len2 length of second run to be merged (must be > 0) * @param len2 length of second run to be merged (must be > 0)
*/ */
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
private void mergeLo(int base1, int len1, int base2, int len2) { private void mergeLo(int base1, int len1, int base2, int len2) {
assert len1 > 0 && len2 > 0 && base1 + len1 == base2; assert len1 > 0 && len2 > 0 && base1 + len1 == base2;
...@@ -729,7 +729,7 @@ class ComparableTimSort { ...@@ -729,7 +729,7 @@ class ComparableTimSort {
* (must be aBase + aLen) * (must be aBase + aLen)
* @param len2 length of second run to be merged (must be > 0) * @param len2 length of second run to be merged (must be > 0)
*/ */
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
private void mergeHi(int base1, int len1, int base2, int len2) { private void mergeHi(int base1, int len1, int base2, int len2) {
assert len1 > 0 && len2 > 0 && base1 + len1 == base2; assert len1 > 0 && len2 > 0 && base1 + len1 == base2;
......
/* /*
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -34,6 +34,8 @@ import java.io.IOException; ...@@ -34,6 +34,8 @@ import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.regex.Pattern; import java.util.regex.Pattern;
...@@ -60,7 +62,14 @@ import sun.util.logging.PlatformLogger; ...@@ -60,7 +62,14 @@ import sun.util.logging.PlatformLogger;
* and the ISO 4217 currency data respectively. The value part consists of * and the ISO 4217 currency data respectively. The value part consists of
* three ISO 4217 values of a currency, i.e., an alphabetic code, a numeric * three ISO 4217 values of a currency, i.e., an alphabetic code, a numeric
* code, and a minor unit. Those three ISO 4217 values are separated by commas. * code, and a minor unit. Those three ISO 4217 values are separated by commas.
* The lines which start with '#'s are considered comment lines. For example, * The lines which start with '#'s are considered comment lines. An optional UTC
* timestamp may be specified per currency entry if users need to specify a
* cutover date indicating when the new data comes into effect. The timestamp is
* appended to the end of the currency properties and uses a comma as a separator.
* If a UTC datestamp is present and valid, the JRE will only use the new currency
* properties if the current UTC date is later than the date specified at class
* loading time. The format of the timestamp must be of ISO 8601 format :
* {@code 'yyyy-MM-dd'T'HH:mm:ss'}. For example,
* <p> * <p>
* <code> * <code>
* #Sample currency properties<br> * #Sample currency properties<br>
...@@ -69,6 +78,20 @@ import sun.util.logging.PlatformLogger; ...@@ -69,6 +78,20 @@ import sun.util.logging.PlatformLogger;
* <p> * <p>
* will supersede the currency data for Japan. * will supersede the currency data for Japan.
* *
* <p>
* <code>
* #Sample currency properties with cutover date<br>
* JP=JPZ,999,0,2014-01-01T00:00:00
* </code>
* <p>
* will supersede the currency data for Japan if {@code Currency} class is loaded after
* 1st January 2014 00:00:00 GMT.
* <p>
* Where syntactically malformed entries are encountered, the entry is ignored
* and the remainder of entries in file are processed. For instances where duplicate
* country code entries exist, the behavior of the Currency information for that
* {@code Currency} is undefined and the remainder of entries in file are processed.
*
* @since 1.4 * @since 1.4
*/ */
public final class Currency implements Serializable { public final class Currency implements Serializable {
...@@ -100,7 +123,6 @@ public final class Currency implements Serializable { ...@@ -100,7 +123,6 @@ public final class Currency implements Serializable {
private static ConcurrentMap<String, Currency> instances = new ConcurrentHashMap<>(7); private static ConcurrentMap<String, Currency> instances = new ConcurrentHashMap<>(7);
private static HashSet<Currency> available; private static HashSet<Currency> available;
// Class data: currency data obtained from currency.data file. // Class data: currency data obtained from currency.data file.
// Purpose: // Purpose:
// - determine valid country codes // - determine valid country codes
...@@ -235,7 +257,9 @@ public final class Currency implements Serializable { ...@@ -235,7 +257,9 @@ public final class Currency implements Serializable {
} }
Set<String> keys = props.stringPropertyNames(); Set<String> keys = props.stringPropertyNames();
Pattern propertiesPattern = Pattern propertiesPattern =
Pattern.compile("([A-Z]{3})\\s*,\\s*(\\d{3})\\s*,\\s*([0-3])"); Pattern.compile("([A-Z]{3})\\s*,\\s*(\\d{3})\\s*,\\s*" +
"([0-3])\\s*,?\\s*(\\d{4}-\\d{2}-\\d{2}T\\d{2}:" +
"\\d{2}:\\d{2})?");
for (String key : keys) { for (String key : keys) {
replaceCurrencyData(propertiesPattern, replaceCurrencyData(propertiesPattern,
key.toUpperCase(Locale.ROOT), key.toUpperCase(Locale.ROOT),
...@@ -645,29 +669,38 @@ public final class Currency implements Serializable { ...@@ -645,29 +669,38 @@ public final class Currency implements Serializable {
* consists of "three-letter alphabet code", "three-digit numeric code", * consists of "three-letter alphabet code", "three-digit numeric code",
* and "one-digit (0,1,2, or 3) default fraction digit". * and "one-digit (0,1,2, or 3) default fraction digit".
* For example, "JPZ,392,0". * For example, "JPZ,392,0".
* @throws * An optional UTC date can be appended to the string (comma separated)
* to allow a currency change take effect after date specified.
* For example, "JP=JPZ,999,0,2014-01-01T00:00:00" has no effect unless
* UTC time is past 1st January 2014 00:00:00 GMT.
*/ */
private static void replaceCurrencyData(Pattern pattern, String ctry, String curdata) { private static void replaceCurrencyData(Pattern pattern, String ctry, String curdata) {
if (ctry.length() != 2) { if (ctry.length() != 2) {
// ignore invalid country code // ignore invalid country code
String message = new StringBuilder() info("currency.properties entry for " + ctry +
.append("The entry in currency.properties for ") " is ignored because of the invalid country code.", null);
.append(ctry).append(" is ignored because of the invalid country code.")
.toString();
info(message, null);
return; return;
} }
Matcher m = pattern.matcher(curdata); Matcher m = pattern.matcher(curdata);
if (!m.find()) { if (!m.find() || (m.group(4) == null && countOccurrences(curdata, ',') >= 3)) {
// format is not recognized. ignore the data // format is not recognized. ignore the data
String message = new StringBuilder() // if group(4) date string is null and we've 4 values, bad date value
.append("The entry in currency.properties for ") info("currency.properties entry for " + ctry +
.append(ctry) " ignored because the value format is not recognized.", null);
.append(" is ignored because the value format is not recognized.") return;
.toString(); }
info(message, null);
try {
if (m.group(4) != null && !isPastCutoverDate(m.group(4))) {
info("currency.properties entry for " + ctry +
" ignored since cutover date has not passed :" + curdata, null);
return;
}
} catch (IndexOutOfBoundsException | NullPointerException | ParseException ex) {
info("currency.properties entry for " + ctry +
" ignored since exception encountered :" + ex.getMessage(), null);
return; return;
} }
...@@ -695,6 +728,26 @@ public final class Currency implements Serializable { ...@@ -695,6 +728,26 @@ public final class Currency implements Serializable {
setMainTableEntry(ctry.charAt(0), ctry.charAt(1), entry); setMainTableEntry(ctry.charAt(0), ctry.charAt(1), entry);
} }
private static boolean isPastCutoverDate(String s)
throws IndexOutOfBoundsException, NullPointerException, ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ROOT);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
format.setLenient(false);
long time = format.parse(s.trim()).getTime();
return System.currentTimeMillis() > time;
}
private static int countOccurrences(String value, char match) {
int count = 0;
for (char c : value.toCharArray()) {
if (c == match) {
++count;
}
}
return count;
}
private static void info(String message, Throwable t) { private static void info(String message, Throwable t) {
PlatformLogger logger = PlatformLogger.getLogger("java.util.Currency"); PlatformLogger logger = PlatformLogger.getLogger("java.util.Currency");
if (logger.isLoggable(PlatformLogger.INFO)) { if (logger.isLoggable(PlatformLogger.INFO)) {
......
/* /*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -230,7 +230,7 @@ public class HashMap<K,V> ...@@ -230,7 +230,7 @@ public class HashMap<K,V>
this.loadFactor = loadFactor; this.loadFactor = loadFactor;
threshold = (int)Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1); threshold = (int)Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
table = new Entry[capacity]; table = new Entry<?,?>[capacity];
init(); init();
} }
...@@ -1078,7 +1078,7 @@ public class HashMap<K,V> ...@@ -1078,7 +1078,7 @@ public class HashMap<K,V>
capacity <<= 1; capacity <<= 1;
} }
table = new Entry[capacity]; table = new Entry<?,?>[capacity];
threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1); threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
init(); // Give subclass a chance to do its thing. init(); // Give subclass a chance to do its thing.
......
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -121,6 +121,7 @@ class JumboEnumSet<E extends Enum<E>> extends EnumSet<E> { ...@@ -121,6 +121,7 @@ class JumboEnumSet<E extends Enum<E>> extends EnumSet<E> {
unseen = elements[0]; unseen = elements[0];
} }
@Override
public boolean hasNext() { public boolean hasNext() {
while (unseen == 0 && unseenIndex < elements.length - 1) while (unseen == 0 && unseenIndex < elements.length - 1)
unseen = elements[++unseenIndex]; unseen = elements[++unseenIndex];
...@@ -128,6 +129,7 @@ class JumboEnumSet<E extends Enum<E>> extends EnumSet<E> { ...@@ -128,6 +129,7 @@ class JumboEnumSet<E extends Enum<E>> extends EnumSet<E> {
} }
@Override @Override
@SuppressWarnings("unchecked")
public E next() { public E next() {
if (!hasNext()) if (!hasNext())
throw new NoSuchElementException(); throw new NoSuchElementException();
...@@ -138,6 +140,7 @@ class JumboEnumSet<E extends Enum<E>> extends EnumSet<E> { ...@@ -138,6 +140,7 @@ class JumboEnumSet<E extends Enum<E>> extends EnumSet<E> {
+ Long.numberOfTrailingZeros(lastReturned)]; + Long.numberOfTrailingZeros(lastReturned)];
} }
@Override
public void remove() { public void remove() {
if (lastReturned == 0) if (lastReturned == 0)
throw new IllegalStateException(); throw new IllegalStateException();
......
/* /*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -330,6 +330,7 @@ public class PriorityQueue<E> extends AbstractQueue<E> ...@@ -330,6 +330,7 @@ public class PriorityQueue<E> extends AbstractQueue<E>
return true; return true;
} }
@SuppressWarnings("unchecked")
public E peek() { public E peek() {
if (size == 0) if (size == 0)
return null; return null;
......
...@@ -246,7 +246,8 @@ public final class PropertyPermission extends BasicPermission { ...@@ -246,7 +246,8 @@ public final class PropertyPermission extends BasicPermission {
return mask; return mask;
} }
// Check against use of constants (used heavily within the JDK) // Use object identity comparison against known-interned strings for
// performance benefit (these values are used heavily within the JDK).
if (actions == SecurityConstants.PROPERTY_READ_ACTION) { if (actions == SecurityConstants.PROPERTY_READ_ACTION) {
return READ; return READ;
} if (actions == SecurityConstants.PROPERTY_WRITE_ACTION) { } if (actions == SecurityConstants.PROPERTY_WRITE_ACTION) {
......
/* /*
* Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -125,6 +125,7 @@ public class PropertyResourceBundle extends ResourceBundle { ...@@ -125,6 +125,7 @@ public class PropertyResourceBundle extends ResourceBundle {
* @throws IOException if an I/O error occurs * @throws IOException if an I/O error occurs
* @throws NullPointerException if <code>stream</code> is null * @throws NullPointerException if <code>stream</code> is null
*/ */
@SuppressWarnings({"unchecked", "rawtypes"})
public PropertyResourceBundle (InputStream stream) throws IOException { public PropertyResourceBundle (InputStream stream) throws IOException {
Properties properties = new Properties(); Properties properties = new Properties();
properties.load(stream); properties.load(stream);
...@@ -143,6 +144,7 @@ public class PropertyResourceBundle extends ResourceBundle { ...@@ -143,6 +144,7 @@ public class PropertyResourceBundle extends ResourceBundle {
* @throws NullPointerException if <code>reader</code> is null * @throws NullPointerException if <code>reader</code> is null
* @since 1.6 * @since 1.6
*/ */
@SuppressWarnings({"unchecked", "rawtypes"})
public PropertyResourceBundle (Reader reader) throws IOException { public PropertyResourceBundle (Reader reader) throws IOException {
Properties properties = new Properties(); Properties properties = new Properties();
properties.load(reader); properties.load(reader);
......
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -325,6 +325,7 @@ class JarVerifier { ...@@ -325,6 +325,7 @@ class JarVerifier {
* the given file in the jar. * the given file in the jar.
* @deprecated * @deprecated
*/ */
@Deprecated
public java.security.cert.Certificate[] getCerts(String name) public java.security.cert.Certificate[] getCerts(String name)
{ {
return mapSignersToCertArray(getCodeSigners(name)); return mapSignersToCertArray(getCodeSigners(name));
......
/* /*
* Copyright (c) 2003,2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003,2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -726,13 +726,13 @@ public abstract class Pack200 { ...@@ -726,13 +726,13 @@ public abstract class Pack200 {
private static final String PACK_PROVIDER = "java.util.jar.Pack200.Packer"; private static final String PACK_PROVIDER = "java.util.jar.Pack200.Packer";
private static final String UNPACK_PROVIDER = "java.util.jar.Pack200.Unpacker"; private static final String UNPACK_PROVIDER = "java.util.jar.Pack200.Unpacker";
private static Class packerImpl; private static Class<?> packerImpl;
private static Class unpackerImpl; private static Class<?> unpackerImpl;
private synchronized static Object newInstance(String prop) { private synchronized static Object newInstance(String prop) {
String implName = "(unknown)"; String implName = "(unknown)";
try { try {
Class impl = (PACK_PROVIDER.equals(prop))? packerImpl: unpackerImpl; Class<?> impl = (PACK_PROVIDER.equals(prop))? packerImpl: unpackerImpl;
if (impl == null) { if (impl == null) {
// The first time, we must decide which class to use. // The first time, we must decide which class to use.
implName = java.security.AccessController.doPrivileged( implName = java.security.AccessController.doPrivileged(
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<!-- <!--
Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
...@@ -41,7 +41,7 @@ input streams. ...@@ -41,7 +41,7 @@ input streams.
</a> </a>
<ul> <ul>
<li><a href="ftp://ftp.uu.net/pub/archiving/zip/doc/appnote-970311-iz.zip"> <li><a href="http://www.info-zip.org/doc/appnote-19970311-iz.zip">
Info-ZIP Application Note 970311 Info-ZIP Application Note 970311
</a> - a detailed description of the Info-ZIP format upon which </a> - a detailed description of the Info-ZIP format upon which
the <code>java.util.zip</code> classes are based. the <code>java.util.zip</code> classes are based.
......
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -1503,10 +1503,15 @@ public class DefaultCaret extends Rectangle implements Caret, FocusListener, Mou ...@@ -1503,10 +1503,15 @@ public class DefaultCaret extends Rectangle implements Caret, FocusListener, Mou
if (caretWidth > -1) { if (caretWidth > -1) {
return caretWidth; return caretWidth;
} } else {
Object property = UIManager.get("Caret.width");
if (property instanceof Integer) {
return ((Integer) property).intValue();
} else {
return 1; return 1;
} }
}
}
// --- serialization --------------------------------------------- // --- serialization ---------------------------------------------
......
...@@ -506,40 +506,25 @@ public abstract class SunToolkit extends Toolkit ...@@ -506,40 +506,25 @@ public abstract class SunToolkit extends Toolkit
postEvent(targetToAppContext(e.getSource()), pe); postEvent(targetToAppContext(e.getSource()), pe);
} }
protected static final Lock flushLock = new ReentrantLock();
private static boolean isFlushingPendingEvents = false;
/* /*
* Flush any pending events which haven't been posted to the AWT * Flush any pending events which haven't been posted to the AWT
* EventQueue yet. * EventQueue yet.
*/ */
public static void flushPendingEvents() { public static void flushPendingEvents() {
flushLock.lock();
try {
// Don't call flushPendingEvents() recursively
if (!isFlushingPendingEvents) {
isFlushingPendingEvents = true;
AppContext appContext = AppContext.getAppContext(); AppContext appContext = AppContext.getAppContext();
PostEventQueue postEventQueue = flushPendingEvents(appContext);
(PostEventQueue)appContext.get(POST_EVENT_QUEUE_KEY);
if (postEventQueue != null) {
postEventQueue.flush();
}
}
} finally {
isFlushingPendingEvents = false;
flushLock.unlock();
}
} }
public static boolean isPostEventQueueEmpty() { /*
AppContext appContext = AppContext.getAppContext(); * Flush the PostEventQueue for the right AppContext.
* The default flushPendingEvents only flushes the thread-local context,
* which is not always correct, c.f. 3746956
*/
public static void flushPendingEvents(AppContext appContext) {
PostEventQueue postEventQueue = PostEventQueue postEventQueue =
(PostEventQueue)appContext.get(POST_EVENT_QUEUE_KEY); (PostEventQueue)appContext.get(POST_EVENT_QUEUE_KEY);
if (postEventQueue != null) { if (postEventQueue != null) {
return postEventQueue.noEvents(); postEventQueue.flush();
} else {
return true;
} }
} }
...@@ -2045,17 +2030,12 @@ class PostEventQueue { ...@@ -2045,17 +2030,12 @@ class PostEventQueue {
private EventQueueItem queueTail = null; private EventQueueItem queueTail = null;
private final EventQueue eventQueue; private final EventQueue eventQueue;
// For the case when queue is cleared but events are not posted private Thread flushThread = null;
private volatile boolean isFlushing = false;
PostEventQueue(EventQueue eq) { PostEventQueue(EventQueue eq) {
eventQueue = eq; eventQueue = eq;
} }
public synchronized boolean noEvents() {
return queueHead == null && !isFlushing;
}
/* /*
* Continually post pending AWTEvents to the Java EventQueue. The method * Continually post pending AWTEvents to the Java EventQueue. The method
* is synchronized to ensure the flush is completed before a new event * is synchronized to ensure the flush is completed before a new event
...@@ -2066,11 +2046,29 @@ class PostEventQueue { ...@@ -2066,11 +2046,29 @@ class PostEventQueue {
* potentially lead to deadlock * potentially lead to deadlock
*/ */
public void flush() { public void flush() {
Thread newThread = Thread.currentThread();
try {
EventQueueItem tempQueue; EventQueueItem tempQueue;
synchronized (this) { synchronized (this) {
// Avoid method recursion
if (newThread == flushThread) {
return;
}
// Wait for other threads' flushing
while (flushThread != null) {
wait();
}
// Skip everything if queue is empty
if (queueHead == null) {
return;
}
// Remember flushing thread
flushThread = newThread;
tempQueue = queueHead; tempQueue = queueHead;
queueHead = queueTail = null; queueHead = queueTail = null;
isFlushing = true;
} }
try { try {
while (tempQueue != null) { while (tempQueue != null) {
...@@ -2079,7 +2077,17 @@ class PostEventQueue { ...@@ -2079,7 +2077,17 @@ class PostEventQueue {
} }
} }
finally { finally {
isFlushing = false; // Only the flushing thread can get here
synchronized (this) {
// Forget flushing thread, inform other pending threads
flushThread = null;
notifyAll();
}
}
}
catch (InterruptedException e) {
// Couldn't allow exception go up, so at least recover the flag
newThread.interrupt();
} }
} }
......
...@@ -333,11 +333,12 @@ public abstract class VolatileSurfaceManager ...@@ -333,11 +333,12 @@ public abstract class VolatileSurfaceManager
// using a SurfaceData that was created in a different // using a SurfaceData that was created in a different
// display mode. // display mode.
sdBackup = null; sdBackup = null;
sdCurrent = getBackupSurface();
// Now, invalidate the old hardware-based SurfaceData // Now, invalidate the old hardware-based SurfaceData
// Note that getBackupSurface may set sdAccel to null so we have to invalidate it before
SurfaceData oldData = sdAccel; SurfaceData oldData = sdAccel;
sdAccel = null; sdAccel = null;
oldData.invalidate(); oldData.invalidate();
sdCurrent = getBackupSurface();
} }
// Update graphicsConfig for the vImg in case it changed due to // Update graphicsConfig for the vImg in case it changed due to
// this display change event // this display change event
......
/* /*
* Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,86 +26,93 @@ ...@@ -26,86 +26,93 @@
package sun.management; package sun.management;
import java.lang.management.LockInfo; import java.lang.management.LockInfo;
import java.lang.management.ThreadInfo; import javax.management.openmbean.CompositeType;
import javax.management.Attribute;
import javax.management.StandardMBean;
import javax.management.openmbean.CompositeData; import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.OpenDataException;
/** /**
* This MXBean is used for data conversion from LockInfo * A CompositeData for LockInfo for the local management support.
* to CompositeData (its mapped type) or vice versa. * This class avoids the performance penalty paid to the
* construction of a CompositeData use in the local case.
*/ */
class LockDataConverter extends StandardMBean public class LockInfoCompositeData extends LazyCompositeData {
implements LockDataConverterMXBean { private final LockInfo lock;
private LockInfo lockInfo;
private LockInfo[] lockedSyncs;
LockDataConverter() {
super(LockDataConverterMXBean.class, true);
this.lockInfo = null;
this.lockedSyncs = null;
}
LockDataConverter(ThreadInfo ti) {
super(LockDataConverterMXBean.class, true);
this.lockInfo = ti.getLockInfo();
this.lockedSyncs = ti.getLockedSynchronizers();
}
public void setLockInfo(LockInfo l) { private LockInfoCompositeData(LockInfo li) {
this.lockInfo = l; this.lock = li;
} }
public LockInfo getLockInfo() { public LockInfo getLockInfo() {
return this.lockInfo; return lock;
} }
public void setLockedSynchronizers(LockInfo[] l) { public static CompositeData toCompositeData(LockInfo li) {
this.lockedSyncs = l; if (li == null) {
return null;
} }
public LockInfo[] getLockedSynchronizers() { LockInfoCompositeData licd = new LockInfoCompositeData(li);
return this.lockedSyncs; return licd.getCompositeData();
} }
// helper methods protected CompositeData getCompositeData() {
CompositeData toLockInfoCompositeData() { // CONTENTS OF THIS ARRAY MUST BE SYNCHRONIZED WITH
// lockInfoItemNames!
final Object[] lockInfoItemValues = {
new String(lock.getClassName()),
new Integer(lock.getIdentityHashCode()),
};
try { try {
return (CompositeData) getAttribute("LockInfo"); return new CompositeDataSupport(lockInfoCompositeType,
} catch (Exception e) { lockInfoItemNames,
throw new AssertionError(e); lockInfoItemValues);
} catch (OpenDataException e) {
// Should never reach here
throw Util.newException(e);
} }
} }
CompositeData[] toLockedSynchronizersCompositeData() { private static final CompositeType lockInfoCompositeType;
static {
try { try {
return (CompositeData[]) getAttribute("LockedSynchronizers"); lockInfoCompositeType = (CompositeType)
} catch (Exception e) { MappedMXBeanType.toOpenType(LockInfo.class);
throw new AssertionError(e); } catch (OpenDataException e) {
// Should never reach here
throw Util.newException(e);
} }
} }
LockInfo toLockInfo(CompositeData cd) { static CompositeType getLockInfoCompositeType() {
try { return lockInfoCompositeType;
setAttribute(new Attribute("LockInfo", cd));
} catch (Exception e) {
throw new AssertionError(e);
}
return getLockInfo();
} }
LockInfo[] toLockedSynchronizers(CompositeData[] cd) { private static final String CLASS_NAME = "className";
try { private static final String IDENTITY_HASH_CODE = "identityHashCode";
setAttribute(new Attribute("LockedSynchronizers", cd)); private static final String[] lockInfoItemNames = {
} catch (Exception e) { CLASS_NAME,
throw new AssertionError(e); IDENTITY_HASH_CODE,
};
/*
* Returns a LockInfo object mapped from the given CompositeData.
*/
public static LockInfo toLockInfo(CompositeData cd) {
if (cd == null) {
throw new NullPointerException("Null CompositeData");
} }
return getLockedSynchronizers();
if (!isTypeMatched(lockInfoCompositeType, cd.getCompositeType())) {
throw new IllegalArgumentException(
"Unexpected composite type for LockInfo");
} }
static CompositeData toLockInfoCompositeData(LockInfo l) { String className = getString(cd, CLASS_NAME);
LockDataConverter ldc = new LockDataConverter(); int identityHashCode = getInt(cd, IDENTITY_HASH_CODE);
ldc.setLockInfo(l); return new LockInfo(className, identityHashCode);
return ldc.toLockInfoCompositeData();
} }
private static final long serialVersionUID = -6374759159749014052L;
} }
...@@ -703,7 +703,7 @@ public abstract class MappedMXBeanType { ...@@ -703,7 +703,7 @@ public abstract class MappedMXBeanType {
if (data instanceof java.lang.management.MonitorInfo) { if (data instanceof java.lang.management.MonitorInfo) {
return MonitorInfoCompositeData.toCompositeData((MonitorInfo) data); return MonitorInfoCompositeData.toCompositeData((MonitorInfo) data);
} }
return LockDataConverter.toLockInfoCompositeData((LockInfo) data); return LockInfoCompositeData.toCompositeData((LockInfo) data);
} }
if (data instanceof MemoryNotificationInfo) { if (data instanceof MemoryNotificationInfo) {
......
...@@ -59,7 +59,7 @@ public class MonitorInfoCompositeData extends LazyCompositeData { ...@@ -59,7 +59,7 @@ public class MonitorInfoCompositeData extends LazyCompositeData {
int len = monitorInfoItemNames.length; int len = monitorInfoItemNames.length;
Object[] values = new Object[len]; Object[] values = new Object[len];
CompositeData li = LockDataConverter.toLockInfoCompositeData(lock); CompositeData li = LockInfoCompositeData.toCompositeData(lock);
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
String item = monitorInfoItemNames[i]; String item = monitorInfoItemNames[i];
......
...@@ -85,11 +85,18 @@ public class ThreadInfoCompositeData extends LazyCompositeData { ...@@ -85,11 +85,18 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
} }
// Convert MonitorInfo[] and LockInfo[] to CompositeData[] // Convert MonitorInfo[] and LockInfo[] to CompositeData[]
LockDataConverter converter = new LockDataConverter(threadInfo); CompositeData lockInfoData =
CompositeData lockInfoData = converter.toLockInfoCompositeData(); LockInfoCompositeData.toCompositeData(threadInfo.getLockInfo());
CompositeData[] lockedSyncsData = converter.toLockedSynchronizersCompositeData();
// Convert LockInfo[] and MonitorInfo[] to CompositeData[]
LockInfo[] lockedSyncs = threadInfo.getLockedSynchronizers();
CompositeData[] lockedSyncsData =
new CompositeData[lockedSyncs.length];
for (int i = 0; i < lockedSyncs.length; i++) {
LockInfo li = lockedSyncs[i];
lockedSyncsData[i] = LockInfoCompositeData.toCompositeData(li);
}
// Convert MonitorInfo[] to CompositeData[]
MonitorInfo[] lockedMonitors = threadInfo.getLockedMonitors(); MonitorInfo[] lockedMonitors = threadInfo.getLockedMonitors();
CompositeData[] lockedMonitorsData = CompositeData[] lockedMonitorsData =
new CompositeData[lockedMonitors.length]; new CompositeData[lockedMonitors.length];
...@@ -98,7 +105,6 @@ public class ThreadInfoCompositeData extends LazyCompositeData { ...@@ -98,7 +105,6 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
lockedMonitorsData[i] = MonitorInfoCompositeData.toCompositeData(mi); lockedMonitorsData[i] = MonitorInfoCompositeData.toCompositeData(mi);
} }
// CONTENTS OF THIS ARRAY MUST BE SYNCHRONIZED WITH // CONTENTS OF THIS ARRAY MUST BE SYNCHRONIZED WITH
// threadInfoItemNames! // threadInfoItemNames!
final Object[] threadInfoItemValues = { final Object[] threadInfoItemValues = {
...@@ -216,11 +222,11 @@ public class ThreadInfoCompositeData extends LazyCompositeData { ...@@ -216,11 +222,11 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
// with it. So we can get the CompositeType representing LockInfo // with it. So we can get the CompositeType representing LockInfo
// from a mapped CompositeData for any LockInfo object. // from a mapped CompositeData for any LockInfo object.
// Thus we construct a random LockInfo object and pass it // Thus we construct a random LockInfo object and pass it
// to LockDataConverter to do the conversion. // to LockInfoCompositeData to do the conversion.
Object o = new Object(); Object o = new Object();
LockInfo li = new LockInfo(o.getClass().getName(), LockInfo li = new LockInfo(o.getClass().getName(),
System.identityHashCode(o)); System.identityHashCode(o));
CompositeData cd = LockDataConverter.toLockInfoCompositeData(li); CompositeData cd = LockInfoCompositeData.toCompositeData(li);
lockInfoCompositeType = cd.getCompositeType(); lockInfoCompositeType = cd.getCompositeType();
} }
...@@ -315,9 +321,8 @@ public class ThreadInfoCompositeData extends LazyCompositeData { ...@@ -315,9 +321,8 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
// 6.0 new attributes // 6.0 new attributes
public LockInfo lockInfo() { public LockInfo lockInfo() {
LockDataConverter converter = new LockDataConverter();
CompositeData lockInfoData = (CompositeData) cdata.get(LOCK_INFO); CompositeData lockInfoData = (CompositeData) cdata.get(LOCK_INFO);
return converter.toLockInfo(lockInfoData); return LockInfo.from(lockInfoData);
} }
public MonitorInfo[] lockedMonitors() { public MonitorInfo[] lockedMonitors() {
...@@ -336,13 +341,17 @@ public class ThreadInfoCompositeData extends LazyCompositeData { ...@@ -336,13 +341,17 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
} }
public LockInfo[] lockedSynchronizers() { public LockInfo[] lockedSynchronizers() {
LockDataConverter converter = new LockDataConverter();
CompositeData[] lockedSyncsData = CompositeData[] lockedSyncsData =
(CompositeData[]) cdata.get(LOCKED_SYNCS); (CompositeData[]) cdata.get(LOCKED_SYNCS);
// The LockedSynchronizers item cannot be null, but if it is we will // The LockedSynchronizers item cannot be null, but if it is we will
// get a NullPointerException when we ask for its length. // get a NullPointerException when we ask for its length.
return converter.toLockedSynchronizers(lockedSyncsData); LockInfo[] locks = new LockInfo[lockedSyncsData.length];
for (int i = 0; i < lockedSyncsData.length; i++) {
CompositeData cdi = lockedSyncsData[i];
locks[i] = LockInfo.from(cdi);
}
return locks;
} }
/** Validate if the input CompositeData has the expected /** Validate if the input CompositeData has the expected
......
...@@ -87,8 +87,10 @@ public final class ECParameters extends AlgorithmParametersSpi { ...@@ -87,8 +87,10 @@ public final class ECParameters extends AlgorithmParametersSpi {
if ((data.length == 0) || (data[0] != 4)) { if ((data.length == 0) || (data[0] != 4)) {
throw new IOException("Only uncompressed point format supported"); throw new IOException("Only uncompressed point format supported");
} }
int n = data.length / 2; // Per ANSI X9.62, an encoded point is a 1 byte type followed by
if (n > ((curve.getField().getFieldSize() + 7 ) >> 3)) { // ceiling(log base 2 field-size / 8) bytes of x and the same of y.
int n = (data.length - 1) / 2;
if (n != ((curve.getField().getFieldSize() + 7 ) >> 3)) {
throw new IOException("Point does not match field size"); throw new IOException("Point does not match field size");
} }
byte[] xb = new byte[n]; byte[] xb = new byte[n];
......
/* /*
* Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -259,8 +259,7 @@ final public class AlgorithmChecker extends PKIXCertPathChecker { ...@@ -259,8 +259,7 @@ final public class AlgorithmChecker extends PKIXCertPathChecker {
} }
// Inherit key parameters from previous key // Inherit key parameters from previous key
if (currPubKey instanceof DSAPublicKey && if (PKIX.isDSAPublicKeyWithoutParams(currPubKey)) {
((DSAPublicKey)currPubKey).getParams() == null) {
// Inherit DSA parameters from previous key // Inherit DSA parameters from previous key
if (!(prevPubKey instanceof DSAPublicKey)) { if (!(prevPubKey instanceof DSAPublicKey)) {
throw new CertPathValidatorException("Input key is not " + throw new CertPathValidatorException("Input key is not " +
......
...@@ -101,9 +101,7 @@ class BasicChecker extends PKIXCertPathChecker { ...@@ -101,9 +101,7 @@ class BasicChecker extends PKIXCertPathChecker {
public void init(boolean forward) throws CertPathValidatorException { public void init(boolean forward) throws CertPathValidatorException {
if (!forward) { if (!forward) {
prevPubKey = trustedPubKey; prevPubKey = trustedPubKey;
if (prevPubKey instanceof DSAPublicKey && if (PKIX.isDSAPublicKeyWithoutParams(prevPubKey)) {
((DSAPublicKey)prevPubKey).getParams() == null)
{
// If TrustAnchor is a DSA public key and it has no params, it // If TrustAnchor is a DSA public key and it has no params, it
// cannot be used to verify the signature of the first cert, // cannot be used to verify the signature of the first cert,
// so throw exception // so throw exception
...@@ -248,8 +246,7 @@ class BasicChecker extends PKIXCertPathChecker { ...@@ -248,8 +246,7 @@ class BasicChecker extends PKIXCertPathChecker {
currCert.getSubjectX500Principal() + "; serial#: " + currCert.getSubjectX500Principal() + "; serial#: " +
currCert.getSerialNumber().toString()); currCert.getSerialNumber().toString());
} }
if (cKey instanceof DSAPublicKey && if (PKIX.isDSAPublicKeyWithoutParams(cKey)) {
((DSAPublicKey)cKey).getParams() == null) {
// cKey needs to inherit DSA parameters from prev key // cKey needs to inherit DSA parameters from prev key
cKey = makeInheritedParamsKey(cKey, prevPubKey); cKey = makeInheritedParamsKey(cKey, prevPubKey);
if (debug != null) debug.println("BasicChecker.updateState Made " + if (debug != null) debug.println("BasicChecker.updateState Made " +
......
...@@ -35,6 +35,7 @@ import java.security.InvalidAlgorithmParameterException; ...@@ -35,6 +35,7 @@ import java.security.InvalidAlgorithmParameterException;
import java.security.PrivilegedActionException; import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction; import java.security.PrivilegedExceptionAction;
import java.security.cert.CertStore; import java.security.cert.CertStore;
import java.security.cert.CertStoreException;
import java.security.cert.X509CertSelector; import java.security.cert.X509CertSelector;
import java.security.cert.X509CRLSelector; import java.security.cert.X509CRLSelector;
import javax.security.auth.x500.X500Principal; import javax.security.auth.x500.X500Principal;
...@@ -96,6 +97,25 @@ public abstract class CertStoreHelper { ...@@ -96,6 +97,25 @@ public abstract class CertStoreHelper {
} }
} }
static boolean isCausedByNetworkIssue(String type, CertStoreException cse) {
switch (type) {
case "LDAP":
case "SSLServer":
try {
CertStoreHelper csh = CertStoreHelper.getInstance(type);
return csh.isCausedByNetworkIssue(cse);
} catch (NoSuchAlgorithmException nsae) {
return false;
}
case "URI":
Throwable t = cse.getCause();
return (t != null && t instanceof IOException);
default:
// we don't know about any other remote CertStore types
return false;
}
}
/** /**
* Returns a CertStore using the given URI as parameters. * Returns a CertStore using the given URI as parameters.
*/ */
...@@ -119,4 +139,10 @@ public abstract class CertStoreHelper { ...@@ -119,4 +139,10 @@ public abstract class CertStoreHelper {
Collection<X500Principal> certIssuers, Collection<X500Principal> certIssuers,
String dn) String dn)
throws IOException; throws IOException;
/**
* Returns true if the cause of the CertStoreException is a network
* related issue.
*/
public abstract boolean isCausedByNetworkIssue(CertStoreException e);
} }
...@@ -116,12 +116,17 @@ class DistributionPointFetcher { ...@@ -116,12 +116,17 @@ class DistributionPointFetcher {
/** /**
* Download CRLs from the given distribution point, verify and return them. * Download CRLs from the given distribution point, verify and return them.
* See the top of the class for current limitations. * See the top of the class for current limitations.
*
* @throws CertStoreException if there is an error retrieving the CRLs
* from one of the GeneralNames and no other CRLs are retrieved from
* the other GeneralNames. If more than one GeneralName throws an
* exception then the one from the last GeneralName is thrown.
*/ */
private static Collection<X509CRL> getCRLs(X509CRLSelector selector, private static Collection<X509CRL> getCRLs(X509CRLSelector selector,
X509CertImpl certImpl, DistributionPoint point, boolean[] reasonsMask, X509CertImpl certImpl, DistributionPoint point, boolean[] reasonsMask,
boolean signFlag, PublicKey prevKey, String provider, boolean signFlag, PublicKey prevKey, String provider,
List<CertStore> certStores, Set<TrustAnchor> trustAnchors, List<CertStore> certStores, Set<TrustAnchor> trustAnchors,
Date validity) { Date validity) throws CertStoreException {
// check for full name // check for full name
GeneralNames fullName = point.getFullName(); GeneralNames fullName = point.getFullName();
...@@ -149,9 +154,10 @@ class DistributionPointFetcher { ...@@ -149,9 +154,10 @@ class DistributionPointFetcher {
return Collections.emptySet(); return Collections.emptySet();
} }
} }
Collection<X509CRL> possibleCRLs = new ArrayList<X509CRL>(); Collection<X509CRL> possibleCRLs = new ArrayList<>();
Collection<X509CRL> crls = new ArrayList<X509CRL>(2); CertStoreException savedCSE = null;
for (Iterator<GeneralName> t = fullName.iterator(); t.hasNext(); ) { for (Iterator<GeneralName> t = fullName.iterator(); t.hasNext(); ) {
try {
GeneralName name = t.next(); GeneralName name = t.next();
if (name.getType() == GeneralNameInterface.NAME_DIRECTORY) { if (name.getType() == GeneralNameInterface.NAME_DIRECTORY) {
X500Name x500Name = (X500Name) name.getName(); X500Name x500Name = (X500Name) name.getName();
...@@ -165,8 +171,16 @@ class DistributionPointFetcher { ...@@ -165,8 +171,16 @@ class DistributionPointFetcher {
possibleCRLs.add(crl); possibleCRLs.add(crl);
} }
} }
} catch (CertStoreException cse) {
savedCSE = cse;
}
}
// only throw CertStoreException if no CRLs are retrieved
if (possibleCRLs.isEmpty() && savedCSE != null) {
throw savedCSE;
} }
Collection<X509CRL> crls = new ArrayList<>(2);
for (X509CRL crl : possibleCRLs) { for (X509CRL crl : possibleCRLs) {
try { try {
// make sure issuer is not set // make sure issuer is not set
...@@ -191,34 +205,43 @@ class DistributionPointFetcher { ...@@ -191,34 +205,43 @@ class DistributionPointFetcher {
/** /**
* Download CRL from given URI. * Download CRL from given URI.
*/ */
private static X509CRL getCRL(URIName name) { private static X509CRL getCRL(URIName name) throws CertStoreException {
URI uri = name.getURI(); URI uri = name.getURI();
if (debug != null) { if (debug != null) {
debug.println("Trying to fetch CRL from DP " + uri); debug.println("Trying to fetch CRL from DP " + uri);
} }
CertStore ucs = null;
try { try {
CertStore ucs = URICertStore.getInstance ucs = URICertStore.getInstance
(new URICertStore.URICertStoreParameters(uri)); (new URICertStore.URICertStoreParameters(uri));
} catch (InvalidAlgorithmParameterException |
NoSuchAlgorithmException e) {
if (debug != null) {
debug.println("Can't create URICertStore: " + e.getMessage());
}
return null;
}
Collection<? extends CRL> crls = ucs.getCRLs(null); Collection<? extends CRL> crls = ucs.getCRLs(null);
if (crls.isEmpty()) { if (crls.isEmpty()) {
return null; return null;
} else { } else {
return (X509CRL) crls.iterator().next(); return (X509CRL) crls.iterator().next();
} }
} catch (Exception e) {
if (debug != null) {
debug.println("Exception getting CRL from CertStore: " + e);
e.printStackTrace();
}
}
return null;
} }
/** /**
* Fetch CRLs from certStores. * Fetch CRLs from certStores.
*
* @throws CertStoreException if there is an error retrieving the CRLs from
* one of the CertStores and no other CRLs are retrieved from
* the other CertStores. If more than one CertStore throws an
* exception then the one from the last CertStore is thrown.
*/ */
private static Collection<X509CRL> getCRLs(X500Name name, private static Collection<X509CRL> getCRLs(X500Name name,
X500Principal certIssuer, List<CertStore> certStores) X500Principal certIssuer,
List<CertStore> certStores)
throws CertStoreException
{ {
if (debug != null) { if (debug != null) {
debug.println("Trying to fetch CRL from DP " + name); debug.println("Trying to fetch CRL from DP " + name);
...@@ -227,22 +250,28 @@ class DistributionPointFetcher { ...@@ -227,22 +250,28 @@ class DistributionPointFetcher {
xcs.addIssuer(name.asX500Principal()); xcs.addIssuer(name.asX500Principal());
xcs.addIssuer(certIssuer); xcs.addIssuer(certIssuer);
Collection<X509CRL> crls = new ArrayList<>(); Collection<X509CRL> crls = new ArrayList<>();
CertStoreException savedCSE = null;
for (CertStore store : certStores) { for (CertStore store : certStores) {
try { try {
for (CRL crl : store.getCRLs(xcs)) { for (CRL crl : store.getCRLs(xcs)) {
crls.add((X509CRL)crl); crls.add((X509CRL)crl);
} }
} catch (CertStoreException cse) { } catch (CertStoreException cse) {
// don't add the CRL
if (debug != null) { if (debug != null) {
debug.println("Non-fatal exception while retrieving " + debug.println("Exception while retrieving " +
"CRLs: " + cse); "CRLs: " + cse);
cse.printStackTrace(); cse.printStackTrace();
} }
savedCSE = new PKIX.CertStoreTypeException(store.getType(),cse);
} }
} }
// only throw CertStoreException if no CRLs are retrieved
if (crls.isEmpty() && savedCSE != null) {
throw savedCSE;
} else {
return crls; return crls;
} }
}
/** /**
* Verifies a CRL for the given certificate's Distribution Point to * Verifies a CRL for the given certificate's Distribution Point to
......
...@@ -369,6 +369,7 @@ class ForwardBuilder extends Builder { ...@@ -369,6 +369,7 @@ class ForwardBuilder extends Builder {
boolean add = false; boolean add = false;
for (AccessDescription ad : adList) { for (AccessDescription ad : adList) {
CertStore cs = URICertStore.getInstance(ad); CertStore cs = URICertStore.getInstance(ad);
if (cs != null) {
try { try {
if (certs.addAll((Collection<X509Certificate>) if (certs.addAll((Collection<X509Certificate>)
cs.getCertificates(caSelector))) { cs.getCertificates(caSelector))) {
...@@ -382,7 +383,7 @@ class ForwardBuilder extends Builder { ...@@ -382,7 +383,7 @@ class ForwardBuilder extends Builder {
debug.println("exception getting certs from CertStore:"); debug.println("exception getting certs from CertStore:");
cse.printStackTrace(); cse.printStackTrace();
} }
continue; }
} }
} }
return add; return add;
...@@ -816,7 +817,7 @@ class ForwardBuilder extends Builder { ...@@ -816,7 +817,7 @@ class ForwardBuilder extends Builder {
} else { } else {
continue; continue;
} }
} else { }
X500Principal principal = anchor.getCA(); X500Principal principal = anchor.getCA();
PublicKey publicKey = anchor.getCAPublicKey(); PublicKey publicKey = anchor.getCAPublicKey();
...@@ -835,17 +836,17 @@ class ForwardBuilder extends Builder { ...@@ -835,17 +836,17 @@ class ForwardBuilder extends Builder {
!principal.equals(cert.getIssuerX500Principal())) { !principal.equals(cert.getIssuerX500Principal())) {
continue; continue;
} }
// skip anchor if it contains a DSA key with no DSA params
if (PKIX.isDSAPublicKeyWithoutParams(publicKey)) {
continue;
} }
/* /*
* Check signature * Check signature
*/ */
try { try {
// NOTE: the DSA public key in the buildParams may lack cert.verify(publicKey, buildParams.sigProvider());
// parameters, yet there is no key to inherit the parameters
// from. This is probably such a rare case that it is not worth
// trying to detect the situation earlier.
cert.verify(anchor.getCAPublicKey(), buildParams.sigProvider());
} catch (InvalidKeyException ike) { } catch (InvalidKeyException ike) {
if (debug != null) { if (debug != null) {
debug.println("ForwardBuilder.isPathCompleted() invalid " debug.println("ForwardBuilder.isPathCompleted() invalid "
......
...@@ -26,12 +26,10 @@ ...@@ -26,12 +26,10 @@
package sun.security.provider.certpath; package sun.security.provider.certpath;
import java.io.IOException; import java.io.IOException;
import java.security.PublicKey;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.CertPathValidatorException; import java.security.cert.CertPathValidatorException;
import java.security.cert.PKIXCertPathChecker; import java.security.cert.PKIXCertPathChecker;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.security.interfaces.DSAPublicKey;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
...@@ -169,9 +167,7 @@ class ForwardState implements State { ...@@ -169,9 +167,7 @@ class ForwardState implements State {
X509CertImpl icert = X509CertImpl.toImpl(cert); X509CertImpl icert = X509CertImpl.toImpl(cert);
/* see if certificate key has null parameters */ /* see if certificate key has null parameters */
PublicKey newKey = icert.getPublicKey(); if (PKIX.isDSAPublicKeyWithoutParams(icert.getPublicKey())) {
if (newKey instanceof DSAPublicKey &&
((DSAPublicKey)newKey).getParams() == null) {
keyParamsNeededFlag = true; keyParamsNeededFlag = true;
} }
......
...@@ -335,8 +335,8 @@ public final class OCSP { ...@@ -335,8 +335,8 @@ public final class OCSP {
static class NetworkFailureException extends CertPathValidatorException { static class NetworkFailureException extends CertPathValidatorException {
private static final long serialVersionUID = 0l; private static final long serialVersionUID = 0l;
private NetworkFailureException(IOException ioe) { NetworkFailureException(Throwable t) {
super(ioe); super(t);
} }
@Override @Override
......
...@@ -26,7 +26,9 @@ package sun.security.provider.certpath; ...@@ -26,7 +26,9 @@ package sun.security.provider.certpath;
import java.security.InvalidAlgorithmParameterException; import java.security.InvalidAlgorithmParameterException;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.PublicKey;
import java.security.cert.*; import java.security.cert.*;
import java.security.interfaces.DSAPublicKey;
import java.util.*; import java.util.*;
import javax.security.auth.x500.X500Principal; import javax.security.auth.x500.X500Principal;
...@@ -42,6 +44,11 @@ class PKIX { ...@@ -42,6 +44,11 @@ class PKIX {
private PKIX() { } private PKIX() { }
static boolean isDSAPublicKeyWithoutParams(PublicKey publicKey) {
return (publicKey instanceof DSAPublicKey &&
((DSAPublicKey)publicKey).getParams() == null);
}
static ValidatorParams checkParams(CertPath cp, CertPathParameters params) static ValidatorParams checkParams(CertPath cp, CertPathParameters params)
throws InvalidAlgorithmParameterException throws InvalidAlgorithmParameterException
{ {
...@@ -270,6 +277,24 @@ class PKIX { ...@@ -270,6 +277,24 @@ class PKIX {
} }
} }
/**
* A CertStoreException with additional information about the type of
* CertStore that generated the exception.
*/
static class CertStoreTypeException extends CertStoreException {
private static final long serialVersionUID = 7463352639238322556L;
private final String type;
CertStoreTypeException(String type, CertStoreException cse) {
super(cse.getMessage(), cse.getCause());
this.type = type;
}
String getType() {
return type;
}
}
/** /**
* Comparator that orders CertStores so that local CertStores come before * Comparator that orders CertStores so that local CertStores come before
* remote CertStores. * remote CertStores.
......
...@@ -32,7 +32,6 @@ import java.security.cert.CertPathValidatorException; ...@@ -32,7 +32,6 @@ import java.security.cert.CertPathValidatorException;
import java.security.cert.PKIXCertPathChecker; import java.security.cert.PKIXCertPathChecker;
import java.security.cert.TrustAnchor; import java.security.cert.TrustAnchor;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.security.interfaces.DSAPublicKey;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
...@@ -287,8 +286,7 @@ class ReverseState implements State { ...@@ -287,8 +286,7 @@ class ReverseState implements State {
/* check for key needing to inherit alg parameters */ /* check for key needing to inherit alg parameters */
X509CertImpl icert = X509CertImpl.toImpl(cert); X509CertImpl icert = X509CertImpl.toImpl(cert);
PublicKey newKey = cert.getPublicKey(); PublicKey newKey = cert.getPublicKey();
if (newKey instanceof DSAPublicKey && if (PKIX.isDSAPublicKeyWithoutParams(newKey)) {
(((DSAPublicKey)newKey).getParams() == null)) {
newKey = BasicChecker.makeInheritedParamsKey(newKey, pubKey); newKey = BasicChecker.makeInheritedParamsKey(newKey, pubKey);
} }
......
...@@ -38,7 +38,6 @@ import java.security.Security; ...@@ -38,7 +38,6 @@ import java.security.Security;
import java.security.cert.CertPathValidatorException.BasicReason; import java.security.cert.CertPathValidatorException.BasicReason;
import java.security.cert.Extension; import java.security.cert.Extension;
import java.security.cert.*; import java.security.cert.*;
import java.security.interfaces.DSAPublicKey;
import java.util.Arrays; import java.util.Arrays;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
...@@ -50,7 +49,7 @@ import java.util.Set; ...@@ -50,7 +49,7 @@ import java.util.Set;
import javax.security.auth.x500.X500Principal; import javax.security.auth.x500.X500Principal;
import static sun.security.provider.certpath.OCSP.*; import static sun.security.provider.certpath.OCSP.*;
import sun.security.provider.certpath.PKIX.ValidatorParams; import static sun.security.provider.certpath.PKIX.*;
import sun.security.action.GetPropertyAction; import sun.security.action.GetPropertyAction;
import sun.security.x509.*; import sun.security.x509.*;
import static sun.security.x509.PKIXExtensions.*; import static sun.security.x509.PKIXExtensions.*;
...@@ -406,8 +405,7 @@ class RevocationChecker extends PKIXRevocationChecker { ...@@ -406,8 +405,7 @@ class RevocationChecker extends PKIXRevocationChecker {
// Make new public key if parameters are missing // Make new public key if parameters are missing
PublicKey pubKey = cert.getPublicKey(); PublicKey pubKey = cert.getPublicKey();
if (pubKey instanceof DSAPublicKey && if (PKIX.isDSAPublicKeyWithoutParams(pubKey)) {
((DSAPublicKey)pubKey).getParams() == null) {
// pubKey needs to inherit DSA parameters from prev key // pubKey needs to inherit DSA parameters from prev key
pubKey = BasicChecker.makeInheritedParamsKey(pubKey, prevPubKey); pubKey = BasicChecker.makeInheritedParamsKey(pubKey, prevPubKey);
} }
...@@ -458,14 +456,23 @@ class RevocationChecker extends PKIXRevocationChecker { ...@@ -458,14 +456,23 @@ class RevocationChecker extends PKIXRevocationChecker {
sel.setCertificateChecking(cert); sel.setCertificateChecking(cert);
CertPathHelper.setDateAndTime(sel, params.date(), MAX_CLOCK_SKEW); CertPathHelper.setDateAndTime(sel, params.date(), MAX_CLOCK_SKEW);
// First, check cached CRLs // First, check user-specified CertStores
NetworkFailureException nfe = null;
for (CertStore store : certStores) { for (CertStore store : certStores) {
try { try {
for (CRL crl : store.getCRLs(sel)) { for (CRL crl : store.getCRLs(sel)) {
possibleCRLs.add((X509CRL)crl); possibleCRLs.add((X509CRL)crl);
} }
} catch (CertStoreException e) { } catch (CertStoreException e) {
// XXX ignore? if (debug != null) {
debug.println("RevocationChecker.checkCRLs() " +
"CertStoreException: " + e.getMessage());
}
if (softFail && nfe == null &&
CertStoreHelper.isCausedByNetworkIssue(store.getType(),e)) {
// save this exception, we may need to throw it later
nfe = new NetworkFailureException(e);
}
} }
} }
...@@ -504,9 +511,12 @@ class RevocationChecker extends PKIXRevocationChecker { ...@@ -504,9 +511,12 @@ class RevocationChecker extends PKIXRevocationChecker {
reasonsMask, anchors, params.date())); reasonsMask, anchors, params.date()));
} }
} catch (CertStoreException e) { } catch (CertStoreException e) {
if (debug != null) { if (softFail && e instanceof CertStoreTypeException) {
debug.println("RevocationChecker.checkCRLs() " + CertStoreTypeException cste = (CertStoreTypeException)e;
"unexpected exception: " + e.getMessage()); if (CertStoreHelper.isCausedByNetworkIssue(cste.getType(),
e)) {
throw new NetworkFailureException(e);
}
} }
throw new CertPathValidatorException(e); throw new CertPathValidatorException(e);
} }
...@@ -516,10 +526,28 @@ class RevocationChecker extends PKIXRevocationChecker { ...@@ -516,10 +526,28 @@ class RevocationChecker extends PKIXRevocationChecker {
checkApprovedCRLs(cert, approvedCRLs); checkApprovedCRLs(cert, approvedCRLs);
} else { } else {
if (allowSeparateKey) { if (allowSeparateKey) {
try {
verifyWithSeparateSigningKey(cert, prevKey, signFlag, verifyWithSeparateSigningKey(cert, prevKey, signFlag,
stackedCerts); stackedCerts);
return; return;
} catch (CertPathValidatorException cpve) {
if (nfe != null) {
// if a network issue previously prevented us from
// retrieving a CRL from one of the user-specified
// CertStores and SOFT_FAIL is enabled, throw it now
// so it can be handled appropriately
throw nfe;
}
throw cpve;
}
} else { } else {
if (nfe != null) {
// if a network issue previously prevented us from
// retrieving a CRL from one of the user-specified
// CertStores and SOFT_FAIL is enabled, throw it now
// so it can be handled appropriately
throw nfe;
}
throw new CertPathValidatorException throw new CertPathValidatorException
("Could not determine revocation status", null, null, -1, ("Could not determine revocation status", null, null, -1,
BasicReason.UNDETERMINED_REVOCATION_STATUS); BasicReason.UNDETERMINED_REVOCATION_STATUS);
......
...@@ -31,7 +31,6 @@ import java.security.InvalidAlgorithmParameterException; ...@@ -31,7 +31,6 @@ import java.security.InvalidAlgorithmParameterException;
import java.security.PublicKey; import java.security.PublicKey;
import java.security.cert.*; import java.security.cert.*;
import java.security.cert.PKIXReason; import java.security.cert.PKIXReason;
import java.security.interfaces.DSAPublicKey;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
...@@ -242,6 +241,15 @@ public final class SunCertPathBuilder extends CertPathBuilderSpi { ...@@ -242,6 +241,15 @@ public final class SunCertPathBuilder extends CertPathBuilderSpi {
break; break;
} }
// skip anchor if it contains a DSA key with no DSA params
X509Certificate trustedCert = anchor.getTrustedCert();
PublicKey pubKey = trustedCert != null ? trustedCert.getPublicKey()
: anchor.getCAPublicKey();
if (PKIX.isDSAPublicKeyWithoutParams(pubKey)) {
continue;
}
/* Initialize current state */ /* Initialize current state */
currentState.initState(buildParams); currentState.initState(buildParams);
currentState.updateState(anchor, buildParams); currentState.updateState(anchor, buildParams);
...@@ -705,9 +713,7 @@ public final class SunCertPathBuilder extends CertPathBuilderSpi { ...@@ -705,9 +713,7 @@ public final class SunCertPathBuilder extends CertPathBuilderSpi {
* Extract and save the final target public key * Extract and save the final target public key
*/ */
finalPublicKey = cert.getPublicKey(); finalPublicKey = cert.getPublicKey();
if (finalPublicKey instanceof DSAPublicKey && if (PKIX.isDSAPublicKeyWithoutParams(finalPublicKey)) {
((DSAPublicKey)finalPublicKey).getParams() == null)
{
finalPublicKey = finalPublicKey =
BasicChecker.makeInheritedParamsKey BasicChecker.makeInheritedParamsKey
(finalPublicKey, currentState.pubKey); (finalPublicKey, currentState.pubKey);
......
...@@ -340,7 +340,11 @@ class URICertStore extends CertStoreSpi { ...@@ -340,7 +340,11 @@ class URICertStore extends CertStoreSpi {
// Fetch the CRLs via LDAP. LDAPCertStore has its own // Fetch the CRLs via LDAP. LDAPCertStore has its own
// caching mechanism, see the class description for more info. // caching mechanism, see the class description for more info.
// Safe cast since xsel is an X509 certificate selector. // Safe cast since xsel is an X509 certificate selector.
try {
return (Collection<X509CRL>) ldapCertStore.getCRLs(xsel); return (Collection<X509CRL>) ldapCertStore.getCRLs(xsel);
} catch (CertStoreException cse) {
throw new PKIX.CertStoreTypeException("LDAP", cse);
}
} }
// Return the CRLs for this entry. It returns the cached value // Return the CRLs for this entry. It returns the cached value
...@@ -391,11 +395,12 @@ class URICertStore extends CertStoreSpi { ...@@ -391,11 +395,12 @@ class URICertStore extends CertStoreSpi {
debug.println("Exception fetching CRL:"); debug.println("Exception fetching CRL:");
e.printStackTrace(); e.printStackTrace();
} }
}
// exception, forget previous values // exception, forget previous values
lastModified = 0; lastModified = 0;
crl = null; crl = null;
return Collections.emptyList(); throw new PKIX.CertStoreTypeException("URI",
new CertStoreException(e));
}
} }
/** /**
......
/* /*
* Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -25,15 +25,18 @@ ...@@ -25,15 +25,18 @@
package sun.security.provider.certpath.ldap; package sun.security.provider.certpath.ldap;
import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.util.Collection; import java.util.Collection;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.InvalidAlgorithmParameterException; import java.security.InvalidAlgorithmParameterException;
import java.security.cert.CertStore; import java.security.cert.CertStore;
import java.security.cert.CertStoreException;
import java.security.cert.X509CertSelector; import java.security.cert.X509CertSelector;
import java.security.cert.X509CRLSelector; import java.security.cert.X509CRLSelector;
import javax.naming.CommunicationException;
import javax.naming.ServiceUnavailableException;
import javax.security.auth.x500.X500Principal; import javax.security.auth.x500.X500Principal;
import java.io.IOException;
import sun.security.provider.certpath.CertStoreHelper; import sun.security.provider.certpath.CertStoreHelper;
...@@ -68,4 +71,11 @@ public final class LDAPCertStoreHelper ...@@ -68,4 +71,11 @@ public final class LDAPCertStoreHelper
{ {
return new LDAPCertStore.LDAPCRLSelector(selector, certIssuers, ldapDN); return new LDAPCertStore.LDAPCRLSelector(selector, certIssuers, ldapDN);
} }
@Override
public boolean isCausedByNetworkIssue(CertStoreException e) {
Throwable t = e.getCause();
return (t != null && (t instanceof ServiceUnavailableException ||
t instanceof CommunicationException));
}
} }
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -25,15 +25,16 @@ ...@@ -25,15 +25,16 @@
package sun.security.provider.certpath.ssl; package sun.security.provider.certpath.ssl;
import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.util.Collection;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.InvalidAlgorithmParameterException; import java.security.InvalidAlgorithmParameterException;
import java.security.cert.CertStore; import java.security.cert.CertStore;
import java.security.cert.CertStoreException;
import java.security.cert.X509CertSelector; import java.security.cert.X509CertSelector;
import java.security.cert.X509CRLSelector; import java.security.cert.X509CRLSelector;
import java.util.Collection;
import javax.security.auth.x500.X500Principal; import javax.security.auth.x500.X500Principal;
import java.io.IOException;
import sun.security.provider.certpath.CertStoreHelper; import sun.security.provider.certpath.CertStoreHelper;
...@@ -66,4 +67,10 @@ public final class SSLServerCertStoreHelper extends CertStoreHelper { ...@@ -66,4 +67,10 @@ public final class SSLServerCertStoreHelper extends CertStoreHelper {
{ {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public boolean isCausedByNetworkIssue(CertStoreException e) {
Throwable t = e.getCause();
return (t != null && t instanceof IOException);
}
} }
...@@ -266,7 +266,7 @@ public abstract class SSLContextImpl extends SSLContextSpi { ...@@ -266,7 +266,7 @@ public abstract class SSLContextImpl extends SSLContextSpi {
} }
// Get suported CipherSuiteList. // Get suported CipherSuiteList.
CipherSuiteList getSuportedCipherSuiteList() { CipherSuiteList getSupportedCipherSuiteList() {
// The maintenance of cipher suites needs to be synchronized. // The maintenance of cipher suites needs to be synchronized.
synchronized (this) { synchronized (this) {
// Clear cache of available ciphersuites. // Clear cache of available ciphersuites.
......
...@@ -1978,7 +1978,7 @@ final public class SSLEngineImpl extends SSLEngine { ...@@ -1978,7 +1978,7 @@ final public class SSLEngineImpl extends SSLEngine {
* @return an array of cipher suite names * @return an array of cipher suite names
*/ */
public String[] getSupportedCipherSuites() { public String[] getSupportedCipherSuites() {
return sslContext.getSuportedCipherSuiteList().toStringArray(); return sslContext.getSupportedCipherSuiteList().toStringArray();
} }
/** /**
......
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -113,7 +113,7 @@ public class SSLServerSocketFactoryImpl extends SSLServerSocketFactory ...@@ -113,7 +113,7 @@ public class SSLServerSocketFactoryImpl extends SSLServerSocketFactory
* @return an array of cipher suite names * @return an array of cipher suite names
*/ */
public String[] getSupportedCipherSuites() { public String[] getSupportedCipherSuites() {
return context.getSuportedCipherSuiteList().toStringArray(); return context.getSupportedCipherSuiteList().toStringArray();
} }
} }
/* /*
* Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -168,7 +168,7 @@ class SSLServerSocketImpl extends SSLServerSocket ...@@ -168,7 +168,7 @@ class SSLServerSocketImpl extends SSLServerSocket
* @return an array of cipher suite names * @return an array of cipher suite names
*/ */
public String[] getSupportedCipherSuites() { public String[] getSupportedCipherSuites() {
return sslContext.getSuportedCipherSuiteList().toStringArray(); return sslContext.getSupportedCipherSuiteList().toStringArray();
} }
/** /**
......
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -177,6 +177,6 @@ final public class SSLSocketFactoryImpl extends SSLSocketFactory { ...@@ -177,6 +177,6 @@ final public class SSLSocketFactoryImpl extends SSLSocketFactory {
* certain kinds of certificates to use certain cipher suites. * certain kinds of certificates to use certain cipher suites.
*/ */
public String[] getSupportedCipherSuites() { public String[] getSupportedCipherSuites() {
return context.getSuportedCipherSuiteList().toStringArray(); return context.getSupportedCipherSuiteList().toStringArray();
} }
} }
...@@ -2353,7 +2353,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { ...@@ -2353,7 +2353,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl {
* @return an array of cipher suite names * @return an array of cipher suite names
*/ */
public String[] getSupportedCipherSuites() { public String[] getSupportedCipherSuites() {
return sslContext.getSuportedCipherSuiteList().toStringArray(); return sslContext.getSupportedCipherSuiteList().toStringArray();
} }
/** /**
......
...@@ -70,15 +70,22 @@ public class Debug { ...@@ -70,15 +70,22 @@ public class Debug {
System.err.println(); System.err.println();
System.err.println("all turn on all debugging"); System.err.println("all turn on all debugging");
System.err.println("access print all checkPermission results"); System.err.println("access print all checkPermission results");
System.err.println("certpath PKIX CertPathBuilder and");
System.err.println(" CertPathValidator debugging");
System.err.println("combiner SubjectDomainCombiner debugging"); System.err.println("combiner SubjectDomainCombiner debugging");
System.err.println("gssloginconfig"); System.err.println("gssloginconfig");
System.err.println(" GSS LoginConfigImpl debugging");
System.err.println("configfile JAAS ConfigFile loading"); System.err.println("configfile JAAS ConfigFile loading");
System.err.println("configparser JAAS ConfigFile parsing"); System.err.println("configparser JAAS ConfigFile parsing");
System.err.println(" GSS LoginConfigImpl debugging");
System.err.println("jar jar verification"); System.err.println("jar jar verification");
System.err.println("logincontext login context results"); System.err.println("logincontext login context results");
System.err.println("jca JCA engine class debugging");
System.err.println("policy loading and granting"); System.err.println("policy loading and granting");
System.err.println("provider security provider debugging"); System.err.println("provider security provider debugging");
System.err.println("pkcs11 PKCS11 session manager debugging");
System.err.println("pkcs11keystore");
System.err.println(" PKCS11 KeyStore debugging");
System.err.println("sunpkcs11 SunPKCS11 provider debugging");
System.err.println("scl permissions SecureClassLoader assigns"); System.err.println("scl permissions SecureClassLoader assigns");
System.err.println("ts timestamping"); System.err.println("ts timestamping");
System.err.println(); System.err.println();
......
/*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.security.x509;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import sun.security.util.*;
/**
* This class defines the subject/issuer unique identity attribute
* for the Certificate.
*
* @author Amit Kapoor
* @author Hemma Prafullchandra
* @see CertAttrSet
*/
public class CertificateIssuerUniqueIdentity implements CertAttrSet<String> {
private UniqueIdentity id;
/**
* Identifier for this attribute, to be used with the
* get, set, delete methods of Certificate, x509 type.
*/
public static final String IDENT = "x509.info.issuerID";
/**
* Sub attributes name for this CertAttrSet.
*/
public static final String NAME = "issuerID";
public static final String ID = "id";
/**
* Default constructor for the certificate attribute.
*
* @param key the UniqueIdentity
*/
public CertificateIssuerUniqueIdentity(UniqueIdentity id) {
this.id = id;
}
/**
* Create the object, decoding the values from the passed DER stream.
*
* @param in the DerInputStream to read the UniqueIdentity from.
* @exception IOException on decoding errors.
*/
public CertificateIssuerUniqueIdentity(DerInputStream in)
throws IOException {
id = new UniqueIdentity(in);
}
/**
* Create the object, decoding the values from the passed stream.
*
* @param in the InputStream to read the UniqueIdentity from.
* @exception IOException on decoding errors.
*/
public CertificateIssuerUniqueIdentity(InputStream in)
throws IOException {
DerValue val = new DerValue(in);
id = new UniqueIdentity(val);
}
/**
* Create the object, decoding the values from the passed DER value.
*
* @param in the DerValue to read the UniqueIdentity from.
* @exception IOException on decoding errors.
*/
public CertificateIssuerUniqueIdentity(DerValue val)
throws IOException {
id = new UniqueIdentity(val);
}
/**
* Return the identity as user readable string.
*/
public String toString() {
if (id == null) return "";
return (id.toString());
}
/**
* Encode the identity in DER form to the stream.
*
* @param out the DerOutputStream to marshal the contents to.
* @exception IOException on errors.
*/
public void encode(OutputStream out) throws IOException {
DerOutputStream tmp = new DerOutputStream();
id.encode(tmp,DerValue.createTag(DerValue.TAG_CONTEXT,false,(byte)1));
out.write(tmp.toByteArray());
}
/**
* Set the attribute value.
*/
public void set(String name, Object obj) throws IOException {
if (!(obj instanceof UniqueIdentity)) {
throw new IOException("Attribute must be of type UniqueIdentity.");
}
if (name.equalsIgnoreCase(ID)) {
id = (UniqueIdentity)obj;
} else {
throw new IOException("Attribute name not recognized by " +
"CertAttrSet: CertificateIssuerUniqueIdentity.");
}
}
/**
* Get the attribute value.
*/
public UniqueIdentity get(String name) throws IOException {
if (name.equalsIgnoreCase(ID)) {
return (id);
} else {
throw new IOException("Attribute name not recognized by " +
"CertAttrSet: CertificateIssuerUniqueIdentity.");
}
}
/**
* Delete the attribute value.
*/
public void delete(String name) throws IOException {
if (name.equalsIgnoreCase(ID)) {
id = null;
} else {
throw new IOException("Attribute name not recognized by " +
"CertAttrSet: CertificateIssuerUniqueIdentity.");
}
}
/**
* Return an enumeration of names of attributes existing within this
* attribute.
*/
public Enumeration<String> getElements() {
AttributeNameEnumeration elements = new AttributeNameEnumeration();
elements.addElement(ID);
return (elements.elements());
}
/**
* Return the name of this attribute.
*/
public String getName() {
return (NAME);
}
}
/*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.security.x509;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import sun.security.util.*;
/**
* This class defines the subject/issuer unique identity attribute
* for the Certificate.
*
* @author Amit Kapoor
* @author Hemma Prafullchandra
* @see CertAttrSet
*/
public class CertificateSubjectUniqueIdentity implements CertAttrSet<String> {
/**
* Identifier for this attribute, to be used with the
* get, set, delete methods of Certificate, x509 type.
*/
public static final String IDENT = "x509.info.subjectID";
/**
* Sub attributes name for this CertAttrSet.
*/
public static final String NAME = "subjectID";
public static final String ID = "id";
private UniqueIdentity id;
/**
* Default constructor for the certificate attribute.
*
* @param key the UniqueIdentity
*/
public CertificateSubjectUniqueIdentity(UniqueIdentity id) {
this.id = id;
}
/**
* Create the object, decoding the values from the passed DER stream.
*
* @param in the DerInputStream to read the UniqueIdentity from.
* @exception IOException on decoding errors.
*/
public CertificateSubjectUniqueIdentity(DerInputStream in)
throws IOException {
id = new UniqueIdentity(in);
}
/**
* Create the object, decoding the values from the passed stream.
*
* @param in the InputStream to read the UniqueIdentity from.
* @exception IOException on decoding errors.
*/
public CertificateSubjectUniqueIdentity(InputStream in)
throws IOException {
DerValue val = new DerValue(in);
id = new UniqueIdentity(val);
}
/**
* Create the object, decoding the values from the passed DER value.
*
* @param in the DerValue to read the UniqueIdentity from.
* @exception IOException on decoding errors.
*/
public CertificateSubjectUniqueIdentity(DerValue val)
throws IOException {
id = new UniqueIdentity(val);
}
/**
* Return the identity as user readable string.
*/
public String toString() {
if (id == null) return "";
return(id.toString());
}
/**
* Encode the identity in DER form to the stream.
*
* @param out the DerOutputStream to marshal the contents to.
* @exception IOException on errors.
*/
public void encode(OutputStream out) throws IOException {
DerOutputStream tmp = new DerOutputStream();
id.encode(tmp,DerValue.createTag(DerValue.TAG_CONTEXT,false,(byte)2));
out.write(tmp.toByteArray());
}
/**
* Set the attribute value.
*/
public void set(String name, Object obj) throws IOException {
if (!(obj instanceof UniqueIdentity)) {
throw new IOException("Attribute must be of type UniqueIdentity.");
}
if (name.equalsIgnoreCase(ID)) {
id = (UniqueIdentity)obj;
} else {
throw new IOException("Attribute name not recognized by " +
"CertAttrSet: CertificateSubjectUniqueIdentity.");
}
}
/**
* Get the attribute value.
*/
public UniqueIdentity get(String name) throws IOException {
if (name.equalsIgnoreCase(ID)) {
return(id);
} else {
throw new IOException("Attribute name not recognized by " +
"CertAttrSet: CertificateSubjectUniqueIdentity.");
}
}
/**
* Delete the attribute value.
*/
public void delete(String name) throws IOException {
if (name.equalsIgnoreCase(ID)) {
id = null;
} else {
throw new IOException("Attribute name not recognized by " +
"CertAttrSet: CertificateSubjectUniqueIdentity.");
}
}
/**
* Return an enumeration of names of attributes existing within this
* attribute.
*/
public Enumeration<String> getElements() {
AttributeNameEnumeration elements = new AttributeNameEnumeration();
elements.addElement(ID);
return (elements.elements());
}
/**
* Return the name of this attribute.
*/
public String getName() {
return (NAME);
}
}
...@@ -1070,8 +1070,7 @@ public class X509CertImpl extends X509Certificate implements DerEncoder { ...@@ -1070,8 +1070,7 @@ public class X509CertImpl extends X509Certificate implements DerEncoder {
return null; return null;
try { try {
UniqueIdentity id = (UniqueIdentity)info.get( UniqueIdentity id = (UniqueIdentity)info.get(
CertificateIssuerUniqueIdentity.NAME X509CertInfo.ISSUER_ID);
+ DOT + CertificateIssuerUniqueIdentity.ID);
if (id == null) if (id == null)
return null; return null;
else else
...@@ -1091,8 +1090,7 @@ public class X509CertImpl extends X509Certificate implements DerEncoder { ...@@ -1091,8 +1090,7 @@ public class X509CertImpl extends X509Certificate implements DerEncoder {
return null; return null;
try { try {
UniqueIdentity id = (UniqueIdentity)info.get( UniqueIdentity id = (UniqueIdentity)info.get(
CertificateSubjectUniqueIdentity.NAME X509CertInfo.SUBJECT_ID);
+ DOT + CertificateSubjectUniqueIdentity.ID);
if (id == null) if (id == null)
return null; return null;
else else
......
...@@ -75,8 +75,8 @@ public class X509CertInfo implements CertAttrSet<String> { ...@@ -75,8 +75,8 @@ public class X509CertInfo implements CertAttrSet<String> {
public static final String VALIDITY = CertificateValidity.NAME; public static final String VALIDITY = CertificateValidity.NAME;
public static final String SUBJECT = CertificateSubjectName.NAME; public static final String SUBJECT = CertificateSubjectName.NAME;
public static final String KEY = CertificateX509Key.NAME; public static final String KEY = CertificateX509Key.NAME;
public static final String ISSUER_ID = CertificateIssuerUniqueIdentity.NAME; public static final String ISSUER_ID = "issuerID";
public static final String SUBJECT_ID = CertificateSubjectUniqueIdentity.NAME; public static final String SUBJECT_ID = "subjectID";
public static final String EXTENSIONS = CertificateExtensions.NAME; public static final String EXTENSIONS = CertificateExtensions.NAME;
// X509.v1 data // X509.v1 data
...@@ -89,8 +89,8 @@ public class X509CertInfo implements CertAttrSet<String> { ...@@ -89,8 +89,8 @@ public class X509CertInfo implements CertAttrSet<String> {
protected CertificateX509Key pubKey = null; protected CertificateX509Key pubKey = null;
// X509.v2 & v3 extensions // X509.v2 & v3 extensions
protected CertificateIssuerUniqueIdentity issuerUniqueId = null; protected UniqueIdentity issuerUniqueId = null;
protected CertificateSubjectUniqueIdentity subjectUniqueId = null; protected UniqueIdentity subjectUniqueId = null;
// X509.v3 extensions // X509.v3 extensions
protected CertificateExtensions extensions = null; protected CertificateExtensions extensions = null;
...@@ -431,19 +431,11 @@ public class X509CertInfo implements CertAttrSet<String> { ...@@ -431,19 +431,11 @@ public class X509CertInfo implements CertAttrSet<String> {
break; break;
case ATTR_ISSUER_ID: case ATTR_ISSUER_ID:
if (suffix == null) {
setIssuerUniqueId(val); setIssuerUniqueId(val);
} else {
issuerUniqueId.set(suffix, val);
}
break; break;
case ATTR_SUBJECT_ID: case ATTR_SUBJECT_ID:
if (suffix == null) {
setSubjectUniqueId(val); setSubjectUniqueId(val);
} else {
subjectUniqueId.set(suffix, val);
}
break; break;
case ATTR_EXTENSIONS: case ATTR_EXTENSIONS:
...@@ -529,18 +521,10 @@ public class X509CertInfo implements CertAttrSet<String> { ...@@ -529,18 +521,10 @@ public class X509CertInfo implements CertAttrSet<String> {
} }
break; break;
case (ATTR_ISSUER_ID): case (ATTR_ISSUER_ID):
if (suffix == null) {
issuerUniqueId = null; issuerUniqueId = null;
} else {
issuerUniqueId.delete(suffix);
}
break; break;
case (ATTR_SUBJECT_ID): case (ATTR_SUBJECT_ID):
if (suffix == null) {
subjectUniqueId = null; subjectUniqueId = null;
} else {
subjectUniqueId.delete(suffix);
}
break; break;
case (ATTR_EXTENSIONS): case (ATTR_EXTENSIONS):
if (suffix == null) { if (suffix == null) {
...@@ -626,23 +610,9 @@ public class X509CertInfo implements CertAttrSet<String> { ...@@ -626,23 +610,9 @@ public class X509CertInfo implements CertAttrSet<String> {
return(serialNum.get(suffix)); return(serialNum.get(suffix));
} }
case (ATTR_ISSUER_ID): case (ATTR_ISSUER_ID):
if (suffix == null) {
return(issuerUniqueId); return(issuerUniqueId);
} else {
if (issuerUniqueId == null)
return null;
else
return(issuerUniqueId.get(suffix));
}
case (ATTR_SUBJECT_ID): case (ATTR_SUBJECT_ID):
if (suffix == null) {
return(subjectUniqueId); return(subjectUniqueId);
} else {
if (subjectUniqueId == null)
return null;
else
return(subjectUniqueId.get(suffix));
}
} }
return null; return null;
} }
...@@ -711,7 +681,7 @@ public class X509CertInfo implements CertAttrSet<String> { ...@@ -711,7 +681,7 @@ public class X509CertInfo implements CertAttrSet<String> {
// Get the issuerUniqueId if present // Get the issuerUniqueId if present
tmp = in.getDerValue(); tmp = in.getDerValue();
if (tmp.isContextSpecific((byte)1)) { if (tmp.isContextSpecific((byte)1)) {
issuerUniqueId = new CertificateIssuerUniqueIdentity(tmp); issuerUniqueId = new UniqueIdentity(tmp);
if (in.available() == 0) if (in.available() == 0)
return; return;
tmp = in.getDerValue(); tmp = in.getDerValue();
...@@ -719,7 +689,7 @@ public class X509CertInfo implements CertAttrSet<String> { ...@@ -719,7 +689,7 @@ public class X509CertInfo implements CertAttrSet<String> {
// Get the subjectUniqueId if present. // Get the subjectUniqueId if present.
if (tmp.isContextSpecific((byte)2)) { if (tmp.isContextSpecific((byte)2)) {
subjectUniqueId = new CertificateSubjectUniqueIdentity(tmp); subjectUniqueId = new UniqueIdentity(tmp);
if (in.available() == 0) if (in.available() == 0)
return; return;
tmp = in.getDerValue(); tmp = in.getDerValue();
...@@ -814,10 +784,12 @@ public class X509CertInfo implements CertAttrSet<String> { ...@@ -814,10 +784,12 @@ public class X509CertInfo implements CertAttrSet<String> {
// Encode issuerUniqueId & subjectUniqueId. // Encode issuerUniqueId & subjectUniqueId.
if (issuerUniqueId != null) { if (issuerUniqueId != null) {
issuerUniqueId.encode(tmp); issuerUniqueId.encode(tmp, DerValue.createTag(DerValue.TAG_CONTEXT,
false,(byte)1));
} }
if (subjectUniqueId != null) { if (subjectUniqueId != null) {
subjectUniqueId.encode(tmp); subjectUniqueId.encode(tmp, DerValue.createTag(DerValue.TAG_CONTEXT,
false,(byte)2));
} }
// Write all the extensions. // Write all the extensions.
...@@ -946,11 +918,11 @@ public class X509CertInfo implements CertAttrSet<String> { ...@@ -946,11 +918,11 @@ public class X509CertInfo implements CertAttrSet<String> {
if (version.compare(CertificateVersion.V2) < 0) { if (version.compare(CertificateVersion.V2) < 0) {
throw new CertificateException("Invalid version"); throw new CertificateException("Invalid version");
} }
if (!(val instanceof CertificateIssuerUniqueIdentity)) { if (!(val instanceof UniqueIdentity)) {
throw new CertificateException( throw new CertificateException(
"IssuerUniqueId class type invalid."); "IssuerUniqueId class type invalid.");
} }
issuerUniqueId = (CertificateIssuerUniqueIdentity)val; issuerUniqueId = (UniqueIdentity)val;
} }
/** /**
...@@ -963,11 +935,11 @@ public class X509CertInfo implements CertAttrSet<String> { ...@@ -963,11 +935,11 @@ public class X509CertInfo implements CertAttrSet<String> {
if (version.compare(CertificateVersion.V2) < 0) { if (version.compare(CertificateVersion.V2) < 0) {
throw new CertificateException("Invalid version"); throw new CertificateException("Invalid version");
} }
if (!(val instanceof CertificateSubjectUniqueIdentity)) { if (!(val instanceof UniqueIdentity)) {
throw new CertificateException( throw new CertificateException(
"SubjectUniqueId class type invalid."); "SubjectUniqueId class type invalid.");
} }
subjectUniqueId = (CertificateSubjectUniqueIdentity)val; subjectUniqueId = (UniqueIdentity)val;
} }
/** /**
......
...@@ -126,7 +126,7 @@ public abstract class PreHashedMap<V> ...@@ -126,7 +126,7 @@ public abstract class PreHashedMap<V>
*/ */
protected abstract void init(Object[] ht); protected abstract void init(Object[] ht);
// @SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private V toV(Object x) { private V toV(Object x) {
return (V)x; return (V)x;
} }
...@@ -259,8 +259,7 @@ public abstract class PreHashedMap<V> ...@@ -259,8 +259,7 @@ public abstract class PreHashedMap<V>
return true; return true;
if (!(ob instanceof Map.Entry)) if (!(ob instanceof Map.Entry))
return false; return false;
Map.Entry<String,V> that Map.Entry<?,?> that = (Map.Entry<?,?>)ob;
= (Map.Entry<String,V>)ob;
return ((this.getKey() == null return ((this.getKey() == null
? that.getKey() == null ? that.getKey() == null
: this.getKey() : this.getKey()
......
...@@ -40,6 +40,22 @@ public class DefaultAsynchronousChannelProvider { ...@@ -40,6 +40,22 @@ public class DefaultAsynchronousChannelProvider {
*/ */
private DefaultAsynchronousChannelProvider() { } private DefaultAsynchronousChannelProvider() { }
@SuppressWarnings("unchecked")
private static AsynchronousChannelProvider createProvider(String cn) {
Class<AsynchronousChannelProvider> c;
try {
c = (Class<AsynchronousChannelProvider>)Class.forName(cn);
} catch (ClassNotFoundException x) {
throw new AssertionError(x);
}
try {
return c.newInstance();
} catch (IllegalAccessException | InstantiationException x) {
throw new AssertionError(x);
}
}
/** /**
* Returns the default AsynchronousChannelProvider. * Returns the default AsynchronousChannelProvider.
*/ */
...@@ -47,12 +63,11 @@ public class DefaultAsynchronousChannelProvider { ...@@ -47,12 +63,11 @@ public class DefaultAsynchronousChannelProvider {
String osname = AccessController String osname = AccessController
.doPrivileged(new GetPropertyAction("os.name")); .doPrivileged(new GetPropertyAction("os.name"));
if (osname.equals("SunOS")) if (osname.equals("SunOS"))
return new SolarisAsynchronousChannelProvider(); return createProvider("sun.nio.ch.SolarisAsynchronousChannelProvider");
if (osname.equals("Linux")) if (osname.equals("Linux"))
return new LinuxAsynchronousChannelProvider(); return createProvider("sun.nio.ch.LinuxAsynchronousChannelProvider");
if (osname.contains("OS X")) if (osname.contains("OS X"))
return new BsdAsynchronousChannelProvider(); return createProvider("sun.nio.ch.BsdAsynchronousChannelProvider");
throw new InternalError("platform not recognized"); throw new InternalError("platform not recognized");
} }
} }
...@@ -27,7 +27,6 @@ package sun.nio.ch; ...@@ -27,7 +27,6 @@ package sun.nio.ch;
import java.nio.channels.spi.SelectorProvider; import java.nio.channels.spi.SelectorProvider;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.security.action.GetPropertyAction; import sun.security.action.GetPropertyAction;
/** /**
...@@ -41,34 +40,32 @@ public class DefaultSelectorProvider { ...@@ -41,34 +40,32 @@ public class DefaultSelectorProvider {
*/ */
private DefaultSelectorProvider() { } private DefaultSelectorProvider() { }
/** @SuppressWarnings("unchecked")
* Returns the default SelectorProvider. private static SelectorProvider createProvider(String cn) {
*/ Class<SelectorProvider> c;
public static SelectorProvider create() {
String osname = AccessController.doPrivileged(
new GetPropertyAction("os.name"));
if ("SunOS".equals(osname)) {
return new sun.nio.ch.DevPollSelectorProvider();
}
// use EPollSelectorProvider for Linux kernels >= 2.6
if ("Linux".equals(osname)) {
String osversion = AccessController.doPrivileged(
new GetPropertyAction("os.version"));
String[] vers = osversion.split("\\.", 0);
if (vers.length >= 2) {
try { try {
int major = Integer.parseInt(vers[0]); c = (Class<SelectorProvider>)Class.forName(cn);
int minor = Integer.parseInt(vers[1]); } catch (ClassNotFoundException x) {
if (major > 2 || (major == 2 && minor >= 6)) { throw new AssertionError(x);
return new sun.nio.ch.EPollSelectorProvider();
}
} catch (NumberFormatException x) {
// format not recognized
} }
try {
return c.newInstance();
} catch (IllegalAccessException | InstantiationException x) {
throw new AssertionError(x);
} }
} }
/**
* Returns the default SelectorProvider.
*/
public static SelectorProvider create() {
String osname = AccessController
.doPrivileged(new GetPropertyAction("os.name"));
if (osname.equals("SunOS"))
return createProvider("sun.nio.ch.DevPollSelectorProvider");
if (osname.equals("Linux"))
return createProvider("sun.nio.ch.EPollSelectorProvider");
return new sun.nio.ch.PollSelectorProvider(); return new sun.nio.ch.PollSelectorProvider();
} }
......
...@@ -27,7 +27,6 @@ package sun.nio.fs; ...@@ -27,7 +27,6 @@ package sun.nio.fs;
import java.nio.file.spi.FileSystemProvider; import java.nio.file.spi.FileSystemProvider;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.security.action.GetPropertyAction; import sun.security.action.GetPropertyAction;
/** /**
...@@ -38,24 +37,18 @@ public class DefaultFileSystemProvider { ...@@ -38,24 +37,18 @@ public class DefaultFileSystemProvider {
private DefaultFileSystemProvider() { } private DefaultFileSystemProvider() { }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private static FileSystemProvider createProvider(final String cn) { private static FileSystemProvider createProvider(String cn) {
return AccessController
.doPrivileged(new PrivilegedAction<FileSystemProvider>() {
public FileSystemProvider run() {
Class<FileSystemProvider> c; Class<FileSystemProvider> c;
try { try {
c = (Class<FileSystemProvider>)Class.forName(cn, true, null); c = (Class<FileSystemProvider>)Class.forName(cn);
} catch (ClassNotFoundException x) { } catch (ClassNotFoundException x) {
throw new AssertionError(x); throw new AssertionError(x);
} }
try { try {
return c.newInstance(); return c.newInstance();
} catch (IllegalAccessException x) { } catch (IllegalAccessException | InstantiationException x) {
throw new AssertionError(x);
} catch (InstantiationException x) {
throw new AssertionError(x); throw new AssertionError(x);
} }
}});
} }
/** /**
...@@ -68,7 +61,7 @@ public class DefaultFileSystemProvider { ...@@ -68,7 +61,7 @@ public class DefaultFileSystemProvider {
return createProvider("sun.nio.fs.SolarisFileSystemProvider"); return createProvider("sun.nio.fs.SolarisFileSystemProvider");
if (osname.equals("Linux")) if (osname.equals("Linux"))
return createProvider("sun.nio.fs.LinuxFileSystemProvider"); return createProvider("sun.nio.fs.LinuxFileSystemProvider");
if (osname.equals("Darwin") || osname.contains("OS X")) if (osname.contains("OS X"))
return createProvider("sun.nio.fs.MacOSXFileSystemProvider"); return createProvider("sun.nio.fs.MacOSXFileSystemProvider");
throw new AssertionError("Platform not recognized"); throw new AssertionError("Platform not recognized");
} }
......
...@@ -110,6 +110,11 @@ public class ScreenUpdateManager { ...@@ -110,6 +110,11 @@ public class ScreenUpdateManager {
public SurfaceData getReplacementScreenSurface(WComponentPeer peer, public SurfaceData getReplacementScreenSurface(WComponentPeer peer,
SurfaceData oldsd) SurfaceData oldsd)
{ {
SurfaceData surfaceData = peer.getSurfaceData();
if (surfaceData.isValid()) {
return surfaceData;
}
peer.replaceSurfaceData();
return peer.getSurfaceData(); return peer.getSurfaceData();
} }
......
/* /*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -70,6 +70,7 @@ void AwtDesktopProperties::GetWindowsParameters() { ...@@ -70,6 +70,7 @@ void AwtDesktopProperties::GetWindowsParameters() {
GetNonClientParameters(); GetNonClientParameters();
GetIconParameters(); GetIconParameters();
GetColorParameters(); GetColorParameters();
GetCaretParameters();
GetOtherParameters(); GetOtherParameters();
GetSoundEvents(); GetSoundEvents();
GetSystemProperties(); GetSystemProperties();
...@@ -636,6 +637,10 @@ void AwtDesktopProperties::GetSoundEvents() { ...@@ -636,6 +637,10 @@ void AwtDesktopProperties::GetSoundEvents() {
SetSoundProperty(TEXT("win.sound.start"), TEXT("SystemStart")); SetSoundProperty(TEXT("win.sound.start"), TEXT("SystemStart"));
} }
void AwtDesktopProperties::GetCaretParameters() {
SetIntegerProperty(TEXT("win.caret.width"), GetIntegerParameter(SPI_GETCARETWIDTH));
}
BOOL AwtDesktopProperties::GetBooleanParameter(UINT spi) { BOOL AwtDesktopProperties::GetBooleanParameter(UINT spi) {
BOOL flag; BOOL flag;
SystemParametersInfo(spi, 0, &flag, 0); SystemParametersInfo(spi, 0, &flag, 0);
......
/* /*
* Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -64,6 +64,7 @@ class AwtDesktopProperties { ...@@ -64,6 +64,7 @@ class AwtDesktopProperties {
void GetColorParameters(); void GetColorParameters();
void GetOtherParameters(); void GetOtherParameters();
void GetSoundEvents(); void GetSoundEvents();
void GetCaretParameters();
static BOOL GetBooleanParameter(UINT spi); static BOOL GetBooleanParameter(UINT spi);
static UINT GetIntegerParameter(UINT spi); static UINT GetIntegerParameter(UINT spi);
......
...@@ -75,6 +75,7 @@ MsgRouting ...@@ -75,6 +75,7 @@ MsgRouting
AwtTextField::HandleEvent(MSG *msg, BOOL synthetic) AwtTextField::HandleEvent(MSG *msg, BOOL synthetic)
{ {
MsgRouting returnVal; MsgRouting returnVal;
BOOL systemBeeperEnabled = FALSE;
/* /*
* RichEdit 1.0 control starts internal message loop if the * RichEdit 1.0 control starts internal message loop if the
* left mouse button is pressed while the cursor is not over * left mouse button is pressed while the cursor is not over
...@@ -217,7 +218,34 @@ AwtTextField::HandleEvent(MSG *msg, BOOL synthetic) ...@@ -217,7 +218,34 @@ AwtTextField::HandleEvent(MSG *msg, BOOL synthetic)
} }
delete msg; delete msg;
return mrConsume; return mrConsume;
} else if (msg->message == WM_KEYDOWN) {
UINT virtualKey = (UINT) msg->wParam;
switch(virtualKey){
case VK_RETURN:
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
case VK_DELETE:
case VK_BACK:
SystemParametersInfo(SPI_GETBEEP, 0, &systemBeeperEnabled, 0);
if(systemBeeperEnabled){
// disable system beeper for the RICHEDIT control to be compatible
// with the EDIT control behaviour
SystemParametersInfo(SPI_SETBEEP, 0, NULL, 0);
} }
break;
}
} else if (msg->message == WM_SETTINGCHANGE) {
if (msg->wParam == SPI_SETBEEP) {
SystemParametersInfo(SPI_GETBEEP, 0, &systemBeeperEnabled, 0);
if(systemBeeperEnabled){
SystemParametersInfo(SPI_SETBEEP, 1, NULL, 0);
}
}
}
/* /*
* Store the 'synthetic' parameter so that the WM_PASTE security check * Store the 'synthetic' parameter so that the WM_PASTE security check
* happens only for synthetic events. * happens only for synthetic events.
...@@ -226,6 +254,10 @@ AwtTextField::HandleEvent(MSG *msg, BOOL synthetic) ...@@ -226,6 +254,10 @@ AwtTextField::HandleEvent(MSG *msg, BOOL synthetic)
returnVal = AwtComponent::HandleEvent(msg, synthetic); returnVal = AwtComponent::HandleEvent(msg, synthetic);
m_synthetic = FALSE; m_synthetic = FALSE;
if(systemBeeperEnabled){
SystemParametersInfo(SPI_SETBEEP, 1, NULL, 0);
}
return returnVal; return returnVal;
} }
......
...@@ -147,6 +147,9 @@ javax/management/remote/mandatory/connection/ReconnectTest.java generic-all ...@@ -147,6 +147,9 @@ javax/management/remote/mandatory/connection/ReconnectTest.java generic-all
# 7158614, locks up Windows machines at least # 7158614, locks up Windows machines at least
sun/management/jmxremote/startstop/JMXStartStopTest.sh windows-all sun/management/jmxremote/startstop/JMXStartStopTest.sh windows-all
# 7120365
javax/management/remote/mandatory/notif/DiffHBTest.java generic-all
############################################################################ ############################################################################
# jdk_math # jdk_math
...@@ -216,11 +219,6 @@ java/net/DatagramSocket/SendDatagramToBadAddress.java macosx-all ...@@ -216,11 +219,6 @@ java/net/DatagramSocket/SendDatagramToBadAddress.java macosx-all
sun/net/www/protocol/http/B6299712.java macosx-all sun/net/www/protocol/http/B6299712.java macosx-all
java/net/CookieHandler/CookieManagerTest.java macosx-all java/net/CookieHandler/CookieManagerTest.java macosx-all
# 7164518
sun/security/krb5/auto/Unreachable.java macosx-all
# JPRT needs to set 127.0.0.1 in proxy bypass list
java/net/URLClassLoader/closetest/CloseTest.java macosx-all
############################################################################ ############################################################################
# jdk_io # jdk_io
...@@ -251,9 +249,6 @@ java/nio/channels/DatagramChannel/ChangingAddress.java macosx-all ...@@ -251,9 +249,6 @@ java/nio/channels/DatagramChannel/ChangingAddress.java macosx-all
# 7132677 # 7132677
java/nio/channels/Selector/OutOfBand.java macosx-all java/nio/channels/Selector/OutOfBand.java macosx-all
# 7142919
java/nio/channels/AsyncCloseAndInterrupt.java solaris-all
############################################################################ ############################################################################
# jdk_rmi # jdk_rmi
...@@ -277,6 +272,9 @@ sun/rmi/transport/proxy/EagerHttpFallback.java linux-all ...@@ -277,6 +272,9 @@ sun/rmi/transport/proxy/EagerHttpFallback.java linux-all
# jdk_security # jdk_security
# 7164518: no PortUnreachableException on Mac
sun/security/krb5/auto/Unreachable.java macosx-all
# 7193792 # 7193792
sun/security/pkcs11/ec/TestECDSA.java solaris-all sun/security/pkcs11/ec/TestECDSA.java solaris-all
sun/security/pkcs11/ec/TestECDSA.java linux-all sun/security/pkcs11/ec/TestECDSA.java linux-all
...@@ -284,47 +282,17 @@ sun/security/pkcs11/ec/TestECDSA.java linux-all ...@@ -284,47 +282,17 @@ sun/security/pkcs11/ec/TestECDSA.java linux-all
# 7193793 # 7193793
sun/security/pkcs11/ec/TestECDH.java linux-all sun/security/pkcs11/ec/TestECDH.java linux-all
# 7198198: the test also fails on SuSE Linux
sun/security/pkcs11/ec/ReadCertificates.java linux-all
# 7147060 # 7147060
com/sun/org/apache/xml/internal/security/transforms/ClassLoaderTest.java generic-all com/sun/org/apache/xml/internal/security/transforms/ClassLoaderTest.java generic-all
# Failing on Solaris i586, 3/9/2010, not a -samevm issue (jdk_security3) # 6988842: 4 tests failing on Solaris 5.10
sun/security/pkcs11/Secmod/AddPrivateKey.java solaris-i586 sun/security/pkcs11/Secmod/AddPrivateKey.java solaris-all
sun/security/pkcs11/ec/ReadCertificates.java generic-all sun/security/pkcs11/ec/ReadCertificates.java solaris-all
sun/security/pkcs11/ec/ReadPKCS12.java generic-all sun/security/pkcs11/ec/ReadPKCS12.java solaris-all
sun/security/pkcs11/ec/TestCurves.java solaris-i586 sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java solaris-all
#sun/security/pkcs11/ec/TestECGenSpec.java solaris-i586
#sun/security/pkcs11/ec/TestKeyFactory.java solaris-i586
sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java generic-all
# Fails on Fedora 9/Ubuntu 10.04 64bit, PKCS11Exception: CKR_DEVICE_ERROR
sun/security/pkcs11/KeyAgreement/TestDH.java generic-all
# Run too slow on Solaris 10 sparc
sun/security/ssl/com/sun/net/ssl/internal/ssl/InputRecord/SSLSocketTimeoutNulls.java solaris-sparc
sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ClientTimeout.java solaris-sparc
sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ServerTimeout.java solaris-sparc
sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/ReadTimeout.java solaris-sparc
sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh solaris-sparc
# Solaris 10 sparc, passed/failed confusion? java.security.ProviderException: update() failed
sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/AsyncSSLSocketClose.java generic-all
# Othervm, sparc, NoRouteToHostException: Cannot assign requested address
sun/security/ssl/javax/net/ssl/NewAPIs/SessionCacheSizeTests.java generic-all
# Times out on windows X64, othervm mode
# Solaris sparc and sparcv9 -server, timeout
sun/security/ssl/javax/net/ssl/NewAPIs/SessionTimeOutTests.java generic-all
# Various failures on Linux Fedora 9 X64, othervm mode
sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/TestAllSuites.java generic-all
sun/security/ssl/sanity/ciphersuites/CheckCipherSuites.java generic-all
# Various failures on Linux Fedora 9 X64, othervm mode
sun/security/ssl/sanity/interop/ClientJSSEServerJSSE.java generic-all
# 7079203 sun/security/tools/keytool/printssl.sh fails on solaris with timeout
sun/security/tools/keytool/printssl.sh solaris-all
# 7041639, Solaris DSA keypair generation bug (Note: jdk_util also affected) # 7041639, Solaris DSA keypair generation bug (Note: jdk_util also affected)
java/security/KeyPairGenerator/SolarisShortDSA.java solaris-all java/security/KeyPairGenerator/SolarisShortDSA.java solaris-all
...@@ -348,6 +316,8 @@ sun/security/tools/keytool/standard.sh solaris-all ...@@ -348,6 +316,8 @@ sun/security/tools/keytool/standard.sh solaris-all
# jdk_text # jdk_text
# 7196199
java/text/Bidi/Bug6665028.java generic-all
############################################################################ ############################################################################
# jdk_tools # jdk_tools
......
...@@ -195,7 +195,7 @@ public class PaddingTest { ...@@ -195,7 +195,7 @@ public class PaddingTest {
private static void diff(String fname1, String fname2) throws Exception { private static void diff(String fname1, String fname2) throws Exception {
if (!Arrays.equals(Files.readAllBytes(Paths.get(fname1)), if (!Arrays.equals(Files.readAllBytes(Paths.get(fname1)),
Files.readAllBytes(Paths.get(fname1)))) { Files.readAllBytes(Paths.get(fname2)))) {
throw new Exception( throw new Exception(
"files " + fname1 + " and " + fname2 + " differ"); "files " + fname1 + " and " + fname2 + " differ");
} }
......
/*
* 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. 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.
*/
/**
* @test PostEventOrderingTest.java
* @bug 4171596 6699589
* @summary Checks that the posting of events between the PostEventQueue
* @summary and the EventQueue maintains proper ordering.
* @run main PostEventOrderingTest
* @author fredx
*/
import java.awt.*;
import java.awt.event.*;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
public class PostEventOrderingTest {
static boolean testPassed = true;
public static void main(String[] args) throws Throwable {
EventQueue q = Toolkit.getDefaultToolkit().getSystemEventQueue();
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
q.postEvent(new PostActionEvent());
for (int k = 0; k < 10; k++) {
SunToolkit.postEvent(AppContext.getAppContext(), new PostActionEvent());
}
}
for (int k = 0; k < 100; k++) {
SunToolkit.postEvent(AppContext.getAppContext(), new PostActionEvent());
}
}
for (;;) {
Thread.currentThread().sleep(100);
if (q.peekEvent() == null) {
Thread.currentThread().sleep(100);
if (q.peekEvent() == null)
break;
}
}
if (!testPassed) {
throw new Exception("PostEventOrderingTest FAILED -- events dispatched out of order.");
} else {
System.out.println("PostEventOrderingTest passed!");
}
}
}
class PostActionEvent extends ActionEvent implements ActiveEvent {
static int counter = 0;
static int mostRecent = -1;
int myval;
public PostActionEvent() {
super("", ACTION_PERFORMED, "" + counter);
myval = counter++;
}
public void dispatch() {
//System.out.println("myval = "+myval+", mostRecent = "+mostRecent+", diff = "+(myval-mostRecent)+".");
if ((myval - mostRecent) != 1)
PostEventOrderingTest.testPassed = false;
mostRecent = myval;
}
}
#!/bin/sh
# 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. 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.
# @test JAWT.sh
# @bug 7190587
# @summary Tests Java AWT native interface library
# @author kshefov
# @run shell JAWT.sh
# NB: To run on Windows with MKS and Visual Studio compiler
# add the following options to jtreg: -e INCLUDE="%INCLUDE%;." -e LIB="%LIB%;."
if [ "${TESTSRC}" = "" ]
then TESTSRC=.
fi
if [ "${TESTJAVA}" = "" ]
then
PARENT=`dirname \`which java\``
TESTJAVA=`dirname ${PARENT}`
echo "TESTJAVA not set, selecting " ${TESTJAVA}
echo "If this is incorrect, try setting the variable manually."
fi
# set platform-dependent variables
OS=`uname -s`
case "$OS" in
Linux )
NULL=/dev/null
PS=":"
FS="/"
${TESTJAVA}${FS}bin${FS}java -version 2>&1 | grep '64-Bit' > $NULL
if [ $? -eq '0' ]
then
ARCH="amd64"
else
ARCH="i386"
fi
SYST="linux"
MAKEFILE="Makefile.unix"
CC="gcc"
MAKE="make"
LD_LIBRARY_PATH="."
;;
SunOS )
NULL=/dev/null
PS=":"
FS="/"
if [ `uname -p | grep -c 'sparc'` -gt '0' ]
then
ARCH="sparc"
else
ARCH="i386"
fi
SYST="solaris"
MAKEFILE="Makefile.unix"
CC="gcc"
MAKE="make"
LD_LIBRARY_PATH="."
;;
Windows* )
NULL=null
PS=";"
FS="\\"
MAKEFILE="Makefile.win"
CC="cl"
MAKE="nmake"
${TESTJAVA}${FS}bin${FS}java -d64 -version 2>&1 | grep '64-Bit' > $NULL
if [ "$?" -eq '0' ]
then
ARCH="amd64"
else
ARCH="i386"
fi
SYST="windows"
;;
CYGWIN* )
NULL=/dev/null
PS=":"
FS="/"
MAKEFILE="Makefile.cygwin"
CC="gcc"
${TESTJAVA}${FS}bin${FS}java -d64 -version 2>&1 | grep '64-Bit' > $NULL
if [ "$?" -eq '0' ]
then
ARCH="amd64"
else
ARCH="i386"
fi
SYST="cygwin"
MAKE="make"
;;
Darwin )
echo "Test passed. This test is not for MacOS."
exit 0;
;;
* )
echo "Unrecognized system!"
exit 1;
;;
esac
# Skip unsupported platforms
case `uname -m` in
arm* | ppc* )
echo "Test passed. Not supported on current architecture."
exit 0
;;
esac
echo "OS-ARCH is" ${SYST}-${ARCH}
${TESTJAVA}${FS}jre${FS}bin${FS}java -fullversion 2>&1
which ${MAKE} >${NULL} 2>&1
if [ "$?" -ne '0' ]
then
echo "No make found. Test passed."
exit 0
fi
which ${CC} >${NULL} 2>&1
if [ "$?" -ne '0' ]
then
echo "No C compiler found. Test passed."
exit 0
fi
case "$OS" in
SunOS )
${CC} -v >${NULL} 2>&1
if [ "$?" -ne '0' ]
then
echo "No C compiler found. Test passed."
exit 0
fi
esac
cp ${TESTSRC}${FS}${MAKEFILE} .
JAVA=${TESTJAVA}${FS}jre${FS}bin${FS}java
JAVAC=${TESTJAVA}${FS}bin${FS}javac
JAVAH=${TESTJAVA}${FS}bin${FS}javah
export CC SYST ARCH LD_LIBRARY_PATH
${JAVAC} -d . ${TESTSRC}${FS}MyCanvas.java
${JAVAH} -jni -classpath . -d . MyCanvas
${MAKE} -f ${MAKEFILE}
${JAVA} -classpath . MyCanvas
exit $?
#! /bin/sh # Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved.
#
# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # 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 # under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. # 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 # This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
...@@ -21,40 +20,30 @@ ...@@ -21,40 +20,30 @@
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 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 # or visit www.oracle.com if you need additional information or have any
# questions. # questions.
#
# @test CFLAGS =
# @author Yingxian Wang OBJS = myfile.o
# @bug 4957669 5017871 HEADERS = MyCanvas.h
# @library ../../../sun/net/www/httptest/ CLASSES = MyCanvas.class
# @build HttpCallback HttpServer ClosedChannelList HttpTransaction
# @run shell/timeout=300 ClassnameCharTest.sh JAVA = $(TESTJAVA)/bin/java -classpath .
# @summary ; cannot load class names containing some JSR 202 characters; JAVAC = $(TESTJAVA)/bin/javac
# plugin does not escape unicode character in http request JAVAH = $(TESTJAVA)/bin/javah
# DEL = rm -rf
# set platform-dependent variables LINK = $(CC)
OS=`uname -s` INCLUDES = -I $(TESTJAVA)/include/win32 -I $(TESTJAVA)/include -I .
case "$OS" in
SunOS | Linux | Darwin ) LIBS = $(TESTJAVA)/lib/jawt.lib -lgdi32
PS=":"
FS="/" all: $(CLASSES) mylib.dll
;;
Windows* | CYGWIN* ) mylib.dll: $(HEADERS) $(OBJS)
PS=";" $(LINK) -shared -o mylib.dll $(OBJS) $(LIBS)
FS="\\"
;; myfile.o:
* ) $(CC) $(CFLAGS) $(INCLUDES) -c $(TESTSRC)/myfile.cpp
echo "Unrecognized system!"
exit 1; clean:
;; $(DEL) mylib.* *.h *.class *.o
esac
cp ${TESTSRC}${FS}testclasses.jar ${TESTCLASSES}
cd ${TESTCLASSES}
${TESTJAVA}${FS}bin${FS}jar xvf testclasses.jar "fo o.class"
${TESTJAVA}${FS}bin${FS}javac -d ${TESTCLASSES} ${TESTSRC}${FS}ClassnameCharTest.java
${TESTJAVA}${FS}bin${FS}java -classpath "${TESTCLASSES}${PS}${TESTCLASSES}${FS}sun${FS}misc${FS}URLClassPath" ClassnameCharTest
rm -rf "fo o.class" testclasses.jar
# 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. 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.
CFLAGS = -fPIC -O
OBJS = myfile.o
HEADERS = MyCanvas.h
CLASSES = MyCanvas.class
ENV = /usr/bin/env
JAVA = $(TESTJAVA)/bin/java -classpath .
JAVAC = $(TESTJAVA)/bin/javac
JAVAH = $(TESTJAVA)/bin/javah
LINK = ld
J_INC = $(TESTJAVA)/include
INCLUDES = -I$(J_INC) -I$(J_INC)/$(SYST) -I.
LIBS = -L$(TESTJAVA)/jre/lib/$(ARCH) -ljawt -lX11
all: $(CLASSES) libmylib.so
libmylib.so: $(HEADERS) $(OBJS)
$(LINK) -G -o libmylib.so $(OBJS) $(LIBS)
myfile.o: $(TESTSRC)/myfile.c
$(CC) $(CFLAGS) $(INCLUDES) -c $(TESTSRC)/myfile.c
clean:
rm -rf libmylib.so $(HEADERS) $(CLASSES) $(OBJS)
# 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. 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.
CFLAGS = -nologo
OBJS = myfile.obj
HEADERS = MyCanvas.h
CLASSES = MyCanvas.class
DEL = del /Q
LINK = link
INCLUDES = -I$(TESTJAVA)\include\win32 -I$(TESTJAVA)\include
LIBS = gdi32.lib user32.lib $(TESTJAVA)\lib\jawt.lib
all: $(CLASSES) mylib.dll
mylib.dll: $(HEADERS) $(OBJS)
$(LINK) -nologo -dll -out:mylib.dll $(OBJS) $(LIBS)
myfile.obj: $(TESTSRC)\myfile.cpp
$(CC) $(CFLAGS) $(INCLUDES) -c $(TESTSRC)\myfile.cpp
clean:
$(DEL) mylib.*
$(DEL) $(HEADERS) $(CLASSES)
$(DEL) *.obj
/**
* 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. 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.
*/
import java.awt.*;
import java.awt.event.*;
public class MyCanvas extends Canvas {
static {
try {
System.loadLibrary("mylib");
} catch (Throwable t) {
System.out.println("Test failed!!");
t.printStackTrace();
System.exit(1);
}
}
public native void paint(Graphics g);
public static void main(String[] args) {
try {
Robot robot = new Robot();
Frame f = new Frame();
f.setBounds(0, 0, 100, 100);
f.add(new MyCanvas());
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
f.setVisible(true);
robot.delay(5000);
Color col1 = new Color(0, 0, 0);
Color col2 = robot.getPixelColor(f.getX()+50, f.getY()+50);
if (col1.equals(col2)) {
System.out.println("Test passed!");
} else {
throw new RuntimeException("Color of JAWT canvas is wrong or " +
"it was not rendered. " + "Check that other windows " +
"do not block the test frame.");
}
System.exit(0);
} catch (Throwable t) {
System.out.println("Test failed!");
t.printStackTrace();
System.exit(1);
}
}
}
/*
* 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. 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.
*/
#include "MyCanvas.h"
#include "jawt_md.h"
/*
* Class: MyCanvas
* Method: paint
* Signature: (Ljava/awt/Graphics;)V
*/
JNIEXPORT void JNICALL Java_MyCanvas_paint
(JNIEnv* env, jobject canvas, jobject graphics)
{
JAWT awt;
JAWT_DrawingSurface* ds;
JAWT_DrawingSurfaceInfo* dsi;
JAWT_X11DrawingSurfaceInfo* dsi_x11;
jboolean result;
jint lock;
GC gc;
jobject ref;
/* Get the AWT */
awt.version = JAWT_VERSION_1_4;
if (JAWT_GetAWT(env, &awt) == JNI_FALSE) {
printf("AWT Not found\n");
return;
}
/* Lock the AWT */
awt.Lock(env);
/* Unlock the AWT */
awt.Unlock(env);
/* Get the drawing surface */
ds = awt.GetDrawingSurface(env, canvas);
if (ds == NULL) {
printf("NULL drawing surface\n");
return;
}
/* Lock the drawing surface */
lock = ds->Lock(ds);
printf("Lock value %d\n", (int)lock);
if((lock & JAWT_LOCK_ERROR) != 0) {
printf("Error locking surface\n");
awt.FreeDrawingSurface(ds);
return;
}
/* Get the drawing surface info */
dsi = ds->GetDrawingSurfaceInfo(ds);
if (dsi == NULL) {
printf("Error getting surface info\n");
ds->Unlock(ds);
awt.FreeDrawingSurface(ds);
return;
}
/* Get the platform-specific drawing info */
dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo;
/* Now paint */
gc = XCreateGC(dsi_x11->display, dsi_x11->drawable, 0, 0);
XSetForeground(dsi_x11->display, gc, 0);
XFillRectangle(dsi_x11->display, dsi_x11->drawable, gc,
5, 5, 90, 90);
XFreeGC(dsi_x11->display, gc);
ref = awt.GetComponent(env, (void*)(dsi_x11->drawable));
if (!(*env)->IsSameObject(env, ref, canvas)) {
printf("Error! Different objects!\n");
}
/* Free the drawing surface info */
ds->FreeDrawingSurfaceInfo(dsi);
/* Unlock the drawing surface */
ds->Unlock(ds);
/* Free the drawing surface */
awt.FreeDrawingSurface(ds);
}
/*
* 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. 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.
*/
#include <windows.h>
#include "MyCanvas.h"
#include "jawt_md.h"
/*
* Class: MyCanvas
* Method: paint
* Signature: (Ljava/awt/Graphics;)V
*/
extern "C" {
JNIEXPORT void JNICALL Java_MyCanvas_paint
(JNIEnv* env, jobject canvas, jobject graphics)
{
/* Get the AWT */
JAWT awt;
awt.version = JAWT_VERSION_1_4;
if (JAWT_GetAWT(env, &awt) == JNI_FALSE) {
printf("AWT Not found\n");
return;
}
/* Lock the AWT */
awt.Lock(env);
/* Unlock the AWT */
awt.Unlock(env);
/* Get the drawing surface */
JAWT_DrawingSurface* ds = awt.GetDrawingSurface(env, canvas);
if (ds == NULL) {
printf("NULL drawing surface\n");
return;
}
/* Lock the drawing surface */
jint lock = ds->Lock(ds);
printf("Lock value %d\n", (int)lock);
if((lock & JAWT_LOCK_ERROR) != 0) {
printf("Error locking surface\n");
return;
}
/* Get the drawing surface info */
JAWT_DrawingSurfaceInfo* dsi = ds->GetDrawingSurfaceInfo(ds);
if (dsi == NULL) {
printf("Error getting surface info\n");
ds->Unlock(ds);
return;
}
/* Get the platform-specific drawing info */
JAWT_Win32DrawingSurfaceInfo* dsi_win =
(JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
/* Now paint */
PAINTSTRUCT ps;
/* Do not use the HDC returned from BeginPaint()!! */
::BeginPaint(dsi_win->hwnd, &ps);
HBRUSH hbrush = (HBRUSH)::GetStockObject(BLACK_BRUSH);
RECT rect;
rect.left = 5;
rect.top = 5;
rect.right = 95;
rect.bottom = 95;
::FillRect(dsi_win->hdc, &rect, hbrush);
::EndPaint(dsi_win->hwnd, &ps);
jobject ref = awt.GetComponent(env, (void*)(dsi_win->hwnd));
if (!env->IsSameObject(ref, canvas)) {
printf("Error! Different objects!\n");
}
/* Free the drawing surface info */
ds->FreeDrawingSurfaceInfo(dsi);
/* Unlock the drawing surface */
ds->Unlock(ds);
/* Free the drawing surface */
awt.FreeDrawingSurface(ds);
}
}
/*
* 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 7196547
* @summary Dead Key implementation for KeyEvent on Mac OS X
* @author alexandr.scherbatiy area=awt.event
* @run main deadKeyMacOSX
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.event.KeyEvent;
import sun.awt.OSInfo;
import sun.awt.SunToolkit;
public class deadKeyMacOSX {
private static SunToolkit toolkit;
private static volatile int state = 0;
public static void main(String[] args) throws Exception {
if (OSInfo.getOSType() != OSInfo.OSType.MACOSX) {
return;
}
toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
Robot robot = new Robot();
robot.setAutoDelay(50);
createAndShowGUI();
// Pressed keys: Alt + E + A
// Results: ALT + VK_DEAD_ACUTE + a with accute accent
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_E);
robot.keyRelease(KeyEvent.VK_E);
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
if (state != 3) {
throw new RuntimeException("Wrong number of key events.");
}
}
static void createAndShowGUI() {
Frame frame = new Frame();
frame.setSize(300, 300);
Panel panel = new Panel();
panel.addKeyListener(new DeadKeyListener());
frame.add(panel);
frame.setVisible(true);
toolkit.realSync();
panel.requestFocusInWindow();
toolkit.realSync();
}
static class DeadKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
char keyChar = e.getKeyChar();
switch (state) {
case 0:
if (keyCode != KeyEvent.VK_ALT) {
throw new RuntimeException("Alt is not pressed.");
}
state++;
break;
case 1:
if (keyCode != KeyEvent.VK_DEAD_ACUTE) {
throw new RuntimeException("Dead ACUTE is not pressed.");
}
if (keyChar != 0xB4) {
throw new RuntimeException("Pressed char is not dead acute.");
}
state++;
break;
case 2:
if (keyCode != KeyEvent.VK_A) {
throw new RuntimeException("A is not pressed.");
}
if (keyChar != 0xE1) {
throw new RuntimeException("A char does not have ACCUTE accent");
}
state++;
break;
default:
throw new RuntimeException("Excessive keyPressed event.");
}
}
@Override
public void keyTyped(KeyEvent e) {
int keyCode = e.getKeyCode();
char keyChar = e.getKeyChar();
if (state == 3) {
if (keyCode != 0) {
throw new RuntimeException("Key code should be undefined.");
}
if (keyChar != 0xE1) {
throw new RuntimeException("A char does not have ACCUTE accent");
}
} else {
throw new RuntimeException("Wron number of keyTyped events.");
}
}
}
}
/*
* 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 7193977
* @summary Tests that generified property descriptors do not loose additional info
* @author Sergey Malenkov
*/
import java.awt.Image;
import java.beans.BeanDescriptor;
import java.beans.BeanInfo;
import java.beans.EventSetDescriptor;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;
import java.util.Arrays;
import java.util.List;
public class Test7193977 {
private static final List<String> names = Arrays.asList("listType", "list", "value");
public static void main(String args[]) {
for (String name : names) {
test(Abstract.class, name);
test(Concrete.class, name);
}
}
private static void test(Class<?> type, String name) {
if (!Boolean.TRUE.equals(BeanUtils.getPropertyDescriptor(type, name).getValue("transient"))) {
throw new Error("property '" + name + "' is not transient");
}
}
public static final class Concrete extends Abstract<String> {
}
public static abstract class Abstract<T> {
private List<T> list;
public List<T> getList() {
return this.list;
}
public void setList(List<T> list) {
this.list = list;
}
public T getValue(int index) {
return (0 <= index) && (this.list != null) && (index < this.list.size())
? this.list.get(index)
: null;
}
public void setValue(int index, T value) {
if ((0 <= index) && (this.list != null)) {
if (index == this.list.size()) {
this.list.add(value);
}
else if (index < this.list.size()) {
this.list.set(index, value);
}
}
}
public String getListType() {
return (this.list != null)
? this.list.getClass().getName()
: null;
}
public void setListType(String type) throws Exception {
this.list = (type != null)
? (List<T>) Class.forName(type).newInstance()
: null;
}
}
public static final class ConcreteBeanInfo extends Wrapper {
public ConcreteBeanInfo() throws IntrospectionException {
super(Concrete.class);
}
}
public static final class AbstractBeanInfo extends Wrapper {
public AbstractBeanInfo() throws IntrospectionException {
super(Abstract.class);
for (PropertyDescriptor pd : getPropertyDescriptors()) {
if (names.contains(pd.getName())) {
pd.setValue("transient", Boolean.TRUE);
}
}
}
}
private static class Wrapper implements BeanInfo {
private final BeanInfo info;
Wrapper(Class<?> type) throws IntrospectionException {
this.info = Introspector.getBeanInfo(type, Introspector.IGNORE_IMMEDIATE_BEANINFO);
}
public BeanDescriptor getBeanDescriptor() {
return this.info.getBeanDescriptor();
}
public EventSetDescriptor[] getEventSetDescriptors() {
return this.info.getEventSetDescriptors();
}
public int getDefaultEventIndex() {
return this.info.getDefaultEventIndex();
}
public PropertyDescriptor[] getPropertyDescriptors() {
return this.info.getPropertyDescriptors();
}
public int getDefaultPropertyIndex() {
return this.info.getDefaultPropertyIndex();
}
public MethodDescriptor[] getMethodDescriptors() {
return this.info.getMethodDescriptors();
}
public BeanInfo[] getAdditionalBeanInfo() {
return this.info.getAdditionalBeanInfo();
}
public Image getIcon(int kind) {
return this.info.getIcon(kind);
}
}
}
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
/* /*
* @test * @test
* @bug 5086470 6358247 * @bug 5086470 6358247 7193302
* @summary Test type conversion when invoking ThreadMXBean.dumpAllThreads * @summary Test type conversion when invoking ThreadMXBean.dumpAllThreads
* through proxy. * through proxy.
* *
...@@ -173,6 +173,10 @@ public class ThreadMXBeanProxy { ...@@ -173,6 +173,10 @@ public class ThreadMXBeanProxy {
throw new RuntimeException("LockInfo: " + syncs[0] + throw new RuntimeException("LockInfo: " + syncs[0] +
" IdentityHashCode not matched. Expected: " + hcode); " IdentityHashCode not matched. Expected: " + hcode);
} }
LockInfo li = info.getLockInfo();
if (li == null) {
throw new RuntimeException("Expected non-null LockInfo");
}
} }
} }
static class Mutex implements Lock, java.io.Serializable { static class Mutex implements Lock, java.io.Serializable {
......
...@@ -48,7 +48,7 @@ public class CollectionUsageThreshold { ...@@ -48,7 +48,7 @@ public class CollectionUsageThreshold {
private static Map<String, PoolRecord> result = new HashMap<>(); private static Map<String, PoolRecord> result = new HashMap<>();
private static boolean trace = false; private static boolean trace = false;
private static boolean testFailed = false; private static boolean testFailed = false;
private static final int EXPECTED_NUM_POOLS = 2; private static int numMemoryPools = 1;
private static final int NUM_GCS = 3; private static final int NUM_GCS = 3;
private static final int THRESHOLD = 10; private static final int THRESHOLD = 10;
private static Checker checker; private static Checker checker;
...@@ -129,14 +129,19 @@ public class CollectionUsageThreshold { ...@@ -129,14 +129,19 @@ public class CollectionUsageThreshold {
for (MemoryPoolMXBean p : pools) { for (MemoryPoolMXBean p : pools) {
MemoryUsage u = p.getUsage(); MemoryUsage u = p.getUsage();
if (p.isUsageThresholdSupported() && p.isCollectionUsageThresholdSupported()) { if (p.isUsageThresholdSupported() && p.isCollectionUsageThresholdSupported()) {
if (p.getName().toLowerCase().contains("perm")) {
// if we have a "perm gen" pool increase the number of expected
// memory pools by one.
numMemoryPools++;
}
PoolRecord pr = new PoolRecord(p); PoolRecord pr = new PoolRecord(p);
result.put(p.getName(), pr); result.put(p.getName(), pr);
if (result.size() == EXPECTED_NUM_POOLS) { if (result.size() == numMemoryPools) {
break; break;
} }
} }
} }
if (result.size() != EXPECTED_NUM_POOLS) { if (result.size() != numMemoryPools) {
throw new RuntimeException("Unexpected number of selected pools"); throw new RuntimeException("Unexpected number of selected pools");
} }
...@@ -209,7 +214,7 @@ public class CollectionUsageThreshold { ...@@ -209,7 +214,7 @@ public class CollectionUsageThreshold {
public void run() { public void run() {
while (true) { while (true) {
try { try {
signals.acquire(EXPECTED_NUM_POOLS); signals.acquire(numMemoryPools);
checkResult(); checkResult();
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
......
...@@ -58,8 +58,11 @@ public class MemoryTest { ...@@ -58,8 +58,11 @@ public class MemoryTest {
// They are: Copy/Scavenger + MSC + CodeCache manager // They are: Copy/Scavenger + MSC + CodeCache manager
// (or equivalent for other collectors) // (or equivalent for other collectors)
// Number of GC memory managers = 2 // Number of GC memory managers = 2
private static int[] expectedMinNumPools = {3, 2};
private static int[] expectedMaxNumPools = {3, 4}; // Hotspot VM 1.8+ after perm gen removal is expected to have only
// one non-heap memory pool
private static int[] expectedMinNumPools = {3, 1};
private static int[] expectedMaxNumPools = {3, 1};
private static int expectedNumGCMgrs = 2; private static int expectedNumGCMgrs = 2;
private static int expectedNumMgrs = expectedNumGCMgrs + 1; private static int expectedNumMgrs = expectedNumGCMgrs + 1;
private static String[] types = { "heap", "non-heap" }; private static String[] types = { "heap", "non-heap" };
...@@ -80,6 +83,7 @@ public class MemoryTest { ...@@ -80,6 +83,7 @@ public class MemoryTest {
private static void checkMemoryPools() throws Exception { private static void checkMemoryPools() throws Exception {
List pools = ManagementFactory.getMemoryPoolMXBeans(); List pools = ManagementFactory.getMemoryPoolMXBeans();
boolean hasPerm = false;
int[] numPools = new int[NUM_TYPES]; int[] numPools = new int[NUM_TYPES];
for (ListIterator iter = pools.listIterator(); iter.hasNext();) { for (ListIterator iter = pools.listIterator(); iter.hasNext();) {
...@@ -90,6 +94,16 @@ public class MemoryTest { ...@@ -90,6 +94,16 @@ public class MemoryTest {
if (pool.getType() == MemoryType.NON_HEAP) { if (pool.getType() == MemoryType.NON_HEAP) {
numPools[NONHEAP]++; numPools[NONHEAP]++;
} }
if (pool.getName().toLowerCase().contains("perm")) {
hasPerm = true;
}
}
if (hasPerm) {
// If the VM has perm gen there will be between 2 and 4 non heap
// pools (4 if class data sharing is used)
expectedMinNumPools[NONHEAP] = 2;
expectedMaxNumPools[NONHEAP] = 4;
} }
// Check the number of Memory pools // Check the number of Memory pools
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 4678055 * @bug 4678055
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main B4678055 * @run main B4678055
* @summary Basic Authentication fails with multiple realms * @summary Basic Authentication fails with multiple realms
*/ */
...@@ -119,13 +119,13 @@ public class B4678055 implements HttpCallback { ...@@ -119,13 +119,13 @@ public class B4678055 implements HttpCallback {
is.close(); is.close();
} }
static HttpServer server; static TestHttpServer server;
public static void main (String[] args) throws Exception { public static void main (String[] args) throws Exception {
MyAuthenticator auth = new MyAuthenticator (); MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth); Authenticator.setDefault (auth);
try { try {
server = new HttpServer (new B4678055(), 1, 10, 0); server = new TestHttpServer (new B4678055(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort()); System.out.println ("Server: listening on port: " + server.getLocalPort());
client ("http://localhost:"+server.getLocalPort()+"/d1/foo.html"); client ("http://localhost:"+server.getLocalPort()+"/d1/foo.html");
client ("http://localhost:"+server.getLocalPort()+"/d2/foo.html"); client ("http://localhost:"+server.getLocalPort()+"/d2/foo.html");
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 4722333 * @bug 4722333
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main B4722333 * @run main B4722333
* @summary JRE Proxy Authentication Not Working with ISA2000 * @summary JRE Proxy Authentication Not Working with ISA2000
*/ */
...@@ -114,13 +114,13 @@ public class B4722333 implements HttpCallback { ...@@ -114,13 +114,13 @@ public class B4722333 implements HttpCallback {
is.close(); is.close();
} }
static HttpServer server; static TestHttpServer server;
public static void main (String[] args) throws Exception { public static void main (String[] args) throws Exception {
MyAuthenticator auth = new MyAuthenticator (); MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth); Authenticator.setDefault (auth);
try { try {
server = new HttpServer (new B4722333(), 1, 10, 0); server = new TestHttpServer (new B4722333(), 1, 10, 0);
System.out.println ("Server started: listening on port: " + server.getLocalPort()); System.out.println ("Server started: listening on port: " + server.getLocalPort());
client ("http://localhost:"+server.getLocalPort()+"/d1/d2/d3/foo.html"); client ("http://localhost:"+server.getLocalPort()+"/d1/d2/d3/foo.html");
client ("http://localhost:"+server.getLocalPort()+"/ASD/d3/x.html"); client ("http://localhost:"+server.getLocalPort()+"/ASD/d3/x.html");
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 4759514 * @bug 4759514
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main B4759514 * @run main B4759514
* @summary Digest Authentication is erroniously quoting the nc value, contrary to RFC 2617 * @summary Digest Authentication is erroniously quoting the nc value, contrary to RFC 2617
*/ */
...@@ -91,13 +91,13 @@ public class B4759514 implements HttpCallback { ...@@ -91,13 +91,13 @@ public class B4759514 implements HttpCallback {
is.close(); is.close();
} }
static HttpServer server; static TestHttpServer server;
public static void main (String[] args) throws Exception { public static void main (String[] args) throws Exception {
MyAuthenticator auth = new MyAuthenticator (); MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth); Authenticator.setDefault (auth);
try { try {
server = new HttpServer (new B4759514(), 1, 10, 0); server = new TestHttpServer (new B4759514(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort()); System.out.println ("Server: listening on port: " + server.getLocalPort());
client ("http://localhost:"+server.getLocalPort()+"/d1/foo.html"); client ("http://localhost:"+server.getLocalPort()+"/d1/foo.html");
} catch (Exception e) { } catch (Exception e) {
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 4769350 * @bug 4769350
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction AbstractCallback * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction AbstractCallback
* @run main/othervm B4769350 server * @run main/othervm B4769350 server
* @run main/othervm B4769350 proxy * @run main/othervm B4769350 proxy
* @summary proxy authentication username and password caching only works in serial case * @summary proxy authentication username and password caching only works in serial case
...@@ -142,10 +142,10 @@ public class B4769350 { ...@@ -142,10 +142,10 @@ public class B4769350 {
switch (count) { switch (count) {
case 0: case 0:
errorReply (req, "Basic realm=\"realm1\""); errorReply (req, "Basic realm=\"realm1\"");
HttpServer.rendezvous ("one", 2); TestHttpServer.rendezvous ("one", 2);
break; break;
case 1: case 1:
HttpServer.waitForCondition ("cond2"); TestHttpServer.waitForCondition ("cond2");
okReply (req); okReply (req);
break; break;
default: default:
...@@ -158,11 +158,11 @@ public class B4769350 { ...@@ -158,11 +158,11 @@ public class B4769350 {
switch (count) { switch (count) {
case 0: case 0:
errorReply (req, "Basic realm=\"realm2\""); errorReply (req, "Basic realm=\"realm2\"");
HttpServer.rendezvous ("one", 2); TestHttpServer.rendezvous ("one", 2);
HttpServer.setCondition ("cond1"); TestHttpServer.setCondition ("cond1");
break; break;
case 1: case 1:
HttpServer.waitForCondition ("cond2"); TestHttpServer.waitForCondition ("cond2");
okReply (req); okReply (req);
break; break;
default: default:
...@@ -174,7 +174,7 @@ public class B4769350 { ...@@ -174,7 +174,7 @@ public class B4769350 {
switch (count) { switch (count) {
case 0: case 0:
errorReply (req, "Basic realm=\"realm1\""); errorReply (req, "Basic realm=\"realm1\"");
HttpServer.rendezvous ("two", 2); TestHttpServer.rendezvous ("two", 2);
break; break;
case 1: case 1:
okReply (req); okReply (req);
...@@ -188,8 +188,8 @@ public class B4769350 { ...@@ -188,8 +188,8 @@ public class B4769350 {
switch (count) { switch (count) {
case 0: case 0:
errorReply (req, "Basic realm=\"realm2\""); errorReply (req, "Basic realm=\"realm2\"");
HttpServer.rendezvous ("two", 2); TestHttpServer.rendezvous ("two", 2);
HttpServer.setCondition ("cond2"); TestHttpServer.setCondition ("cond2");
break; break;
case 1: case 1:
okReply (req); okReply (req);
...@@ -207,7 +207,7 @@ public class B4769350 { ...@@ -207,7 +207,7 @@ public class B4769350 {
void doT2a (HttpTransaction req, int count) throws IOException { void doT2a (HttpTransaction req, int count) throws IOException {
/* This will be called several times */ /* This will be called several times */
if (count == 1) { if (count == 1) {
HttpServer.setCondition ("T2cond1"); TestHttpServer.setCondition ("T2cond1");
} }
errorReply (req, "Basic realm=\"realm3\""); errorReply (req, "Basic realm=\"realm3\"");
} }
...@@ -233,7 +233,7 @@ public class B4769350 { ...@@ -233,7 +233,7 @@ public class B4769350 {
switch (count) { switch (count) {
case 0: case 0:
proxyReply (req, "Basic realm=\"proxy\""); proxyReply (req, "Basic realm=\"proxy\"");
HttpServer.setCondition ("T3cond1"); TestHttpServer.setCondition ("T3cond1");
break; break;
case 1: case 1:
errorReply (req, "Basic realm=\"realm4\""); errorReply (req, "Basic realm=\"realm4\"");
...@@ -260,7 +260,7 @@ public class B4769350 { ...@@ -260,7 +260,7 @@ public class B4769350 {
} }
}; };
static HttpServer server; static TestHttpServer server;
static MyAuthenticator auth = new MyAuthenticator (); static MyAuthenticator auth = new MyAuthenticator ();
static int redirects = 4; static int redirects = 4;
...@@ -276,7 +276,7 @@ public class B4769350 { ...@@ -276,7 +276,7 @@ public class B4769350 {
c4 = new Client (authority, "/test/realm2/t1d", false); c4 = new Client (authority, "/test/realm2/t1d", false);
c1.start(); c2.start(); c1.start(); c2.start();
HttpServer.waitForCondition ("cond1"); TestHttpServer.waitForCondition ("cond1");
c3.start(); c4.start(); c3.start(); c4.start();
c1.join(); c2.join(); c3.join(); c4.join(); c1.join(); c2.join(); c3.join(); c4.join();
...@@ -294,7 +294,7 @@ public class B4769350 { ...@@ -294,7 +294,7 @@ public class B4769350 {
c5 = new Client (authority, "/test/realm3/t2a", true); c5 = new Client (authority, "/test/realm3/t2a", true);
c6 = new Client (authority, "/test/realm3/t2b", false); c6 = new Client (authority, "/test/realm3/t2b", false);
c5.start (); c5.start ();
HttpServer.waitForCondition ("T2cond1"); TestHttpServer.waitForCondition ("T2cond1");
c6.start (); c6.start ();
c5.join(); c6.join(); c5.join(); c6.join();
...@@ -313,7 +313,7 @@ public class B4769350 { ...@@ -313,7 +313,7 @@ public class B4769350 {
c8 = new Client (authority, "/test/realm4/t3b", false); c8 = new Client (authority, "/test/realm4/t3b", false);
c9 = new Client (authority, "/test/realm4/t3c", false); c9 = new Client (authority, "/test/realm4/t3c", false);
c7.start (); c7.start ();
HttpServer.waitForCondition ("T3cond1"); TestHttpServer.waitForCondition ("T3cond1");
c8.start (); c8.start ();
c9.start (); c9.start ();
c7.join(); c8.join(); c9.join(); c7.join(); c8.join(); c9.join();
...@@ -333,7 +333,7 @@ public class B4769350 { ...@@ -333,7 +333,7 @@ public class B4769350 {
Authenticator.setDefault (auth); Authenticator.setDefault (auth);
boolean proxy = args[0].equals ("proxy"); boolean proxy = args[0].equals ("proxy");
try { try {
server = new HttpServer (new CallBack(), 10, 1, 0); server = new TestHttpServer (new CallBack(), 10, 1, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort()); System.out.println ("Server: listening on port: " + server.getLocalPort());
if (proxy) { if (proxy) {
System.setProperty ("http.proxyHost", "localhost"); System.setProperty ("http.proxyHost", "localhost");
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 4921848 * @bug 4921848
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main/othervm -Dhttp.auth.preference=basic B4921848 * @run main/othervm -Dhttp.auth.preference=basic B4921848
* @summary Allow user control over authentication schemes * @summary Allow user control over authentication schemes
*/ */
...@@ -82,13 +82,13 @@ public class B4921848 implements HttpCallback { ...@@ -82,13 +82,13 @@ public class B4921848 implements HttpCallback {
is.close(); is.close();
} }
static HttpServer server; static TestHttpServer server;
public static void main (String[] args) throws Exception { public static void main (String[] args) throws Exception {
MyAuthenticator auth = new MyAuthenticator (); MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth); Authenticator.setDefault (auth);
try { try {
server = new HttpServer (new B4921848(), 1, 10, 0); server = new TestHttpServer (new B4921848(), 1, 10, 0);
System.out.println ("Server started: listening on port: " + server.getLocalPort()); System.out.println ("Server started: listening on port: " + server.getLocalPort());
client ("http://localhost:"+server.getLocalPort()+"/d1/d2/d3/foo.html"); client ("http://localhost:"+server.getLocalPort()+"/d1/d2/d3/foo.html");
} catch (Exception e) { } catch (Exception e) {
......
...@@ -119,7 +119,7 @@ public class B4933582 implements HttpCallback { ...@@ -119,7 +119,7 @@ public class B4933582 implements HttpCallback {
is.close(); is.close();
} }
static HttpServer server; static TestHttpServer server;
public static void main (String[] args) throws Exception { public static void main (String[] args) throws Exception {
firstTime = args[0].equals ("first"); firstTime = args[0].equals ("first");
...@@ -128,11 +128,11 @@ public class B4933582 implements HttpCallback { ...@@ -128,11 +128,11 @@ public class B4933582 implements HttpCallback {
CacheImpl cache; CacheImpl cache;
try { try {
if (firstTime) { if (firstTime) {
server = new HttpServer (new B4933582(), 1, 10, 0); server = new TestHttpServer (new B4933582(), 1, 10, 0);
cache = new CacheImpl (server.getLocalPort()); cache = new CacheImpl (server.getLocalPort());
} else { } else {
cache = new CacheImpl (); cache = new CacheImpl ();
server = new HttpServer(new B4933582(), 1, 10, cache.getPort()); server = new TestHttpServer(new B4933582(), 1, 10, cache.getPort());
} }
AuthCacheValue.setAuthCache (cache); AuthCacheValue.setAuthCache (cache);
System.out.println ("Server: listening on port: " + server.getLocalPort()); System.out.println ("Server: listening on port: " + server.getLocalPort());
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 4962064 * @bug 4962064
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main/othervm B4962064 * @run main/othervm B4962064
* @summary Extend Authenticator to provide access to request URI and server/proxy * @summary Extend Authenticator to provide access to request URI and server/proxy
*/ */
...@@ -85,12 +85,12 @@ public class B4962064 implements HttpCallback { ...@@ -85,12 +85,12 @@ public class B4962064 implements HttpCallback {
is.close(); is.close();
} }
static HttpServer server; static TestHttpServer server;
static URL urlsave; static URL urlsave;
public static void main (String[] args) throws Exception { public static void main (String[] args) throws Exception {
try { try {
server = new HttpServer (new B4962064(), 1, 10, 0); server = new TestHttpServer (new B4962064(), 1, 10, 0);
int port = server.getLocalPort(); int port = server.getLocalPort();
System.setProperty ("http.proxyHost", "localhost"); System.setProperty ("http.proxyHost", "localhost");
System.setProperty ("http.proxyPort", Integer.toString (port)); System.setProperty ("http.proxyPort", Integer.toString (port));
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
* @summary Unit test for java.net.CookieManager * @summary Unit test for java.net.CookieManager
* @bug 6244040 * @bug 6244040
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main/othervm -ea CookieManagerTest * @run main/othervm -ea CookieManagerTest
* @author Edward Wang * @author Edward Wang
*/ */
...@@ -38,7 +38,7 @@ import sun.net.www.MessageHeader; ...@@ -38,7 +38,7 @@ import sun.net.www.MessageHeader;
public class CookieManagerTest { public class CookieManagerTest {
static CookieHttpTransaction httpTrans; static CookieHttpTransaction httpTrans;
static HttpServer server; static TestHttpServer server;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
startHttpServer(); startHttpServer();
...@@ -52,7 +52,7 @@ public class CookieManagerTest { ...@@ -52,7 +52,7 @@ public class CookieManagerTest {
public static void startHttpServer() { public static void startHttpServer() {
try { try {
httpTrans = new CookieHttpTransaction(); httpTrans = new CookieHttpTransaction();
server = new HttpServer(httpTrans, 1, 1, 0); server = new TestHttpServer(httpTrans, 1, 1, 0);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
......
...@@ -41,14 +41,13 @@ public class GetLocalHostWithSM { ...@@ -41,14 +41,13 @@ public class GetLocalHostWithSM {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
// try setting the local hostname // try setting the local hostname
try { InetAddress localHost = InetAddress.getLocalHost();
System.setProperty("host.name", InetAddress. if (localHost.isLoopbackAddress()) {
getLocalHost(). System.err.println("Local host name is resolved into a loopback address. Quit now!");
getHostName()); return;
} catch (UnknownHostException e) {
System.out.println("Cannot find the local hostname, " +
"no nameserver entry found");
} }
System.setProperty("host.name", localHost.
getHostName());
String policyFileName = System.getProperty("test.src", ".") + String policyFileName = System.getProperty("test.src", ".") +
"/" + "policy.file"; "/" + "policy.file";
System.setProperty("java.security.policy", policyFileName); System.setProperty("java.security.policy", policyFileName);
...@@ -66,6 +65,7 @@ public class GetLocalHostWithSM { ...@@ -66,6 +65,7 @@ public class GetLocalHostWithSM {
new MyAction(), null); new MyAction(), null);
if (localHost1.equals(localHost2)) { if (localHost1.equals(localHost2)) {
System.out.println("localHost1 = " + localHost1);
throw new RuntimeException("InetAddress.getLocalHost() test " + throw new RuntimeException("InetAddress.getLocalHost() test " +
" fails. localHost2 should be " + " fails. localHost2 should be " +
" the real address instead of " + " the real address instead of " +
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @bug 4924226 * @bug 4924226
* @summary PIT: Can no launch jnlp application via 127.0.0.1 address on the web server * @summary PIT: Can no launch jnlp application via 127.0.0.1 address on the web server
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build ClosedChannelList HttpServer HttpTransaction HttpCallback * @build ClosedChannelList TestHttpServer HttpTransaction HttpCallback
* @compile LoopbackAddresses.java * @compile LoopbackAddresses.java
* @run main/othervm LoopbackAddresses * @run main/othervm LoopbackAddresses
*/ */
...@@ -39,7 +39,7 @@ import java.io.*; ...@@ -39,7 +39,7 @@ import java.io.*;
*/ */
public class LoopbackAddresses implements HttpCallback { public class LoopbackAddresses implements HttpCallback {
static HttpServer server; static TestHttpServer server;
public void request (HttpTransaction req) { public void request (HttpTransaction req) {
req.setResponseEntityBody ("Hello ."); req.setResponseEntityBody ("Hello .");
...@@ -52,7 +52,7 @@ public class LoopbackAddresses implements HttpCallback { ...@@ -52,7 +52,7 @@ public class LoopbackAddresses implements HttpCallback {
public static void main(String[] args) { public static void main(String[] args) {
try { try {
server = new HttpServer (new LoopbackAddresses(), 1, 10, 0); server = new TestHttpServer (new LoopbackAddresses(), 1, 10, 0);
ProxyServer pserver = new ProxyServer(InetAddress.getByName("localhost"), server.getLocalPort()); ProxyServer pserver = new ProxyServer(InetAddress.getByName("localhost"), server.getLocalPort());
// start proxy server // start proxy server
new Thread(pserver).start(); new Thread(pserver).start();
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
* @bug 4696512 * @bug 4696512
* @summary HTTP client: Improve proxy server configuration and selection * @summary HTTP client: Improve proxy server configuration and selection
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build ClosedChannelList HttpServer HttpTransaction HttpCallback * @build ClosedChannelList TestHttpServer HttpTransaction HttpCallback
* @compile ProxyTest.java * @compile ProxyTest.java
* @run main/othervm -Dhttp.proxyHost=inexistant -Dhttp.proxyPort=8080 ProxyTest * @run main/othervm -Dhttp.proxyHost=inexistant -Dhttp.proxyPort=8080 ProxyTest
*/ */
...@@ -36,7 +36,7 @@ import java.io.*; ...@@ -36,7 +36,7 @@ import java.io.*;
import java.util.ArrayList; import java.util.ArrayList;
public class ProxyTest implements HttpCallback { public class ProxyTest implements HttpCallback {
static HttpServer server; static TestHttpServer server;
public ProxyTest() { public ProxyTest() {
} }
...@@ -74,7 +74,7 @@ public class ProxyTest implements HttpCallback { ...@@ -74,7 +74,7 @@ public class ProxyTest implements HttpCallback {
throw new RuntimeException("Default ProxySelector is null"); throw new RuntimeException("Default ProxySelector is null");
ProxySelector.setDefault(new MyProxySelector()); ProxySelector.setDefault(new MyProxySelector());
try { try {
server = new HttpServer (new ProxyTest(), 1, 10, 0); server = new TestHttpServer (new ProxyTest(), 1, 10, 0);
URL url = new URL("http://localhost:"+server.getLocalPort()); URL url = new URL("http://localhost:"+server.getLocalPort());
System.out.println ("client opening connection to: " + url); System.out.println ("client opening connection to: " + url);
HttpURLConnection urlc = (HttpURLConnection)url.openConnection (); HttpURLConnection urlc = (HttpURLConnection)url.openConnection ();
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @bug 4920526 * @bug 4920526
* @summary Needs per connection proxy support for URLs * @summary Needs per connection proxy support for URLs
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build ClosedChannelList HttpServer HttpTransaction HttpCallback * @build ClosedChannelList TestHttpServer HttpTransaction HttpCallback
* @compile PerConnectionProxy.java * @compile PerConnectionProxy.java
* @run main/othervm -Dhttp.proxyHost=inexistant -Dhttp.proxyPort=8080 PerConnectionProxy * @run main/othervm -Dhttp.proxyHost=inexistant -Dhttp.proxyPort=8080 PerConnectionProxy
*/ */
...@@ -35,7 +35,7 @@ import java.io.*; ...@@ -35,7 +35,7 @@ import java.io.*;
import sun.net.www.*; import sun.net.www.*;
public class PerConnectionProxy implements HttpCallback { public class PerConnectionProxy implements HttpCallback {
static HttpServer server; static TestHttpServer server;
public void request (HttpTransaction req) { public void request (HttpTransaction req) {
req.setResponseEntityBody ("Hello ."); req.setResponseEntityBody ("Hello .");
...@@ -48,7 +48,7 @@ public class PerConnectionProxy implements HttpCallback { ...@@ -48,7 +48,7 @@ public class PerConnectionProxy implements HttpCallback {
public static void main(String[] args) { public static void main(String[] args) {
try { try {
server = new HttpServer (new PerConnectionProxy(), 1, 10, 0); server = new TestHttpServer (new PerConnectionProxy(), 1, 10, 0);
ProxyServer pserver = new ProxyServer(InetAddress.getByName("localhost"), server.getLocalPort()); ProxyServer pserver = new ProxyServer(InetAddress.getByName("localhost"), server.getLocalPort());
// start proxy server // start proxy server
new Thread(pserver).start(); new Thread(pserver).start();
......
...@@ -128,7 +128,7 @@ public class CloseTest extends Common { ...@@ -128,7 +128,7 @@ public class CloseTest extends Common {
// load tests // load tests
loadClass ("com.foo.TestClass1", loader, false); loadClass ("com.foo.TestClass1", loader, false);
loadClass ("com.foo.TestClass", loader, true); loadClass ("com.foo.TestClass", loader, true);
loadClass ("java.awt.Button", loader, true); loadClass ("java.sql.Array", loader, true);
// now check we can delete the path // now check we can delete the path
rm_minus_rf (new File(name)); rm_minus_rf (new File(name));
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 5052093 * @bug 5052093
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main B5052093 * @run main B5052093
* @summary URLConnection doesn't support large files * @summary URLConnection doesn't support large files
*/ */
...@@ -34,7 +34,7 @@ import java.io.*; ...@@ -34,7 +34,7 @@ import java.io.*;
import sun.net.www.protocol.file.FileURLConnection; import sun.net.www.protocol.file.FileURLConnection;
public class B5052093 implements HttpCallback { public class B5052093 implements HttpCallback {
private static HttpServer server; private static TestHttpServer server;
private static long testSize = ((long) (Integer.MAX_VALUE)) + 2; private static long testSize = ((long) (Integer.MAX_VALUE)) + 2;
public static class LargeFile extends File { public static class LargeFile extends File {
...@@ -63,7 +63,7 @@ public class B5052093 implements HttpCallback { ...@@ -63,7 +63,7 @@ public class B5052093 implements HttpCallback {
} }
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
server = new HttpServer(new B5052093(), 1, 10, 0); server = new TestHttpServer(new B5052093(), 1, 10, 0);
try { try {
URL url = new URL("http://localhost:"+server.getLocalPort()+"/foo"); URL url = new URL("http://localhost:"+server.getLocalPort()+"/foo");
URLConnection conn = url.openConnection(); URLConnection conn = url.openConnection();
......
/* /*
* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -22,17 +22,24 @@ ...@@ -22,17 +22,24 @@
*/ */
/* @test /* @test
* @bug 4460583 4470470 4840199 6419424 6710579 6596323 6824135 6395224 * @bug 4460583 4470470 4840199 6419424 6710579 6596323 6824135 6395224 7142919
* @run main/othervm AsyncCloseAndInterrupt
* @summary Comprehensive test of asynchronous closing and interruption * @summary Comprehensive test of asynchronous closing and interruption
* @author Mark Reinhold * @author Mark Reinhold
*/ */
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import java.nio.*;
import java.nio.channels.*; import java.nio.channels.*;
import java.util.*; import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class AsyncCloseAndInterrupt { public class AsyncCloseAndInterrupt {
...@@ -79,45 +86,12 @@ public class AsyncCloseAndInterrupt { ...@@ -79,45 +86,12 @@ public class AsyncCloseAndInterrupt {
// Server socket that refuses all connections // Server socket that refuses all connections
static ServerSocketChannel refuser; static ServerSocketChannel refuser;
static List refuserClients = new ArrayList();
private static void initRefuser() throws IOException { private static void initRefuser() throws IOException {
refuser = ServerSocketChannel.open(); refuser = ServerSocketChannel.open();
refuser.socket().bind(wildcardAddress); refuser.socket().bind(wildcardAddress);
pumpRefuser("Initializing refuser...");
} }
private static void pumpRefuser(String msg) throws IOException {
// Can't reliably saturate connection backlog on Windows Server editions
assert !TestUtil.onWindows();
log.print(msg);
int n = refuserClients.size();
// Saturate the refuser's connection backlog so that further connection
// attempts will block
//
outer:
for (;;) {
SocketChannel sc = SocketChannel.open();
sc.configureBlocking(false);
if (!sc.connect(refuser.socket().getLocalSocketAddress())) {
for (int i = 0; i < 20; i++) {
Thread.yield();
if (sc.finishConnect())
break;
if (i >= 19)
break outer;
}
}
// Retain so that finalizer doesn't close
refuserClients.add(sc);
}
log.println(" " + (refuserClients.size() - n) + " connections");
}
// Dead pipe source and sink // Dead pipe source and sink
static Pipe.SourceChannel deadSource; static Pipe.SourceChannel deadSource;
...@@ -374,8 +348,8 @@ public class AsyncCloseAndInterrupt { ...@@ -374,8 +348,8 @@ public class AsyncCloseAndInterrupt {
}; };
static final Op CONNECT = new Op("connect") { static final Op CONNECT = new Op("connect") {
void setup() throws IOException { void setup() {
pumpRefuser("Pumping refuser ..."); waitPump("connect wait for pumping refuser ...");
} }
void doIO(InterruptibleChannel ich) throws IOException { void doIO(InterruptibleChannel ich) throws IOException {
SocketChannel sc = (SocketChannel)ich; SocketChannel sc = (SocketChannel)ich;
...@@ -386,8 +360,8 @@ public class AsyncCloseAndInterrupt { ...@@ -386,8 +360,8 @@ public class AsyncCloseAndInterrupt {
}; };
static final Op FINISH_CONNECT = new Op("finishConnect") { static final Op FINISH_CONNECT = new Op("finishConnect") {
void setup() throws IOException { void setup() {
pumpRefuser("Pumping refuser ..."); waitPump("finishConnect wait for pumping refuser ...");
} }
void doIO(InterruptibleChannel ich) throws IOException { void doIO(InterruptibleChannel ich) throws IOException {
SocketChannel sc = (SocketChannel)ich; SocketChannel sc = (SocketChannel)ich;
...@@ -462,6 +436,7 @@ public class AsyncCloseAndInterrupt { ...@@ -462,6 +436,7 @@ public class AsyncCloseAndInterrupt {
this.test = test; this.test = test;
} }
@SuppressWarnings("fallthrough")
private void caught(Channel ch, IOException x) { private void caught(Channel ch, IOException x) {
String xn = x.getClass().getName(); String xn = x.getClass().getName();
switch (test) { switch (test) {
...@@ -519,9 +494,63 @@ public class AsyncCloseAndInterrupt { ...@@ -519,9 +494,63 @@ public class AsyncCloseAndInterrupt {
} }
private static volatile boolean pumpDone = false;
private static volatile boolean pumpReady = false;
// Tests private static void waitPump(String msg){
pumpReady = false;
log.println(msg);
while (!pumpReady){
sleep(200);
}
}
// Create a pump thread dedicated to saturate refuser's connection backlog
private static Future<Integer> pumpRefuser(ExecutorService pumperExecutor) {
Callable<Integer> pumpTask = new Callable<Integer>() {
@Override
public Integer call() throws IOException {
// Can't reliably saturate connection backlog on Windows Server editions
assert !TestUtil.onWindows();
log.println("Start pumping refuser ...");
List<SocketChannel> refuserClients = new ArrayList<>();
// Saturate the refuser's connection backlog so that further connection
// attempts will be blocked
while (!pumpDone) {
SocketChannel sc = SocketChannel.open();
sc.configureBlocking(false);
boolean connected = sc.connect(refuser.socket().getLocalSocketAddress());
// Assume that the connection backlog is saturated if a
// client cannot connect to the refuser within 50 miliseconds
long start = System.currentTimeMillis();
while (!connected && (System.currentTimeMillis() - start < 50)) {
connected = sc.finishConnect();
}
if (connected) {
// Retain so that finalizer doesn't close
refuserClients.add(sc);
pumpReady = false;
} else {
sc.close();
pumpReady = true;
}
}
log.println("Stop pumping refuser ...");
return refuserClients.size();
}
};
return pumperExecutor.submit(pumpTask);
}
// Test
static void test(ChannelFactory cf, Op op, int test) static void test(ChannelFactory cf, Op op, int test)
throws Exception throws Exception
{ {
...@@ -667,15 +696,40 @@ public class AsyncCloseAndInterrupt { ...@@ -667,15 +696,40 @@ public class AsyncCloseAndInterrupt {
log.println("WARNING Cannot reliably test connect/finishConnect" log.println("WARNING Cannot reliably test connect/finishConnect"
+ " operations on Windows"); + " operations on Windows");
} else { } else {
// Only the following tests need refuser's connection backlog
// to be saturated
ExecutorService pumperExecutor =
Executors.newSingleThreadExecutor(
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
t.setName("Pumper");
return t;
}
});
pumpDone = false;
try {
Future<Integer> pumpFuture = pumpRefuser(pumperExecutor);
waitPump("\nWait for initial Pump");
test(socketChannelFactory, CONNECT); test(socketChannelFactory, CONNECT);
test(socketChannelFactory, FINISH_CONNECT); test(socketChannelFactory, FINISH_CONNECT);
pumpDone = true;
Integer newConn = pumpFuture.get(30, TimeUnit.SECONDS);
log.println("Pump " + newConn + " connections.");
} finally {
pumperExecutor.shutdown();
}
} }
test(serverSocketChannelFactory, ACCEPT); test(serverSocketChannelFactory, ACCEPT);
test(datagramChannelFactory); test(datagramChannelFactory);
test(pipeSourceChannelFactory); test(pipeSourceChannelFactory);
test(pipeSinkChannelFactory); test(pipeSinkChannelFactory);
} }
} }
/* /*
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -22,11 +22,12 @@ ...@@ -22,11 +22,12 @@
*/ */
import java.io.*; import java.io.*;
import java.text.*;
import java.util.*; import java.util.*;
import java.util.regex.*; import java.util.regex.*;
public class PropertiesTest { public class PropertiesTest {
public static void main(String[] s) { public static void main(String[] s) throws Exception {
for (int i = 0; i < s.length; i ++) { for (int i = 0; i < s.length; i ++) {
if ("-d".equals(s[i])) { if ("-d".equals(s[i])) {
i++; i++;
...@@ -76,7 +77,7 @@ public class PropertiesTest { ...@@ -76,7 +77,7 @@ public class PropertiesTest {
pw.close(); pw.close();
} }
private static void compare(String beforeFile, String afterFile) { private static void compare(String beforeFile, String afterFile) throws Exception {
// load file contents // load file contents
Properties before = new Properties(); Properties before = new Properties();
Properties after = new Properties(); Properties after = new Properties();
...@@ -114,11 +115,23 @@ public class PropertiesTest { ...@@ -114,11 +115,23 @@ public class PropertiesTest {
// test each replacements // test each replacements
keys = p.stringPropertyNames(); keys = p.stringPropertyNames();
Pattern propertiesPattern = Pattern propertiesPattern =
Pattern.compile("([A-Z]{3})\\s*,\\s*(\\d{3})\\s*,\\s*([0-3])"); Pattern.compile("([A-Z]{3})\\s*,\\s*(\\d{3})\\s*,\\s*" +
"([0-3])\\s*,?\\s*(\\d{4}-\\d{2}-\\d{2}T\\d{2}:" +
"\\d{2}:\\d{2})?");
for (String key: keys) { for (String key: keys) {
String val = p.getProperty(key); String val = p.getProperty(key);
try {
if (countOccurrences(val, ',') == 3 && !isPastCutoverDate(val)) {
System.out.println("Skipping since date is in future");
continue; // skip since date in future (no effect)
}
} catch (ParseException pe) {
// swallow - currency class should not honour this value
continue;
}
String afterVal = after.getProperty(key); String afterVal = after.getProperty(key);
System.out.printf("Testing key: %s, val: %s... ", key, val); System.out.printf("Testing key: %s, val: %s... ", key, val);
System.out.println("AfterVal is : " + afterVal);
Matcher m = propertiesPattern.matcher(val.toUpperCase(Locale.ROOT)); Matcher m = propertiesPattern.matcher(val.toUpperCase(Locale.ROOT));
if (!m.find()) { if (!m.find()) {
...@@ -131,7 +144,6 @@ public class PropertiesTest { ...@@ -131,7 +144,6 @@ public class PropertiesTest {
// ignore this // ignore this
continue; continue;
} }
Matcher mAfter = propertiesPattern.matcher(afterVal); Matcher mAfter = propertiesPattern.matcher(afterVal);
mAfter.find(); mAfter.find();
...@@ -164,4 +176,29 @@ public class PropertiesTest { ...@@ -164,4 +176,29 @@ public class PropertiesTest {
throw new RuntimeException(sb.toString()); throw new RuntimeException(sb.toString());
} }
} }
private static boolean isPastCutoverDate(String s)
throws IndexOutOfBoundsException, NullPointerException, ParseException {
String dateString = s.substring(s.lastIndexOf(',')+1, s.length()).trim();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ROOT);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
format.setLenient(false);
long time = format.parse(dateString).getTime();
if (System.currentTimeMillis() - time >= 0L) {
return true;
} else {
return false;
}
}
private static int countOccurrences(String value, char match) {
int count = 0;
for (char c : value.toCharArray()) {
if (c == match) {
++count;
}
}
return count;
}
} }
#!/bin/sh #!/bin/sh
# #
# @test # @test
# @bug 6332666 # @bug 6332666 7180362
# @summary tests the capability of replacing the currency data with user # @summary tests the capability of replacing the currency data with user
# specified currency properties file # specified currency properties file
# @build PropertiesTest # @build PropertiesTest
......
...@@ -2,9 +2,19 @@ ...@@ -2,9 +2,19 @@
# Test data for replacing the currency data # Test data for replacing the currency data
# #
JP=JPZ,123,2 JP=JPZ,123,2
US=euR,978,2 ES=ESD,877,2
US=euR,978,2,2001-01-01T00:00:00
CM=IED,111,2, 2004-01-01T00:70:00
SB=EUR,111,2, 2099-01-01T00:00:00
ZZ = ZZZ , 999 , 3 ZZ = ZZZ , 999 , 3
NO=EUR ,978 ,2, 2099-01-01T00:00:00
# invalid entries # invalid entries
GB=123 GB=123
FR=zzzzz.123 FR=zzzzz.123
DE=2009-01-01T00:00:00,EUR,111,2
IE=euR,111,2,#testcomment
=euR,111,2, 2099-01-01-00-00-00
FM=DED,194,2,eeee-01-01T00:00:00
PE=EUR ,978 ,2, 20399-01-01T00:00:00
MX=SSS,493,2,2001-01-01-00-00-00
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
/* /*
* @test * @test
* @bug 7126277 * @bug 7126277
* @run main Collisions -shortrun
* @run main/othervm -Djdk.map.althashing.threshold=0 Collisions -shortrun
* @summary Ensure Maps behave well with lots of hashCode() collisions. * @summary Ensure Maps behave well with lots of hashCode() collisions.
* @author Mike Duigou * @author Mike Duigou
*/ */
...@@ -33,6 +35,11 @@ import java.util.concurrent.ConcurrentSkipListMap; ...@@ -33,6 +35,11 @@ import java.util.concurrent.ConcurrentSkipListMap;
public class Collisions { public class Collisions {
/**
* Number of elements per map.
*/
private static final int TEST_SIZE = 5000;
final static class HashableInteger implements Comparable<HashableInteger> { final static class HashableInteger implements Comparable<HashableInteger> {
final int value; final int value;
...@@ -64,20 +71,19 @@ public class Collisions { ...@@ -64,20 +71,19 @@ public class Collisions {
return value - o.value; return value - o.value;
} }
@Override
public String toString() { public String toString() {
return Integer.toString(value); return Integer.toString(value);
} }
} }
private static final int ITEMS = 5000;
private static final Object KEYS[][];
static { private static Object[][] makeTestData(int size) {
HashableInteger UNIQUE_OBJECTS[] = new HashableInteger[ITEMS]; HashableInteger UNIQUE_OBJECTS[] = new HashableInteger[size];
HashableInteger COLLIDING_OBJECTS[] = new HashableInteger[ITEMS]; HashableInteger COLLIDING_OBJECTS[] = new HashableInteger[size];
String UNIQUE_STRINGS[] = new String[ITEMS]; String UNIQUE_STRINGS[] = new String[size];
String COLLIDING_STRINGS[] = new String[ITEMS]; String COLLIDING_STRINGS[] = new String[size];
for (int i = 0; i < ITEMS; i++) { for (int i = 0; i < size; i++) {
UNIQUE_OBJECTS[i] = new HashableInteger(i, Integer.MAX_VALUE); UNIQUE_OBJECTS[i] = new HashableInteger(i, Integer.MAX_VALUE);
COLLIDING_OBJECTS[i] = new HashableInteger(i, 10); COLLIDING_OBJECTS[i] = new HashableInteger(i, 10);
UNIQUE_STRINGS[i] = unhash(i); UNIQUE_STRINGS[i] = unhash(i);
...@@ -86,7 +92,7 @@ public class Collisions { ...@@ -86,7 +92,7 @@ public class Collisions {
: "\u0000\u0000\u0000\u0000\u0000" + COLLIDING_STRINGS[i - 1]; : "\u0000\u0000\u0000\u0000\u0000" + COLLIDING_STRINGS[i - 1];
} }
KEYS = new Object[][] { return new Object[][] {
new Object[]{"Unique Objects", UNIQUE_OBJECTS}, new Object[]{"Unique Objects", UNIQUE_OBJECTS},
new Object[]{"Colliding Objects", COLLIDING_OBJECTS}, new Object[]{"Colliding Objects", COLLIDING_OBJECTS},
new Object[]{"Unique Strings", UNIQUE_STRINGS}, new Object[]{"Unique Strings", UNIQUE_STRINGS},
...@@ -132,19 +138,25 @@ public class Collisions { ...@@ -132,19 +138,25 @@ public class Collisions {
} }
private static void realMain(String[] args) throws Throwable { private static void realMain(String[] args) throws Throwable {
for (Object[] keys_desc : KEYS) { boolean shortRun = args.length > 0 && args[0].equals("-shortrun");
Map<Object, Object>[] MAPS = (Map<Object, Object>[]) new Map[]{
new Hashtable<>(), Object[][] mapKeys = makeTestData(shortRun ? (TEST_SIZE / 2) : TEST_SIZE);
// loop through data sets
for (Object[] keys_desc : mapKeys) {
Map<Object, Object>[] maps = (Map<Object, Object>[]) new Map[]{
new HashMap<>(), new HashMap<>(),
new Hashtable<>(),
new IdentityHashMap<>(), new IdentityHashMap<>(),
new LinkedHashMap<>(), new LinkedHashMap<>(),
new ConcurrentHashMap<>(),
new WeakHashMap<>(),
new TreeMap<>(), new TreeMap<>(),
new WeakHashMap<>(),
new ConcurrentHashMap<>(),
new ConcurrentSkipListMap<>() new ConcurrentSkipListMap<>()
}; };
for (Map<Object, Object> map : MAPS) { // for each map type.
for (Map<Object, Object> map : maps) {
String desc = (String) keys_desc[0]; String desc = (String) keys_desc[0];
Object[] keys = (Object[]) keys_desc[1]; Object[] keys = (Object[]) keys_desc[1];
try { try {
...@@ -397,7 +409,7 @@ public class Collisions { ...@@ -397,7 +409,7 @@ public class Collisions {
} }
public static void main(String[] args) throws Throwable { public static void main(String[] args) throws Throwable {
Thread.currentThread().setName("Collisions"); Thread.currentThread().setName(Collisions.class.getName());
// Thread.currentThread().setPriority(Thread.MAX_PRIORITY); // Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
try { try {
realMain(args); realMain(args);
......
/* /*
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this * published by the Free Software Foundation.
* 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 * This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
......
/* /*
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this * published by the Free Software Foundation.
* 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 * This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
......
/*
* 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 4429876
* @run main GetChildNames
* @summary Tests that the getChildNames method of
* IIOMetadataFormatImpl returns null for a CHILD_POLICY_EMPTY node.
*/
import javax.imageio.metadata.IIOMetadataFormatImpl;
import javax.imageio.ImageTypeSpecifier;
public class GetChildNames {
public static void main(String argv[]) {
GCNFormatImpl fmt = new GCNFormatImpl("root", 1, 10);
fmt.addElement("cc", "root", fmt.CHILD_POLICY_EMPTY);
String[] result = fmt.getChildNames("cc");
if (result != null) {
throw new RuntimeException
("Failed, result is not null: " + result);
}
}
}
class GCNFormatImpl extends IIOMetadataFormatImpl {
GCNFormatImpl(String root, int minChildren, int maxChildren) {
super(root, minChildren, maxChildren);
}
public void addElement(String elementName,
String parentName, int childPolicy) {
super.addElement(elementName, parentName, childPolicy);
}
public boolean canNodeAppear(String elementName,
ImageTypeSpecifier imageType) {
return true;
}
}
/*
* 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 4429875 7186799
* @compile -source 1.4 GetObjectMinValue.java
* @run main GetObjectMinValue
* @summary Tests the getObject{Min,Max}Value method of
* IIOMetadataFormatImpl for an inclusive range
*/
// Compiled with -source 1.4 to work around javac bug 5041233
import javax.imageio.metadata.IIOMetadataFormatImpl;
import javax.imageio.ImageTypeSpecifier;
public class GetObjectMinValue {
public static void main(String argv[]) {
test(true, true);
test(true, false);
test(false, true);
test(false, false);
}
private static void test(boolean minInclusive, boolean maxInclusive) {
Integer defValue = new Integer(1);
Integer minValue = new Integer(0);
Integer maxValue = new Integer(10);
MyFormatImpl fmt = new MyFormatImpl("root", 1, 10);
fmt.addObjectValue("root", defValue.getClass(), defValue,
minValue, maxValue, minInclusive, maxInclusive);
try {
Integer act_min = (Integer)fmt.getObjectMinValue("root");
if (! act_min.equals(minValue))
throw new RuntimeException("invalid min value: " + act_min);
} catch (Throwable e) {
throw new RuntimeException
("getObjectMinValue: unexpected exception: " + e);
}
try {
Integer act_max = (Integer)fmt.getObjectMaxValue("root");
if (! act_max.equals(maxValue))
throw new RuntimeException("invalid max value: " + act_max);
} catch (Throwable e) {
throw new RuntimeException
("getObjectMaxValue: unexpected exception: " + e);
}
}
static class MyFormatImpl extends IIOMetadataFormatImpl {
MyFormatImpl(String root, int minChildren, int maxChildren) {
super(root, minChildren, maxChildren);
}
public void addObjectValue(String elementName,
Class classType, Object defaultValue,
Comparable minValue, Comparable maxValue,
boolean minInclusive, boolean maxInclusive) {
super.addObjectValue(elementName,
classType, defaultValue,
minValue, maxValue,
minInclusive, maxInclusive);
}
public boolean canNodeAppear(String elementName,
ImageTypeSpecifier imageType) {
return true;
}
}
}
/*
* 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.
*/
/*
* @bug 4929170
* @summary Tests that user-supplied IIOMetadata implementations
* is able to load correspnding IIOMetadataFormat implementations.
*/
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
public class MetadataFormatTest {
public static void main(String[] args) throws Exception {
String codebase = args[0];
String code = args[1];
MetadataTest t = createTest(codebase, code);
try {
t.doTest();
} catch (IllegalStateException e) {
System.out.println("Test failed.");
e.printStackTrace();
System.exit(1);
}
}
protected static MetadataTest createTest(String codebase,
String code) throws Exception {
URL[] urls = { new File(codebase).toURL()};
ClassLoader loader = new URLClassLoader(urls);
Class ct = loader.loadClass(code);
return (MetadataTest)ct.newInstance();
}
}
/*
* 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.
*/
/*
* @bug 4929170
* @summary Tests that user-supplied IIOMetadata implementations
* is able to load correspnding IIOMetadataFormat implementations.
*/
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
public class MetadataFormatThreadTest implements Runnable {
String test_class;
public static void main(String[] args) throws Exception {
String codebase = args[0];
String code = args[1];
Thread t = createTest(codebase, code);
try {
t.start();
} catch (IllegalStateException e) {
System.out.println("Test failed.");
e.printStackTrace();
System.exit(1);
}
}
public MetadataFormatThreadTest(String c) {
test_class = c;
}
public void run() {
try {
ClassLoader loader = (ClassLoader)
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction() {
public Object run() {
return Thread.currentThread().getContextClassLoader();
}
});
Class ct = loader.loadClass(test_class);
MetadataTest t = (MetadataTest)ct.newInstance();
t.doTest();
} catch (Exception e) {
System.out.println("Test failed.");
e.printStackTrace();
System.exit(1);
}
}
protected static Thread createTest(String codebase,
String code) throws Exception {
URL[] urls = { new File(codebase).toURL()};
final ClassLoader loader = new URLClassLoader(urls);
final Thread t = new Thread(new MetadataFormatThreadTest(code));
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction() {
public Object run() {
t.setContextClassLoader(loader);
return null;
}
});
return t;
}
}
/* /*
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this * published by the Free Software Foundation.
* 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 * This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
...@@ -23,18 +21,14 @@ ...@@ -23,18 +21,14 @@
* questions. * questions.
*/ */
package sun.management; /*
* @bug 4929170
import java.lang.management.LockInfo; * @summary Interface for user-supplied IIOMetadata
* implementation tests.
/**
* This interface is used for data conversion from LockInfo
* to CompositeData (its mapped type) or vice versa.
*/ */
public interface LockDataConverterMXBean {
public void setLockInfo(LockInfo l);
public LockInfo getLockInfo();
public void setLockedSynchronizers(LockInfo[] l); import java.io.IOException;
public LockInfo[] getLockedSynchronizers();
public interface MetadataTest {
public void doTest() throws IOException;
} }
/*
* 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 4929170
* @summary Tests that user-supplied IIOMetadata implementations loaded by
* system class loader (i.e. corresponding classes are available via
* classpath) is able to load correspnding IIOMetadataFormat
* implementations.
* @run main UserPluginMetadataFormatTest
*/
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.ByteArrayInputStream;
import java.util.Iterator;
import java.util.ListResourceBundle;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageReadParam;
import javax.imageio.IIOException;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.event.IIOReadWarningListener;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataFormat;
import javax.imageio.metadata.IIOMetadataFormatImpl;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.spi.ImageReaderSpi;
import org.w3c.dom.Node;
public class UserPluginMetadataFormatTest implements MetadataTest {
public static void main(String[] argv) throws IOException {
new UserPluginMetadataFormatTest().doTest();
}
public void doTest() throws IOException {
DummyImageReaderImpl reader;
reader = new DummyImageReaderImpl(new DummyImageReaderSpiImpl());
byte[] data = new byte[1024];
ByteArrayInputStream bais =
new ByteArrayInputStream(data);
reader.setInput(ImageIO.createImageInputStream(bais));
IIOMetadata metadata = reader.getImageMetadata(1);
if(metadata == null) {
throw new RuntimeException("IIOMetada is NULL");
}
String[] formatNames = metadata.getMetadataFormatNames();
for(int j=0; j<formatNames.length; j++) {
String formatName = formatNames[j];
System.out.println("\nFormat Names : " + formatName);
try {
IIOMetadataFormat metadataFormat =
metadata.getMetadataFormat(formatName);
System.out.println(" Class Name " +
metadataFormat.getClass());
} catch(IllegalStateException ise) {
Throwable t = ise;
t.printStackTrace();
while(t.getCause() != null) {
t = t.getCause();
t.printStackTrace();
}
// test failed!
// stop applet!
System.out.println("Test faied.");
throw new RuntimeException("Test failed.", ise);
}
}
}
public static class DummyImageReaderImpl extends ImageReader {
public DummyImageReaderImpl(ImageReaderSpi originatingProvider) {
super(originatingProvider);
}
public int getNumImages(boolean allowSearch) throws IOException {
return 5;
}
public int getWidth(int imageIndex) throws IOException {
if (input == null)
throw new IllegalStateException();
if (imageIndex >= 5 || imageIndex < 0)
throw new IndexOutOfBoundsException();
return 10;
}
public int getHeight(int imageIndex) throws IOException {
if (input == null)
throw new IllegalStateException();
if (imageIndex >= 5 || imageIndex < 0)
throw new IndexOutOfBoundsException();
return 15;
}
public Iterator getImageTypes(int imageIndex) throws IOException {
if (input == null)
throw new IllegalStateException();
if (imageIndex >= 5 || imageIndex < 0)
throw new IndexOutOfBoundsException();
Vector imageTypes = new Vector();
imageTypes.add(ImageTypeSpecifier.createFromBufferedImageType
(BufferedImage.TYPE_BYTE_GRAY ));
return imageTypes.iterator();
}
public IIOMetadata getStreamMetadata() throws IOException {
return new DummyIIOMetadataImpl(true, null, null, null, null);
}
public IIOMetadata getImageMetadata(int imageIndex) throws IOException {
if (input == null)
throw new IllegalStateException();
if (imageIndex >= 5 || imageIndex < 0)
throw new IndexOutOfBoundsException();
if (seekForwardOnly) {
if (imageIndex < minIndex)
throw new IndexOutOfBoundsException();
minIndex = imageIndex;
}
System.out.println("Current format class name " + DummyIIOMetadataFormatImpl.class.getName());
return new DummyIIOMetadataImpl(true,
DummyIIOMetadataFormatImpl.nativeMetadataFormatName,
DummyIIOMetadataFormatImpl.class.getName(),
null, null);
}
public BufferedImage read(int imageIndex, ImageReadParam param)
throws IOException {
if (input == null)
throw new IllegalStateException();
if (imageIndex >= 5 || imageIndex < 0)
throw new IndexOutOfBoundsException();
if (seekForwardOnly) {
if (imageIndex < minIndex)
throw new IndexOutOfBoundsException();
minIndex = imageIndex;
}
return getDestination(param, getImageTypes(imageIndex), 10, 15);
}
// protected methods - now public
public boolean abortRequested() {
return super.abortRequested();
}
public void clearAbortRequest() {
super.clearAbortRequest();
}
public void processImageComplete() {
super.processImageComplete();
}
public void processImageProgress(float percentageDone) {
super.processImageProgress(percentageDone);
}
public void processImageStarted(int imageIndex) {
super.processImageStarted(imageIndex);
}
public void processImageUpdate(BufferedImage theImage,
int minX,
int minY,
int width,
int height,
int periodX,
int periodY,
int[] bands) {
super.processImageUpdate(theImage,
minX,
minY,
width,
height,
periodX,
periodY,
bands);
}
public void processPassComplete(BufferedImage theImage) {
super. processPassComplete(theImage);
}
public void processPassStarted(BufferedImage theImage,
int pass, int minPass,
int maxPass,
int minX,
int minY,
int periodX,
int periodY,
int[] bands) {
super.processPassStarted(theImage,
pass,
minPass,
maxPass,
minX,
minY,
periodX,
periodY,
bands);
}
public void processReadAborted() {
super.processReadAborted();
}
public void processSequenceComplete() {
super.processSequenceComplete();
}
public void processSequenceStarted(int minIndex) {
super.processSequenceStarted(minIndex);
}
public void processThumbnailComplete() {
super.processThumbnailComplete();
}
public void processThumbnailPassComplete(BufferedImage theThumbnail) {
super.processThumbnailPassComplete(theThumbnail);
}
public void processThumbnailPassStarted(BufferedImage theThumbnail,
int pass,
int minPass,
int maxPass,
int minX,
int minY,
int periodX,
int periodY,
int[] bands) {
super.processThumbnailPassStarted(theThumbnail,
pass,
minPass,
maxPass,
minX,
minY,
periodX,
periodY,
bands);
}
public void processThumbnailProgress(float percentageDone) {
super.processThumbnailProgress(percentageDone);
}
public void processThumbnailStarted(int imageIndex, int thumbnailIndex) {
super.processThumbnailStarted(imageIndex, thumbnailIndex);
}
public void processThumbnailUpdate(BufferedImage theThumbnail,
int minX,
int minY,
int width,
int height,
int periodX,
int periodY,
int[] bands) {
super.processThumbnailUpdate(theThumbnail,
minX,
minY,
width,
height,
periodX,
periodY,
bands);
}
public void processWarningOccurred(String warning) {
super.processWarningOccurred(warning);
}
public static Rectangle getSourceRegion(ImageReadParam param,
int srcWidth,
int srcHeight) {
return ImageReader.getSourceRegion(param, srcWidth, srcHeight);
}
public static void computeRegions(ImageReadParam param,
int srcWidth,
int srcHeight,
BufferedImage image,
Rectangle srcRegion,
Rectangle destRegion) {
ImageReader.computeRegions(param,
srcWidth,
srcHeight,
image,
srcRegion,
destRegion);
}
public static void checkReadParamBandSettings(ImageReadParam param,
int numSrcBands,
int numDstBands) {
ImageReader.checkReadParamBandSettings( param,
numSrcBands,
numDstBands);
}
public static BufferedImage getDestination(ImageReadParam param,
Iterator imageTypes,
int width,
int height)
throws IIOException {
return ImageReader.getDestination(param,
imageTypes,
width,
height);
}
public void setAvailableLocales(Locale[] locales) {
if (locales == null || locales.length == 0)
availableLocales = null;
else
availableLocales = (Locale[])locales.clone();
}
public void processWarningOccurred(String baseName, String keyword) {
super.processWarningOccurred(baseName, keyword);
}
}
public static class DummyIIOMetadataFormatImpl
extends IIOMetadataFormatImpl {
public static String nativeMetadataFormatName =
"javax_imageio_dummy_1.0";
private static IIOMetadataFormat instance = null;
private DummyIIOMetadataFormatImpl() {
super(DummyIIOMetadataFormatImpl.nativeMetadataFormatName,
CHILD_POLICY_SOME);
}
public boolean canNodeAppear(String elementName,
ImageTypeSpecifier imageType) {
return false;
}
public static synchronized IIOMetadataFormat getInstance() {
if (instance == null) {
instance = new DummyIIOMetadataFormatImpl();
}
return instance;
}
}
public static class DummyIIOMetadataImpl extends IIOMetadata {
public DummyIIOMetadataImpl() {
super();
}
public DummyIIOMetadataImpl(boolean standardMetadataFormatSupported,
String nativeMetadataFormatName,
String nativeMetadataFormatClassName,
String[] extraMetadataFormatNames,
String[] extraMetadataFormatClassNames) {
super(standardMetadataFormatSupported,
nativeMetadataFormatName,
nativeMetadataFormatClassName,
extraMetadataFormatNames,
extraMetadataFormatClassNames);
}
public boolean isReadOnly() {
return true;
}
public Node getAsTree(String formatName) {
return null;
}
public void mergeTree(String formatName, Node root)
throws IIOInvalidTreeException {
throw new IllegalStateException();
}
public void reset() {
throw new IllegalStateException();
}
}
public static class DummyImageReaderSpiImpl extends ImageReaderSpi {
static final String[] names ={ "myformat" };
public DummyImageReaderSpiImpl() {
super("vendorName",
"version",
names,
null,
null,
"DummyImageReaderImpl",
STANDARD_INPUT_TYPE,
null,
true,
null,
null,
null,
null,
true,
null,
null,
null,
null);
}
public boolean canDecodeInput(Object source)
throws IOException {
return true;
}
public ImageReader createReaderInstance(Object extension)
throws IOException {
return new DummyImageReaderImpl(this);
}
public String getDescription(Locale locale) {
return "DummyImageReaderSpiImpl";
}
}
}
#!/bin/ksh -p
#
# 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 4929170 7078379
# @summary Tests that user-supplied IIOMetadata implementations
# loaded by separate classloader is able to load correspnding
# IIOMetadataFormat implementations.
# @author Andrew Brygin
#
# @compile UserPluginMetadataFormatTest.java MetadataFormatTest.java MetadataTest.java
# @run shell/timeout=60 runMetadataFormatTest.sh
# Note!!!! JavaCodeForYourTest_CHANGE_THIS.java must be changed or deleted.
# If there is any java code which will be executed during the test, it must
# be compiled by the line above. If multiple .java files, separate the
# files by spaces on that line. See testing page of AWT home page for
# pointers to the testharness spec. and FAQ.
# Note!!!! Change AppletDeadlock.sh to the name of your test!!!!
# There are several resources which need to be present before many
# shell scripts can run. Following are examples of how to check for
# many common ones.
#
# Note that the shell used is the Korn Shell, KSH
#
# Also note, it is recommended that make files NOT be used. Rather,
# put the individual commands directly into this file. That way,
# it is possible to use command line arguments and other shell tech-
# niques to find the compiler, etc on different systems. For example,
# a different path could be used depending on whether this were a
# Solaris or Win32 machine, which is more difficult (if even possible)
# in a make file.
# Beginning of subroutines:
status=1
#Call this from anywhere to fail the test with an error message
# usage: fail "reason why the test failed"
fail()
{ echo "The test failed :-("
echo "$*" 1>&2
exit 1
} #end of fail()
#Call this from anywhere to pass the test with a message
# usage: pass "reason why the test passed if applicable"
pass()
{ echo "The test passed!!!"
echo "$*" 1>&2
exit 0
} #end of pass()
# end of subroutines
# The beginning of the script proper
# Checking for proper OS
OS=`uname -s`
case "$OS" in
SunOS )
VAR="One value for Sun"
DEFAULT_JDK=/none
#DEFAULT_JDK=/usr/local/java/jdk1.2/solaris
FILESEP="/"
;;
Linux | Darwin )
VAR="A different value for Linux"
DEFAULT_JDK=/none
#DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386
FILESEP="/"
;;
Windows_95 | Windows_98 | Windows_NT | Windows_ME )
VAR="A different value for Win32"
DEFAULT_JDK=/none
#DEFAULT_JDK=/usr/local/java/jdk1.2/win32
FILESEP="\\"
;;
CYGWIN* )
VAR="A different value for CYGWIN"
DEFAULT_JDK=/none
FILESEP="/"
;;
# catch all other OSs
* )
echo "Unrecognized system! $OS"
fail "Unrecognized system! $OS"
;;
esac
# check that some executable or other file you need is available, abort if not
# note that the name of the executable is in the fail string as well.
# this is how to check for presence of the compiler, etc.
#RESOURCE=`whence SomeProgramOrFileNeeded`
#if [ "${RESOURCE}" = "" ] ;
# then fail "Need SomeProgramOrFileNeeded to perform the test" ;
#fi
# IT'S FINE TO DELETE THIS IF NOT NEEDED!
# check if an environment variable you need is set, give it a default if not
#if [ -z "${NEEDED_VAR}" ] ; then
# # The var is NOT set, so give it a default
# NEEDED_VAR=/some/default/value/such/as/a/path
#fi
# IT'S FINE TO DELETE THIS IF NOT NEEDED!
#if [ -z "${NEEDED_LATER_VAR}" ] ; then
# # The var is NOT set, so give it a default
# # will need it in other scripts called from this one, so export it
# NEEDED_LATER_VAR="/a/different/path/note/the/quotes"
# export NEEDED_LATER_VAR
#fi
# Want this test to run standalone as well as in the harness, so do the
# following to copy the test's directory into the harness's scratch directory
# and set all appropriate variables:
if [ -z "${TESTJAVA}" ] ; then
# TESTJAVA is not set, so the test is running stand-alone.
# TESTJAVA holds the path to the root directory of the build of the JDK
# to be tested. That is, any java files run explicitly in this shell
# should use TESTJAVA in the path to the java interpreter.
# So, we'll set this to the JDK spec'd on the command line. If none
# is given on the command line, tell the user that and use a cheesy
# default.
# THIS IS THE JDK BEING TESTED.
if [ -n "$1" ] ;
then TESTJAVA=$1
else echo "no JDK specified on command line so using default!"
TESTJAVA=$DEFAULT_JDK
fi
TESTSRC=.
TESTCLASSES=.
STANDALONE=1;
fi
echo "JDK under test is: $TESTJAVA"
#Deal with .class files:
if [ -n "${STANDALONE}" ] ;
then
#if standalone, remind user to cd to dir. containing test before running it
echo "Just a reminder: cd to the dir containing this test when running it"
# then compile all .java files (if there are any) into .class files
if [ -a *.java ] ;
then echo "Reminder, this test should be in its own directory with all"
echo "supporting files it needs in the directory with it."
${TESTJAVA}/bin/javac ./*.java ;
fi
# else in harness so copy all the class files from where jtreg put them
# over to the scratch directory this test is running in.
else cp ${TESTCLASSES}/*.class . ;
fi
#if in test harness, then copy the entire directory that the test is in over
# to the scratch directory. This catches any support files needed by the test.
#if [ -z "${STANDALONE}" ] ;
# then cp ${TESTSRC}/* .
#fi
#Just before executing anything, make sure it has executable permission!
chmod 777 ./*
############### YOUR TEST CODE HERE!!!!!!! #############
#All files required for the test should be in the same directory with
# this file. If converting a standalone test to run with the harness,
# as long as all files are in the same directory and it returns 0 for
# pass, you should be able to cut and paste it into here and it will
# run with the test harness.
# This is an example of running something -- test
# The stuff below catches the exit status of test then passes or fails
# this shell test as appropriate ( 0 status is considered a pass here )
#./test # DELETE THIS LINE AND REPLACE WITH YOUR OWN COMMAND!!!
if [ -d ./test_classes ] ; then
rm -rf ./test_calsses
fi
mkdir ./test_classes
# split application classes and test plugin classes
mv ./UserPluginMetadataFormatTest*.class ./test_classes
$TESTJAVA/bin/java MetadataFormatTest test_classes UserPluginMetadataFormatTest
############### END YOUR TEST CODE !!!!! ############
status=$?
# pass or fail the test based on status of the command
if [ $status -eq "0" ];
then pass "Test passed - no stack trace printing"
else fail "Test failure - stack trace was printed"
fi
#For additional examples of how to write platform independent KSH scripts,
# see the jtreg file itself. It is a KSH script for both Solaris and Win32
#!/bin/ksh -p
#
# 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 4929170 7078379
# @summary Tests that user-supplied IIOMetadata implementations
# loaded by separate classloader in separate thread
# is able to load correspnding IIOMetadataFormat
# implementations.
# @author Andrew Brygin
#
# @compile UserPluginMetadataFormatTest.java MetadataFormatThreadTest.java MetadataTest.java
# @run shell/timeout=60 runMetadataFormatThreadTest.sh
# Note!!!! JavaCodeForYourTest_CHANGE_THIS.java must be changed or deleted.
# If there is any java code which will be executed during the test, it must
# be compiled by the line above. If multiple .java files, separate the
# files by spaces on that line. See testing page of AWT home page for
# pointers to the testharness spec. and FAQ.
# Note!!!! Change AppletDeadlock.sh to the name of your test!!!!
# There are several resources which need to be present before many
# shell scripts can run. Following are examples of how to check for
# many common ones.
#
# Note that the shell used is the Korn Shell, KSH
#
# Also note, it is recommended that make files NOT be used. Rather,
# put the individual commands directly into this file. That way,
# it is possible to use command line arguments and other shell tech-
# niques to find the compiler, etc on different systems. For example,
# a different path could be used depending on whether this were a
# Solaris or Win32 machine, which is more difficult (if even possible)
# in a make file.
# Beginning of subroutines:
status=1
#Call this from anywhere to fail the test with an error message
# usage: fail "reason why the test failed"
fail()
{ echo "The test failed :-("
echo "$*" 1>&2
exit 1
} #end of fail()
#Call this from anywhere to pass the test with a message
# usage: pass "reason why the test passed if applicable"
pass()
{ echo "The test passed!!!"
echo "$*" 1>&2
exit 0
} #end of pass()
# end of subroutines
# The beginning of the script proper
# Checking for proper OS
OS=`uname -s`
case "$OS" in
SunOS )
VAR="One value for Sun"
DEFAULT_JDK=/none
#DEFAULT_JDK=/usr/local/java/jdk1.2/solaris
FILESEP="/"
;;
Linux | Darwin )
VAR="A different value for Linux"
DEFAULT_JDK=/none
#DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386
FILESEP="/"
;;
Windows_95 | Windows_98 | Windows_NT | Windows_ME )
VAR="A different value for Win32"
DEFAULT_JDK=/none
#DEFAULT_JDK=/usr/local/java/jdk1.2/win32
FILESEP="\\"
;;
CYGWIN* )
VAR="A different value for CYGWIN"
DEFAULT_JDK=/none
FILESEP="/"
;;
# catch all other OSs
* )
echo "Unrecognized system! $OS"
fail "Unrecognized system! $OS"
;;
esac
# check that some executable or other file you need is available, abort if not
# note that the name of the executable is in the fail string as well.
# this is how to check for presence of the compiler, etc.
#RESOURCE=`whence SomeProgramOrFileNeeded`
#if [ "${RESOURCE}" = "" ] ;
# then fail "Need SomeProgramOrFileNeeded to perform the test" ;
#fi
# IT'S FINE TO DELETE THIS IF NOT NEEDED!
# check if an environment variable you need is set, give it a default if not
#if [ -z "${NEEDED_VAR}" ] ; then
# # The var is NOT set, so give it a default
# NEEDED_VAR=/some/default/value/such/as/a/path
#fi
# IT'S FINE TO DELETE THIS IF NOT NEEDED!
#if [ -z "${NEEDED_LATER_VAR}" ] ; then
# # The var is NOT set, so give it a default
# # will need it in other scripts called from this one, so export it
# NEEDED_LATER_VAR="/a/different/path/note/the/quotes"
# export NEEDED_LATER_VAR
#fi
# Want this test to run standalone as well as in the harness, so do the
# following to copy the test's directory into the harness's scratch directory
# and set all appropriate variables:
if [ -z "${TESTJAVA}" ] ; then
# TESTJAVA is not set, so the test is running stand-alone.
# TESTJAVA holds the path to the root directory of the build of the JDK
# to be tested. That is, any java files run explicitly in this shell
# should use TESTJAVA in the path to the java interpreter.
# So, we'll set this to the JDK spec'd on the command line. If none
# is given on the command line, tell the user that and use a cheesy
# default.
# THIS IS THE JDK BEING TESTED.
if [ -n "$1" ] ;
then TESTJAVA=$1
else echo "no JDK specified on command line so using default!"
TESTJAVA=$DEFAULT_JDK
fi
TESTSRC=.
TESTCLASSES=.
STANDALONE=1;
fi
echo "JDK under test is: $TESTJAVA"
#Deal with .class files:
if [ -n "${STANDALONE}" ] ;
then
#if standalone, remind user to cd to dir. containing test before running it
echo "Just a reminder: cd to the dir containing this test when running it"
# then compile all .java files (if there are any) into .class files
if [ -a *.java ] ;
then echo "Reminder, this test should be in its own directory with all"
echo "supporting files it needs in the directory with it."
${TESTJAVA}/bin/javac ./*.java ;
fi
# else in harness so copy all the class files from where jtreg put them
# over to the scratch directory this test is running in.
else cp ${TESTCLASSES}/*.class . ;
fi
#if in test harness, then copy the entire directory that the test is in over
# to the scratch directory. This catches any support files needed by the test.
#if [ -z "${STANDALONE}" ] ;
# then cp ${TESTSRC}/* .
#fi
#Just before executing anything, make sure it has executable permission!
chmod 777 ./*
############### YOUR TEST CODE HERE!!!!!!! #############
#All files required for the test should be in the same directory with
# this file. If converting a standalone test to run with the harness,
# as long as all files are in the same directory and it returns 0 for
# pass, you should be able to cut and paste it into here and it will
# run with the test harness.
# This is an example of running something -- test
# The stuff below catches the exit status of test then passes or fails
# this shell test as appropriate ( 0 status is considered a pass here )
#./test # DELETE THIS LINE AND REPLACE WITH YOUR OWN COMMAND!!!
if [ -d ./test_classes ] ; then
rm -rf ./test_calsses
fi
mkdir ./test_classes
# split application classes and test plugin classes
mv ./UserPluginMetadataFormatTest*.class ./test_classes
$TESTJAVA/bin/java MetadataFormatThreadTest test_classes UserPluginMetadataFormatTest
############### END YOUR TEST CODE !!!!! ############
status=$?
# pass or fail the test based on status of the command
if [ $status -eq "0" ];
then pass "Test passed - no stack trace printing"
else fail "Test failure - stack trace was printed"
fi
#For additional examples of how to write platform independent KSH scripts,
# see the jtreg file itself. It is a KSH script for both Solaris and Win32
/*
* 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 4403350 4403352 4436995 4438977
* @run main IIOMetadataFormatImplTest
* @summary Tests various methods of IIOMetadataFormatImpl:
*
* getElement{Min,Max}Children and getAttribute{Min,Max}Value
* getAttributeDescription
* getAttributeEnumerations
*/
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadataFormat;
import javax.imageio.metadata.IIOMetadataFormatImpl;
public class IIOMetadataFormatImplTest {
public static void main(String[] args) {
test440335x();
test4436995();
test4438977();
}
static class IIOMetadataFormatImpl440335x extends IIOMetadataFormatImpl {
public IIOMetadataFormatImpl440335x() {
super("rootNode", 0, 1);
addElement("anElement", "rootNode", 20, 200);
addAttribute("anElement", "exclusiveAttr",
IIOMetadataFormat.DATATYPE_INTEGER,
true, null,
"50", "500",
false, false);
addAttribute("anElement", "minAttr",
IIOMetadataFormat.DATATYPE_INTEGER,
true, null,
"60", "600",
true, false);
addAttribute("anElement", "maxAttr",
IIOMetadataFormat.DATATYPE_INTEGER,
true, null,
"70", "700",
false, true);
addAttribute("anElement", "minMaxAttr",
IIOMetadataFormat.DATATYPE_INTEGER,
true, null,
"80", "800",
true, true);
}
public boolean canNodeAppear(String nodeName,
ImageTypeSpecifier imageType) {
return true;
}
}
private static void test440335x() {
IIOMetadataFormat format = new IIOMetadataFormatImpl440335x();
// Check that correct value is returned
if (format.getElementMinChildren("anElement") != 20) {
throw new RuntimeException("Error on getElementMinChildren!");
}
if (format.getElementMaxChildren("anElement") != 200) {
throw new RuntimeException("Error on getElementMaxChildren!");
}
// Check that correct value is returned and no exception is thrown
try {
if (!format.getAttributeMinValue("anElement",
"exclusiveAttr").equals("50")) {
throw new RuntimeException("Error on exclusiveAttr min!");
}
if (!format.getAttributeMaxValue("anElement",
"exclusiveAttr").equals("500")) {
throw new RuntimeException("Error on exclusiveAttr max!");
}
if (!format.getAttributeMinValue("anElement",
"minAttr").equals("60")) {
throw new RuntimeException("Error on minAttr min!");
}
if (!format.getAttributeMaxValue("anElement",
"minAttr").equals("600")) {
throw new RuntimeException("Error on minAttr max!");
}
if (!format.getAttributeMinValue("anElement",
"maxAttr").equals("70")) {
throw new RuntimeException("Error on maxAttr min!");
}
if (!format.getAttributeMaxValue("anElement",
"maxAttr").equals("700")) {
throw new RuntimeException("Error on maxAttr max!");
}
if (!format.getAttributeMinValue("anElement",
"minMaxAttr").equals("80")) {
throw new RuntimeException("Error on minMaxAttr min!");
}
if (!format.getAttributeMaxValue("anElement",
"minMaxAttr").equals("800")) {
throw new RuntimeException("Error on minMaxAttr max!");
}
} catch (IllegalStateException e) {
throw new RuntimeException("Got IllegalStateException!");
}
}
static class IIOMetadataFormatImpl4436995 extends IIOMetadataFormatImpl {
public IIOMetadataFormatImpl4436995(String root,
int minChildren, int maxChildren) {
super(root, minChildren, maxChildren);
}
public void addAttribute(String elementName,
String attrName,
int dataType,
boolean required,
int listMinLength, int listMaxLength) {
super.addAttribute(elementName,
attrName,
dataType,
required, listMinLength,
listMaxLength);
}
public boolean canNodeAppear(String elementName,
ImageTypeSpecifier imageType) {
return true;
}
}
private static void test4436995() {
String result;
IIOMetadataFormatImpl4436995 fmt =
new IIOMetadataFormatImpl4436995("root", 1, 10);
fmt.addAttribute("root", "attr", fmt.DATATYPE_INTEGER, true, 2, 5);
try {
result = fmt.getAttributeDescription("root", "non-existent", null);
throw new RuntimeException("Failed to get IAE!");
} catch(IllegalArgumentException e) {
}
}
static class IIOMetadataFormatImpl4438977 extends IIOMetadataFormatImpl {
public IIOMetadataFormatImpl4438977(String root,
int minChildren, int maxChildren) {
super(root, minChildren, maxChildren);
}
public void addAttribute(String elementName,
String attrName,
int dataType,
boolean required,
int listMinLength, int listMaxLength) {
super.addAttribute(elementName,
attrName,
dataType,
required, listMinLength,
listMaxLength);
}
public boolean canNodeAppear(String elementName,
ImageTypeSpecifier imageType) {
return true;
}
}
private static void test4438977() {
String[] result;
IIOMetadataFormatImpl4438977 fmt =
new IIOMetadataFormatImpl4438977("root", 1, 10);
fmt.addAttribute("root", "attr", fmt.DATATYPE_INTEGER, true, 2, 5);
try {
result = fmt.getAttributeEnumerations("root", "attr");
throw new RuntimeException("Failed to get IAE!");
} catch(IllegalArgumentException e) {
}
}
}
/*
* 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.
*/
//
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataFormat;
import javax.imageio.metadata.IIOMetadataFormatImpl;
import javax.imageio.spi.IIORegistry;
import javax.imageio.spi.ImageReaderSpi;
import com.sun.imageio.plugins.png.PNGMetadata;
public class MetadataFormatPrinter {
private int indentLevel = 0;
private int column = 0;
private PrintStream out;
private static final int maxColumn = 75;
private static String[] dataTypeNames = {
"String", "Boolean", "Integer", "Float", "Double"
};
// "Infinite" values
private static String maxInteger = Integer.toString(Integer.MAX_VALUE);
public MetadataFormatPrinter(PrintStream out) {
this.out = out;
}
private void println() {
out.println();
column = 0;
}
private void println(String s) {
out.println(s);
column = 0;
}
private void printWrapped(String in, int leftIndent) {
StringTokenizer t = new StringTokenizer(in);
while (t.hasMoreTokens()) {
String s = t.nextToken();
int length = s.length();
if (column + length > maxColumn) {
println();
indent();
for (int i = 0; i < leftIndent; i++) {
print(" ");
}
}
out.print(s);
out.print(" ");
column += length + 1;
}
}
private void print(String s) {
int length = s.length();
if (column + length > maxColumn) {
println();
indent();
print(" ");
}
out.print(s);
column += length;
}
private void print(IIOMetadataFormat format) {
String rootName = format.getRootName();
println("<!DOCTYPE \"" +
rootName +
"\" [");
++indentLevel;
print(format, rootName);
--indentLevel;
print("]>");
println();
println();
}
private void indent() {
for (int i = 0; i < indentLevel; i++) {
out.print(" ");
column += 2;
}
}
private void printElementInfo(IIOMetadataFormat format,
String elementName) {
println();
indent();
print("<!ELEMENT \"" +
elementName +
"\"");
String[] childNames = format.getChildNames(elementName);
boolean hasChildren = true;
String separator = " "; // symbol to place between children
String terminator = ""; // symbol to follow last child
String repeater = ""; // "*" if repeating
switch (format.getChildPolicy(elementName)) {
case IIOMetadataFormat.CHILD_POLICY_EMPTY:
hasChildren = false;
break;
case IIOMetadataFormat.CHILD_POLICY_ALL:
separator = ", ";
break;
case IIOMetadataFormat.CHILD_POLICY_SOME:
separator = "?, ";
terminator = "?";
break;
case IIOMetadataFormat.CHILD_POLICY_CHOICE:
separator = " | ";
break;
case IIOMetadataFormat.CHILD_POLICY_SEQUENCE:
separator = " | ";
repeater = "*";
break;
case IIOMetadataFormat.CHILD_POLICY_REPEAT:
repeater = "*";
break;
default:
break;
}
if (hasChildren) {
print(" (");
for (int i = 0; i < childNames.length - 1; i++) {
print(childNames[i] + separator);
}
print(childNames[childNames.length - 1] + terminator);
print(")" + repeater + ">");
} else {
print(" EMPTY>");
}
println();
String description = format.getElementDescription(elementName, null);
if (description != null) {
++indentLevel;
indent();
printWrapped("<!-- " + description + " -->", 5);
println();
--indentLevel;
}
if (format.getChildPolicy(elementName) ==
IIOMetadataFormat.CHILD_POLICY_REPEAT) {
int minChildren = format.getElementMinChildren(elementName);
if (minChildren != 0) {
indent();
println(" <!-- Min children: " +
minChildren +
" -->");
}
int maxChildren = format.getElementMaxChildren(elementName);
if (maxChildren != Integer.MAX_VALUE) {
indent();
println(" <!-- Max children: " +
maxChildren +
" -->");
}
}
}
private void printAttributeInfo(IIOMetadataFormat format,
String elementName,
String attrName) {
indent();
print("<!ATTLIST \"" +
elementName +
"\" \"" +
attrName +
"\"");
int attrValueType =
format.getAttributeValueType(elementName, attrName);
switch (attrValueType) {
case IIOMetadataFormat.VALUE_NONE:
throw new RuntimeException
("Encountered VALUE_NONE for an attribute!");
// break;
case IIOMetadataFormat.VALUE_ARBITRARY:
print(" #CDATA");
break;
case IIOMetadataFormat.VALUE_RANGE:
case IIOMetadataFormat.VALUE_RANGE_MIN_INCLUSIVE:
case IIOMetadataFormat.VALUE_RANGE_MAX_INCLUSIVE:
case IIOMetadataFormat.VALUE_RANGE_MIN_MAX_INCLUSIVE:
print(" #CDATA");
break;
case IIOMetadataFormat.VALUE_ENUMERATION:
print(" (");
String[] attrValues =
format.getAttributeEnumerations(elementName, attrName);
for (int j = 0; j < attrValues.length - 1; j++) {
print("\"" + attrValues[j] + "\" | ");
}
print("\"" + attrValues[attrValues.length - 1] + "\")");
break;
case IIOMetadataFormat.VALUE_LIST:
print(" #CDATA");
break;
default:
throw new RuntimeException
("Encountered unknown value type for an attribute!");
// break;
}
String defaultValue =
format.getAttributeDefaultValue(elementName, attrName);
if (defaultValue != null) {
print(" ");
print("\"" + defaultValue + "\"");
} else {
if (format.isAttributeRequired(elementName, attrName)) {
print(" #REQUIRED");
} else {
print(" #IMPLIED");
}
}
println(">");
String description = format.getAttributeDescription(elementName,
attrName,
null);
if (description != null) {
++indentLevel;
indent();
printWrapped("<!-- " + description + " -->", 5);
println();
--indentLevel;
}
int dataType = format.getAttributeDataType(elementName, attrName);
switch (attrValueType) {
case IIOMetadataFormat.VALUE_ARBITRARY:
indent();
println(" <!-- Data type: " + dataTypeNames[dataType] + " -->");
break;
case IIOMetadataFormat.VALUE_RANGE:
case IIOMetadataFormat.VALUE_RANGE_MIN_INCLUSIVE:
case IIOMetadataFormat.VALUE_RANGE_MAX_INCLUSIVE:
case IIOMetadataFormat.VALUE_RANGE_MIN_MAX_INCLUSIVE:
indent();
println(" <!-- Data type: " + dataTypeNames[dataType] + " -->");
boolean minInclusive =
(attrValueType &
IIOMetadataFormat.VALUE_RANGE_MIN_INCLUSIVE_MASK) != 0;
boolean maxInclusive =
(attrValueType &
IIOMetadataFormat.VALUE_RANGE_MAX_INCLUSIVE_MASK) != 0;
indent();
println(" <!-- Min value: " +
format.getAttributeMinValue(elementName, attrName) +
" " +
(minInclusive ? "(inclusive)" : "(exclusive)") +
" -->");
String maxValue =
format.getAttributeMaxValue(elementName, attrName);
// Hack: don't print "infinite" max values
if (dataType != IIOMetadataFormat.DATATYPE_INTEGER ||
!maxValue.equals(maxInteger)) {
indent();
println(" <!-- Max value: " +
maxValue +
" " +
(maxInclusive ? "(inclusive)" : "(exclusive)") +
" -->");
}
break;
case IIOMetadataFormat.VALUE_LIST:
indent();
println(" <!-- Data type: List of " + dataTypeNames[dataType] + " -->");
int minLength =
format.getAttributeListMinLength(elementName, attrName);
if (minLength != 0) {
indent();
println(" <!-- Min length: " +
minLength +
" -->");
}
int maxLength =
format.getAttributeListMaxLength(elementName, attrName);
if (maxLength != Integer.MAX_VALUE) {
indent();
println(" <!-- Max length: " +
maxLength +
" -->");
}
break;
}
}
private void printObjectInfo(IIOMetadataFormat format,
String elementName) {
int objectType = format.getObjectValueType(elementName);
if (objectType == IIOMetadataFormat.VALUE_NONE) {
return;
}
Class objectClass = format.getObjectClass(elementName);
if (objectClass != null) {
indent();
if (objectType == IIOMetadataFormat.VALUE_LIST) {
println(" <!-- User object: array of " +
objectClass.getName() +
" -->");
} else {
println(" <!-- User object: " +
objectClass.getName() +
" -->");
}
Object defaultValue = format.getObjectDefaultValue(elementName);
if (defaultValue != null) {
indent();
println(" <!-- Default value: " +
defaultValue.toString() +
" -->");
}
switch (objectType) {
case IIOMetadataFormat.VALUE_RANGE:
indent();
println(" <!-- Min value: " +
format.getObjectMinValue(elementName).toString() +
" -->");
indent();
println(" <!-- Max value: " +
format.getObjectMaxValue(elementName).toString() +
" -->");
break;
case IIOMetadataFormat.VALUE_ENUMERATION:
Object[] enums = format.getObjectEnumerations(elementName);
for (int i = 0; i < enums.length; i++) {
indent();
println(" <!-- Enumerated value: " +
enums[i].toString() +
" -->");
}
break;
case IIOMetadataFormat.VALUE_LIST:
int minLength = format.getObjectArrayMinLength(elementName);
if (minLength != 0) {
indent();
println(" <!-- Min length: " +
minLength +
" -->");
}
int maxLength = format.getObjectArrayMaxLength(elementName);
if (maxLength != Integer.MAX_VALUE) {
indent();
println(" <!-- Max length: " +
maxLength +
" -->");
}
break;
}
}
}
// Set of elements that have been printed already
Set printedElements = new HashSet();
// Set of elements that have been scheduled to be printed
Set scheduledElements = new HashSet();
private void print(IIOMetadataFormat format,
String elementName) {
// Don't print elements more than once
if (printedElements.contains(elementName)) {
return;
}
printedElements.add(elementName);
// Add the unscheduled children of this node to a list,
// and mark them as scheduled
List children = new ArrayList();
String[] childNames = format.getChildNames(elementName);
if (childNames != null) {
for (int i = 0; i < childNames.length; i++) {
String childName = childNames[i];
if (!scheduledElements.contains(childName)) {
children.add(childName);
scheduledElements.add(childName);
}
}
}
printElementInfo(format, elementName);
printObjectInfo(format, elementName);
++indentLevel;
String[] attrNames = format.getAttributeNames(elementName);
for (int i = 0; i < attrNames.length; i++) {
printAttributeInfo(format, elementName, attrNames[i]);
}
// Recurse on child nodes
Iterator iter = children.iterator();
while (iter.hasNext()) {
print(format, (String)iter.next());
}
--indentLevel;
}
public static void main(String[] args) {
IIOMetadataFormat format = null;
if (args.length == 0 || args[0].equals("javax_imageio_1.0")) {
format = IIOMetadataFormatImpl.getStandardFormatInstance();
} else {
IIORegistry registry = IIORegistry.getDefaultInstance();
Iterator iter = registry.getServiceProviders(ImageReaderSpi.class,
false);
while (iter.hasNext()) {
ImageReaderSpi spi = (ImageReaderSpi)iter.next();
if (args[0].equals
(spi.getNativeStreamMetadataFormatName())) {
System.out.print(spi.getDescription(null));
System.out.println(": native stream format");
format = spi.getStreamMetadataFormat(args[0]);
break;
}
String[] extraStreamFormatNames =
spi.getExtraStreamMetadataFormatNames();
if (extraStreamFormatNames != null &&
Arrays.asList(extraStreamFormatNames).
contains(args[0])) {
System.out.print(spi.getDescription(null));
System.out.println(": extra stream format");
format = spi.getStreamMetadataFormat(args[0]);
break;
}
if (args[0].equals
(spi.getNativeImageMetadataFormatName())) {
System.out.print(spi.getDescription(null));
System.out.println(": native image format");
format = spi.getImageMetadataFormat(args[0]);
break;
}
String[] extraImageFormatNames =
spi.getExtraImageMetadataFormatNames();
if (extraImageFormatNames != null &&
Arrays.asList(extraImageFormatNames).contains(args[0])) {
System.out.print(spi.getDescription(null));
System.out.println(": extra image format");
format = spi.getImageMetadataFormat(args[0]);
break;
}
}
}
if (format == null) {
System.err.println("Unknown format: " + args[0]);
System.exit(0);
}
MetadataFormatPrinter printer = new MetadataFormatPrinter(System.out);
printer.print(format);
}
}
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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 * under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this * published by the Free Software Foundation.
* 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 * This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
...@@ -23,18 +21,37 @@ ...@@ -23,18 +21,37 @@
* questions. * questions.
*/ */
package sun.awt; /*
* @test
* @bug 4406353
* @run main ObjectArrayMaxLength
* @summary Tests the getObjectArrayMaxLength method of
* IIOMetadataFormatImpl
*/
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadataFormat;
import javax.imageio.metadata.IIOMetadataFormatImpl;
class MyIIOMetadataFormatImpl extends IIOMetadataFormatImpl {
MyIIOMetadataFormatImpl() {
super("root", CHILD_POLICY_EMPTY);
addObjectValue("root", byte.class, 123, 321);
}
public boolean canNodeAppear(String nodeName, ImageTypeSpecifier type) {
return true;
}
}
public class ObjectArrayMaxLength {
// This class exists only so we can flush the PostEventQueue for the right AppContext public static void main(String[] args) {
// The default flushPendingEvents only flushes the thread-local context, which is wrong. IIOMetadataFormat f = new MyIIOMetadataFormatImpl();
// c.f. 3746956 if (f.getObjectArrayMaxLength("root") != 321) {
public abstract class SunToolkitSubclass extends SunToolkit { throw new RuntimeException
public static void flushPendingEvents(AppContext appContext) { ("Bad value for getObjectArrayMaxLength!");
flushLock.lock();
PostEventQueue postEventQueue = (PostEventQueue)appContext.get("PostEventQueue");
if (postEventQueue != null) {
postEventQueue.flush();
} }
flushLock.unlock();
} }
} }
/*
* 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 5017991
* @summary This test verifies two things:
* a) we can get MetadataFormat classes for
* each registered metadata format.
* b) all metadata formats for standard plugins
* are registered.
* @run main RegisteredFormatsTest
*/
import javax.imageio.spi.IIORegistry;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.metadata.IIOMetadataFormat;
import java.util.Iterator;
import java.util.Hashtable;
import java.util.Enumeration;
public class RegisteredFormatsTest {
private static Hashtable fmts;
public static void main(String[] args) {
fmts = new Hashtable();
fmts.put("javax_imageio_jpeg_stream_1.0", Boolean.FALSE);
fmts.put("javax_imageio_jpeg_image_1.0", Boolean.FALSE);
fmts.put("javax_imageio_png_1.0", Boolean.FALSE);
fmts.put("javax_imageio_bmp_1.0", Boolean.FALSE);
fmts.put("javax_imageio_wbmp_1.0", Boolean.FALSE);
fmts.put("javax_imageio_gif_stream_1.0", Boolean.FALSE);
fmts.put("javax_imageio_gif_image_1.0", Boolean.FALSE);
IIORegistry registry = IIORegistry.getDefaultInstance();
Iterator iter = registry.getServiceProviders(ImageReaderSpi.class,
false);
while(iter.hasNext()) {
ImageReaderSpi spi = (ImageReaderSpi)iter.next();
String fmt_name;
fmt_name = spi.getNativeStreamMetadataFormatName();
testStreamMetadataFormat(spi, fmt_name);
fmt_name = spi.getNativeImageMetadataFormatName();
testImageMetadataFormat(spi, fmt_name);
String[] fmt_names;
fmt_names = spi.getExtraStreamMetadataFormatNames();
for (int i=0; fmt_names != null && i < fmt_names.length; i++) {
testStreamMetadataFormat(spi, fmt_names[i]);
}
fmt_names = spi.getExtraImageMetadataFormatNames();
for (int i=0; fmt_names != null && i < fmt_names.length; i++) {
testImageMetadataFormat(spi, fmt_names[i]);
}
}
Enumeration keys = fmts.keys();
while (keys.hasMoreElements()) {
String key = (String)keys.nextElement();
boolean val = ((Boolean)fmts.get(key)).booleanValue();
if (!val) {
throw new RuntimeException("Test failed: format " +
key + "is not registered.");
}
}
}
private static void testStreamMetadataFormat(ImageReaderSpi spi,
String fmt_name) {
if (fmt_name == null) {
return;
}
try {
testMetadataFormat(spi.getStreamMetadataFormat(fmt_name),
fmt_name);
} catch (Exception e) {
throw new RuntimeException("Test failed for " + fmt_name,
e);
}
}
private static void testImageMetadataFormat(ImageReaderSpi spi,
String fmt_name) {
if (fmt_name == null) {
return;
}
try {
testMetadataFormat(spi.getImageMetadataFormat(fmt_name),
fmt_name);
} catch (Exception e) {
throw new RuntimeException("Test failed for " + fmt_name,
e);
}
}
private static void testMetadataFormat(IIOMetadataFormat fmt,
String fmt_name) {
System.out.print(fmt_name + "...");
if (fmt != null) {
fmts.put(fmt_name, Boolean.TRUE);
System.out.println("Ok");
} else {
throw new RuntimeException("Test failed for " + fmt_name);
}
}
}
/*
* 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 4432628 7186799
* @run main RemoveElement
* @summary Checks if ImageMetadataFormatImpl.removeElement properly
* removes the element from its parent's child list.
*/
import javax.imageio.metadata.IIOMetadataFormatImpl;
import javax.imageio.metadata.IIOMetadataFormat;
import javax.imageio.ImageTypeSpecifier;
public class RemoveElement {
public static void main(String[] args) {
String elem = "elem2";
int policy = IIOMetadataFormat.CHILD_POLICY_SOME;
MyFormatImpl fmt = new MyFormatImpl("root", 1, 10);
fmt.addElement("elem1", "root", policy);
fmt.addElement(elem, "root", policy);
fmt.removeElement("elem1");
boolean gotIAE = false;
try {
fmt.getChildPolicy("elem1");
} catch (IllegalArgumentException e) {
gotIAE = true;
}
if (!gotIAE) {
throw new RuntimeException("Element is still present!");
}
String[] chNames = fmt.getChildNames("root");
if (chNames.length != 1) {
throw new RuntimeException("Root still has more than 1 child!");
}
if (!elem.equals(chNames[0])) {
throw new RuntimeException("Root's remaining child is incorrect!");
}
}
static class MyFormatImpl extends IIOMetadataFormatImpl {
MyFormatImpl(String root, int minChildren, int maxChildren) {
super(root, minChildren, maxChildren);
}
public void addElement(String elementName,
String parentName,
int childPolicy) {
super.addElement(elementName, parentName, childPolicy);
}
public void removeElement(String elementName) {
super.removeElement(elementName);
}
public boolean canNodeAppear(String elementName,
ImageTypeSpecifier imageType) {
return true;
}
}
}
/*
* 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 4507256
* @run main SetAttributeNode
* @summary Tests the functionality of IIOMetadataNode.setAttributeNode().
* Four separate tests are involved:
* 1) Tests whether a DOMException.INUSE_ATTRIBUTE_ERR is thrown if newAttr
* is already an attribute of another Element object.
* 2) Tests whether setAttributeNode() returns the old attribute if it is
* replaced.
* 3) Tests whether setAttributeNode() returns null if the new attribute is
* not replacing an existing attribute.
* 4) Tests whether the new attribute successfully replaces an existing one.
*/
import javax.imageio.metadata.IIOMetadataNode;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
import org.w3c.dom.TypeInfo;
public class SetAttributeNode {
public static void test1() {
IIOMetadataNode parent = new IIOMetadataNode("parent");
IIOMetadataNode elem = new IIOMetadataNode("elem");
MyAttrNode attrNode = new MyAttrNode("name", "value");
elem.setAttributeNode(attrNode);
attrNode.setOwnerElement(elem);
try {
parent.setAttributeNode(attrNode);
} catch (DOMException e) {
if (e.code != DOMException.INUSE_ATTRIBUTE_ERR) {
throw new RuntimeException("Test 1 failed: " +
"Invalid exception code: " +
e.code);
}
return;
}
throw new RuntimeException("Test 1 failed: DOMException not thrown");
}
public static void test2() {
String name = "attr";
String oldValue = "old value";
String newValue = "new value";
Attr retAttr;
IIOMetadataNode parent = new IIOMetadataNode("parent");
MyAttrNode attrNode1 = new MyAttrNode(name, oldValue);
MyAttrNode attrNode2 = new MyAttrNode(name, newValue);
retAttr = parent.setAttributeNode(attrNode1);
retAttr = parent.setAttributeNode(attrNode2);
String actName = retAttr.getNodeName();
String actValue = retAttr.getValue();
if (!actName.equals(name) || !actValue.equals(oldValue)) {
throw new RuntimeException("Test 2 failed: Invalid attribute " +
"returned: " +
"(name: " + actName +
", value: " + actValue + ")");
}
}
public static void test3() {
IIOMetadataNode parent = new IIOMetadataNode("parent");
MyAttrNode attrNode = new MyAttrNode("name", "value");
Attr retAttr = parent.setAttributeNode(attrNode);
if (retAttr != null) {
throw new RuntimeException("Test 3 failed: Return value is " +
"non-null");
}
}
public static void test4() {
String name = "name";
String correctValue = "correct value";
String wrongValue = "wrong value";
IIOMetadataNode parent = new IIOMetadataNode("parent");
MyAttrNode attrNode1 = new MyAttrNode(name, wrongValue);
MyAttrNode attrNode2 = new MyAttrNode(name, correctValue);
parent.setAttributeNode(attrNode1);
parent.setAttributeNode(attrNode2);
Attr actAttr = parent.getAttributeNode(name);
String actValue = actAttr.getValue();
if (!actValue.equals(correctValue)) {
throw new RuntimeException("Test 4 failed: Return value is: " +
actValue);
}
}
public static void main(String[] args) {
test1();
test2();
test3();
test4();
}
}
class MyAttrNode extends IIOMetadataNode implements Attr {
private Element owner;
private String name;
private String value;
public MyAttrNode(String name, String value) {
this.name = name;
this.value = value;
}
public Element getOwnerElement() {
return owner;
}
public void setOwnerElement(Element owner) {
this.owner = owner;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public boolean getSpecified() {
return false;
}
public TypeInfo getSchemaTypeInfo() {
return null;
}
public boolean isId() {
return false;
}
}
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
* *
* As usual with timing-sensitive tests, we could potentially get * As usual with timing-sensitive tests, we could potentially get
* sporadic failures. We fail if the ratio of the time with many * sporadic failures. We fail if the ratio of the time with many
* MBeans to the time with just one MBean is more than 100. With the * MBeans to the time with just one MBean is more than 500. With the
* fix in place, it is usually less than 1, presumably because some * fix in place, it is usually less than 1, presumably because some
* code was being interpreted during the first measurement but had * code was being interpreted during the first measurement but had
* been compiled by the second. * been compiled by the second.
...@@ -176,7 +176,7 @@ public class ListenerScaleTest { ...@@ -176,7 +176,7 @@ public class ListenerScaleTest {
long manyMBeansTime = timeNotif(mbs); long manyMBeansTime = timeNotif(mbs);
System.out.println("Time with many MBeans: " + manyMBeansTime + "ns"); System.out.println("Time with many MBeans: " + manyMBeansTime + "ns");
double ratio = (double) manyMBeansTime / singleMBeanTime; double ratio = (double) manyMBeansTime / singleMBeanTime;
if (ratio > 100.0) if (ratio > 500.0)
throw new Exception("Failed: ratio=" + ratio); throw new Exception("Failed: ratio=" + ratio);
System.out.println("Test passed: ratio=" + ratio); System.out.println("Test passed: ratio=" + ratio);
} }
......
/*
* 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 6438430
* @summary Tests that submenu title doesn't overlap with submenu indicator
* in JPopupMenu
* @author Mikhail Lapshin
* @run main/othervm -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel bug6438430
* @run main/othervm -Dswing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel bug6438430
*/
import javax.swing.JMenuItem;
import javax.swing.JMenu;
import javax.swing.JCheckBoxMenuItem;
public class bug6438430 {
public static void main(String[] args) {
JMenu subMenu1 = new JMenu("Long-titled Sub Menu");
subMenu1.add(new JMenuItem("SubMenu Item"));
JMenuItem checkBoxMenuItem1 = new JCheckBoxMenuItem("CheckBox");
JMenu menu1 = new JMenu("It works always");
menu1.add(checkBoxMenuItem1);
menu1.add(subMenu1);
// Simulate DefaultMenuLayout calls.
// The latest traversed menu item must be the widest.
checkBoxMenuItem1.getPreferredSize();
int width1 = subMenu1.getPreferredSize().width;
System.out.println("width1 = " + width1);
JMenu subMenu2 = new JMenu("Long-titled Sub Menu");
subMenu2.add(new JMenuItem("SubMenu Item"));
JMenuItem checkBoxMenuItem2 = new JCheckBoxMenuItem("CheckBox");
JMenu menu2 = new JMenu("It did not work before the fix");
menu2.add(subMenu2);
menu2.add(checkBoxMenuItem2);
// Simulate DefaultMenuLayout calls.
// The latest traversed menu item must be the widest.
subMenu2.getPreferredSize();
int width2 = checkBoxMenuItem2.getPreferredSize().width;
System.out.println("width2 = " + width2);
if (width1 != width2) {
throw new RuntimeException( "Submenu title and submenu indicator " +
"overlap on JMenuItem!" );
}
System.out.println("Test passed");
}
}
/* /*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -21,75 +21,97 @@ ...@@ -21,75 +21,97 @@
* questions. * questions.
*/ */
/** /* @test
* See ClassnameCharTest.sh for details. * @bug 4957669 5017871
* @compile -XDignore.symbol.file=true ClassnameCharTest.java
* @run main ClassnameCharTest
* @summary cannot load class names containing some JSR 202 characters;
* plugin does not escape unicode character in http request
*/ */
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import java.security.*; import java.util.jar.*;
import com.sun.net.httpserver.*;
import sun.applet.AppletClassLoader; import sun.applet.AppletClassLoader;
public class ClassnameCharTest implements HttpCallback { public class ClassnameCharTest {
private static String FNPrefix; static String FNPrefix = System.getProperty("test.src", ".") + File.separator;
private String[] respBody = new String[52]; static File classesJar = new File(FNPrefix + "testclasses.jar");
private byte[][] bufs = new byte[52][8*1024]; static HttpServer server;
private static MessageDigest md5;
private static byte[] file1Mac, file2Mac; public static void realMain(String[] args) throws Exception {
public void request (HttpTransaction req) { server = HttpServer.create(new InetSocketAddress(0), 0);
server.createContext("/", new HttpHandler() {
@Override
public void handle(HttpExchange exchange) {
try { try {
String filename = req.getRequestURI().getPath(); String filename = exchange.getRequestURI().getPath();
System.out.println("getRequestURI = "+req.getRequestURI()); System.out.println("getRequestURI = " + exchange.getRequestURI());
System.out.println("filename = "+filename); System.out.println("filename = " + filename);
FileInputStream fis = new FileInputStream(FNPrefix+filename); try (FileInputStream fis = new FileInputStream(classesJar);
req.setResponseEntityBody(fis); JarInputStream jis = new JarInputStream(fis)) {
req.sendResponse(200, "OK"); JarEntry entry;
req.orderlyClose(); while ((entry = jis.getNextJarEntry()) != null) {
if (filename.endsWith(entry.getName())) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[8092];
int count = 0;
while ((count = jis.read(buf)) != -1)
baos.write(buf, 0, count);
exchange.sendResponseHeaders(200, baos.size());
try (OutputStream os = exchange.getResponseBody()) {
baos.writeTo(os);
}
return;
}
}
fail("Failed to find " + filename);
}
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); unexpected(e);
} }
} }
static HttpServer server; });
server.start();
public static void test () throws Exception {
try { try {
URL base = new URL("http://localhost:" + server.getAddress().getPort());
FNPrefix = System.getProperty("test.classes", ".")+"/"; System.out.println ("Server: listening on " + base);
server = new HttpServer (new ClassnameCharTest(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort());
URL base = new URL("http://localhost:"+server.getLocalPort());
MyAppletClassLoader acl = new MyAppletClassLoader(base); MyAppletClassLoader acl = new MyAppletClassLoader(base);
Class class1 = acl.findClass("fo o"); Class<?> class1 = acl.findClass("fo o");
System.out.println("class1 = "+class1); System.out.println("class1 = " + class1);
pass();
// can't test the following class unless platform in unicode locale // can't test the following class unless platform in unicode locale
// Class class2 = acl.findClass("\u624b\u518c"); // Class class2 = acl.findClass("\u624b\u518c");
// System.out.println("class2 = "+class2); // System.out.println("class2 = "+class2);
} catch (Exception e) { } finally {
if (server != null) { server.stop(0);
server.terminate();
} }
throw e;
} }
server.terminate(); static class MyAppletClassLoader extends AppletClassLoader {
}
public static void main(String[] args) throws Exception {
test();
}
public static void except (String s) {
server.terminate();
throw new RuntimeException (s);
}
}
class MyAppletClassLoader extends AppletClassLoader {
MyAppletClassLoader(URL base) { MyAppletClassLoader(URL base) {
super(base); super(base);
} }
public Class findClass(String name) throws ClassNotFoundException { @Override
public Class<?> findClass(String name) throws ClassNotFoundException {
return super.findClass(name); return super.findClass(name);
} }
}
//--------------------- Infrastructure ---------------------------
static volatile int passed = 0, failed = 0;
static boolean pass() {passed++; return true;}
static boolean fail() {failed++; server.stop(0); Thread.dumpStack(); return false;}
static boolean fail(String msg) {System.out.println(msg); return fail();}
static void unexpected(Throwable t) {failed++; server.stop(0); t.printStackTrace();}
static boolean check(boolean cond) {if (cond) pass(); else fail(); return cond;}
static boolean equal(Object x, Object y) {
if (x == null ? y == null : x.equals(y)) return pass();
else return fail(x + " not equal to " + y);}
public static void main(String[] args) throws Throwable {
try {realMain(args);} catch (Throwable t) {unexpected(t);}
System.out.println("\nPassed = " + passed + " failed = " + failed);
if (failed > 0) throw new AssertionError("Some tests failed");}
} }
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 4804309 * @bug 4804309
* @library ../../../sun/net/www/httptest/ * @library ../../../sun/net/www/httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main AuthHeaderTest * @run main AuthHeaderTest
* @summary AuthHeaderTest bug * @summary AuthHeaderTest bug
*/ */
...@@ -90,13 +90,13 @@ public class AuthHeaderTest implements HttpCallback { ...@@ -90,13 +90,13 @@ public class AuthHeaderTest implements HttpCallback {
is.close(); is.close();
} }
static HttpServer server; static TestHttpServer server;
public static void main (String[] args) throws Exception { public static void main (String[] args) throws Exception {
MyAuthenticator auth = new MyAuthenticator (); MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth); Authenticator.setDefault (auth);
try { try {
server = new HttpServer (new AuthHeaderTest(), 1, 10, 0); server = new TestHttpServer (new AuthHeaderTest(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort()); System.out.println ("Server: listening on port: " + server.getLocalPort());
client ("http://localhost:"+server.getLocalPort()+"/d1/foo.html"); client ("http://localhost:"+server.getLocalPort()+"/d1/foo.html");
} catch (Exception e) { } catch (Exception e) {
......
...@@ -24,8 +24,6 @@ ...@@ -24,8 +24,6 @@
/** /**
* @test * @test
* @bug 4333920 4994372 * @bug 4333920 4994372
* @library ../../../../../sun/net/www/httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction
* @run main ChunkedEncodingWithProgressMonitorTest * @run main ChunkedEncodingWithProgressMonitorTest
* @summary ChunkedEncoding unit test; MeteredStream/ProgressData problem * @summary ChunkedEncoding unit test; MeteredStream/ProgressData problem
*/ */
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 5045306 6356004 6993490 * @bug 5045306 6356004 6993490
* @library ../../httptest/ * @library ../../httptest/
* @build HttpCallback HttpServer HttpTransaction * @build HttpCallback TestHttpServer HttpTransaction
* @run main/othervm B5045306 * @run main/othervm B5045306
* @summary Http keep-alive implementation is not efficient * @summary Http keep-alive implementation is not efficient
*/ */
...@@ -50,7 +50,7 @@ import java.lang.management.*; ...@@ -50,7 +50,7 @@ import java.lang.management.*;
public class B5045306 public class B5045306
{ {
static SimpleHttpTransaction httpTrans; static SimpleHttpTransaction httpTrans;
static HttpServer server; static TestHttpServer server;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
startHttpServer(); startHttpServer();
...@@ -60,7 +60,7 @@ public class B5045306 ...@@ -60,7 +60,7 @@ public class B5045306
public static void startHttpServer() { public static void startHttpServer() {
try { try {
httpTrans = new SimpleHttpTransaction(); httpTrans = new SimpleHttpTransaction();
server = new HttpServer(httpTrans, 1, 10, 0); server = new TestHttpServer(httpTrans, 1, 10, 0);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
......
...@@ -37,7 +37,7 @@ public class HttpTransaction { ...@@ -37,7 +37,7 @@ public class HttpTransaction {
String command; String command;
URI requesturi; URI requesturi;
HttpServer.Server server; TestHttpServer.Server server;
MessageHeader reqheaders, reqtrailers; MessageHeader reqheaders, reqtrailers;
String reqbody; String reqbody;
byte[] rspbody; byte[] rspbody;
...@@ -46,7 +46,7 @@ public class HttpTransaction { ...@@ -46,7 +46,7 @@ public class HttpTransaction {
int rspbodylen; int rspbodylen;
boolean rspchunked; boolean rspchunked;
HttpTransaction (HttpServer.Server server, String command, HttpTransaction (TestHttpServer.Server server, String command,
URI requesturi, MessageHeader headers, URI requesturi, MessageHeader headers,
String body, MessageHeader trailers, SelectionKey key) { String body, MessageHeader trailers, SelectionKey key) {
this.command = command; this.command = command;
...@@ -290,7 +290,7 @@ public class HttpTransaction { ...@@ -290,7 +290,7 @@ public class HttpTransaction {
* @param rTag the response string to send with the response code * @param rTag the response string to send with the response code
*/ */
public void sendResponse (int rCode, String rTag) throws IOException { public void sendResponse (int rCode, String rTag) throws IOException {
OutputStream os = new HttpServer.NioOutputStream(channel()); OutputStream os = new TestHttpServer.NioOutputStream(channel());
PrintStream ps = new PrintStream (os); PrintStream ps = new PrintStream (os);
ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n"); ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n");
if (rspheaders != null) { if (rspheaders != null) {
...@@ -314,7 +314,7 @@ public class HttpTransaction { ...@@ -314,7 +314,7 @@ public class HttpTransaction {
/* sends one byte less than intended */ /* sends one byte less than intended */
public void sendPartialResponse (int rCode, String rTag)throws IOException { public void sendPartialResponse (int rCode, String rTag)throws IOException {
OutputStream os = new HttpServer.NioOutputStream(channel()); OutputStream os = new TestHttpServer.NioOutputStream(channel());
PrintStream ps = new PrintStream (os); PrintStream ps = new PrintStream (os);
ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n"); ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n");
ps.flush(); ps.flush();
......
...@@ -48,7 +48,7 @@ import java.util.*; ...@@ -48,7 +48,7 @@ import java.util.*;
* NOTE NOTE NOTE NOTE NOTE NOTE NOTE * NOTE NOTE NOTE NOTE NOTE NOTE NOTE
*/ */
public class HttpServer { public class TestHttpServer {
ServerSocketChannel schan; ServerSocketChannel schan;
int threads; int threads;
...@@ -57,19 +57,19 @@ public class HttpServer { ...@@ -57,19 +57,19 @@ public class HttpServer {
Server[] servers; Server[] servers;
/** /**
* Create a <code>HttpServer<code> instance with the specified callback object * Create a <code>TestHttpServer<code> instance with the specified callback object
* for handling requests. One thread is created to handle requests, * for handling requests. One thread is created to handle requests,
* and up to ten TCP connections will be handled simultaneously. * and up to ten TCP connections will be handled simultaneously.
* @param cb the callback object which is invoked to handle each * @param cb the callback object which is invoked to handle each
* incoming request * incoming request
*/ */
public HttpServer (HttpCallback cb) throws IOException { public TestHttpServer (HttpCallback cb) throws IOException {
this (cb, 1, 10, 0); this (cb, 1, 10, 0);
} }
/** /**
* Create a <code>HttpServer<code> instance with the specified number of * Create a <code>TestHttpServer<code> instance with the specified number of
* threads and maximum number of connections per thread. This functions * threads and maximum number of connections per thread. This functions
* the same as the 4 arg constructor, where the port argument is set to zero. * the same as the 4 arg constructor, where the port argument is set to zero.
* @param cb the callback object which is invoked to handle each * @param cb the callback object which is invoked to handle each
...@@ -80,13 +80,13 @@ public class HttpServer { ...@@ -80,13 +80,13 @@ public class HttpServer {
* handle per thread * handle per thread
*/ */
public HttpServer (HttpCallback cb, int threads, int cperthread) public TestHttpServer (HttpCallback cb, int threads, int cperthread)
throws IOException { throws IOException {
this (cb, threads, cperthread, 0); this (cb, threads, cperthread, 0);
} }
/** /**
* Create a <code>HttpServer<code> instance with the specified number * Create a <code>TestHttpServer<code> instance with the specified number
* of threads and maximum number of connections per thread and running on * of threads and maximum number of connections per thread and running on
* the specified port. The specified number of threads are created to * the specified port. The specified number of threads are created to
* handle incoming requests, and each thread is allowed * handle incoming requests, and each thread is allowed
...@@ -101,7 +101,7 @@ public class HttpServer { ...@@ -101,7 +101,7 @@ public class HttpServer {
* means choose any free port. * means choose any free port.
*/ */
public HttpServer (HttpCallback cb, int threads, int cperthread, int port) public TestHttpServer (HttpCallback cb, int threads, int cperthread, int port)
throws IOException { throws IOException {
schan = ServerSocketChannel.open (); schan = ServerSocketChannel.open ();
InetSocketAddress addr = new InetSocketAddress (port); InetSocketAddress addr = new InetSocketAddress (port);
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 6296310 * @bug 6296310
* @library ../../httptest/ * @library ../../httptest/
* @build HttpCallback HttpServer HttpTransaction * @build HttpCallback TestHttpServer HttpTransaction
* @run main/othervm B6296310 * @run main/othervm B6296310
* @summary REGRESSION: AppletClassLoader.getResourceAsStream() behaviour is wrong in some cases * @summary REGRESSION: AppletClassLoader.getResourceAsStream() behaviour is wrong in some cases
*/ */
...@@ -42,7 +42,7 @@ import java.util.*; ...@@ -42,7 +42,7 @@ import java.util.*;
public class B6296310 public class B6296310
{ {
static SimpleHttpTransaction httpTrans; static SimpleHttpTransaction httpTrans;
static HttpServer server; static TestHttpServer server;
public static void main(String[] args) public static void main(String[] args)
{ {
...@@ -55,7 +55,7 @@ public class B6296310 ...@@ -55,7 +55,7 @@ public class B6296310
public static void startHttpServer() { public static void startHttpServer() {
try { try {
httpTrans = new SimpleHttpTransaction(); httpTrans = new SimpleHttpTransaction();
server = new HttpServer(httpTrans, 1, 10, 0); server = new TestHttpServer(httpTrans, 1, 10, 0);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 6299712 * @bug 6299712
* @library ../../httptest/ * @library ../../httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main/othervm B6299712 * @run main/othervm B6299712
* @summary NullPointerException in sun.net.www.protocol.http.HttpURLConnection.followRedirect * @summary NullPointerException in sun.net.www.protocol.http.HttpURLConnection.followRedirect
*/ */
...@@ -49,7 +49,7 @@ import java.util.*; ...@@ -49,7 +49,7 @@ import java.util.*;
*/ */
public class B6299712 { public class B6299712 {
static SimpleHttpTransaction httpTrans; static SimpleHttpTransaction httpTrans;
static HttpServer server; static TestHttpServer server;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
ResponseCache.setDefault(new DeployCacheHandler()); ResponseCache.setDefault(new DeployCacheHandler());
...@@ -61,7 +61,7 @@ public class B6299712 { ...@@ -61,7 +61,7 @@ public class B6299712 {
public static void startHttpServer() { public static void startHttpServer() {
try { try {
httpTrans = new SimpleHttpTransaction(); httpTrans = new SimpleHttpTransaction();
server = new HttpServer(httpTrans, 1, 10, 0); server = new TestHttpServer(httpTrans, 1, 10, 0);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 4726087 * @bug 4726087
* @library ../../httptest/ * @library ../../httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main RelativeRedirect * @run main RelativeRedirect
* @summary URLConnection cannot handle redirects * @summary URLConnection cannot handle redirects
*/ */
...@@ -35,7 +35,7 @@ import java.net.*; ...@@ -35,7 +35,7 @@ import java.net.*;
public class RelativeRedirect implements HttpCallback { public class RelativeRedirect implements HttpCallback {
static int count = 0; static int count = 0;
static HttpServer server; static TestHttpServer server;
static class MyAuthenticator extends Authenticator { static class MyAuthenticator extends Authenticator {
public MyAuthenticator () { public MyAuthenticator () {
...@@ -89,7 +89,7 @@ public class RelativeRedirect implements HttpCallback { ...@@ -89,7 +89,7 @@ public class RelativeRedirect implements HttpCallback {
MyAuthenticator auth = new MyAuthenticator (); MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth); Authenticator.setDefault (auth);
try { try {
server = new HttpServer (new RelativeRedirect(), 1, 10, 0); server = new TestHttpServer (new RelativeRedirect(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort()); System.out.println ("Server: listening on port: " + server.getLocalPort());
URL url = new URL("http://localhost:"+server.getLocalPort()); URL url = new URL("http://localhost:"+server.getLocalPort());
System.out.println ("client opening connection to: " + url); System.out.println ("client opening connection to: " + url);
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 6262486 * @bug 6262486
* @library ../../httptest/ * @library ../../httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main/othervm -Dhttp.keepAlive=false ResponseCacheStream * @run main/othervm -Dhttp.keepAlive=false ResponseCacheStream
* @summary COMPATIBILITY: jagex_com - Monkey Puzzle applet fails to load * @summary COMPATIBILITY: jagex_com - Monkey Puzzle applet fails to load
*/ */
...@@ -91,13 +91,13 @@ public class ResponseCacheStream implements HttpCallback { ...@@ -91,13 +91,13 @@ public class ResponseCacheStream implements HttpCallback {
} }
} }
static HttpServer server; static TestHttpServer server;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
MyResponseCache cache = new MyResponseCache(); MyResponseCache cache = new MyResponseCache();
try { try {
ResponseCache.setDefault(cache); ResponseCache.setDefault(cache);
server = new HttpServer (new ResponseCacheStream()); server = new TestHttpServer (new ResponseCacheStream());
System.out.println ("Server: listening on port: " + server.getLocalPort()); System.out.println ("Server: listening on port: " + server.getLocalPort());
URL url = new URL ("http://127.0.0.1:"+server.getLocalPort()+"/"); URL url = new URL ("http://127.0.0.1:"+server.getLocalPort()+"/");
System.out.println ("Client: connecting to " + url); System.out.println ("Client: connecting to " + url);
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 5049976 * @bug 5049976
* @library ../../httptest/ * @library ../../httptest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main SetChunkedStreamingMode * @run main SetChunkedStreamingMode
* @summary Unspecified NPE is thrown when streaming output mode is enabled * @summary Unspecified NPE is thrown when streaming output mode is enabled
*/ */
...@@ -60,11 +60,11 @@ public class SetChunkedStreamingMode implements HttpCallback { ...@@ -60,11 +60,11 @@ public class SetChunkedStreamingMode implements HttpCallback {
System.out.println ("finished reading"); System.out.println ("finished reading");
} }
static HttpServer server; static TestHttpServer server;
public static void main (String[] args) throws Exception { public static void main (String[] args) throws Exception {
try { try {
server = new HttpServer (new SetChunkedStreamingMode(), 1, 10, 0); server = new TestHttpServer (new SetChunkedStreamingMode(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort()); System.out.println ("Server: listening on port: " + server.getLocalPort());
URL url = new URL ("http://127.0.0.1:"+server.getLocalPort()+"/"); URL url = new URL ("http://127.0.0.1:"+server.getLocalPort()+"/");
System.out.println ("Client: connecting to " + url); System.out.println ("Client: connecting to " + url);
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
* @test * @test
* @bug 5026745 * @bug 5026745
* @library ../../httpstest/ * @library ../../httpstest/
* @build TestHttpsServer HttpCallback
* @run main/othervm Test * @run main/othervm Test
* *
* SunJSSE does not support dynamic system properties, no way to re-use * SunJSSE does not support dynamic system properties, no way to re-use
...@@ -275,7 +276,7 @@ public class Test implements HttpCallback { ...@@ -275,7 +276,7 @@ public class Test implements HttpCallback {
} }
} }
static HttpServer server; static TestHttpsServer server;
public static void main (String[] args) throws Exception { public static void main (String[] args) throws Exception {
// setup properties to do ssl // setup properties to do ssl
...@@ -296,7 +297,7 @@ public class Test implements HttpCallback { ...@@ -296,7 +297,7 @@ public class Test implements HttpCallback {
HttpsURLConnection.setDefaultHostnameVerifier(new NameVerifier()); HttpsURLConnection.setDefaultHostnameVerifier(new NameVerifier());
try { try {
server = new HttpServer (new Test(), 1, 10, 0); server = new TestHttpsServer (new Test(), 1, 10, 0);
System.out.println ("Server started: listening on port: " + server.getLocalPort()); System.out.println ("Server started: listening on port: " + server.getLocalPort());
// the test server doesn't support keep-alive yet // the test server doesn't support keep-alive yet
// test1("http://localhost:"+server.getLocalPort()+"/d0"); // test1("http://localhost:"+server.getLocalPort()+"/d0");
......
...@@ -37,7 +37,7 @@ public class HttpTransaction { ...@@ -37,7 +37,7 @@ public class HttpTransaction {
String command; String command;
URI requesturi; URI requesturi;
HttpServer.ServerWorker server; TestHttpsServer.ServerWorker server;
MessageHeader reqheaders, reqtrailers; MessageHeader reqheaders, reqtrailers;
String reqbody; String reqbody;
byte[] rspbody; byte[] rspbody;
...@@ -46,7 +46,7 @@ public class HttpTransaction { ...@@ -46,7 +46,7 @@ public class HttpTransaction {
int rspbodylen; int rspbodylen;
boolean rspchunked; boolean rspchunked;
HttpTransaction (HttpServer.ServerWorker server, String command, HttpTransaction (TestHttpsServer.ServerWorker server, String command,
URI requesturi, MessageHeader headers, URI requesturi, MessageHeader headers,
String body, MessageHeader trailers, SocketChannel ch) { String body, MessageHeader trailers, SocketChannel ch) {
this.command = command; this.command = command;
...@@ -290,7 +290,7 @@ public class HttpTransaction { ...@@ -290,7 +290,7 @@ public class HttpTransaction {
* @param rTag the response string to send with the response code * @param rTag the response string to send with the response code
*/ */
public void sendResponse (int rCode, String rTag) throws IOException { public void sendResponse (int rCode, String rTag) throws IOException {
OutputStream os = new HttpServer.NioOutputStream(channel(), server.getSSLEngine(), server.outNetBB(), server.outAppBB()); OutputStream os = new TestHttpsServer.NioOutputStream(channel(), server.getSSLEngine(), server.outNetBB(), server.outAppBB());
PrintStream ps = new PrintStream (os); PrintStream ps = new PrintStream (os);
ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n"); ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n");
if (rspheaders != null) { if (rspheaders != null) {
...@@ -314,7 +314,7 @@ public class HttpTransaction { ...@@ -314,7 +314,7 @@ public class HttpTransaction {
/* sends one byte less than intended */ /* sends one byte less than intended */
public void sendPartialResponse (int rCode, String rTag)throws IOException { public void sendPartialResponse (int rCode, String rTag)throws IOException {
OutputStream os = new HttpServer.NioOutputStream(channel(), server.getSSLEngine(), server.outNetBB(), server.outAppBB()); OutputStream os = new TestHttpsServer.NioOutputStream(channel(), server.getSSLEngine(), server.outNetBB(), server.outAppBB());
PrintStream ps = new PrintStream (os); PrintStream ps = new PrintStream (os);
ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n"); ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n");
ps.flush(); ps.flush();
......
...@@ -51,7 +51,7 @@ import java.security.*; ...@@ -51,7 +51,7 @@ import java.security.*;
* NOTE NOTE NOTE NOTE NOTE NOTE NOTE * NOTE NOTE NOTE NOTE NOTE NOTE NOTE
*/ */
public class HttpServer { public class TestHttpsServer {
ServerSocketChannel schan; ServerSocketChannel schan;
int threads; int threads;
...@@ -63,19 +63,19 @@ public class HttpServer { ...@@ -63,19 +63,19 @@ public class HttpServer {
static SSLContext sslCtx; static SSLContext sslCtx;
/** /**
* Create a <code>HttpServer<code> instance with the specified callback object * Create a <code>TestHttpsServer<code> instance with the specified callback object
* for handling requests. One thread is created to handle requests, * for handling requests. One thread is created to handle requests,
* and up to ten TCP connections will be handled simultaneously. * and up to ten TCP connections will be handled simultaneously.
* @param cb the callback object which is invoked to handle each * @param cb the callback object which is invoked to handle each
* incoming request * incoming request
*/ */
public HttpServer (HttpCallback cb) throws IOException { public TestHttpsServer (HttpCallback cb) throws IOException {
this (cb, 1, 10, 0); this (cb, 1, 10, 0);
} }
/** /**
* Create a <code>HttpServer<code> instance with the specified number of * Create a <code>TestHttpsServer<code> instance with the specified number of
* threads and maximum number of connections per thread. This functions * threads and maximum number of connections per thread. This functions
* the same as the 4 arg constructor, where the port argument is set to zero. * the same as the 4 arg constructor, where the port argument is set to zero.
* @param cb the callback object which is invoked to handle each * @param cb the callback object which is invoked to handle each
...@@ -86,13 +86,13 @@ public class HttpServer { ...@@ -86,13 +86,13 @@ public class HttpServer {
* handle per thread * handle per thread
*/ */
public HttpServer (HttpCallback cb, int threads, int cperthread) public TestHttpsServer (HttpCallback cb, int threads, int cperthread)
throws IOException { throws IOException {
this (cb, threads, cperthread, 0); this (cb, threads, cperthread, 0);
} }
/** /**
* Create a <code>HttpServer<code> instance with the specified number * Create a <code>TestHttpsServer<code> instance with the specified number
* of threads and maximum number of connections per thread and running on * of threads and maximum number of connections per thread and running on
* the specified port. The specified number of threads are created to * the specified port. The specified number of threads are created to
* handle incoming requests, and each thread is allowed * handle incoming requests, and each thread is allowed
...@@ -107,7 +107,7 @@ public class HttpServer { ...@@ -107,7 +107,7 @@ public class HttpServer {
* means choose any free port. * means choose any free port.
*/ */
public HttpServer (HttpCallback cb, int threads, int cperthread, int port) public TestHttpsServer (HttpCallback cb, int threads, int cperthread, int port)
throws IOException { throws IOException {
schan = ServerSocketChannel.open (); schan = ServerSocketChannel.open ();
InetSocketAddress addr = new InetSocketAddress (port); InetSocketAddress addr = new InetSocketAddress (port);
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* @test * @test
* @bug 6216082 * @bug 6216082
* @library ../../../httpstest/ * @library ../../../httpstest/
* @build HttpCallback HttpServer ClosedChannelList HttpTransaction TunnelProxy * @build HttpCallback TestHttpsServer ClosedChannelList HttpTransaction TunnelProxy
* @summary Redirect problem with HttpsURLConnection using a proxy * @summary Redirect problem with HttpsURLConnection using a proxy
* SunJSSE does not support dynamic system properties, no way to re-use * SunJSSE does not support dynamic system properties, no way to re-use
* system properties in samevm/agentvm mode. * system properties in samevm/agentvm mode.
...@@ -39,7 +39,7 @@ import java.util.*; ...@@ -39,7 +39,7 @@ import java.util.*;
public class B6216082 { public class B6216082 {
static SimpleHttpTransaction httpTrans; static SimpleHttpTransaction httpTrans;
static HttpServer server; static TestHttpsServer server;
static TunnelProxy proxy; static TunnelProxy proxy;
// it seems there's no proxy ever if a url points to 'localhost', // it seems there's no proxy ever if a url points to 'localhost',
...@@ -133,7 +133,7 @@ public class B6216082 { ...@@ -133,7 +133,7 @@ public class B6216082 {
// Both the https server and the proxy let the // Both the https server and the proxy let the
// system pick up an ephemeral port. // system pick up an ephemeral port.
httpTrans = new SimpleHttpTransaction(); httpTrans = new SimpleHttpTransaction();
server = new HttpServer(httpTrans, 1, 10, 0); server = new TestHttpsServer(httpTrans, 1, 10, 0);
proxy = new TunnelProxy(1, 10, 0); proxy = new TunnelProxy(1, 10, 0);
} }
......
...@@ -41,30 +41,35 @@ if [ "${TESTJAVA}" = "" ] ; then ...@@ -41,30 +41,35 @@ if [ "${TESTJAVA}" = "" ] ; then
exit 1 exit 1
fi fi
find_one() {
for TARGET_FILE in $@; do
if [ -e "$TARGET_FILE" ]; then
echo $TARGET_FILE
return
fi
done
}
# set platform-dependent variables # set platform-dependent variables
OS=`uname -s` OS=`uname -s`
case "$OS" in case "$OS" in
SunOS ) SunOS )
FS="/" FS="/"
LIBNAME=libsoftokn3.so LIBNAME="/usr/lib/mps/libsoftokn3.so"
ARCH=`isainfo`
case "$ARCH" in
sparc* )
NSSDIR="/usr/lib/mps"
;;
* )
echo "Will not run test on: Solaris ${ARCH}"
exit 0;
;;
esac
;; ;;
Linux ) Linux )
LIBNAME=libsoftokn3.so
ARCH=`uname -m` ARCH=`uname -m`
FS="/" FS="/"
case "$ARCH" in case "$ARCH" in
i[3-6]86 ) i[3-6]86 )
NSSDIR="/usr/lib" LIBNAME=`find_one \
"/usr/lib/libsoftokn3.so" \
"/usr/lib/i386-linux-gnu/nss/libsoftokn3.so"`
;;
x86_64 )
LIBNAME=`find_one \
"/usr/lib64/libsoftokn3.so" \
"/usr/lib/x86_64-linux-gnu/nss/libsoftokn3.so"`
;; ;;
* ) * )
echo "Will not run test on: Linux ${ARCH}" echo "Will not run test on: Linux ${ARCH}"
...@@ -78,7 +83,13 @@ case "$OS" in ...@@ -78,7 +83,13 @@ case "$OS" in
;; ;;
esac esac
${TESTJAVA}${FS}bin${FS}javac -d . ${TESTSRC}${FS}KeyToolTest.java || exit 10 if [ "$LIBNAME" = "" ]; then
echo "Cannot find LIBNAME"
exit 1
fi
${TESTJAVA}${FS}bin${FS}javac -d . -XDignore.symbol.file \
${TESTSRC}${FS}KeyToolTest.java || exit 10
NSS=${TESTSRC}${FS}..${FS}..${FS}pkcs11${FS}nss NSS=${TESTSRC}${FS}..${FS}..${FS}pkcs11${FS}nss
...@@ -91,7 +102,7 @@ chmod u+w key3.db ...@@ -91,7 +102,7 @@ chmod u+w key3.db
chmod u+w cert8.db chmod u+w cert8.db
echo | ${TESTJAVA}${FS}bin${FS}java -Dnss \ echo | ${TESTJAVA}${FS}bin${FS}java -Dnss \
-Dnss.lib=${NSSDIR}${FS}${LIBNAME} \ -Dnss.lib=${LIBNAME} \
KeyToolTest KeyToolTest
status=$? status=$?
...@@ -105,4 +116,3 @@ rm KeyToolTest*.class ...@@ -105,4 +116,3 @@ rm KeyToolTest*.class
rm TestException.class rm TestException.class
exit $status exit $status
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册