--- a/jdk/src/share/classes/com/sun/imageio/plugins/bmp/BMPImageReaderSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/bmp/BMPImageReaderSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -51,7 +51,7 @@
entensions,
mimeType,
"com.sun.imageio.plugins.bmp.BMPImageReader",
- STANDARD_INPUT_TYPE,
+ new Class[] { ImageInputStream.class },
writerSpiNames,
false,
null, null, null, null,
--- a/jdk/src/share/classes/com/sun/imageio/plugins/bmp/BMPImageWriterSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/bmp/BMPImageWriterSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -32,6 +32,7 @@
import javax.imageio.spi.ImageWriterSpi;
import javax.imageio.spi.ServiceRegistry;
import javax.imageio.spi.IIORegistry;
+import javax.imageio.stream.ImageOutputStream;
import javax.imageio.ImageWriter;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.IIOException;
@@ -55,7 +56,7 @@
entensions,
mimeType,
"com.sun.imageio.plugins.bmp.BMPImageWriter",
- STANDARD_OUTPUT_TYPE,
+ new Class[] { ImageOutputStream.class },
readerSpiNames,
false,
null, null, null, null,
--- a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReaderSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReaderSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -60,7 +60,7 @@
suffixes,
MIMETypes,
readerClassName,
- STANDARD_INPUT_TYPE,
+ new Class[] { ImageInputStream.class },
writerSpiNames,
true,
GIFStreamMetadata.nativeMetadataFormatName,
--- a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageWriterSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageWriterSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -31,6 +31,7 @@
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriter;
import javax.imageio.spi.ImageWriterSpi;
+import javax.imageio.stream.ImageOutputStream;
import com.sun.imageio.plugins.common.PaletteBuilder;
public class GIFImageWriterSpi extends ImageWriterSpi {
@@ -59,7 +60,7 @@
suffixes,
MIMETypes,
writerClassName,
- STANDARD_OUTPUT_TYPE,
+ new Class[] { ImageOutputStream.class },
readerSpiNames,
true,
GIFWritableStreamMetadata.NATIVE_FORMAT_NAME,
--- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -46,7 +46,7 @@
JPEG.suffixes,
JPEG.MIMETypes,
"com.sun.imageio.plugins.jpeg.JPEGImageReader",
- STANDARD_INPUT_TYPE,
+ new Class[] { ImageInputStream.class },
writerSpiNames,
true,
JPEG.nativeStreamMetadataFormatName,
--- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -28,6 +28,7 @@
import javax.imageio.spi.ImageWriterSpi;
import javax.imageio.spi.ServiceRegistry;
import javax.imageio.spi.IIORegistry;
+import javax.imageio.stream.ImageOutputStream;
import javax.imageio.ImageWriter;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.IIOException;
@@ -49,7 +50,7 @@
JPEG.suffixes,
JPEG.MIMETypes,
"com.sun.imageio.plugins.jpeg.JPEGImageWriter",
- STANDARD_OUTPUT_TYPE,
+ new Class[] { ImageOutputStream.class },
readerSpiNames,
true,
JPEG.nativeStreamMetadataFormatName,
--- a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageReaderSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageReaderSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -60,7 +60,7 @@
suffixes,
MIMETypes,
readerClassName,
- STANDARD_INPUT_TYPE,
+ new Class[] { ImageInputStream.class },
writerSpiNames,
false,
null, null,
--- a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageWriterSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageWriterSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -34,6 +34,7 @@
import javax.imageio.metadata.IIOMetadataFormat;
import javax.imageio.metadata.IIOMetadataFormatImpl;
import javax.imageio.spi.ImageWriterSpi;
+import javax.imageio.stream.ImageOutputStream;
public class PNGImageWriterSpi extends ImageWriterSpi {
@@ -61,7 +62,7 @@
suffixes,
MIMETypes,
writerClassName,
- STANDARD_OUTPUT_TYPE,
+ new Class[] { ImageOutputStream.class },
readerSpiNames,
false,
null, null,
--- a/jdk/src/share/classes/com/sun/imageio/plugins/wbmp/WBMPImageReaderSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/wbmp/WBMPImageReaderSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -55,7 +55,7 @@
entensions,
mimeType,
"com.sun.imageio.plugins.wbmp.WBMPImageReader",
- STANDARD_INPUT_TYPE,
+ new Class[] { ImageInputStream.class },
writerSpiNames,
true,
null, null, null, null,
--- a/jdk/src/share/classes/com/sun/imageio/plugins/wbmp/WBMPImageWriterSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/wbmp/WBMPImageWriterSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -28,6 +28,7 @@
import javax.imageio.spi.ImageWriterSpi;
import javax.imageio.spi.ServiceRegistry;
import javax.imageio.spi.IIORegistry;
+import javax.imageio.stream.ImageOutputStream;
import javax.imageio.ImageWriter;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.IIOException;
@@ -54,7 +55,7 @@
entensions,
mimeType,
"com.sun.imageio.plugins.wbmp.WBMPImageWriter",
- STANDARD_OUTPUT_TYPE,
+ new Class[] { ImageOutputStream.class },
readerSpiNames,
true,
null, null, null, null,
--- a/jdk/src/share/classes/com/sun/imageio/stream/StreamCloser.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/imageio/stream/StreamCloser.java Wed Jul 08 14:24:20 2009 -0700
@@ -43,35 +43,35 @@
*/
public class StreamCloser {
- private static WeakHashMap<ImageInputStream, Object> toCloseQueue;
+ private static WeakHashMap<CloseAction, Object> toCloseQueue;
private static Thread streamCloser;
- public static void addToQueue(ImageInputStream iis) {
+ public static void addToQueue(CloseAction ca) {
synchronized (StreamCloser.class) {
if (toCloseQueue == null) {
toCloseQueue =
- new WeakHashMap<ImageInputStream, Object>();
+ new WeakHashMap<CloseAction, Object>();
}
- toCloseQueue.put(iis, null);
+ toCloseQueue.put(ca, null);
if (streamCloser == null) {
final Runnable streamCloserRunnable = new Runnable() {
public void run() {
if (toCloseQueue != null) {
synchronized (StreamCloser.class) {
- Set<ImageInputStream> set =
+ Set<CloseAction> set =
toCloseQueue.keySet();
// Make a copy of the set in order to avoid
// concurrent modification (the is.close()
// will in turn call removeFromQueue())
- ImageInputStream[] streams =
- new ImageInputStream[set.size()];
- streams = set.toArray(streams);
- for (ImageInputStream is : streams) {
- if (is != null) {
+ CloseAction[] actions =
+ new CloseAction[set.size()];
+ actions = set.toArray(actions);
+ for (CloseAction ca : actions) {
+ if (ca != null) {
try {
- is.close();
+ ca.performAction();
} catch (IOException e) {
}
}
@@ -106,10 +106,28 @@
}
}
- public static void removeFromQueue(ImageInputStream iis) {
+ public static void removeFromQueue(CloseAction ca) {
synchronized (StreamCloser.class) {
if (toCloseQueue != null) {
- toCloseQueue.remove(iis);
+ toCloseQueue.remove(ca);
+ }
+ }
+ }
+
+ public static CloseAction createCloseAction(ImageInputStream iis) {
+ return new CloseAction(iis);
+ }
+
+ public static final class CloseAction {
+ private ImageInputStream iis;
+
+ private CloseAction(ImageInputStream iis) {
+ this.iis = iis;
+ }
+
+ public void performAction() throws IOException {
+ if (iis != null) {
+ iis.close();
}
}
}
--- a/jdk/src/share/classes/com/sun/media/sound/JDK13Services.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/media/sound/JDK13Services.java Wed Jul 08 14:24:20 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. 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
@@ -41,6 +41,15 @@
import javax.sound.midi.spi.SoundbankReader;
import javax.sound.midi.spi.MidiDeviceProvider;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.Sequencer;
+import javax.sound.midi.Synthesizer;
+import javax.sound.midi.Transmitter;
+import javax.sound.sampled.Clip;
+import javax.sound.sampled.Port;
+import javax.sound.sampled.SourceDataLine;
+import javax.sound.sampled.TargetDataLine;
+
/**
* JDK13Services uses the Service class in JDK 1.3
@@ -186,6 +195,16 @@
If the property is not set, null is returned.
*/
private static synchronized String getDefaultProvider(Class typeClass) {
+ if (!SourceDataLine.class.equals(typeClass)
+ && !TargetDataLine.class.equals(typeClass)
+ && !Clip.class.equals(typeClass)
+ && !Port.class.equals(typeClass)
+ && !Receiver.class.equals(typeClass)
+ && !Transmitter.class.equals(typeClass)
+ && !Synthesizer.class.equals(typeClass)
+ && !Sequencer.class.equals(typeClass)) {
+ return null;
+ }
String value;
String propertyName = typeClass.getName();
value = JSSecurityManager.getProperty(propertyName);
--- a/jdk/src/share/classes/com/sun/media/sound/JSSecurityManager.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/media/sound/JSSecurityManager.java Wed Jul 08 14:24:20 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. 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
@@ -283,28 +283,37 @@
static List getProviders(final Class providerClass) {
- PrivilegedAction action = new PrivilegedAction() {
- public Object run() {
- List p = new ArrayList();
- Iterator ps = Service.providers(providerClass);
- while (ps.hasNext()) {
- try {
- Object provider = ps.next();
- if (providerClass.isInstance(provider)) {
- // $$mp 2003-08-22
- // Always adding at the beginning reverses the
- // order of the providers. So we no longer have
- // to do this in AudioSystem and MidiSystem.
- p.add(0, provider);
- }
- } catch (Throwable t) {
- //$$fb 2002-11-07: do not fail on SPI not found
- if (Printer.err) t.printStackTrace();
- } }
- return p;
+ List p = new ArrayList();
+ // Service.providers(Class) just creates "lazy" iterator instance,
+ // so it doesn't require do be called from privileged section
+ final Iterator ps = Service.providers(providerClass);
+
+ // the iterator's hasNext() method looks through classpath for
+ // the provider class names, so it requires read permissions
+ PrivilegedAction<Boolean> hasNextAction = new PrivilegedAction<Boolean>() {
+ public Boolean run() {
+ return ps.hasNext();
+ }
+ };
+
+ while (AccessController.doPrivileged(hasNextAction)) {
+ try {
+ // the iterator's next() method creates instances of the
+ // providers and it should be called in the current security
+ // context
+ Object provider = ps.next();
+ if (providerClass.isInstance(provider)) {
+ // $$mp 2003-08-22
+ // Always adding at the beginning reverses the
+ // order of the providers. So we no longer have
+ // to do this in AudioSystem and MidiSystem.
+ p.add(0, provider);
}
- };
- List providers = (List) AccessController.doPrivileged(action);
- return providers;
+ } catch (Throwable t) {
+ //$$fb 2002-11-07: do not fail on SPI not found
+ if (Printer.err) t.printStackTrace();
+ }
+ }
+ return p;
}
}
--- a/jdk/src/share/classes/com/sun/media/sound/StandardMidiFileWriter.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/media/sound/StandardMidiFileWriter.java Wed Jul 08 14:24:20 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. 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
@@ -82,7 +82,7 @@
/**
* MIDI parser types
*/
- public static final int types[] = {
+ private static final int types[] = {
MIDI_TYPE_0,
MIDI_TYPE_1
};
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/IntegrityHmac.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/IntegrityHmac.java Wed Jul 08 14:24:20 2009 -0700
@@ -60,8 +60,14 @@
*/
public abstract String engineGetURI();
+ /**
+ * Returns the output length of the hash/digest.
+ */
+ abstract int getDigestLength();
+
/** Field _macAlgorithm */
private Mac _macAlgorithm = null;
+ private boolean _HMACOutputLengthSet = false;
/** Field _HMACOutputLength */
int _HMACOutputLength = 0;
@@ -115,14 +121,16 @@
throws XMLSignatureException {
try {
- byte[] completeResult = this._macAlgorithm.doFinal();
-
- if ((this._HMACOutputLength == 0) || (this._HMACOutputLength >= 160)) {
+ if (this._HMACOutputLengthSet && this._HMACOutputLength < getDigestLength()) {
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE,
+ "HMACOutputLength must not be less than " + getDigestLength());
+ }
+ throw new XMLSignatureException("errorMessages.XMLSignatureException");
+ } else {
+ byte[] completeResult = this._macAlgorithm.doFinal();
return MessageDigestAlgorithm.isEqual(completeResult, signature);
}
- byte[] stripped = IntegrityHmac.reduceBitLength(completeResult,
- this._HMACOutputLength);
- return MessageDigestAlgorithm.isEqual(stripped, signature);
} catch (IllegalStateException ex) {
throw new XMLSignatureException("empty", ex);
}
@@ -176,14 +184,15 @@
protected byte[] engineSign() throws XMLSignatureException {
try {
- byte[] completeResult = this._macAlgorithm.doFinal();
-
- if ((this._HMACOutputLength == 0) || (this._HMACOutputLength >= 160)) {
- return completeResult;
+ if (this._HMACOutputLengthSet && this._HMACOutputLength < getDigestLength()) {
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE,
+ "HMACOutputLength must not be less than " + getDigestLength());
+ }
+ throw new XMLSignatureException("errorMessages.XMLSignatureException");
+ } else {
+ return this._macAlgorithm.doFinal();
}
- return IntegrityHmac.reduceBitLength(completeResult,
- this._HMACOutputLength);
-
} catch (IllegalStateException ex) {
throw new XMLSignatureException("empty", ex);
}
@@ -361,6 +370,7 @@
*/
protected void engineSetHMACOutputLength(int HMACOutputLength) {
this._HMACOutputLength = HMACOutputLength;
+ this._HMACOutputLengthSet = true;
}
/**
@@ -376,12 +386,13 @@
throw new IllegalArgumentException("element null");
}
- Text hmaclength =XMLUtils.selectDsNodeText(element.getFirstChild(),
- Constants._TAG_HMACOUTPUTLENGTH,0);
+ Text hmaclength =XMLUtils.selectDsNodeText(element.getFirstChild(),
+ Constants._TAG_HMACOUTPUTLENGTH,0);
- if (hmaclength != null) {
- this._HMACOutputLength = Integer.parseInt(hmaclength.getData());
- }
+ if (hmaclength != null) {
+ this._HMACOutputLength = Integer.parseInt(hmaclength.getData());
+ this._HMACOutputLengthSet = true;
+ }
}
@@ -390,14 +401,13 @@
*
* @param element
*/
- public void engineAddContextToElement(Element element)
- {
+ public void engineAddContextToElement(Element element) {
if (element == null) {
throw new IllegalArgumentException("null element");
}
- if (this._HMACOutputLength != 0) {
+ if (this._HMACOutputLengthSet) {
Document doc = element.getOwnerDocument();
Element HMElem = XMLUtils.createElementInSignatureSpace(doc,
Constants._TAG_HMACOUTPUTLENGTH);
@@ -436,6 +446,10 @@
public String engineGetURI() {
return XMLSignature.ALGO_ID_MAC_HMAC_SHA1;
}
+
+ int getDigestLength() {
+ return 160;
+ }
}
/**
@@ -463,6 +477,10 @@
public String engineGetURI() {
return XMLSignature.ALGO_ID_MAC_HMAC_SHA256;
}
+
+ int getDigestLength() {
+ return 256;
+ }
}
/**
@@ -490,6 +508,10 @@
public String engineGetURI() {
return XMLSignature.ALGO_ID_MAC_HMAC_SHA384;
}
+
+ int getDigestLength() {
+ return 384;
+ }
}
/**
@@ -517,6 +539,10 @@
public String engineGetURI() {
return XMLSignature.ALGO_ID_MAC_HMAC_SHA512;
}
+
+ int getDigestLength() {
+ return 512;
+ }
}
/**
@@ -544,6 +570,10 @@
public String engineGetURI() {
return XMLSignature.ALGO_ID_MAC_HMAC_RIPEMD160;
}
+
+ int getDigestLength() {
+ return 160;
+ }
}
/**
@@ -571,5 +601,9 @@
public String engineGetURI() {
return XMLSignature.ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5;
}
+
+ int getDigestLength() {
+ return 128;
+ }
}
}
--- a/jdk/src/share/classes/java/awt/Cursor.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/java/awt/Cursor.java Wed Jul 08 14:24:20 2009 -0700
@@ -118,8 +118,18 @@
*/
public static final int MOVE_CURSOR = 13;
+ /**
+ * @deprecated As of JDK version 1.7, the {@link #getPredefinedCursor()}
+ * method should be used instead.
+ */
+ @Deprecated
protected static Cursor predefined[] = new Cursor[14];
+ /**
+ * This field is a private replacement for 'predefined' array.
+ */
+ private final static Cursor[] predefinedPrivate = new Cursor[14];
+
/* Localization names and default values */
static final String[][] cursorProperties = {
{ "AWT.DefaultCursor", "Default Cursor" },
@@ -253,10 +263,15 @@
if (type < Cursor.DEFAULT_CURSOR || type > Cursor.MOVE_CURSOR) {
throw new IllegalArgumentException("illegal cursor type");
}
+ Cursor c = predefinedPrivate[type];
+ if (c == null) {
+ predefinedPrivate[type] = c = new Cursor(type);
+ }
+ // fill 'predefined' array for backwards compatibility.
if (predefined[type] == null) {
- predefined[type] = new Cursor(type);
+ predefined[type] = c;
}
- return predefined[type];
+ return c;
}
/**
--- a/jdk/src/share/classes/java/awt/Window.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/java/awt/Window.java Wed Jul 08 14:24:20 2009 -0700
@@ -3723,16 +3723,58 @@
// ****************** END OF MIXING CODE ********************************
- // This method gets the window location/size as reported by the native
- // system since the locally cached values may represent outdated data.
- // NOTE: this method is invoked on the toolkit thread, and therefore
- // is not supposed to become public/user-overridable.
+ /**
+ * Limit the given double value with the given range.
+ */
+ private static double limit(double value, double min, double max) {
+ value = Math.max(value, min);
+ value = Math.min(value, max);
+ return value;
+ }
+
+ /**
+ * Calculate the position of the security warning.
+ *
+ * This method gets the window location/size as reported by the native
+ * system since the locally cached values may represent outdated data.
+ *
+ * The method is used from the native code, or via AWTAccessor.
+ *
+ * NOTE: this method is invoked on the toolkit thread, and therefore is not
+ * supposed to become public/user-overridable.
+ */
private Point2D calculateSecurityWarningPosition(double x, double y,
double w, double h)
{
- return new Point2D.Double(
- x + w * securityWarningAlignmentX + securityWarningPointX,
- y + h * securityWarningAlignmentY + securityWarningPointY);
+ // The position according to the spec of SecurityWarning.setPosition()
+ double wx = x + w * securityWarningAlignmentX + securityWarningPointX;
+ double wy = y + h * securityWarningAlignmentY + securityWarningPointY;
+
+ // First, make sure the warning is not too far from the window bounds
+ wx = Window.limit(wx,
+ x - securityWarningWidth - 2,
+ x + w + 2);
+ wy = Window.limit(wy,
+ y - securityWarningHeight - 2,
+ y + h + 2);
+
+ // Now make sure the warning window is visible on the screen
+ GraphicsConfiguration graphicsConfig =
+ getGraphicsConfiguration_NoClientCode();
+ Rectangle screenBounds = graphicsConfig.getBounds();
+ Insets screenInsets =
+ Toolkit.getDefaultToolkit().getScreenInsets(graphicsConfig);
+
+ wx = Window.limit(wx,
+ screenBounds.x + screenInsets.left,
+ screenBounds.x + screenBounds.width - screenInsets.right
+ - securityWarningWidth);
+ wy = Window.limit(wy,
+ screenBounds.y + screenInsets.top,
+ screenBounds.y + screenBounds.height - screenInsets.bottom
+ - securityWarningHeight);
+
+ return new Point2D.Double(wx, wy);
}
static {
--- a/jdk/src/share/classes/java/beans/Introspector.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/java/beans/Introspector.java Wed Jul 08 14:24:20 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. 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
@@ -45,6 +45,7 @@
import java.util.List;
import java.util.WeakHashMap;
import java.util.TreeMap;
+import sun.awt.AppContext;
import sun.reflect.misc.ReflectUtil;
/**
@@ -111,8 +112,8 @@
// Static Caches to speed up introspection.
private static Map declaredMethodCache =
Collections.synchronizedMap(new WeakHashMap());
- private static Map beanInfoCache =
- Collections.synchronizedMap(new WeakHashMap());
+
+ private static final Object BEANINFO_CACHE = new Object();
private Class beanClass;
private BeanInfo explicitBeanInfo;
@@ -175,10 +176,18 @@
if (!ReflectUtil.isPackageAccessible(beanClass)) {
return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
}
- BeanInfo bi = (BeanInfo)beanInfoCache.get(beanClass);
+ Map<Class<?>, BeanInfo> map;
+ synchronized (BEANINFO_CACHE) {
+ map = (Map<Class<?>, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE);
+ if (map == null) {
+ map = Collections.synchronizedMap(new WeakHashMap<Class<?>, BeanInfo>());
+ AppContext.getAppContext().put(BEANINFO_CACHE, map);
+ }
+ }
+ BeanInfo bi = map.get(beanClass);
if (bi == null) {
bi = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
- beanInfoCache.put(beanClass, bi);
+ map.put(beanClass, bi);
}
return bi;
}
@@ -351,7 +360,10 @@
*/
public static void flushCaches() {
- beanInfoCache.clear();
+ Map map = (Map) AppContext.getAppContext().get(BEANINFO_CACHE);
+ if (map != null) {
+ map.clear();
+ }
declaredMethodCache.clear();
}
@@ -374,7 +386,10 @@
if (clz == null) {
throw new NullPointerException();
}
- beanInfoCache.remove(clz);
+ Map map = (Map) AppContext.getAppContext().get(BEANINFO_CACHE);
+ if (map != null) {
+ map.remove(clz);
+ }
declaredMethodCache.remove(clz);
}
--- a/jdk/src/share/classes/java/beans/MetaData.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/java/beans/MetaData.java Wed Jul 08 14:24:20 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-2009 Sun Microsystems, Inc. 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
@@ -333,31 +333,6 @@
return (oldC.size() == newC.size()) && oldC.containsAll(newC);
}
- static Object getPrivateField(final Object instance, final String name) {
- return AccessController.doPrivileged(
- new PrivilegedAction() {
- public Object run() {
- Class type = instance.getClass();
- while ( true ) {
- try {
- Field field = type.getDeclaredField(name);
- field.setAccessible(true);
- return field.get( instance );
- }
- catch (NoSuchFieldException exception) {
- type = type.getSuperclass();
- if (type == null) {
- throw new IllegalStateException("Could not find field " + name, exception);
- }
- }
- catch (Exception exception) {
- throw new IllegalStateException("Could not get value " + type.getName() + '.' + name, exception);
- }
- }
- }
- } );
- }
-
static final class EmptyList_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
return new Expression(oldInstance, Collections.class, "emptyList", null);
@@ -498,7 +473,7 @@
static final class CheckedCollection_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object type = getPrivateField(oldInstance, "type");
+ Object type = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedCollection.type");
List list = new ArrayList((Collection) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedCollection", new Object[]{list, type});
}
@@ -506,7 +481,7 @@
static final class CheckedList_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object type = getPrivateField(oldInstance, "type");
+ Object type = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedCollection.type");
List list = new LinkedList((Collection) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedList", new Object[]{list, type});
}
@@ -514,7 +489,7 @@
static final class CheckedRandomAccessList_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object type = getPrivateField(oldInstance, "type");
+ Object type = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedCollection.type");
List list = new ArrayList((Collection) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedList", new Object[]{list, type});
}
@@ -522,7 +497,7 @@
static final class CheckedSet_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object type = getPrivateField(oldInstance, "type");
+ Object type = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedCollection.type");
Set set = new HashSet((Set) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedSet", new Object[]{set, type});
}
@@ -530,7 +505,7 @@
static final class CheckedSortedSet_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object type = getPrivateField(oldInstance, "type");
+ Object type = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedCollection.type");
SortedSet set = new TreeSet((SortedSet) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedSortedSet", new Object[]{set, type});
}
@@ -538,8 +513,8 @@
static final class CheckedMap_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object keyType = getPrivateField(oldInstance, "keyType");
- Object valueType = getPrivateField(oldInstance, "valueType");
+ Object keyType = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedMap.keyType");
+ Object valueType = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedMap.valueType");
Map map = new HashMap((Map) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedMap", new Object[]{map, keyType, valueType});
}
@@ -547,8 +522,8 @@
static final class CheckedSortedMap_PersistenceDelegate extends java_util_Collections {
protected Expression instantiate(Object oldInstance, Encoder out) {
- Object keyType = getPrivateField(oldInstance, "keyType");
- Object valueType = getPrivateField(oldInstance, "valueType");
+ Object keyType = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedMap.keyType");
+ Object valueType = MetaData.getPrivateFieldValue(oldInstance, "java.util.Collections$CheckedMap.valueType");
SortedMap map = new TreeMap((SortedMap) oldInstance);
return new Expression(oldInstance, Collections.class, "checkedSortedMap", new Object[]{map, keyType, valueType});
}
@@ -570,7 +545,7 @@
}
private static Object getType(Object instance) {
- return java_util_Collections.getPrivateField(instance, "keyType");
+ return MetaData.getPrivateFieldValue(instance, "java.util.EnumMap.keyType");
}
}
@@ -589,7 +564,7 @@
}
private static Object getType(Object instance) {
- return java_util_Collections.getPrivateField(instance, "elementType");
+ return MetaData.getPrivateFieldValue(instance, "java.util.EnumSet.elementType");
}
}
@@ -1280,7 +1255,7 @@
private Integer getAxis(Object object) {
Box box = (Box) object;
- return (Integer) java_util_Collections.getPrivateField(box.getLayout(), "axis");
+ return (Integer) MetaData.getPrivateFieldValue(box.getLayout(), "javax.swing.BoxLayout.axis");
}
}
@@ -1363,6 +1338,7 @@
}
class MetaData {
+ private static final Map<String,Field> fields = Collections.synchronizedMap(new WeakHashMap<String, Field>());
private static Hashtable internalPersistenceDelegates = new Hashtable();
private static PersistenceDelegate nullPersistenceDelegate = new NullPersistenceDelegate();
@@ -1501,4 +1477,35 @@
return null;
}
}
+
+ static Object getPrivateFieldValue(Object instance, String name) {
+ Field field = fields.get(name);
+ if (field == null) {
+ int index = name.lastIndexOf('.');
+ final String className = name.substring(0, index);
+ final String fieldName = name.substring(1 + index);
+ field = AccessController.doPrivileged(new PrivilegedAction<Field>() {
+ public Field run() {
+ try {
+ Field field = Class.forName(className).getDeclaredField(fieldName);
+ field.setAccessible(true);
+ return field;
+ }
+ catch (ClassNotFoundException exception) {
+ throw new IllegalStateException("Could not find class", exception);
+ }
+ catch (NoSuchFieldException exception) {
+ throw new IllegalStateException("Could not find field", exception);
+ }
+ }
+ });
+ fields.put(name, field);
+ }
+ try {
+ return field.get(instance);
+ }
+ catch (IllegalAccessException exception) {
+ throw new IllegalStateException("Could not get value of the field", exception);
+ }
+ }
}
--- a/jdk/src/share/classes/java/net/Socket.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/java/net/Socket.java Wed Jul 08 14:24:20 2009 -0700
@@ -114,9 +114,14 @@
* @since 1.5
*/
public Socket(Proxy proxy) {
- if (proxy != null && proxy.type() == Proxy.Type.SOCKS) {
+ // Create a copy of Proxy as a security measure
+ if (proxy == null) {
+ throw new IllegalArgumentException("Invalid Proxy");
+ }
+ Proxy p = proxy == Proxy.NO_PROXY ? Proxy.NO_PROXY : sun.net.ApplicationProxy.create(proxy);
+ if (p.type() == Proxy.Type.SOCKS) {
SecurityManager security = System.getSecurityManager();
- InetSocketAddress epoint = (InetSocketAddress) proxy.address();
+ InetSocketAddress epoint = (InetSocketAddress) p.address();
if (security != null) {
if (epoint.isUnresolved())
security.checkConnect(epoint.getHostName(),
@@ -125,10 +130,10 @@
security.checkConnect(epoint.getAddress().getHostAddress(),
epoint.getPort());
}
- impl = new SocksSocketImpl(proxy);
+ impl = new SocksSocketImpl(p);
impl.setSocket(this);
} else {
- if (proxy == Proxy.NO_PROXY) {
+ if (p == Proxy.NO_PROXY) {
if (factory == null) {
impl = new PlainSocketImpl();
impl.setSocket(this);
--- a/jdk/src/share/classes/java/net/SocksSocketImpl.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/java/net/SocksSocketImpl.java Wed Jul 08 14:24:20 2009 -0700
@@ -46,6 +46,9 @@
private Socket cmdsock = null;
private InputStream cmdIn = null;
private OutputStream cmdOut = null;
+ /* true if the Proxy has been set programatically */
+ private boolean applicationSetProxy; /* false */
+
SocksSocketImpl() {
// Nothing needed
@@ -237,8 +240,7 @@
out.write((endpoint.getPort() >> 8) & 0xff);
out.write((endpoint.getPort() >> 0) & 0xff);
out.write(endpoint.getAddress().getAddress());
- String userName = java.security.AccessController.doPrivileged(
- new sun.security.action.GetPropertyAction("user.name"));
+ String userName = getUserName();
try {
out.write(userName.getBytes("ISO-8859-1"));
} catch (java.io.UnsupportedEncodingException uee) {
@@ -554,8 +556,7 @@
out.write((super.getLocalPort() >> 8) & 0xff);
out.write((super.getLocalPort() >> 0) & 0xff);
out.write(addr1);
- String userName = java.security.AccessController.doPrivileged(
- new sun.security.action.GetPropertyAction("user.name"));
+ String userName = getUserName();
try {
out.write(userName.getBytes("ISO-8859-1"));
} catch (java.io.UnsupportedEncodingException uee) {
@@ -1022,4 +1023,16 @@
super.close();
}
+ private String getUserName() {
+ String userName = "";
+ if (applicationSetProxy) {
+ try {
+ userName = System.getProperty("user.name");
+ } catch (SecurityException se) { /* swallow Exception */ }
+ } else {
+ userName = java.security.AccessController.doPrivileged(
+ new sun.security.action.GetPropertyAction("user.name"));
+ }
+ return userName;
+ }
}
--- a/jdk/src/share/classes/java/net/URL.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/java/net/URL.java Wed Jul 08 14:24:20 2009 -0700
@@ -1004,16 +1004,18 @@
throw new IllegalArgumentException("proxy can not be null");
}
+ // Create a copy of Proxy as a security measure
+ Proxy p = proxy == Proxy.NO_PROXY ? Proxy.NO_PROXY : sun.net.ApplicationProxy.create(proxy);
SecurityManager sm = System.getSecurityManager();
- if (proxy.type() != Proxy.Type.DIRECT && sm != null) {
- InetSocketAddress epoint = (InetSocketAddress) proxy.address();
+ if (p.type() != Proxy.Type.DIRECT && sm != null) {
+ InetSocketAddress epoint = (InetSocketAddress) p.address();
if (epoint.isUnresolved())
sm.checkConnect(epoint.getHostName(), epoint.getPort());
else
sm.checkConnect(epoint.getAddress().getHostAddress(),
epoint.getPort());
}
- return handler.openConnection(this, proxy);
+ return handler.openConnection(this, p);
}
/**
--- a/jdk/src/share/classes/javax/accessibility/AccessibleResourceBundle.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/javax/accessibility/AccessibleResourceBundle.java Wed Jul 08 14:24:20 2009 -0700
@@ -44,15 +44,11 @@
* localized display strings.
*/
public Object[][] getContents() {
- return contents;
- }
+ // The table holding the mapping between the programmatic keys
+ // and the display strings for the en_US locale.
+ return new Object[][] {
- /**
- * The table holding the mapping between the programmatic keys
- * and the display strings for the en_US locale.
- */
- static final Object[][] contents = {
- // LOCALIZE THIS
+ // LOCALIZE THIS
// Role names
// { "application","application" },
// { "border","border" },
@@ -151,5 +147,6 @@
{ "vertical","vertical" },
{ "horizontal","horizontal" }
// END OF MATERIAL TO LOCALIZE
- };
+ };
+ }
}
--- a/jdk/src/share/classes/javax/imageio/plugins/bmp/BMPImageWriteParam.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/javax/imageio/plugins/bmp/BMPImageWriteParam.java Wed Jul 08 14:24:20 2009 -0700
@@ -78,7 +78,7 @@
super(locale);
// Set compression types ("BI_RGB" denotes uncompressed).
- compressionTypes = BMPConstants.compressionTypeNames;
+ compressionTypes = BMPConstants.compressionTypeNames.clone();
// Set compression flag.
canWriteCompressed = true;
--- a/jdk/src/share/classes/javax/imageio/spi/ImageReaderSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/javax/imageio/spi/ImageReaderSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -77,7 +77,10 @@
* A single-element array, initially containing
* <code>ImageInputStream.class</code>, to be returned from
* <code>getInputTypes</code>.
+ * @deprecated Instead of using this field, directly create
+ * the equivalent array <code>{ ImageInputStream.class }<code>.
*/
+ @Deprecated
public static final Class[] STANDARD_INPUT_TYPE =
{ ImageInputStream.class };
@@ -227,7 +230,11 @@
throw new IllegalArgumentException
("inputTypes.length == 0!");
}
- this.inputTypes = (Class[])inputTypes.clone();
+
+ this.inputTypes = (inputTypes == STANDARD_INPUT_TYPE) ?
+ new Class<?>[] { ImageInputStream.class } :
+ inputTypes.clone();
+
// If length == 0, leave it null
if (writerSpiNames != null && writerSpiNames.length > 0) {
this.writerSpiNames = (String[])writerSpiNames.clone();
--- a/jdk/src/share/classes/javax/imageio/spi/ImageWriterSpi.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/javax/imageio/spi/ImageWriterSpi.java Wed Jul 08 14:24:20 2009 -0700
@@ -77,9 +77,12 @@
/**
* A single-element array, initially containing
- * <code>ImageInputStream.class</code>, to be returned from
- * <code>getInputTypes</code>.
+ * <code>ImageOutputStream.class</code>, to be returned from
+ * <code>getOutputTypes</code>.
+ * @deprecated Instead of using this field, directly create
+ * the equivalent array <code>{ ImageOutputStream.class }<code>.
*/
+ @Deprecated
public static final Class[] STANDARD_OUTPUT_TYPE =
{ ImageOutputStream.class };
@@ -228,7 +231,11 @@
throw new IllegalArgumentException
("outputTypes.length == 0!");
}
- this.outputTypes = (Class[])outputTypes.clone();
+
+ this.outputTypes = (outputTypes == STANDARD_OUTPUT_TYPE) ?
+ new Class<?>[] { ImageOutputStream.class } :
+ outputTypes.clone();
+
// If length == 0, leave it null
if (readerSpiNames != null && readerSpiNames.length > 0) {
this.readerSpiNames = (String[])readerSpiNames.clone();
--- a/jdk/src/share/classes/javax/imageio/stream/FileCacheImageInputStream.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/javax/imageio/stream/FileCacheImageInputStream.java Wed Jul 08 14:24:20 2009 -0700
@@ -62,6 +62,10 @@
/** The DisposerRecord that closes the underlying cache. */
private final DisposerRecord disposerRecord;
+ /** The CloseAction that closes the stream in
+ * the StreamCloser's shutdown hook */
+ private final StreamCloser.CloseAction closeAction;
+
/**
* Constructs a <code>FileCacheImageInputStream</code> that will read
* from a given <code>InputStream</code>.
@@ -96,7 +100,9 @@
this.cacheFile =
File.createTempFile("imageio", ".tmp", cacheDir);
this.cache = new RandomAccessFile(cacheFile, "rw");
- StreamCloser.addToQueue(this);
+
+ this.closeAction = StreamCloser.createCloseAction(this);
+ StreamCloser.addToQueue(closeAction);
disposerRecord = new StreamDisposerRecord(cacheFile, cache);
if (getClass() == FileCacheImageInputStream.class) {
@@ -242,7 +248,7 @@
stream = null;
cache = null;
cacheFile = null;
- StreamCloser.removeFromQueue(this);
+ StreamCloser.removeFromQueue(closeAction);
}
/**
--- a/jdk/src/share/classes/javax/imageio/stream/FileCacheImageOutputStream.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/javax/imageio/stream/FileCacheImageOutputStream.java Wed Jul 08 14:24:20 2009 -0700
@@ -48,6 +48,10 @@
// Pos after last (rightmost) byte written
private long maxStreamPos = 0L;
+ /** The CloseAction that closes the stream in
+ * the StreamCloser's shutdown hook */
+ private final StreamCloser.CloseAction closeAction;
+
/**
* Constructs a <code>FileCacheImageOutputStream</code> that will write
* to a given <code>outputStream</code>.
@@ -82,7 +86,9 @@
this.cacheFile =
File.createTempFile("imageio", ".tmp", cacheDir);
this.cache = new RandomAccessFile(cacheFile, "rw");
- StreamCloser.addToQueue(this);
+
+ this.closeAction = StreamCloser.createCloseAction(this);
+ StreamCloser.addToQueue(closeAction);
}
public int read() throws IOException {
@@ -227,7 +233,7 @@
cacheFile = null;
stream.flush();
stream = null;
- StreamCloser.removeFromQueue(this);
+ StreamCloser.removeFromQueue(closeAction);
}
public void flushBefore(long pos) throws IOException {
--- a/jdk/src/share/classes/javax/management/openmbean/OpenMBeanAttributeInfoSupport.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/javax/management/openmbean/OpenMBeanAttributeInfoSupport.java Wed Jul 08 14:24:20 2009 -0700
@@ -690,7 +690,7 @@
private static <T> T convertFromString(String s, OpenType<T> openType) {
Class<T> c;
try {
- c = cast(Class.forName(openType.getClassName()));
+ c = cast(Class.forName(openType.safeGetClassName()));
} catch (ClassNotFoundException e) {
throw new NoClassDefFoundError(e.toString()); // can't happen
}
@@ -711,7 +711,7 @@
} catch (Exception e) {
final String msg =
"Could not convert \"" + s + "\" using method: " + valueOf;
- throw new IllegalArgumentException(msg);
+ throw new IllegalArgumentException(msg, e);
}
}
@@ -728,7 +728,7 @@
} catch (Exception e) {
final String msg =
"Could not convert \"" + s + "\" using constructor: " + con;
- throw new IllegalArgumentException(msg);
+ throw new IllegalArgumentException(msg, e);
}
}
@@ -757,7 +757,7 @@
stringArrayClass =
Class.forName(squareBrackets + "Ljava.lang.String;");
targetArrayClass =
- Class.forName(squareBrackets + "L" + baseType.getClassName() +
+ Class.forName(squareBrackets + "L" + baseType.safeGetClassName() +
";");
} catch (ClassNotFoundException e) {
throw new NoClassDefFoundError(e.toString()); // can't happen
--- a/jdk/src/share/classes/javax/management/openmbean/OpenType.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/javax/management/openmbean/OpenType.java Wed Jul 08 14:24:20 2009 -0700
@@ -304,7 +304,12 @@
* @return the class name.
*/
public String getClassName() {
+ return className;
+ }
+ // A version of getClassName() that can only be called from within this
+ // package and that cannot be overridden.
+ String safeGetClassName() {
return className;
}
--- a/jdk/src/share/classes/javax/swing/plaf/synth/Region.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/Region.java Wed Jul 08 14:24:20 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2002-2009 Sun Microsystems, Inc. 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
@@ -24,8 +24,13 @@
*/
package javax.swing.plaf.synth;
-import javax.swing.*;
-import java.util.*;
+import sun.awt.AppContext;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import javax.swing.JComponent;
+import javax.swing.UIDefaults;
/**
* A distinct rendering area of a Swing component. A component may
@@ -67,8 +72,8 @@
* @author Scott Violet
*/
public class Region {
- private static final Map<String, Region> uiToRegionMap = new HashMap<String, Region>();
- private static final Map<Region, String> lowerCaseNameMap = new HashMap<Region, String>();
+ private static final Object UI_TO_REGION_MAP_KEY = new Object();
+ private static final Object LOWER_CASE_NAME_MAP_KEY = new Object();
/**
* ArrowButton's are special types of buttons that also render a
@@ -77,396 +82,433 @@
* To bind a style to this <code>Region</code> use the name
* <code>ArrowButton</code>.
*/
- public static final Region ARROW_BUTTON = new Region("ArrowButton",
- "ArrowButtonUI");
+ public static final Region ARROW_BUTTON = new Region("ArrowButton", false);
/**
* Button region. To bind a style to this <code>Region</code> use the name
* <code>Button</code>.
*/
- public static final Region BUTTON = new Region("Button",
- "ButtonUI");
+ public static final Region BUTTON = new Region("Button", false);
/**
* CheckBox region. To bind a style to this <code>Region</code> use the name
* <code>CheckBox</code>.
*/
- public static final Region CHECK_BOX = new Region("CheckBox",
- "CheckBoxUI");
+ public static final Region CHECK_BOX = new Region("CheckBox", false);
/**
* CheckBoxMenuItem region. To bind a style to this <code>Region</code> use
* the name <code>CheckBoxMenuItem</code>.
*/
- public static final Region CHECK_BOX_MENU_ITEM = new Region(
- "CheckBoxMenuItem", "CheckBoxMenuItemUI");
+ public static final Region CHECK_BOX_MENU_ITEM = new Region("CheckBoxMenuItem", false);
/**
* ColorChooser region. To bind a style to this <code>Region</code> use
* the name <code>ColorChooser</code>.
*/
- public static final Region COLOR_CHOOSER = new Region(
- "ColorChooser", "ColorChooserUI");
+ public static final Region COLOR_CHOOSER = new Region("ColorChooser", false);
/**
* ComboBox region. To bind a style to this <code>Region</code> use
* the name <code>ComboBox</code>.
*/
- public static final Region COMBO_BOX = new Region(
- "ComboBox", "ComboBoxUI");
+ public static final Region COMBO_BOX = new Region("ComboBox", false);
/**
* DesktopPane region. To bind a style to this <code>Region</code> use
* the name <code>DesktopPane</code>.
*/
- public static final Region DESKTOP_PANE = new Region("DesktopPane",
- "DesktopPaneUI");
+ public static final Region DESKTOP_PANE = new Region("DesktopPane", false);
+
/**
* DesktopIcon region. To bind a style to this <code>Region</code> use
* the name <code>DesktopIcon</code>.
*/
- public static final Region DESKTOP_ICON = new Region("DesktopIcon",
- "DesktopIconUI");
+ public static final Region DESKTOP_ICON = new Region("DesktopIcon", false);
/**
* EditorPane region. To bind a style to this <code>Region</code> use
* the name <code>EditorPane</code>.
*/
- public static final Region EDITOR_PANE = new Region("EditorPane",
- "EditorPaneUI");
+ public static final Region EDITOR_PANE = new Region("EditorPane", false);
/**
* FileChooser region. To bind a style to this <code>Region</code> use
* the name <code>FileChooser</code>.
*/
- public static final Region FILE_CHOOSER = new Region("FileChooser",
- "FileChooserUI");
+ public static final Region FILE_CHOOSER = new Region("FileChooser", false);
/**
* FormattedTextField region. To bind a style to this <code>Region</code> use
* the name <code>FormattedTextField</code>.
*/
- public static final Region FORMATTED_TEXT_FIELD = new Region(
- "FormattedTextField", "FormattedTextFieldUI");
+ public static final Region FORMATTED_TEXT_FIELD = new Region("FormattedTextField", false);
/**
* InternalFrame region. To bind a style to this <code>Region</code> use
* the name <code>InternalFrame</code>.
*/
- public static final Region INTERNAL_FRAME = new Region("InternalFrame",
- "InternalFrameUI");
+ public static final Region INTERNAL_FRAME = new Region("InternalFrame", false);
+
/**
* TitlePane of an InternalFrame. The TitlePane typically
* shows a menu, title, widgets to manipulate the internal frame.
* To bind a style to this <code>Region</code> use the name
* <code>InternalFrameTitlePane</code>.
*/
- public static final Region INTERNAL_FRAME_TITLE_PANE =
- new Region("InternalFrameTitlePane",
- "InternalFrameTitlePaneUI");
+ public static final Region INTERNAL_FRAME_TITLE_PANE = new Region("InternalFrameTitlePane", false);
/**
* Label region. To bind a style to this <code>Region</code> use the name
* <code>Label</code>.
*/
- public static final Region LABEL = new Region("Label", "LabelUI");
+ public static final Region LABEL = new Region("Label", false);
/**
* List region. To bind a style to this <code>Region</code> use the name
* <code>List</code>.
*/
- public static final Region LIST = new Region("List", "ListUI");
+ public static final Region LIST = new Region("List", false);
/**
* Menu region. To bind a style to this <code>Region</code> use the name
* <code>Menu</code>.
*/
- public static final Region MENU = new Region("Menu", "MenuUI");
+ public static final Region MENU = new Region("Menu", false);
/**
* MenuBar region. To bind a style to this <code>Region</code> use the name
* <code>MenuBar</code>.
*/
- public static final Region MENU_BAR = new Region("MenuBar", "MenuBarUI");
+ public static final Region MENU_BAR = new Region("MenuBar", false);
/**
* MenuItem region. To bind a style to this <code>Region</code> use the name
* <code>MenuItem</code>.
*/
- public static final Region MENU_ITEM = new Region("MenuItem","MenuItemUI");
+ public static final Region MENU_ITEM = new Region("MenuItem", false);
/**
* Accelerator region of a MenuItem. To bind a style to this
* <code>Region</code> use the name <code>MenuItemAccelerator</code>.
*/
- public static final Region MENU_ITEM_ACCELERATOR = new Region(
- "MenuItemAccelerator");
+ public static final Region MENU_ITEM_ACCELERATOR = new Region("MenuItemAccelerator", true);
/**
* OptionPane region. To bind a style to this <code>Region</code> use
* the name <code>OptionPane</code>.
*/
- public static final Region OPTION_PANE = new Region("OptionPane",
- "OptionPaneUI");
+ public static final Region OPTION_PANE = new Region("OptionPane", false);
/**
* Panel region. To bind a style to this <code>Region</code> use the name
* <code>Panel</code>.
*/
- public static final Region PANEL = new Region("Panel", "PanelUI");
+ public static final Region PANEL = new Region("Panel", false);
/**
* PasswordField region. To bind a style to this <code>Region</code> use
* the name <code>PasswordField</code>.
*/
- public static final Region PASSWORD_FIELD = new Region("PasswordField",
- "PasswordFieldUI");
+ public static final Region PASSWORD_FIELD = new Region("PasswordField", false);
/**
* PopupMenu region. To bind a style to this <code>Region</code> use
* the name <code>PopupMenu</code>.
*/
- public static final Region POPUP_MENU = new Region("PopupMenu",
- "PopupMenuUI");
+ public static final Region POPUP_MENU = new Region("PopupMenu", false);
/**
* PopupMenuSeparator region. To bind a style to this <code>Region</code>
* use the name <code>PopupMenuSeparator</code>.
*/
- public static final Region POPUP_MENU_SEPARATOR = new Region(
- "PopupMenuSeparator", "PopupMenuSeparatorUI");
+ public static final Region POPUP_MENU_SEPARATOR = new Region("PopupMenuSeparator", false);
/**
* ProgressBar region. To bind a style to this <code>Region</code>
* use the name <code>ProgressBar</code>.
*/
- public static final Region PROGRESS_BAR = new Region("ProgressBar",
- "ProgressBarUI");
+ public static final Region PROGRESS_BAR = new Region("ProgressBar", false);
/**
* RadioButton region. To bind a style to this <code>Region</code>
* use the name <code>RadioButton</code>.
*/
- public static final Region RADIO_BUTTON = new Region(
- "RadioButton", "RadioButtonUI");
+ public static final Region RADIO_BUTTON = new Region("RadioButton", false);
/**
* RegionButtonMenuItem region. To bind a style to this <code>Region</code>
* use the name <code>RadioButtonMenuItem</code>.
*/
- public static final Region RADIO_BUTTON_MENU_ITEM = new Region(
- "RadioButtonMenuItem", "RadioButtonMenuItemUI");
+ public static final Region RADIO_BUTTON_MENU_ITEM = new Region("RadioButtonMenuItem", false);
/**
* RootPane region. To bind a style to this <code>Region</code> use
* the name <code>RootPane</code>.
*/
- public static final Region ROOT_PANE = new Region("RootPane",
- "RootPaneUI");
+ public static final Region ROOT_PANE = new Region("RootPane", false);
/**
* ScrollBar region. To bind a style to this <code>Region</code> use
* the name <code>ScrollBar</code>.
*/
- public static final Region SCROLL_BAR = new Region("ScrollBar",
- "ScrollBarUI");
+ public static final Region SCROLL_BAR = new Region("ScrollBar", false);
+
/**
* Track of the ScrollBar. To bind a style to this <code>Region</code> use
* the name <code>ScrollBarTrack</code>.
*/
- public static final Region SCROLL_BAR_TRACK = new Region("ScrollBarTrack");
+ public static final Region SCROLL_BAR_TRACK = new Region("ScrollBarTrack", true);
+
/**
* Thumb of the ScrollBar. The thumb is the region of the ScrollBar
* that gives a graphical depiction of what percentage of the View is
* currently visible. To bind a style to this <code>Region</code> use
* the name <code>ScrollBarThumb</code>.
*/
- public static final Region SCROLL_BAR_THUMB = new Region("ScrollBarThumb");
+ public static final Region SCROLL_BAR_THUMB = new Region("ScrollBarThumb", true);
/**
* ScrollPane region. To bind a style to this <code>Region</code> use
* the name <code>ScrollPane</code>.
*/
- public static final Region SCROLL_PANE = new Region("ScrollPane",
- "ScrollPaneUI");
+ public static final Region SCROLL_PANE = new Region("ScrollPane", false);
/**
* Separator region. To bind a style to this <code>Region</code> use
* the name <code>Separator</code>.
*/
- public static final Region SEPARATOR = new Region("Separator",
- "SeparatorUI");
+ public static final Region SEPARATOR = new Region("Separator", false);
/**
* Slider region. To bind a style to this <code>Region</code> use
* the name <code>Slider</code>.
*/
- public static final Region SLIDER = new Region("Slider", "SliderUI");
+ public static final Region SLIDER = new Region("Slider", false);
+
/**
* Track of the Slider. To bind a style to this <code>Region</code> use
* the name <code>SliderTrack</code>.
*/
- public static final Region SLIDER_TRACK = new Region("SliderTrack");
+ public static final Region SLIDER_TRACK = new Region("SliderTrack", true);
+
/**
* Thumb of the Slider. The thumb of the Slider identifies the current
* value. To bind a style to this <code>Region</code> use the name
* <code>SliderThumb</code>.
*/
- public static final Region SLIDER_THUMB = new Region("SliderThumb");
+ public static final Region SLIDER_THUMB = new Region("SliderThumb", true);
/**
* Spinner region. To bind a style to this <code>Region</code> use the name
* <code>Spinner</code>.
*/
- public static final Region SPINNER = new Region("Spinner", "SpinnerUI");
+ public static final Region SPINNER = new Region("Spinner", false);
/**
* SplitPane region. To bind a style to this <code>Region</code> use the name
* <code>SplitPane</code>.
*/
- public static final Region SPLIT_PANE = new Region("SplitPane",
- "SplitPaneUI");
+ public static final Region SPLIT_PANE = new Region("SplitPane", false);
/**
* Divider of the SplitPane. To bind a style to this <code>Region</code>
* use the name <code>SplitPaneDivider</code>.
*/
- public static final Region SPLIT_PANE_DIVIDER = new Region(
- "SplitPaneDivider");
+ public static final Region SPLIT_PANE_DIVIDER = new Region("SplitPaneDivider", true);
/**
* TabbedPane region. To bind a style to this <code>Region</code> use
* the name <code>TabbedPane</code>.
*/
- public static final Region TABBED_PANE = new Region("TabbedPane",
- "TabbedPaneUI");
+ public static final Region TABBED_PANE = new Region("TabbedPane", false);
+
/**
* Region of a TabbedPane for one tab. To bind a style to this
* <code>Region</code> use the name <code>TabbedPaneTab</code>.
*/
- public static final Region TABBED_PANE_TAB = new Region("TabbedPaneTab");
+ public static final Region TABBED_PANE_TAB = new Region("TabbedPaneTab", true);
+
/**
* Region of a TabbedPane containing the tabs. To bind a style to this
* <code>Region</code> use the name <code>TabbedPaneTabArea</code>.
*/
- public static final Region TABBED_PANE_TAB_AREA =
- new Region("TabbedPaneTabArea");
+ public static final Region TABBED_PANE_TAB_AREA = new Region("TabbedPaneTabArea", true);
+
/**
* Region of a TabbedPane containing the content. To bind a style to this
* <code>Region</code> use the name <code>TabbedPaneContent</code>.
*/
- public static final Region TABBED_PANE_CONTENT =
- new Region("TabbedPaneContent");
+ public static final Region TABBED_PANE_CONTENT = new Region("TabbedPaneContent", true);
/**
* Table region. To bind a style to this <code>Region</code> use
* the name <code>Table</code>.
*/
- public static final Region TABLE = new Region("Table", "TableUI");
+ public static final Region TABLE = new Region("Table", false);
/**
* TableHeader region. To bind a style to this <code>Region</code> use
* the name <code>TableHeader</code>.
*/
- public static final Region TABLE_HEADER = new Region("TableHeader",
- "TableHeaderUI");
+ public static final Region TABLE_HEADER = new Region("TableHeader", false);
+
/**
* TextArea region. To bind a style to this <code>Region</code> use
* the name <code>TextArea</code>.
*/
- public static final Region TEXT_AREA = new Region("TextArea",
- "TextAreaUI");
+ public static final Region TEXT_AREA = new Region("TextArea", false);
/**
* TextField region. To bind a style to this <code>Region</code> use
* the name <code>TextField</code>.
*/
- public static final Region TEXT_FIELD = new Region("TextField",
- "TextFieldUI");
+ public static final Region TEXT_FIELD = new Region("TextField", false);
/**
* TextPane region. To bind a style to this <code>Region</code> use
* the name <code>TextPane</code>.
*/
- public static final Region TEXT_PANE = new Region("TextPane",
- "TextPaneUI");
+ public static final Region TEXT_PANE = new Region("TextPane", false);
/**
* ToggleButton region. To bind a style to this <code>Region</code> use
* the name <code>ToggleButton</code>.
*/
- public static final Region TOGGLE_BUTTON = new Region("ToggleButton",
- "ToggleButtonUI");
+ public static final Region TOGGLE_BUTTON = new Region("ToggleButton", false);
/**
* ToolBar region. To bind a style to this <code>Region</code> use
* the name <code>ToolBar</code>.
*/
- public static final Region TOOL_BAR = new Region("ToolBar", "ToolBarUI");
+ public static final Region TOOL_BAR = new Region("ToolBar", false);
+
/**
* Region of the ToolBar containing the content. To bind a style to this
* <code>Region</code> use the name <code>ToolBarContent</code>.
*/
- public static final Region TOOL_BAR_CONTENT = new Region("ToolBarContent");
+ public static final Region TOOL_BAR_CONTENT = new Region("ToolBarContent", true);
+
/**
* Region for the Window containing the ToolBar. To bind a style to this
* <code>Region</code> use the name <code>ToolBarDragWindow</code>.
*/
- public static final Region TOOL_BAR_DRAG_WINDOW = new Region(
- "ToolBarDragWindow", null, false);
+ public static final Region TOOL_BAR_DRAG_WINDOW = new Region("ToolBarDragWindow", false);
/**
* ToolTip region. To bind a style to this <code>Region</code> use
* the name <code>ToolTip</code>.
*/
- public static final Region TOOL_TIP = new Region("ToolTip", "ToolTipUI");
+ public static final Region TOOL_TIP = new Region("ToolTip", false);
/**
* ToolBar separator region. To bind a style to this <code>Region</code> use
* the name <code>ToolBarSeparator</code>.
*/
- public static final Region TOOL_BAR_SEPARATOR = new Region(
- "ToolBarSeparator", "ToolBarSeparatorUI");
+ public static final Region TOOL_BAR_SEPARATOR = new Region("ToolBarSeparator", false);
/**
* Tree region. To bind a style to this <code>Region</code> use the name
* <code>Tree</code>.
*/
- public static final Region TREE = new Region("Tree", "TreeUI");
+ public static final Region TREE = new Region("Tree", false);
+
/**
* Region of the Tree for one cell. To bind a style to this
* <code>Region</code> use the name <code>TreeCell</code>.
*/
- public static final Region TREE_CELL = new Region("TreeCell");
+ public static final Region TREE_CELL = new Region("TreeCell", true);
/**
* Viewport region. To bind a style to this <code>Region</code> use
* the name <code>Viewport</code>.
*/
- public static final Region VIEWPORT = new Region("Viewport", "ViewportUI");
-
+ public static final Region VIEWPORT = new Region("Viewport", false);
- private String name;
- private boolean subregion;
+ private static Map<String, Region> getUItoRegionMap() {
+ AppContext context = AppContext.getAppContext();
+ Map<String, Region> map = (Map<String, Region>) context.get(UI_TO_REGION_MAP_KEY);
+ if (map == null) {
+ map = new HashMap<String, Region>();
+ map.put("ArrowButtonUI", ARROW_BUTTON);
+ map.put("ButtonUI", BUTTON);
+ map.put("CheckBoxUI", CHECK_BOX);
+ map.put("CheckBoxMenuItemUI", CHECK_BOX_MENU_ITEM);
+ map.put("ColorChooserUI", COLOR_CHOOSER);
+ map.put("ComboBoxUI", COMBO_BOX);
+ map.put("DesktopPaneUI", DESKTOP_PANE);
+ map.put("DesktopIconUI", DESKTOP_ICON);
+ map.put("EditorPaneUI", EDITOR_PANE);
+ map.put("FileChooserUI", FILE_CHOOSER);
+ map.put("FormattedTextFieldUI", FORMATTED_TEXT_FIELD);
+ map.put("InternalFrameUI", INTERNAL_FRAME);
+ map.put("InternalFrameTitlePaneUI", INTERNAL_FRAME_TITLE_PANE);
+ map.put("LabelUI", LABEL);
+ map.put("ListUI", LIST);
+ map.put("MenuUI", MENU);
+ map.put("MenuBarUI", MENU_BAR);
+ map.put("MenuItemUI", MENU_ITEM);
+ map.put("OptionPaneUI", OPTION_PANE);
+ map.put("PanelUI", PANEL);
+ map.put("PasswordFieldUI", PASSWORD_FIELD);
+ map.put("PopupMenuUI", POPUP_MENU);
+ map.put("PopupMenuSeparatorUI", POPUP_MENU_SEPARATOR);
+ map.put("ProgressBarUI", PROGRESS_BAR);
+ map.put("RadioButtonUI", RADIO_BUTTON);
+ map.put("RadioButtonMenuItemUI", RADIO_BUTTON_MENU_ITEM);
+ map.put("RootPaneUI", ROOT_PANE);
+ map.put("ScrollBarUI", SCROLL_BAR);
+ map.put("ScrollPaneUI", SCROLL_PANE);
+ map.put("SeparatorUI", SEPARATOR);
+ map.put("SliderUI", SLIDER);
+ map.put("SpinnerUI", SPINNER);
+ map.put("SplitPaneUI", SPLIT_PANE);
+ map.put("TabbedPaneUI", TABBED_PANE);
+ map.put("TableUI", TABLE);
+ map.put("TableHeaderUI", TABLE_HEADER);
+ map.put("TextAreaUI", TEXT_AREA);
+ map.put("TextFieldUI", TEXT_FIELD);
+ map.put("TextPaneUI", TEXT_PANE);
+ map.put("ToggleButtonUI", TOGGLE_BUTTON);
+ map.put("ToolBarUI", TOOL_BAR);
+ map.put("ToolTipUI", TOOL_TIP);
+ map.put("ToolBarSeparatorUI", TOOL_BAR_SEPARATOR);
+ map.put("TreeUI", TREE);
+ map.put("ViewportUI", VIEWPORT);
+ context.put(UI_TO_REGION_MAP_KEY, map);
+ }
+ return map;
+ }
+ private static Map<Region, String> getLowerCaseNameMap() {
+ AppContext context = AppContext.getAppContext();
+ Map<Region, String> map = (Map<Region, String>) context.get(LOWER_CASE_NAME_MAP_KEY);
+ if (map == null) {
+ map = new HashMap<Region, String>();
+ context.put(LOWER_CASE_NAME_MAP_KEY, map);
+ }
+ return map;
+ }
static Region getRegion(JComponent c) {
- return uiToRegionMap.get(c.getUIClassID());
+ return getUItoRegionMap().get(c.getUIClassID());
}
static void registerUIs(UIDefaults table) {
- for (String key : uiToRegionMap.keySet()) {
+ for (Object key : getUItoRegionMap().keySet()) {
table.put(key, "javax.swing.plaf.synth.SynthLookAndFeel");
}
}
+ private final String name;
+ private final boolean subregion;
- Region(String name) {
- this(name, null, true);
- }
-
- Region(String name, String ui) {
- this(name, ui, false);
+ private Region(String name, boolean subregion) {
+ if (name == null) {
+ throw new NullPointerException("You must specify a non-null name");
+ }
+ this.name = name;
+ this.subregion = subregion;
}
/**
@@ -481,14 +523,10 @@
* @param subregion Whether or not this is a subregion.
*/
protected Region(String name, String ui, boolean subregion) {
- if (name == null) {
- throw new NullPointerException("You must specify a non-null name");
+ this(name, subregion);
+ if (ui != null) {
+ getUItoRegionMap().put(ui, this);
}
- this.name = name;
- if (ui != null) {
- uiToRegionMap.put(ui, this);
- }
- this.subregion = subregion;
}
/**
@@ -514,16 +552,17 @@
/**
* Returns the name, in lowercase.
+ *
+ * @return lower case representation of the name of the Region
*/
String getLowerCaseName() {
- synchronized(lowerCaseNameMap) {
- String lowerCaseName = lowerCaseNameMap.get(this);
- if (lowerCaseName == null) {
- lowerCaseName = getName().toLowerCase();
- lowerCaseNameMap.put(this, lowerCaseName);
- }
- return lowerCaseName;
+ Map<Region, String> lowerCaseNameMap = getLowerCaseNameMap();
+ String lowerCaseName = lowerCaseNameMap.get(this);
+ if (lowerCaseName == null) {
+ lowerCaseName = name.toLowerCase(Locale.ENGLISH);
+ lowerCaseNameMap.put(this, lowerCaseName);
}
+ return lowerCaseName;
}
/**
@@ -531,6 +570,7 @@
*
* @return name of the Region.
*/
+ @Override
public String toString() {
return name;
}
--- a/jdk/src/share/classes/javax/swing/text/LayoutQueue.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/javax/swing/text/LayoutQueue.java Wed Jul 08 14:24:20 2009 -0700
@@ -25,6 +25,7 @@
package javax.swing.text;
import java.util.Vector;
+import sun.awt.AppContext;
/**
* A queue of text layout tasks.
@@ -35,10 +36,10 @@
*/
public class LayoutQueue {
- Vector<Runnable> tasks;
- Thread worker;
+ private static final Object DEFAULT_QUEUE = new Object();
- static LayoutQueue defaultQueue;
+ private Vector<Runnable> tasks;
+ private Thread worker;
/**
* Construct a layout queue.
@@ -51,10 +52,15 @@
* Fetch the default layout queue.
*/
public static LayoutQueue getDefaultQueue() {
- if (defaultQueue == null) {
- defaultQueue = new LayoutQueue();
+ AppContext ac = AppContext.getAppContext();
+ synchronized (DEFAULT_QUEUE) {
+ LayoutQueue defaultQueue = (LayoutQueue) ac.get(DEFAULT_QUEUE);
+ if (defaultQueue == null) {
+ defaultQueue = new LayoutQueue();
+ ac.put(DEFAULT_QUEUE, defaultQueue);
+ }
+ return defaultQueue;
}
- return defaultQueue;
}
/**
@@ -63,7 +69,9 @@
* @param q the new queue.
*/
public static void setDefaultQueue(LayoutQueue q) {
- defaultQueue = q;
+ synchronized (DEFAULT_QUEUE) {
+ AppContext.getAppContext().put(DEFAULT_QUEUE, q);
+ }
}
/**
--- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMHMACSignatureMethod.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMHMACSignatureMethod.java Wed Jul 08 14:24:20 2009 -0700
@@ -19,7 +19,7 @@
*
*/
/*
- * Copyright 2005-2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2005-2009 Sun Microsystems, Inc. All rights reserved.
*/
/*
* $Id: DOMHMACSignatureMethod.java,v 1.2 2008/07/24 15:20:32 mullan Exp $
@@ -58,6 +58,7 @@
Logger.getLogger("org.jcp.xml.dsig.internal.dom");
private Mac hmac;
private int outputLength;
+ private boolean outputLengthSet;
/**
* Creates a <code>DOMHMACSignatureMethod</code> with the specified params
@@ -87,6 +88,7 @@
("params must be of type HMACParameterSpec");
}
outputLength = ((HMACParameterSpec) params).getOutputLength();
+ outputLengthSet = true;
if (log.isLoggable(Level.FINE)) {
log.log(Level.FINE,
"Setting outputLength from HMACParameterSpec to: "
@@ -101,6 +103,7 @@
throws MarshalException {
outputLength = new Integer
(paramsElem.getFirstChild().getNodeValue()).intValue();
+ outputLengthSet = true;
if (log.isLoggable(Level.FINE)) {
log.log(Level.FINE, "unmarshalled outputLength: " + outputLength);
}
@@ -135,23 +138,13 @@
throw new XMLSignatureException(nsae);
}
}
- if (log.isLoggable(Level.FINE)) {
- log.log(Level.FINE, "outputLength = " + outputLength);
+ if (outputLengthSet && outputLength < getDigestLength()) {
+ throw new XMLSignatureException
+ ("HMACOutputLength must not be less than " + getDigestLength());
}
hmac.init((SecretKey) key);
si.canonicalize(context, new MacOutputStream(hmac));
byte[] result = hmac.doFinal();
- if (log.isLoggable(Level.FINE)) {
- log.log(Level.FINE, "resultLength = " + result.length);
- }
- if (outputLength != -1) {
- int byteLength = outputLength/8;
- if (result.length > byteLength) {
- byte[] truncated = new byte[byteLength];
- System.arraycopy(result, 0, truncated, 0, byteLength);
- result = truncated;
- }
- }
return MessageDigest.isEqual(sig, result);
}
@@ -171,18 +164,13 @@
throw new XMLSignatureException(nsae);
}
}
+ if (outputLengthSet && outputLength < getDigestLength()) {
+ throw new XMLSignatureException
+ ("HMACOutputLength must not be less than " + getDigestLength());
+ }
hmac.init((SecretKey) key);
si.canonicalize(context, new MacOutputStream(hmac));
- byte[] result = hmac.doFinal();
- if (outputLength != -1) {
- int byteLength = outputLength/8;
- if (result.length > byteLength) {
- byte[] truncated = new byte[byteLength];
- System.arraycopy(result, 0, truncated, 0, byteLength);
- result = truncated;
- }
- }
- return result;
+ return hmac.doFinal();
}
boolean paramsEqual(AlgorithmParameterSpec spec) {
@@ -197,6 +185,11 @@
return (outputLength == ospec.getOutputLength());
}
+ /**
+ * Returns the output length of the hash/digest.
+ */
+ abstract int getDigestLength();
+
static final class SHA1 extends DOMHMACSignatureMethod {
SHA1(AlgorithmParameterSpec params)
throws InvalidAlgorithmParameterException {
@@ -211,6 +204,9 @@
String getSignatureAlgorithm() {
return "HmacSHA1";
}
+ int getDigestLength() {
+ return 160;
+ }
}
static final class SHA256 extends DOMHMACSignatureMethod {
@@ -227,6 +223,9 @@
String getSignatureAlgorithm() {
return "HmacSHA256";
}
+ int getDigestLength() {
+ return 256;
+ }
}
static final class SHA384 extends DOMHMACSignatureMethod {
@@ -243,6 +242,9 @@
String getSignatureAlgorithm() {
return "HmacSHA384";
}
+ int getDigestLength() {
+ return 384;
+ }
}
static final class SHA512 extends DOMHMACSignatureMethod {
@@ -259,5 +261,8 @@
String getSignatureAlgorithm() {
return "HmacSHA512";
}
+ int getDigestLength() {
+ return 512;
+ }
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/net/ApplicationProxy.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.net;
+
+import java.net.Proxy;
+import java.net.SocketAddress;
+
+/**
+ * Proxy wrapper class so that we can determine application set
+ * proxies by type.
+ */
+public final class ApplicationProxy extends Proxy {
+ private ApplicationProxy(Proxy proxy) {
+ super(proxy.type(), proxy.address());
+ }
+
+ public static ApplicationProxy create(Proxy proxy) {
+ return new ApplicationProxy(proxy);
+ }
+}
--- a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Wed Jul 08 14:24:20 2009 -0700
@@ -578,12 +578,20 @@
responses = new MessageHeader();
this.handler = handler;
instProxy = p;
- cookieHandler = java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<CookieHandler>() {
+ if (instProxy instanceof sun.net.ApplicationProxy) {
+ /* Application set Proxies should not have access to cookies
+ * in a secure environment unless explicitly allowed. */
+ try {
+ cookieHandler = CookieHandler.getDefault();
+ } catch (SecurityException se) { /* swallow exception */ }
+ } else {
+ cookieHandler = java.security.AccessController.doPrivileged(
+ new java.security.PrivilegedAction<CookieHandler>() {
public CookieHandler run() {
- return CookieHandler.getDefault();
- }
- });
+ return CookieHandler.getDefault();
+ }
+ });
+ }
cacheHandler = java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<ResponseCache>() {
public ResponseCache run() {
--- a/jdk/src/share/lib/security/java.security Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/lib/security/java.security Wed Jul 08 14:24:20 2009 -0700
@@ -127,7 +127,7 @@
# passed to checkPackageAccess unless the
# corresponding RuntimePermission ("accessClassInPackage."+package) has
# been granted.
-package.access=sun.
+package.access=sun.,com.sun.imageio.
#
# List of comma-separated packages that start with or equal this string
--- a/jdk/src/share/lib/security/java.security-solaris Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/lib/security/java.security-solaris Wed Jul 08 14:24:20 2009 -0700
@@ -128,7 +128,7 @@
# passed to checkPackageAccess unless the
# corresponding RuntimePermission ("accessClassInPackage."+package) has
# been granted.
-package.access=sun.
+package.access=sun.,com.sun.imageio.
#
# List of comma-separated packages that start with or equal this string
--- a/jdk/src/share/lib/security/java.security-windows Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/lib/security/java.security-windows Wed Jul 08 14:24:20 2009 -0700
@@ -128,7 +128,7 @@
# passed to checkPackageAccess unless the
# corresponding RuntimePermission ("accessClassInPackage."+package) has
# been granted.
-package.access=sun.
+package.access=sun.,com.sun.imageio.
#
# List of comma-separated packages that start with or equal this string
--- a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp Wed Jul 08 14:24:20 2009 -0700
@@ -908,10 +908,12 @@
// place a limit on future CP growth:
int generous = 0;
- generous += u->ic_count*3; // implicit name, outer, outer.utf8
- generous += 40; // WKUs, misc
- generous += u->class_count; // implicit SourceFile strings
- maxentries = nentries + generous;
+ generous = add_size(generous, u->ic_count); // implicit name
+ generous = add_size(generous, u->ic_count); // outer
+ generous = add_size(generous, u->ic_count); // outer.utf8
+ generous = add_size(generous, 40); // WKUs, misc
+ generous = add_size(generous, u->class_count); // implicit SourceFile strings
+ maxentries = add_size(nentries, generous);
// Note that this CP does not include "empty" entries
// for longs and doubles. Those are introduced when
--- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_jpeg.c Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_jpeg.c Wed Jul 08 14:24:20 2009 -0700
@@ -139,21 +139,45 @@
splash->width = cinfo->output_width;
splash->height = cinfo->output_height;
+
+ if (!SAFE_TO_ALLOC(splash->imageFormat.depthBytes, splash->width)) {
+ return 0;
+ }
stride = splash->width * splash->imageFormat.depthBytes;
+ if (!SAFE_TO_ALLOC(stride, splash->height)) {
+ return 0;
+ }
+ if (!SAFE_TO_ALLOC(cinfo->output_width, cinfo->output_components)) {
+ return 0;
+ }
+
splash->frameCount = 1;
splash->frames = (SplashImage *) malloc(sizeof(SplashImage) *
splash->frameCount);
+ if (splash->frames == NULL) {
+ return 0;
+ }
memset(splash->frames, 0, sizeof(SplashImage) *
splash->frameCount);
+
splash->loopCount = 1;
+ splash->frames[0].delay = 0;
splash->frames[0].bitmapBits = malloc(stride * splash->height);
- splash->frames[0].delay = 0;
+ if (splash->frames[0].bitmapBits == NULL) {
+ free(splash->frames);
+ return 0;
+ }
rowStride = cinfo->output_width * cinfo->output_components;
buffer = (*cinfo->mem->alloc_sarray)
((j_common_ptr) cinfo, JPOOL_IMAGE, rowStride, 1);
+ if (buffer == NULL) {
+ free(splash->frames[0].bitmapBits);
+ free(splash->frames);
+ return 0;
+ }
initFormat(&srcFormat, 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000);
srcFormat.byteOrder = BYTE_ORDER_LSBFIRST;
--- a/jdk/src/windows/native/sun/windows/awt_Window.cpp Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp Wed Jul 08 14:24:20 2009 -0700
@@ -501,7 +501,7 @@
RegisterWarningWindowClass();
warningWindow = ::CreateWindowEx(
- WS_EX_NOACTIVATE | WS_EX_LAYERED,
+ WS_EX_NOACTIVATE,
GetWarningWindowClassName(),
warningString,
WS_POPUP,
@@ -513,7 +513,7 @@
NULL // lParam
);
if (warningWindow == NULL) {
- //XXX: actually this is bad... We didn't manage to create the widow.
+ //XXX: actually this is bad... We didn't manage to create the window.
return;
}
@@ -684,31 +684,6 @@
env->DeleteLocalRef(point2D);
- //Make sure the warning is not far from the window bounds
- x = max(x, windowBounds.left - (int)warningWindowWidth - 2);
- x = min(x, windowBounds.right + (int)warningWindowWidth + 2);
-
- y = max(y, windowBounds.top - (int)warningWindowHeight - 2);
- y = min(y, windowBounds.bottom + (int)warningWindowHeight + 2);
-
- // Now make sure the warning window is visible on the screen
- HMONITOR hmon = MonitorFromWindow(GetHWnd(), MONITOR_DEFAULTTOPRIMARY);
- DASSERT(hmon != NULL);
-
- RECT monitorBounds;
- RECT monitorInsets;
-
- MonitorBounds(hmon, &monitorBounds);
- if (!AwtToolkit::GetScreenInsets(m_screenNum, &monitorInsets)) {
- ::ZeroMemory(&monitorInsets, sizeof(monitorInsets));
- }
-
- x = max(x, monitorBounds.left + monitorInsets.left);
- x = min(x, monitorBounds.right - monitorInsets.right - (int)warningWindowWidth);
-
- y = max(y, monitorBounds.top + monitorInsets.top);
- y = min(y, monitorBounds.bottom - monitorInsets.bottom - (int)warningWindowHeight);
-
rect->left = x;
rect->top = y;
rect->right = rect->left + warningWindowWidth;
@@ -813,6 +788,19 @@
::ReleaseDC(warningWindow, hdc);
}
+void AwtWindow::SetLayered(HWND window, bool layered)
+{
+ const LONG ex_style = ::GetWindowLong(window, GWL_EXSTYLE);
+ ::SetWindowLong(window, GWL_EXSTYLE, layered ?
+ ex_style | WS_EX_LAYERED : ex_style & ~WS_EX_LAYERED);
+}
+
+bool AwtWindow::IsLayered(HWND window)
+{
+ const LONG ex_style = ::GetWindowLong(window, GWL_EXSTYLE);
+ return ex_style & WS_EX_LAYERED;
+}
+
void AwtWindow::StartSecurityAnimation(AnimationKind kind)
{
if (!IsUntrusted()) {
@@ -835,8 +823,14 @@
::SetLayeredWindowAttributes(warningWindow, RGB(0, 0, 0),
0xFF, LWA_ALPHA);
+ AwtWindow::SetLayered(warningWindow, false);
::RedrawWindow(warningWindow, NULL, NULL,
RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
+ } else if (securityAnimationKind == akPreHide) {
+ // Pre-hiding means fading-out. We have to make the window layered.
+ // Note: Some VNC clients do not support layered windows, hence
+ // we dynamically turn it on and off. See 6805231.
+ AwtWindow::SetLayered(warningWindow, true);
}
}
@@ -2514,8 +2508,6 @@
HWND hwnd = GetHWnd();
- LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
-
if (opaque != old_opaque) {
::EnterCriticalSection(&contentBitmapCS);
if (hContentBitmap != NULL) {
@@ -2527,21 +2519,22 @@
if (opaque && opacity == 0xff) {
// Turn off all the effects
- ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style & ~WS_EX_LAYERED);
+ AwtWindow::SetLayered(hwnd, false);
+
// Ask the window to repaint itself and all the children
RedrawWindow();
} else {
// We're going to enable some effects
- if (!(ex_style & WS_EX_LAYERED)) {
- ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style | WS_EX_LAYERED);
+ if (!AwtWindow::IsLayered(hwnd)) {
+ AwtWindow::SetLayered(hwnd, true);
} else {
if ((opaque && opacity < 0xff) ^ (old_opaque && old_opacity < 0xff)) {
// _One_ of the modes uses the SetLayeredWindowAttributes.
// Need to reset the style in this case.
// If both modes are simple (i.e. just changing the opacity level),
// no need to reset the style.
- ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style & ~WS_EX_LAYERED);
- ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style | WS_EX_LAYERED);
+ AwtWindow::SetLayered(hwnd, false);
+ AwtWindow::SetLayered(hwnd, true);
}
}
--- a/jdk/src/windows/native/sun/windows/awt_Window.h Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/src/windows/native/sun/windows/awt_Window.h Wed Jul 08 14:24:20 2009 -0700
@@ -331,6 +331,9 @@
void RepositionSecurityWarning(JNIEnv *env);
+ static void SetLayered(HWND window, bool layered);
+ static bool IsLayered(HWND window);
+
public:
void UpdateSecurityWarningVisibility();
static bool IsWarningWindow(HWND hWnd);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/org/apache/xml/internal/security/TruncateHMAC.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test %I% %E%
+ * @bug 6824440
+ * @summary Check that Apache XMLSec APIs will not accept HMAC truncation
+ * lengths less than minimum bound
+ * @compile -XDignore.symbol.file TruncateHMAC.java
+ * @run main TruncateHMAC
+ */
+
+import java.io.File;
+import javax.crypto.SecretKey;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import com.sun.org.apache.xml.internal.security.Init;
+import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
+import com.sun.org.apache.xml.internal.security.signature.XMLSignature;
+import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
+import com.sun.org.apache.xml.internal.security.utils.Constants;
+
+
+public class TruncateHMAC {
+
+ private final static String DIR = System.getProperty("test.src", ".");
+ private static DocumentBuilderFactory dbf = null;
+ private static boolean atLeastOneFailed = false;
+
+ public static void main(String[] args) throws Exception {
+
+ Init.init();
+ dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(false);
+ validate("signature-enveloping-hmac-sha1-trunclen-0-attack.xml");
+ validate("signature-enveloping-hmac-sha1-trunclen-8-attack.xml");
+ generate_hmac_sha1_40();
+
+ if (atLeastOneFailed) {
+ throw new Exception
+ ("At least one signature did not validate as expected");
+ }
+ }
+
+ private static void validate(String data) throws Exception {
+ System.out.println("Validating " + data);
+ File file = new File(DIR, data);
+
+ Document doc = dbf.newDocumentBuilder().parse(file);
+ NodeList nl =
+ doc.getElementsByTagNameNS(Constants.SignatureSpecNS, "Signature");
+ if (nl.getLength() == 0) {
+ throw new Exception("Couldn't find signature Element");
+ }
+ Element sigElement = (Element) nl.item(0);
+ XMLSignature signature = new XMLSignature
+ (sigElement, file.toURI().toString());
+ SecretKey sk = signature.createSecretKey("secret".getBytes("ASCII"));
+ try {
+ System.out.println
+ ("Validation status: " + signature.checkSignatureValue(sk));
+ System.out.println("FAILED");
+ atLeastOneFailed = true;
+ } catch (XMLSignatureException xse) {
+ System.out.println(xse.getMessage());
+ System.out.println("PASSED");
+ }
+ }
+
+ private static void generate_hmac_sha1_40() throws Exception {
+ System.out.println("Generating ");
+
+ Document doc = dbf.newDocumentBuilder().newDocument();
+ XMLSignature sig = new XMLSignature
+ (doc, null, XMLSignature.ALGO_ID_MAC_HMAC_SHA1, 40,
+ Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
+ try {
+ sig.sign(getSecretKey("secret".getBytes("ASCII")));
+ System.out.println("FAILED");
+ atLeastOneFailed = true;
+ } catch (XMLSignatureException xse) {
+ System.out.println(xse.getMessage());
+ System.out.println("PASSED");
+ }
+ }
+
+ private static SecretKey getSecretKey(final byte[] secret) {
+ return new SecretKey() {
+ public String getFormat() { return "RAW"; }
+ public byte[] getEncoded() { return secret; }
+ public String getAlgorithm(){ return "SECRET"; }
+ };
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/org/apache/xml/internal/security/signature-enveloping-hmac-sha1-trunclen-0-attack.xml Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
+ <SignedInfo>
+ <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
+ <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1">
+ <HMACOutputLength>0</HMACOutputLength>
+ </SignatureMethod>
+ <Reference URI="#object">
+ <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
+ <DigestValue>nz4GS0NbH2SrWlD/4fX313CoTzc=</DigestValue>
+ </Reference>
+ </SignedInfo>
+ <SignatureValue>
+ </SignatureValue>
+ <Object Id="object">some other text</Object>
+</Signature>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/org/apache/xml/internal/security/signature-enveloping-hmac-sha1-trunclen-8-attack.xml Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
+ <SignedInfo>
+ <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
+ <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1">
+ <HMACOutputLength>8</HMACOutputLength>
+ </SignatureMethod>
+ <Reference URI="#object">
+ <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
+ <DigestValue>nz4GS0NbH2SrWlD/4fX313CoTzc=</DigestValue>
+ </Reference>
+ </SignedInfo>
+ <SignatureValue>
+ Qw==
+ </SignatureValue>
+ <Object Id="object">some other text</Object>
+</Signature>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Cursor/PredefinedPrivate/PredefinedPrivate.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6656586
+ * @summary Test that Cursor.predefined array is not used in
+Cursor.getPredefinedCursor() method
+ * @author Artem Ananiev
+ * @run main PredefinedPrivate
+ */
+
+import java.awt.*;
+
+public class PredefinedPrivate {
+ public static void main(String args[]) {
+ new MyCursor();
+ if (Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR) instanceof MyCursor) {
+ throw new RuntimeException("Test FAILED: getPredefinedCursor() returned modified cursor");
+ }
+ }
+}
+
+class MyCursor extends Cursor {
+ public MyCursor() {
+ super(DEFAULT_CURSOR);
+ Cursor.predefined[DEFAULT_CURSOR] = this;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/Introspector/Test6660539.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6660539
+ * @summary Tests changeable BeanInfo cache in different application contexts
+ * @author Sergey Malenkov
+ */
+
+import sun.awt.SunToolkit;
+
+import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+
+public class Test6660539 implements Runnable {
+ private static final String NAME = "$$$";
+
+ public static void main(String[] args) throws Exception {
+ for (PropertyDescriptor pd : getPropertyDescriptors()) {
+ pd.setDisplayName(NAME);
+ }
+ ThreadGroup group = new ThreadGroup(NAME);
+ Thread thread = new Thread(group, new Test6660539());
+ thread.start();
+ thread.join();
+ }
+
+ public void run() {
+ SunToolkit.createNewAppContext();
+ for (PropertyDescriptor pd : getPropertyDescriptors()) {
+ if (pd.getDisplayName().equals(NAME))
+ throw new Error("shared BeanInfo cache");
+ }
+ }
+
+ private static PropertyDescriptor[] getPropertyDescriptors() {
+ try {
+ BeanInfo info = Introspector.getBeanInfo(Test6660539.class);
+ return info.getPropertyDescriptors();
+ }
+ catch (IntrospectionException exception) {
+ throw new Error("unexpected", exception);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestBox.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6777487
+ * @summary Tests private field access for BoxLayout
+ * @author Sergey Malenkov
+ */
+
+import java.awt.FlowLayout;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+
+public final class TestBox {
+ private static final Integer OBJECT = Integer.valueOf(-123);
+
+ public static void main(String[] args) {
+ TestEncoder.test(
+ new Box(BoxLayout.LINE_AXIS),
+ new Box(BoxLayout.PAGE_AXIS) {
+ @Override
+ public FlowLayout getLayout() {
+ return new FlowLayout() {
+ private final Object axis = OBJECT;
+ };
+ }
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedCollection.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6777487
+ * @summary Tests private field access for CheckedCollection
+ * @author Sergey Malenkov
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class TestCheckedCollection {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ List<String> list = Collections.emptyList();
+ TestEncoder.test(
+ Collections.checkedCollection(list, String.class),
+ new ArrayList() {
+ private final Object type = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedList.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6777487
+ * @summary Tests private field access for CheckedList
+ * @author Sergey Malenkov
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class TestCheckedList {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ List<String> list = Collections.emptyList();
+ TestEncoder.test(
+ Collections.checkedList(list, String.class),
+ new ArrayList() {
+ private final Object type = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedMap.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6777487
+ * @summary Tests private field access for CheckedMap
+ * @author Sergey Malenkov
+ */
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class TestCheckedMap {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ Map<String, String> map = Collections.emptyMap();
+ TestEncoder.test(
+ Collections.checkedMap(map, String.class, String.class),
+ new HashMap() {
+ private final Object keyType = OBJECT;
+ private final Object valueType = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedRandomAccessList.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6777487
+ * @summary Tests private field access for CheckedRandomAccessList
+ * @author Sergey Malenkov
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class TestCheckedRandomAccessList {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ List<String> list = new ArrayList<String>();
+ TestEncoder.test(
+ Collections.checkedList(list, String.class),
+ new ArrayList() {
+ private final Object type = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedSet.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6777487
+ * @summary Tests private field access for CheckedSet
+ * @author Sergey Malenkov
+ */
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class TestCheckedSet {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ Set<String> set = Collections.emptySet();
+ TestEncoder.test(
+ Collections.checkedSet(set, String.class),
+ new HashSet() {
+ private final Object type = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedSortedMap.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6777487
+ * @summary Tests private field access for CheckedSortedMap
+ * @author Sergey Malenkov
+ */
+
+import java.util.Collections;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+public final class TestCheckedSortedMap {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ SortedMap<String, String> map = new TreeMap<String, String>();
+ TestEncoder.test(
+ Collections.checkedSortedMap(map, String.class, String.class),
+ new TreeMap() {
+ private final Object keyType = OBJECT;
+ private final Object valueType = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestCheckedSortedSet.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6777487
+ * @summary Tests private field access for CheckedSortedSet
+ * @author Sergey Malenkov
+ */
+
+import java.util.Collections;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+public final class TestCheckedSortedSet {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ SortedSet<String> set = new TreeSet<String>();
+ TestEncoder.test(
+ Collections.checkedSortedSet(set, String.class),
+ new TreeSet() {
+ private final Object type = OBJECT;
+ },
+ OBJECT
+ );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestEncoder.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.beans.Expression;
+import java.beans.XMLEncoder;
+
+final class TestEncoder extends XMLEncoder {
+ private Expression expression;
+
+ private TestEncoder() {
+ super(System.out);
+ }
+
+ @Override
+ public void writeExpression(Expression expression) {
+ if (this.expression == null) {
+ this.expression = expression;
+ }
+ super.writeExpression(expression);
+ }
+
+ public static void test(Object provider, Object object, Object value) {
+ System.setSecurityManager(new SecurityManager());
+
+ TestEncoder encoder = new TestEncoder();
+ encoder.setPersistenceDelegate(
+ object.getClass(),
+ encoder.getPersistenceDelegate(provider.getClass()));
+ encoder.writeObject(object);
+ encoder.close();
+
+ if (encoder.expression != null) {
+ for (Object argument : encoder.expression.getArguments()) {
+ if (value.equals(argument)) {
+ throw new Error("Found private value!");
+ }
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestEnumMap.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6777487
+ * @summary Tests private field access for EnumMap
+ * @author Sergey Malenkov
+ */
+
+import java.util.EnumMap;
+import java.util.HashMap;
+
+public final class TestEnumMap {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ TestEncoder.test(
+ new EnumMap<Point, String>(Point.class),
+ new HashMap() {
+ private final Object keyType = OBJECT;
+ },
+ OBJECT);
+ }
+
+ public enum Point { X, Y, Z }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/6777487/TestEnumSet.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6777487
+ * @summary Tests private field access for EnumSet
+ * @author Sergey Malenkov
+ */
+
+import java.util.EnumSet;
+import java.util.HashSet;
+
+public final class TestEnumSet {
+ private static final Object OBJECT = new Object();
+
+ public static void main(String[] args) {
+ TestEncoder.test(
+ EnumSet.noneOf(Point.class),
+ new HashSet() {
+ private final Object elementType = OBJECT;
+ },
+ OBJECT);
+ }
+
+ public enum Point { X, Y, Z }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/plaf/synth/Test6660049.java Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6660049 6849518
+ * @summary Tests the Region initialization
+ * @author Sergey Malenkov
+ */
+
+import sun.awt.SunToolkit;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
+import javax.swing.plaf.synth.Region;
+import javax.swing.plaf.synth.SynthLookAndFeel;
+
+public class Test6660049 implements Runnable {
+ public static void main(String[] args) {
+ SwingUtilities.invokeLater(new Test6660049(
+ javax.swing.JButton.class,
+ javax.swing.JCheckBox.class,
+ javax.swing.JCheckBoxMenuItem.class,
+ javax.swing.JColorChooser.class,
+ javax.swing.JComboBox.class,
+ javax.swing.JDesktopPane.class,
+ javax.swing.JEditorPane.class,
+ javax.swing.JFileChooser.class,
+ javax.swing.JFormattedTextField.class,
+ javax.swing.JInternalFrame.class,
+ javax.swing.JLabel.class,
+ javax.swing.JList.class,
+ javax.swing.JMenu.class,
+ javax.swing.JMenuBar.class,
+ javax.swing.JMenuItem.class,
+ javax.swing.JOptionPane.class,
+ javax.swing.JPanel.class,
+ javax.swing.JPasswordField.class,
+ javax.swing.JPopupMenu.class,
+ javax.swing.JProgressBar.class,
+ javax.swing.JRadioButton.class,
+ javax.swing.JRadioButtonMenuItem.class,
+ javax.swing.JRootPane.class,
+ javax.swing.JScrollBar.class,
+ javax.swing.JScrollPane.class,
+ javax.swing.JSeparator.class,
+ javax.swing.JSlider.class,
+ javax.swing.JSpinner.class,
+ javax.swing.JSplitPane.class,
+ javax.swing.JTabbedPane.class,
+ javax.swing.JTable.class,
+ javax.swing.JTextArea.class,
+ javax.swing.JTextField.class,
+ javax.swing.JTextPane.class,
+ javax.swing.JToggleButton.class,
+ javax.swing.JToolBar.class,
+ javax.swing.JToolTip.class,
+ javax.swing.JTree.class,
+ javax.swing.JViewport.class,
+ javax.swing.table.JTableHeader.class));
+ }
+
+ private final Class<? extends JComponent>[] types;
+ private final Region region;
+
+ private Test6660049(Class<? extends JComponent>... types) {
+ this.types = types;
+ run();
+
+ this.region = new Region("Button", "ButtonUI", true) {
+ @Override
+ public String getName() {
+ throw new Error("6660049: exploit is available");
+ }
+ };
+ }
+
+ public void run() {
+ if (this.region != null) {
+ SunToolkit.createNewAppContext();
+ }
+ for (Class<? extends JComponent> type : this.types) {
+ Region region = getRegion(type);
+ if (region == null) {
+ throw new Error("6849518: region is not initialized");
+ }
+ }
+ getRegion(JButton.class).getName();
+ }
+
+ private static Region getRegion(Class<? extends JComponent> type) {
+ try {
+ return SynthLookAndFeel.getRegion(type.newInstance());
+ }
+ catch (IllegalAccessException exception) {
+ throw new Error("unexpected exception", exception);
+ }
+ catch (InstantiationException exception) {
+ throw new Error("unexpected exception", exception);
+ }
+ }
+}
--- a/jdk/test/javax/xml/crypto/dsig/GenerationTests.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/test/javax/xml/crypto/dsig/GenerationTests.java Wed Jul 08 14:24:20 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,9 +23,7 @@
/**
* @test
- * @bug 4635230
- * @bug 6283345
- * @bug 6303830
+ * @bug 4635230 6283345 6303830 6824440
* @summary Basic unit tests for generating XML Signatures with JSR 105
* @compile -XDignore.symbol.file KeySelectors.java SignatureValidator.java
* X509KeySelector.java GenerationTests.java
@@ -248,8 +246,14 @@
System.out.println("* Generating signature-enveloping-hmac-sha1-40.xml");
SignatureMethod hmacSha1 = fac.newSignatureMethod
(SignatureMethod.HMAC_SHA1, new HMACParameterSpec(40));
- test_create_signature_enveloping(sha1, hmacSha1, null,
- getSecretKey("secret".getBytes("ASCII")), sks, false);
+ try {
+ test_create_signature_enveloping(sha1, hmacSha1, null,
+ getSecretKey("secret".getBytes("ASCII")), sks, false);
+ } catch (Exception e) {
+ if (!(e instanceof XMLSignatureException)) {
+ throw e;
+ }
+ }
System.out.println();
}
--- a/jdk/test/javax/xml/crypto/dsig/ValidationTests.java Wed Jul 08 09:12:17 2009 -0700
+++ b/jdk/test/javax/xml/crypto/dsig/ValidationTests.java Wed Jul 08 14:24:20 2009 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,9 +23,7 @@
/**
* @test
- * @bug 4635230
- * @bug 6365103
- * @bug 6366054
+ * @bug 4635230 6365103 6366054 6824440
* @summary Basic unit tests for validating XML Signatures with JSR 105
* @compile -XDignore.symbol.file KeySelectors.java SignatureValidator.java
* X509KeySelector.java ValidationTests.java
@@ -42,6 +40,7 @@
import javax.xml.crypto.URIReference;
import javax.xml.crypto.URIReferenceException;
import javax.xml.crypto.XMLCryptoContext;
+import javax.xml.crypto.dsig.XMLSignatureException;
import javax.xml.crypto.dsig.XMLSignatureFactory;
/**
@@ -68,7 +67,6 @@
"signature-enveloping-dsa.xml",
"signature-enveloping-rsa.xml",
"signature-enveloping-hmac-sha1.xml",
- "signature-enveloping-hmac-sha1-40.xml",
"signature-external-dsa.xml",
"signature-external-b64-dsa.xml",
"signature-retrievalmethod-rawx509crt.xml",
@@ -106,7 +104,6 @@
KVKS,
KVKS,
SKKS,
- SKKS,
KVKS,
KVKS,
CKS,
@@ -146,6 +143,36 @@
atLeastOneFailed = true;
}
+ System.out.println("Validating signature-enveloping-hmac-sha1-40.xml");
+ try {
+ test_signature("signature-enveloping-hmac-sha1-40.xml", SKKS, false);
+ System.out.println("FAILED");
+ atLeastOneFailed = true;
+ } catch (XMLSignatureException xse) {
+ System.out.println(xse.getMessage());
+ System.out.println("PASSED");
+ }
+
+ System.out.println("Validating signature-enveloping-hmac-sha1-trunclen-0-attack.xml");
+ try {
+ test_signature("signature-enveloping-hmac-sha1-trunclen-0-attack.xml", SKKS, false);
+ System.out.println("FAILED");
+ atLeastOneFailed = true;
+ } catch (XMLSignatureException xse) {
+ System.out.println(xse.getMessage());
+ System.out.println("PASSED");
+ }
+
+ System.out.println("Validating signature-enveloping-hmac-sha1-trunclen-8-attack.xml");
+ try {
+ test_signature("signature-enveloping-hmac-sha1-trunclen-8-attack.xml", SKKS, false);
+ System.out.println("FAILED");
+ atLeastOneFailed = true;
+ } catch (XMLSignatureException xse) {
+ System.out.println(xse.getMessage());
+ System.out.println("PASSED");
+ }
+
if (atLeastOneFailed) {
throw new Exception
("At least one signature did not validate as expected");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-enveloping-hmac-sha1-trunclen-0-attack.xml Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
+ <SignedInfo>
+ <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
+ <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1">
+ <HMACOutputLength>0</HMACOutputLength>
+ </SignatureMethod>
+ <Reference URI="#object">
+ <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
+ <DigestValue>nz4GS0NbH2SrWlD/4fX313CoTzc=</DigestValue>
+ </Reference>
+ </SignedInfo>
+ <SignatureValue>
+ </SignatureValue>
+ <Object Id="object">some other text</Object>
+</Signature>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-enveloping-hmac-sha1-trunclen-8-attack.xml Wed Jul 08 14:24:20 2009 -0700
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
+ <SignedInfo>
+ <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
+ <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1">
+ <HMACOutputLength>8</HMACOutputLength>
+ </SignatureMethod>
+ <Reference URI="#object">
+ <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
+ <DigestValue>nz4GS0NbH2SrWlD/4fX313CoTzc=</DigestValue>
+ </Reference>
+ </SignedInfo>
+ <SignatureValue>
+ Qw==
+ </SignatureValue>
+ <Object Id="object">some other text</Object>
+</Signature>