--- a/jdk/.hgtags Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/.hgtags Mon Sep 10 09:00:00 2012 -0400
@@ -175,3 +175,4 @@
e865efbc71059a414b3b2dd2e0adfcb3d2ab6ff9 jdk8-b51
e8569a473cee7f4955bd9e76a9bdf6c6a07ced27 jdk8-b52
2c6933c5106b81a8578b70996fe5b735fb3adb60 jdk8-b53
+70ad0ed1d6cef0e7712690d1bab21e4769708aad jdk8-b54
--- a/jdk/make/common/Program.gmk Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/make/common/Program.gmk Mon Sep 10 09:00:00 2012 -0400
@@ -126,6 +126,26 @@
endif
#
+# Applications expect to be able to link against libjawt without invoking
+# System.loadLibrary("jawt") first. This was the behaviour described in the
+# devloper documentation of JAWT and what worked with OpenJDK6.
+#
+ifeq ($(PLATFORM), solaris)
+ ifeq ($(ARCH_DATA_MODEL), 32)
+ LDFLAGS += -R \$$ORIGIN/../lib/$(LIBARCH)
+ LDFLAGS += -R \$$ORIGIN/../jre/lib/$(LIBARCH)
+ else # ! ARCH_DATA_MODEL 64-bit
+ LDFLAGS += -R \$$ORIGIN/../../lib/$(LIBARCH)
+ LDFLAGS += -R \$$ORIGIN/../../jre/lib/$(LIBARCH)
+ endif # ARCH_DATA_MODEL
+endif # PLATFORM SOLARIS
+ifeq ($(PLATFORM), linux)
+ LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../lib/$(LIBARCH)
+ LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/../jre/lib/$(LIBARCH)
+endif # PLATFORM LINUX
+
+
+#
# Launcher specific files.
#
FILES_o = $(OBJDIR)/main.$(OBJECT_SUFFIX)
--- a/jdk/make/docs/Makefile Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/make/docs/Makefile Mon Sep 10 09:00:00 2012 -0400
@@ -73,7 +73,7 @@
else ifeq ($(ARCH),universal)
MAX_VM_MEMORY = 1024
else
- MAX_VM_MEMORY = 612
+ MAX_VM_MEMORY = 768
endif
# List of all possible directories for javadoc to look for sources
--- a/jdk/make/sun/Makefile Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/make/sun/Makefile Mon Sep 10 09:00:00 2012 -0400
@@ -87,7 +87,7 @@
endif
SUBDIRS_desktop = audio $(RENDER_SUBDIR) image \
$(LWAWT_PRE_SUBDIR) $(DISPLAY_LIBS) $(DGA_SUBDIR) $(LWAWT_SUBDIR) \
- jawt font jpeg cmm $(DISPLAY_TOOLS) beans
+ jawt font jpeg cmm $(DISPLAY_TOOLS)
SUBDIRS_management = management
SUBDIRS_misc = $(ORG_SUBDIR) rmi $(JDBC_SUBDIR) tracing
SUBDIRS_tools = native2ascii serialver tools jconsole
--- a/jdk/make/sun/beans/Makefile Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-#
-# Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation. Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-#
-# Makefile for building sun.beans.*
-#
-
-BUILDDIR = ../..
-PACKAGE = sun.beans
-PRODUCT = sun
-include $(BUILDDIR)/common/Defs.gmk
-
-#
-# Files
-#
-AUTO_FILES_JAVA_DIRS = sun/beans
-
-#
-# Rules
-#
-include $(BUILDDIR)/common/Classes.gmk
--- a/jdk/make/sun/jawt/Makefile Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/make/sun/jawt/Makefile Mon Sep 10 09:00:00 2012 -0400
@@ -31,6 +31,13 @@
include $(BUILDDIR)/common/Defs.gmk
#
+# libjawt links to other programs, but nothing links to it directly. An RPATH
+# entry has been added to the launcher so third-party programs linked against
+# it will be able to find it no matter where the JDK or the third-party program
+# is located.
+#
+
+#
# Files
#
ifeq ($(PLATFORM), windows)
--- a/jdk/src/macosx/classes/com/apple/laf/ScreenMenuItem.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/com/apple/laf/ScreenMenuItem.java Mon Sep 10 09:00:00 2012 -0400
@@ -34,7 +34,7 @@
import sun.lwawt.macosx.CMenuItem;
-class ScreenMenuItem extends MenuItem implements ActionListener, ComponentListener, ScreenMenuPropertyHandler {
+final class ScreenMenuItem extends MenuItem implements ActionListener, ComponentListener, ScreenMenuPropertyHandler {
ScreenMenuPropertyListener fListener;
JMenuItem fMenuItem;
@@ -96,19 +96,29 @@
fMenuItem.removeComponentListener(this);
}
- public void setAccelerator(final KeyStroke ks) {
- if (ks == null) {
- setShortcut(null);
+ static void syncLabelAndKS(MenuItem menuItem, String label, KeyStroke ks) {
+ final MenuComponentPeer peer = menuItem.getPeer();
+ if (!(peer instanceof CMenuItem)) {
+ //Is it possible?
return;
}
+ final CMenuItem cmi = (CMenuItem) peer;
+ if (ks == null) {
+ cmi.setLabel(label);
+ } else {
+ cmi.setLabel(label, ks.getKeyChar(), ks.getKeyCode(),
+ ks.getModifiers());
+ }
+ }
- final MenuComponentPeer peer = getPeer();
- if (peer instanceof CMenuItem) {
- final CMenuItem ourPeer = (CMenuItem)peer;
- ourPeer.setLabel(fMenuItem.getText(), ks.getKeyChar(), ks.getKeyCode(), ks.getModifiers());
- } else {
- setShortcut(new MenuShortcut(ks.getKeyCode(), (ks.getModifiers() & InputEvent.SHIFT_MASK) != 0));
- }
+ @Override
+ public synchronized void setLabel(final String label) {
+ syncLabelAndKS(this, label, fMenuItem.getAccelerator());
+ }
+
+ @Override
+ public void setAccelerator(final KeyStroke ks) {
+ syncLabelAndKS(this, fMenuItem.getText(), ks);
}
public void actionPerformed(final ActionEvent e) {
--- a/jdk/src/macosx/classes/com/apple/laf/ScreenMenuItemCheckbox.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/com/apple/laf/ScreenMenuItemCheckbox.java Mon Sep 10 09:00:00 2012 -0400
@@ -36,7 +36,7 @@
import sun.lwawt.macosx.*;
-class ScreenMenuItemCheckbox extends CheckboxMenuItem implements ActionListener, ComponentListener, ScreenMenuPropertyHandler, ItemListener {
+final class ScreenMenuItemCheckbox extends CheckboxMenuItem implements ActionListener, ComponentListener, ScreenMenuPropertyHandler, ItemListener {
JMenuItem fMenuItem;
MenuContainer fParent;
@@ -110,19 +110,14 @@
super.removeNotify();
}
- public void setAccelerator(final KeyStroke ks) {
- if (ks == null) {
- setShortcut(null);
- return;
- }
+ @Override
+ public synchronized void setLabel(final String label) {
+ ScreenMenuItem.syncLabelAndKS(this, label, fMenuItem.getAccelerator());
+ }
- final MenuComponentPeer peer = getPeer();
- if (peer instanceof CMenuItem) {
- final CMenuItem ourPeer = (CMenuItem)peer;
- ourPeer.setLabel(fMenuItem.getText(), ks.getKeyChar(), ks.getKeyCode(), ks.getModifiers());
- } else {
- setShortcut(new MenuShortcut(ks.getKeyCode(), (ks.getModifiers() & InputEvent.SHIFT_MASK) != 0));
- }
+ @Override
+ public void setAccelerator(final KeyStroke ks) {
+ ScreenMenuItem.syncLabelAndKS(this, fMenuItem.getText(), ks);
}
public void actionPerformed(final ActionEvent e) {
--- a/jdk/src/macosx/classes/sun/java2d/opengl/CGLGraphicsConfig.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/java2d/opengl/CGLGraphicsConfig.java Mon Sep 10 09:00:00 2012 -0400
@@ -31,8 +31,12 @@
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.ImageCapabilities;
+import java.awt.Rectangle;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
@@ -44,6 +48,7 @@
import sun.awt.CGraphicsConfig;
import sun.awt.CGraphicsDevice;
+import sun.awt.TextureSizeConstraining;
import sun.awt.image.OffScreenImage;
import sun.awt.image.SunVolatileImage;
import sun.awt.image.SurfaceManager;
@@ -65,7 +70,7 @@
import sun.lwawt.macosx.CPlatformView;
public class CGLGraphicsConfig extends CGraphicsConfig
- implements OGLGraphicsConfig
+ implements OGLGraphicsConfig, TextureSizeConstraining
{
//private static final int kOpenGLSwapInterval = RuntimeOptions.getCurrentOptions().OpenGLSwapInterval;
private static final int kOpenGLSwapInterval = 0; // TODO
@@ -242,6 +247,8 @@
} finally {
rq.unlock();
}
+
+ updateTotalDisplayBounds();
}
@Override
@@ -478,4 +485,50 @@
public void removeDeviceEventListener(AccelDeviceEventListener l) {
AccelDeviceEventNotifier.removeListener(l);
}
+
+ private static final Rectangle totalDisplayBounds = new Rectangle();
+
+ private static void updateTotalDisplayBounds() {
+ synchronized (totalDisplayBounds) {
+ Rectangle virtualBounds = new Rectangle();
+ for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) {
+ for (GraphicsConfiguration gc : gd.getConfigurations()) {
+ virtualBounds = virtualBounds.union(gc.getBounds());
+ }
+ }
+ totalDisplayBounds.setBounds(virtualBounds);
+ }
+ }
+
+ // 7160609: GL still fails to create a square texture of this size,
+ // so we use this value to cap the total display bounds.
+ native private static int getMaxTextureSize();
+
+ @Override
+ public int getMaxTextureWidth() {
+ int width;
+
+ synchronized (totalDisplayBounds) {
+ if (totalDisplayBounds.width == 0) {
+ updateTotalDisplayBounds();
+ }
+ width = totalDisplayBounds.width;
+ }
+
+ return Math.min(width, getMaxTextureSize());
+ }
+
+ @Override
+ public int getMaxTextureHeight() {
+ int height;
+
+ synchronized (totalDisplayBounds) {
+ if (totalDisplayBounds.height == 0) {
+ updateTotalDisplayBounds();
+ }
+ height = totalDisplayBounds.height;
+ }
+
+ return Math.min(height, getMaxTextureSize());
+ }
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -282,7 +282,7 @@
* Note that we call setVisible() at the end of initialization.
*/
public final void initialize() {
- platformComponent.initialize(target, this, getPlatformWindow());
+ platformComponent.initialize(getPlatformWindow());
initializeImpl();
setVisible(target.isVisible());
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -338,6 +338,18 @@
h = MINIMUM_HEIGHT;
}
+ if (graphicsConfig instanceof TextureSizeConstraining) {
+ final int maxW = ((TextureSizeConstraining)graphicsConfig).getMaxTextureWidth();
+ final int maxH = ((TextureSizeConstraining)graphicsConfig).getMaxTextureHeight();
+
+ if (w > maxW) {
+ w = maxW;
+ }
+ if (h > maxH) {
+ h = maxH;
+ }
+ }
+
// Don't post ComponentMoved/Resized and Paint events
// until we've got a notification from the delegate
setBounds(x, y, w, h, op, false, false);
@@ -405,14 +417,33 @@
@Override
public void updateMinimumSize() {
- Dimension d = null;
+ final Dimension min;
if (getTarget().isMinimumSizeSet()) {
- d = getTarget().getMinimumSize();
+ min = getTarget().getMinimumSize();
+ min.width = Math.max(min.width, MINIMUM_WIDTH);
+ min.height = Math.max(min.height, MINIMUM_HEIGHT);
+ } else {
+ min = new Dimension(MINIMUM_WIDTH, MINIMUM_HEIGHT);
}
- if (d == null) {
- d = new Dimension(MINIMUM_WIDTH, MINIMUM_HEIGHT);
+
+ final int maxW, maxH;
+ if (graphicsConfig instanceof TextureSizeConstraining) {
+ maxW = ((TextureSizeConstraining)graphicsConfig).getMaxTextureWidth();
+ maxH = ((TextureSizeConstraining)graphicsConfig).getMaxTextureHeight();
+ } else {
+ maxW = maxH = Integer.MAX_VALUE;
}
- platformWindow.setMinimumSize(d.width, d.height);
+
+ final Dimension max;
+ if (getTarget().isMaximumSizeSet()) {
+ max = getTarget().getMaximumSize();
+ max.width = Math.min(max.width, maxW);
+ max.height = Math.min(max.height, maxH);
+ } else {
+ max = new Dimension(maxW, maxH);
+ }
+
+ platformWindow.setSizeConstraints(min.width, min.height, max.width, max.height);
}
@Override
--- a/jdk/src/macosx/classes/sun/lwawt/PlatformComponent.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/lwawt/PlatformComponent.java Mon Sep 10 09:00:00 2012 -0400
@@ -23,15 +23,38 @@
* questions.
*/
+
package sun.lwawt;
-import java.awt.Component;
-
+/**
+ * Can be used to store information about native resource related to the
+ * lightweight component.
+ */
public interface PlatformComponent {
- public void initialize(Component target, LWComponentPeer peer, PlatformWindow platformWindow);
+ /**
+ * Initializes platform component.
+ *
+ * @param platformWindow already initialized {@code PlatformWindow}.
+ */
+ void initialize(PlatformWindow platformWindow);
- public void setBounds(int x, int y, int w, int h);
+ /**
+ * Moves and resizes this component. The new location of the top-left corner
+ * is specified by {@code x} and {@code y}, and the new size is specified by
+ * {@code w} and {@code h}. The location is specified relative to the {@code
+ * platformWindow}.
+ *
+ * @param x the X location of the component
+ * @param y the Y location of the component
+ * @param w the width of the component
+ * @param h the height of the component
+ */
+ void setBounds(int x, int y, int w, int h);
- public void dispose();
+ /**
+ * Releases all of the native resources used by this {@code
+ * PlatformComponent}.
+ */
+ void dispose();
}
--- a/jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java Mon Sep 10 09:00:00 2012 -0400
@@ -131,7 +131,10 @@
public void setResizable(boolean resizable);
- public void setMinimumSize(int width, int height);
+ /**
+ * Applies the minimum and maximum size to the platform window.
+ */
+ public void setSizeConstraints(int minW, int minH, int maxW, int maxH);
/**
* Transforms the given Graphics object according to the native
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CFRetainedResource.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CFRetainedResource.java Mon Sep 10 09:00:00 2012 -0400
@@ -33,8 +33,8 @@
public class CFRetainedResource {
private static native void nativeCFRelease(final long ptr, final boolean disposeOnAppKitThread);
- final boolean disposeOnAppKitThread;
- protected long ptr;
+ private final boolean disposeOnAppKitThread;
+ protected volatile long ptr;
/**
* @param ptr CFRetained native object pointer
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CFileDialog.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CFileDialog.java Mon Sep 10 09:00:00 2012 -0400
@@ -30,12 +30,14 @@
import java.awt.BufferCapabilities.FlipContents;
import java.awt.event.*;
import java.awt.image.*;
+import java.security.AccessController;
import java.util.List;
import java.io.*;
import sun.awt.CausedFocusEvent.Cause;
import sun.awt.AWTAccessor;
import sun.java2d.pipe.Region;
+import sun.security.action.GetBooleanAction;
class CFileDialog implements FileDialogPeer {
@@ -53,11 +55,14 @@
if (title == null) {
title = " ";
}
+ Boolean chooseDirectories = AccessController.doPrivileged(
+ new GetBooleanAction("apple.awt.fileDialogForDirectories"));
String[] userFileNames = nativeRunFileDialog(title,
dialogMode,
target.isMultipleMode(),
navigateApps,
+ chooseDirectories,
target.getFilenameFilter() != null,
target.getDirectory(),
target.getFile());
@@ -142,7 +147,8 @@
}
private native String[] nativeRunFileDialog(String title, int mode,
- boolean multipleMode, boolean shouldNavigateApps, boolean hasFilenameFilter,
+ boolean multipleMode, boolean shouldNavigateApps,
+ boolean canChooseDirectories, boolean hasFilenameFilter,
String directory, String file);
@Override
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformComponent.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformComponent.java Mon Sep 10 09:00:00 2012 -0400
@@ -23,27 +23,24 @@
* questions.
*/
+
package sun.lwawt.macosx;
-import java.awt.Component;
import java.awt.Insets;
import sun.lwawt.PlatformComponent;
import sun.lwawt.PlatformWindow;
-import sun.lwawt.LWComponentPeer;
-
-import sun.lwawt.macosx.CFRetainedResource;
-
-public class CPlatformComponent extends CFRetainedResource implements PlatformComponent {
- Component target;
- LWComponentPeer peer;
- PlatformWindow platformWindow;
+/**
+ * On OSX {@code CPlatformComponent} stores pointer to the native CAlayer which
+ * can be used from JAWT.
+ */
+final class CPlatformComponent extends CFRetainedResource
+ implements PlatformComponent {
- private native long nativeCreateComponent(long windowLayer);
- private native long nativeSetBounds(long ptr, int x, int y, int width, int height);
+ private volatile PlatformWindow platformWindow;
- public CPlatformComponent() {
+ CPlatformComponent() {
super(0, true);
}
@@ -51,27 +48,28 @@
return ptr;
}
- public void initialize(Component target, LWComponentPeer peer, PlatformWindow platformWindow) {
- this.target = target;
- this.peer = peer;
+ @Override
+ public void initialize(final PlatformWindow platformWindow) {
this.platformWindow = platformWindow;
-
- long windowLayerPtr = platformWindow.getLayerPtr();
- setPtr(nativeCreateComponent(windowLayerPtr));
+ setPtr(nativeCreateComponent(platformWindow.getLayerPtr()));
}
// TODO: visibility, z-order
@Override
- public void setBounds(int x, int y, int width, int height) {
+ public void setBounds(final int x, final int y, final int w, final int h) {
// translates values from the coordinate system of the top-level window
// to the coordinate system of the content view
- Insets insets = platformWindow.getPeer().getInsets();
- nativeSetBounds(getPointer(), x - insets.left, y - insets.top, width, height);
+ final Insets insets = platformWindow.getPeer().getInsets();
+ nativeSetBounds(getPointer(), x - insets.left, y - insets.top, w, h);
}
@Override
public void dispose() {
super.dispose();
}
+
+ private native long nativeCreateComponent(long windowLayer);
+
+ private native void nativeSetBounds(long ptr, int x, int y, int w, int h);
}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Mon Sep 10 09:00:00 2012 -0400
@@ -180,7 +180,7 @@
public void setResizable(boolean resizable) {}
@Override
- public void setMinimumSize(int width, int height) {}
+ public void setSizeConstraints(int minW, int minH, int maxW, int maxH) {}
@Override
public Graphics transformGraphics(Graphics g) {
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Mon Sep 10 09:00:00 2012 -0400
@@ -672,20 +672,15 @@
// Re-apply the size constraints and the size to ensure the space
// occupied by the grow box is counted properly
- setMinimumSize(1, 1); // the method ignores its arguments
+ peer.updateMinimumSize();
Rectangle bounds = peer.getBounds();
setBounds(bounds.x, bounds.y, bounds.width, bounds.height);
}
@Override
- public void setMinimumSize(int width, int height) {
- //TODO width, height should be used
- //NOTE: setResizable() calls setMinimumSize(1,1) relaying on the logic below
- final long nsWindowPtr = getNSWindowPtr();
- final Dimension min = target.getMinimumSize();
- final Dimension max = target.getMaximumSize();
- nativeSetNSWindowMinMax(nsWindowPtr, min.getWidth(), min.getHeight(), max.getWidth(), max.getHeight());
+ public void setSizeConstraints(int minW, int minH, int maxW, int maxH) {
+ nativeSetNSWindowMinMax(getNSWindowPtr(), minW, minH, maxW, maxH);
}
@Override
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Mon Sep 10 09:00:00 2012 -0400
@@ -42,7 +42,7 @@
import sun.awt.*;
import sun.lwawt.*;
import sun.lwawt.LWWindowPeer.PeerType;
-
+import sun.security.action.GetBooleanAction;
class NamedCursor extends Cursor {
NamedCursor(String name) {
@@ -81,14 +81,6 @@
}
}
- static String getSystemProperty(final String name, final String deflt) {
- return AccessController.doPrivileged (new PrivilegedAction<String>() {
- public String run() {
- return System.getProperty(name, deflt);
- }
- });
- }
-
public LWCToolkit() {
SunToolkit.setDataTransfererClassName("sun.lwawt.macosx.CDataTransferer");
@@ -700,8 +692,8 @@
*/
public synchronized static boolean getSunAwtDisableCALayers() {
if (sunAwtDisableCALayers == null) {
- sunAwtDisableCALayers =
- getBooleanSystemProperty("sun.awt.disableCALayers");
+ sunAwtDisableCALayers = AccessController.doPrivileged(
+ new GetBooleanAction("sun.awt.disableCALayers"));
}
return sunAwtDisableCALayers.booleanValue();
}
--- a/jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/native/sun/awt/AWTSurfaceLayers.m Mon Sep 10 09:00:00 2012 -0400
@@ -78,11 +78,10 @@
// translates values to the coordinate system of the "root" layer
CGFloat newY = windowLayer.bounds.size.height - rect.origin.y - rect.size.height;
+ CGRect newRect = CGRectMake(rect.origin.x, newY, rect.size.width, rect.size.height);
- // REMIND: why do we need to inverse position?
- CGRect newRect = CGRectMake(-rect.origin.x, -newY, rect.size.width, rect.size.height);
+ layer.frame = newRect;
- layer.bounds = newRect;
[AWTSurfaceLayers repaintLayersRecursively:layer];
}
--- a/jdk/src/macosx/native/sun/awt/CFileDialog.h Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/native/sun/awt/CFileDialog.h Mon Sep 10 09:00:00 2012 -0400
@@ -52,6 +52,9 @@
// Should we navigate into apps?
BOOL fNavigateApps;
+ // Can the dialog choose directories ?
+ BOOL fChooseDirectories;
+
// Contains the absolute paths of the selected files as URLs
NSArray *fURLs;
}
@@ -65,6 +68,7 @@
mode:(jint)inMode
multipleMode:(BOOL)inMultipleMode
shouldNavigate:(BOOL)inNavigateApps
+ canChooseDirectories:(BOOL)inChooseDirectories
withEnv:(JNIEnv*)env;
// Invoked from the main thread
--- a/jdk/src/macosx/native/sun/awt/CFileDialog.m Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/native/sun/awt/CFileDialog.m Mon Sep 10 09:00:00 2012 -0400
@@ -43,6 +43,7 @@
mode:(jint)inMode
multipleMode:(BOOL)inMultipleMode
shouldNavigate:(BOOL)inNavigateApps
+canChooseDirectories:(BOOL)inChooseDirectories
withEnv:(JNIEnv*)env;
{
if (self == [super init]) {
@@ -57,6 +58,7 @@
fMode = inMode;
fMultipleMode = inMultipleMode;
fNavigateApps = inNavigateApps;
+ fChooseDirectories = inChooseDirectories;
fPanelResult = NSCancelButton;
}
@@ -109,7 +111,7 @@
NSOpenPanel *openPanel = (NSOpenPanel *)thePanel;
[openPanel setAllowsMultipleSelection:fMultipleMode];
[openPanel setCanChooseFiles:YES];
- [openPanel setCanChooseDirectories:NO];
+ [openPanel setCanChooseDirectories:fChooseDirectories];
[openPanel setCanCreateDirectories:YES];
}
@@ -182,7 +184,8 @@
JNIEXPORT jobjectArray JNICALL
Java_sun_lwawt_macosx_CFileDialog_nativeRunFileDialog
(JNIEnv *env, jobject peer, jstring title, jint mode, jboolean multipleMode,
- jboolean navigateApps, jboolean hasFilter, jstring directory, jstring file)
+ jboolean navigateApps, jboolean chooseDirectories, jboolean hasFilter,
+ jstring directory, jstring file)
{
jobjectArray returnValue = NULL;
@@ -200,6 +203,7 @@
mode:mode
multipleMode:multipleMode
shouldNavigate:navigateApps
+ canChooseDirectories:chooseDirectories
withEnv:env];
[JNFRunLoop performOnMainThread:@selector(safeSaveOrLoad)
--- a/jdk/src/macosx/native/sun/java2d/opengl/CGLGraphicsConfig.m Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/native/sun/java2d/opengl/CGLGraphicsConfig.m Mon Sep 10 09:00:00 2012 -0400
@@ -447,3 +447,20 @@
return cglinfo->context->caps;
}
}
+
+JNIEXPORT jint JNICALL
+Java_sun_java2d_opengl_CGLGraphicsConfig_getMaxTextureSize
+ (JNIEnv *env, jclass cglgc)
+{
+ J2dTraceLn(J2D_TRACE_INFO, "CGLGraphicsConfig_getMaxTextureSize");
+
+ __block int max = 0;
+
+ [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
+ [sharedContext makeCurrentContext];
+ j2d_glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
+ }];
+
+ return (jint)max;
+}
+
--- a/jdk/src/macosx/native/sun/osxapp/NSApplicationAWT.h Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/native/sun/osxapp/NSApplicationAWT.h Mon Sep 10 09:00:00 2012 -0400
@@ -28,7 +28,6 @@
@interface NSApplicationAWT : NSApplication {
NSString *fApplicationName;
- BOOL fUseDefaultIcon;
NSWindow *eventTransparentWindow;
}
--- a/jdk/src/macosx/native/sun/osxapp/NSApplicationAWT.m Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/macosx/native/sun/osxapp/NSApplicationAWT.m Mon Sep 10 09:00:00 2012 -0400
@@ -52,7 +52,6 @@
AWT_ASSERT_APPKIT_THREAD;
fApplicationName = nil;
- fUseDefaultIcon = NO;
// NSApplication will call _RegisterApplication with the application's bundle, but there may not be one.
// So, we need to call it ourselves to ensure the app is set up properly.
@@ -147,10 +146,6 @@
if (appName != NULL) {
fApplicationName = [NSString stringWithUTF8String:appName];
unsetenv(envVar);
-
- // If this environment variable was set we were launched from the command line, so we
- // should use a generic app icon if one wasn't set.
- fUseDefaultIcon = YES;
}
// If it wasn't specified as an argument, see if it was specified as a system property.
@@ -171,9 +166,6 @@
if (lastPeriod.location != NSNotFound) {
fApplicationName = [fApplicationName substringFromIndex:lastPeriod.location + 1];
}
- // If this environment variable was set we were launched from the command line, so we
- // should use a generic app icon if one wasn't set.
- fUseDefaultIcon = YES;
}
}
@@ -266,8 +258,11 @@
// If the icon file wasn't specified as an argument and we need to get an icon
// we'll use the generic java app icon.
NSString *defaultIconPath = [NSString stringWithFormat:@"%@%@", SHARED_FRAMEWORK_BUNDLE, @"/Resources/GenericApp.icns"];
- if (fUseDefaultIcon && (theIconPath == nil)) {
- theIconPath = defaultIconPath;
+ if (theIconPath == nil) {
+ NSString* bundleIcon = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIconFile"];
+ if (bundleIcon == nil) {
+ theIconPath = defaultIconPath;
+ }
}
// Set up the dock icon if we have an icon name.
--- a/jdk/src/share/bin/jli_util.h Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/bin/jli_util.h Mon Sep 10 09:00:00 2012 -0400
@@ -68,12 +68,23 @@
#define JLI_StrNCaseCmp(p1, p2, p3) strnicmp((p1), (p2), (p3))
#define JLI_Snprintf _snprintf
void JLI_CmdToArgs(char *cmdline);
-#else
+#define JLI_Lseek _lseeki64
+#else /* NIXES */
#include <unistd.h>
#include <strings.h>
#define JLI_StrCaseCmp(p1, p2) strcasecmp((p1), (p2))
#define JLI_StrNCaseCmp(p1, p2, p3) strncasecmp((p1), (p2), (p3))
#define JLI_Snprintf snprintf
+#ifdef __solaris__
+#define JLI_Lseek llseek
+#endif
+#ifdef __linux__
+#define _LARGFILE64_SOURCE
+#define JLI_Lseek lseek64
+#endif
+#ifdef MACOSX
+#define JLI_Lseek lseek
+#endif
#endif /* _WIN32 */
/*
--- a/jdk/src/share/bin/manifest_info.h Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/bin/manifest_info.h Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,8 @@
#define CENSIG 0x02014b50L /* "PK\001\002" */
#define ENDSIG 0x06054b50L /* "PK\005\006" */
+#define ZIP64_ENDSIG 0x06064b50L /* "PK\006\006" */
+#define ZIP64_LOCSIG 0x07064b50L /* "PK\006\007" */
/*
* Header sizes including signatures
*/
@@ -45,12 +47,21 @@
#define CENHDR 46
#define ENDHDR 22
+#define ZIP64_ENDHDR 56 // ZIP64 end header size
+#define ZIP64_LOCHDR 20 // ZIP64 end loc header size
+#define ZIP64_EXTHDR 24 // EXT header size
+#define ZIP64_EXTID 1 // Extra field Zip64 header ID
+
+#define ZIP64_MAGICVAL 0xffffffffLL
+#define ZIP64_MAGICCOUNT 0xffff
+
/*
* Header field access macros
*/
#define CH(b, n) (((unsigned char *)(b))[n])
#define SH(b, n) (CH(b, n) | (CH(b, n+1) << 8))
-#define LG(b, n) (SH(b, n) | (SH(b, n+2) << 16))
+#define LG(b, n) ((SH(b, n) | (SH(b, n+2) << 16)) &0xffffffffUL)
+#define LL(b, n) (((jlong)LG(b, n)) | (((jlong)LG(b, n+4)) << 32))
#define GETSIG(b) LG(b, 0)
/*
@@ -102,6 +113,26 @@
#define ENDCOM(b) SH(b, 20) /* size of zip file comment */
/*
+ * Macros for getting Zip64 end of central directory header fields
+ */
+#define ZIP64_ENDLEN(b) LL(b, 4) /* size of zip64 end of central dir */
+#define ZIP64_ENDVEM(b) SH(b, 12) /* version made by */
+#define ZIP64_ENDVER(b) SH(b, 14) /* version needed to extract */
+#define ZIP64_ENDNMD(b) LG(b, 16) /* number of this disk */
+#define ZIP64_ENDDSK(b) LG(b, 20) /* disk number of start */
+#define ZIP64_ENDTOD(b) LL(b, 24) /* total number of entries on this disk */
+#define ZIP64_ENDTOT(b) LL(b, 32) /* total number of entries */
+#define ZIP64_ENDSIZ(b) LL(b, 40) /* central directory size in bytes */
+#define ZIP64_ENDOFF(b) LL(b, 48) /* offset of first CEN header */
+
+/*
+ * Macros for getting Zip64 end of central directory locator fields
+ */
+#define ZIP64_LOCDSK(b) LG(b, 4) /* disk number start */
+#define ZIP64_LOCOFF(b) LL(b, 8) /* offset of zip64 end */
+#define ZIP64_LOCTOT(b) LG(b, 16) /* total number of disks */
+
+/*
* A comment of maximum length of 64kb can follow the END record. This
* is the furthest the END record can be from the end of the file.
*/
@@ -119,7 +150,7 @@
typedef struct zentry { /* Zip file entry */
size_t isize; /* size of inflated data */
size_t csize; /* size of compressed data (zero if uncompressed) */
- off_t offset; /* position of compressed data */
+ jlong offset; /* position of compressed data */
int how; /* compression method (if any) */
} zentry;
--- a/jdk/src/share/bin/parse_manifest.c Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/bin/parse_manifest.c Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -61,7 +61,7 @@
if (entry->csize == (size_t) -1 || entry->isize == (size_t) -1 )
return (NULL);
- if (lseek(fd, entry->offset, SEEK_SET) < (off_t)0)
+ if (JLI_Lseek(fd, entry->offset, SEEK_SET) < (jlong)0)
return (NULL);
if ((in = malloc(entry->csize + 1)) == NULL)
return (NULL);
@@ -110,6 +110,38 @@
return (NULL);
}
+static jboolean zip64_present = JNI_FALSE;
+
+/*
+ * Checks to see if we have ZIP64 archive, and save
+ * the check for later use
+ */
+static int
+haveZIP64(Byte *p) {
+ jlong cenlen, cenoff, centot;
+ cenlen = ENDSIZ(p);
+ cenoff = ENDOFF(p);
+ centot = ENDTOT(p);
+ zip64_present = (cenlen == ZIP64_MAGICVAL ||
+ cenoff == ZIP64_MAGICVAL ||
+ centot == ZIP64_MAGICCOUNT);
+ return zip64_present;
+}
+
+static jlong
+find_end64(int fd, Byte *ep, jlong pos)
+{
+ jlong end64pos;
+ jlong bytes;
+ if ((end64pos = JLI_Lseek(fd, pos - ZIP64_LOCHDR, SEEK_SET)) < (jlong)0)
+ return -1;
+ if ((bytes = read(fd, ep, ZIP64_LOCHDR)) < 0)
+ return -1;
+ if (GETSIG(ep) == ZIP64_LOCSIG)
+ return end64pos;
+ return -1;
+}
+
/*
* A very little used routine to handle the case that zip file has
* a comment at the end. Believe it or not, the only way to find the
@@ -122,12 +154,12 @@
* Returns the offset of the END record in the file on success,
* -1 on failure.
*/
-static off_t
+static jlong
find_end(int fd, Byte *eb)
{
- off_t len;
- off_t pos;
- off_t flen;
+ jlong len;
+ jlong pos;
+ jlong flen;
int bytes;
Byte *cp;
Byte *endpos;
@@ -136,14 +168,16 @@
/*
* 99.44% (or more) of the time, there will be no comment at the
* end of the zip file. Try reading just enough to read the END
- * record from the end of the file.
+ * record from the end of the file, at this time we should also
+ * check to see if we have a ZIP64 archive.
*/
- if ((pos = lseek(fd, -ENDHDR, SEEK_END)) < (off_t)0)
+ if ((pos = JLI_Lseek(fd, -ENDHDR, SEEK_END)) < (jlong)0)
return (-1);
if ((bytes = read(fd, eb, ENDHDR)) < 0)
return (-1);
- if (GETSIG(eb) == ENDSIG)
- return (pos);
+ if (GETSIG(eb) == ENDSIG) {
+ return haveZIP64(eb) ? find_end64(fd, eb, pos) : pos;
+ }
/*
* Shucky-Darn,... There is a comment at the end of the zip file.
@@ -151,10 +185,10 @@
* Allocate and fill a buffer with enough of the zip file
* to meet the specification for a maximal comment length.
*/
- if ((flen = lseek(fd, 0, SEEK_END)) < (off_t)0)
+ if ((flen = JLI_Lseek(fd, 0, SEEK_END)) < (jlong)0)
return (-1);
len = (flen < END_MAXLEN) ? flen : END_MAXLEN;
- if (lseek(fd, -len, SEEK_END) < (off_t)0)
+ if (JLI_Lseek(fd, -len, SEEK_END) < (jlong)0)
return (-1);
if ((buffer = malloc(END_MAXLEN)) == NULL)
return (-1);
@@ -175,12 +209,92 @@
(cp + ENDHDR + ENDCOM(cp) == endpos)) {
(void) memcpy(eb, cp, ENDHDR);
free(buffer);
- return (flen - (endpos - cp));
+ pos = flen - (endpos - cp);
+ return haveZIP64(eb) ? find_end64(fd, eb, pos) : pos;
}
free(buffer);
return (-1);
}
+#define BUFSIZE (3 * 65536 + CENHDR + SIGSIZ)
+#define MINREAD 1024
+
+/*
+ * Computes and positions at the start of the CEN header, ie. the central
+ * directory, this will also return the offset if there is a zip file comment
+ * at the end of the archive, for most cases this would be 0.
+ */
+static jlong
+compute_cen(int fd, Byte *bp)
+{
+ int bytes;
+ Byte *p;
+ jlong base_offset;
+ jlong offset;
+ char buffer[MINREAD];
+ p = buffer;
+ /*
+ * Read the END Header, which is the starting point for ZIP files.
+ * (Clearly designed to make writing a zip file easier than reading
+ * one. Now isn't that precious...)
+ */
+ if ((base_offset = find_end(fd, bp)) == -1) {
+ return (-1);
+ }
+ p = bp;
+ /*
+ * There is a historical, but undocumented, ability to allow for
+ * additional "stuff" to be prepended to the zip/jar file. It seems
+ * that this has been used to prepend an actual java launcher
+ * executable to the jar on Windows. Although this is just another
+ * form of statically linking a small piece of the JVM to the
+ * application, we choose to continue to support it. Note that no
+ * guarantees have been made (or should be made) to the customer that
+ * this will continue to work.
+ *
+ * Therefore, calculate the base offset of the zip file (within the
+ * expanded file) by assuming that the central directory is followed
+ * immediately by the end record.
+ */
+ if (zip64_present) {
+ if ((offset = ZIP64_LOCOFF(p)) < (jlong)0) {
+ return -1;
+ }
+ if (JLI_Lseek(fd, offset, SEEK_SET) < (jlong) 0) {
+ return (-1);
+ }
+ if ((bytes = read(fd, buffer, MINREAD)) < 0) {
+ return (-1);
+ }
+ if (GETSIG(buffer) != ZIP64_ENDSIG) {
+ return -1;
+ }
+ if ((offset = ZIP64_ENDOFF(buffer)) < (jlong)0) {
+ return -1;
+ }
+ if (JLI_Lseek(fd, offset, SEEK_SET) < (jlong)0) {
+ return (-1);
+ }
+ p = buffer;
+ base_offset = base_offset - ZIP64_ENDSIZ(p) - ZIP64_ENDOFF(p) - ZIP64_ENDHDR;
+ } else {
+ base_offset = base_offset - ENDSIZ(p) - ENDOFF(p);
+ /*
+ * The END Header indicates the start of the Central Directory
+ * Headers. Remember that the desired Central Directory Header (CEN)
+ * will almost always be the second one and the first one is a small
+ * directory entry ("META-INF/"). Keep the code optimized for
+ * that case.
+ *
+ * Seek to the beginning of the Central Directory.
+ */
+ if (JLI_Lseek(fd, base_offset + ENDOFF(p), SEEK_SET) < (jlong) 0) {
+ return (-1);
+ }
+ }
+ return base_offset;
+}
+
/*
* Locate the manifest file with the zip/jar file.
*
@@ -208,9 +322,6 @@
* a typical jar file (META-INF and META-INF/MANIFEST.MF). Keep this factoid
* in mind when optimizing this code.
*/
-#define BUFSIZE (3 * 65536 + CENHDR + SIGSIZ)
-#define MINREAD 1024
-
static int
find_file(int fd, zentry *entry, const char *file_name)
{
@@ -218,7 +329,7 @@
int res;
int entry_size;
int read_size;
- int base_offset;
+ jlong base_offset;
Byte *p;
Byte *bp;
Byte *buffer;
@@ -228,54 +339,18 @@
return(-1);
}
- p = buffer;
bp = buffer;
-
- /*
- * Read the END Header, which is the starting point for ZIP files.
- * (Clearly designed to make writing a zip file easier than reading
- * one. Now isn't that precious...)
- */
- if ((base_offset = find_end(fd, bp)) == -1) {
+ base_offset = compute_cen(fd, bp);
+ if (base_offset == -1) {
free(buffer);
- return (-1);
+ return -1;
}
- /*
- * There is a historical, but undocumented, ability to allow for
- * additional "stuff" to be prepended to the zip/jar file. It seems
- * that this has been used to prepend an actual java launcher
- * executable to the jar on Windows. Although this is just another
- * form of statically linking a small piece of the JVM to the
- * application, we choose to continue to support it. Note that no
- * guarantees have been made (or should be made) to the customer that
- * this will continue to work.
- *
- * Therefore, calculate the base offset of the zip file (within the
- * expanded file) by assuming that the central directory is followed
- * immediately by the end record.
- */
- base_offset = base_offset - ENDSIZ(p) - ENDOFF(p);
-
- /*
- * The END Header indicates the start of the Central Directory
- * Headers. Remember that the desired Central Directory Header (CEN)
- * will almost always be the second one and the first one is a small
- * directory entry ("META-INF/"). Keep the code optimized for
- * that case.
- *
- * Begin by seeking to the beginning of the Central Directory and
- * reading in the first buffer full of bits.
- */
- if (lseek(fd, base_offset + ENDOFF(p), SEEK_SET) < (off_t)0) {
- free(buffer);
- return (-1);
- }
if ((bytes = read(fd, bp, MINREAD)) < 0) {
free(buffer);
return (-1);
}
-
+ p = bp;
/*
* Loop through the Central Directory Headers. Note that a valid zip/jar
* must have an ENDHDR (with ENDSIG) after the Central Directory.
@@ -319,7 +394,7 @@
*/
if ((size_t)CENNAM(p) == JLI_StrLen(file_name) &&
memcmp((p + CENHDR), file_name, JLI_StrLen(file_name)) == 0) {
- if (lseek(fd, base_offset + CENOFF(p), SEEK_SET) < (off_t)0) {
+ if (JLI_Lseek(fd, base_offset + CENOFF(p), SEEK_SET) < (jlong)0) {
free(buffer);
return (-1);
}
@@ -487,6 +562,9 @@
char *splashscreen_name = NULL;
if ((fd = open(jarfile, O_RDONLY
+#ifdef O_LARGEFILE
+ | O_LARGEFILE /* large file mode on solaris */
+#endif
#ifdef O_BINARY
| O_BINARY /* use binary mode on windows */
#endif
--- a/jdk/src/share/classes/com/sun/beans/decoder/MethodElementHandler.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/beans/decoder/MethodElementHandler.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,8 @@
import java.lang.reflect.Method;
+import sun.reflect.misc.MethodUtil;
+
/**
* This class is intended to handle <method> element.
* It describes invocation of the method.
@@ -101,7 +103,7 @@
if (method.isVarArgs()) {
args = getArguments(args, method.getParameterTypes());
}
- Object value = method.invoke(bean, args);
+ Object value = MethodUtil.invoke(method, bean, args);
return method.getReturnType().equals(void.class)
? ValueObjectImpl.VOID
: ValueObjectImpl.create(value);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/BooleanEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.beans.editors;
+
+/**
+ * Property editor for a java builtin "boolean" type.
+ */
+
+import java.beans.*;
+
+public class BooleanEditor extends PropertyEditorSupport {
+
+
+ public String getJavaInitializationString() {
+ Object value = getValue();
+ return (value != null)
+ ? value.toString()
+ : "null";
+ }
+
+ public String getAsText() {
+ Object value = getValue();
+ return (value instanceof Boolean)
+ ? getValidName((Boolean) value)
+ : null;
+ }
+
+ public void setAsText(String text) throws java.lang.IllegalArgumentException {
+ if (text == null) {
+ setValue(null);
+ } else if (isValidName(true, text)) {
+ setValue(Boolean.TRUE);
+ } else if (isValidName(false, text)) {
+ setValue(Boolean.FALSE);
+ } else {
+ throw new java.lang.IllegalArgumentException(text);
+ }
+ }
+
+ public String[] getTags() {
+ return new String[] {getValidName(true), getValidName(false)};
+ }
+
+ // the following method should be localized (4890258)
+
+ private String getValidName(boolean value) {
+ return value ? "True" : "False";
+ }
+
+ private boolean isValidName(boolean value, String name) {
+ return getValidName(value).equalsIgnoreCase(name);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/ByteEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.beans.editors;
+
+/**
+ * Property editor for a java builtin "byte" type.
+ *
+ */
+
+import java.beans.*;
+
+public class ByteEditor extends NumberEditor {
+
+ public String getJavaInitializationString() {
+ Object value = getValue();
+ return (value != null)
+ ? "((byte)" + value + ")"
+ : "null";
+ }
+
+ public void setAsText(String text) throws IllegalArgumentException {
+ setValue((text == null) ? null : Byte.decode(text));
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/ColorEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.beans.editors;
+
+import java.awt.*;
+import java.beans.*;
+
+public class ColorEditor extends Panel implements PropertyEditor {
+ private static final long serialVersionUID = 1781257185164716054L;
+
+ public ColorEditor() {
+ setLayout(null);
+
+ ourWidth = hPad;
+
+ // Create a sample color block bordered in black
+ Panel p = new Panel();
+ p.setLayout(null);
+ p.setBackground(Color.black);
+ sample = new Canvas();
+ p.add(sample);
+ sample.reshape(2, 2, sampleWidth, sampleHeight);
+ add(p);
+ p.reshape(ourWidth, 2, sampleWidth+4, sampleHeight+4);
+ ourWidth += sampleWidth + 4 + hPad;
+
+ text = new TextField("", 14);
+ add(text);
+ text.reshape(ourWidth,0,100,30);
+ ourWidth += 100 + hPad;
+
+ choser = new Choice();
+ int active = 0;
+ for (int i = 0; i < colorNames.length; i++) {
+ choser.addItem(colorNames[i]);
+ }
+ add(choser);
+ choser.reshape(ourWidth,0,100,30);
+ ourWidth += 100 + hPad;
+
+ resize(ourWidth,40);
+ }
+
+ public void setValue(Object o) {
+ Color c = (Color)o;
+ changeColor(c);
+ }
+
+ public Dimension preferredSize() {
+ return new Dimension(ourWidth, 40);
+ }
+
+ public boolean keyUp(Event e, int key) {
+ if (e.target == text) {
+ try {
+ setAsText(text.getText());
+ } catch (IllegalArgumentException ex) {
+ // Quietly ignore.
+ }
+ }
+ return (false);
+ }
+
+ public void setAsText(String s) throws java.lang.IllegalArgumentException {
+ if (s == null) {
+ changeColor(null);
+ return;
+ }
+ int c1 = s.indexOf(',');
+ int c2 = s.indexOf(',', c1+1);
+ if (c1 < 0 || c2 < 0) {
+ // Invalid string.
+ throw new IllegalArgumentException(s);
+ }
+ try {
+ int r = Integer.parseInt(s.substring(0,c1));
+ int g = Integer.parseInt(s.substring(c1+1, c2));
+ int b = Integer.parseInt(s.substring(c2+1));
+ Color c = new Color(r,g,b);
+ changeColor(c);
+ } catch (Exception ex) {
+ throw new IllegalArgumentException(s);
+ }
+
+ }
+
+ public boolean action(Event e, Object arg) {
+ if (e.target == choser) {
+ changeColor(colors[choser.getSelectedIndex()]);
+ }
+ return false;
+ }
+
+ public String getJavaInitializationString() {
+ return (this.color != null)
+ ? "new java.awt.Color(" + this.color.getRGB() + ",true)"
+ : "null";
+ }
+
+
+ private void changeColor(Color c) {
+
+ if (c == null) {
+ this.color = null;
+ this.text.setText("");
+ return;
+ }
+
+ color = c;
+
+ text.setText("" + c.getRed() + "," + c.getGreen() + "," + c.getBlue());
+
+ int active = 0;
+ for (int i = 0; i < colorNames.length; i++) {
+ if (color.equals(colors[i])) {
+ active = i;
+ }
+ }
+ choser.select(active);
+
+ sample.setBackground(color);
+ sample.repaint();
+
+ support.firePropertyChange("", null, null);
+ }
+
+ public Object getValue() {
+ return color;
+ }
+
+ public boolean isPaintable() {
+ return true;
+ }
+
+ public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) {
+ Color oldColor = gfx.getColor();
+ gfx.setColor(Color.black);
+ gfx.drawRect(box.x, box.y, box.width-3, box.height-3);
+ gfx.setColor(color);
+ gfx.fillRect(box.x+1, box.y+1, box.width-4, box.height-4);
+ gfx.setColor(oldColor);
+ }
+
+ public String getAsText() {
+ return (this.color != null)
+ ? this.color.getRed() + "," + this.color.getGreen() + "," + this.color.getBlue()
+ : null;
+ }
+
+ public String[] getTags() {
+ return null;
+ }
+
+ public java.awt.Component getCustomEditor() {
+ return this;
+ }
+
+ public boolean supportsCustomEditor() {
+ return true;
+ }
+
+ public void addPropertyChangeListener(PropertyChangeListener l) {
+ support.addPropertyChangeListener(l);
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener l) {
+ support.removePropertyChangeListener(l);
+ }
+
+
+ private String colorNames[] = { " ", "white", "lightGray", "gray", "darkGray",
+ "black", "red", "pink", "orange",
+ "yellow", "green", "magenta", "cyan",
+ "blue"};
+ private Color colors[] = { null, Color.white, Color.lightGray, Color.gray, Color.darkGray,
+ Color.black, Color.red, Color.pink, Color.orange,
+ Color.yellow, Color.green, Color.magenta, Color.cyan,
+ Color.blue};
+
+ private Canvas sample;
+ private int sampleHeight = 20;
+ private int sampleWidth = 40;
+ private int hPad = 5;
+ private int ourWidth;
+
+ private Color color;
+ private TextField text;
+ private Choice choser;
+
+ private PropertyChangeSupport support = new PropertyChangeSupport(this);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/DoubleEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.beans.editors;
+
+/**
+ * Property editor for a java builtin "double" type.
+ *
+ */
+
+import java.beans.*;
+
+public class DoubleEditor extends NumberEditor {
+
+ public void setAsText(String text) throws IllegalArgumentException {
+ setValue((text == null) ? null : Double.valueOf(text));
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/EnumEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.beans.editors;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyEditor;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Property editor for java.lang.Enum subclasses.
+ *
+ * @see PropertyEditor
+ *
+ * @since 1.7
+ *
+ * @author Sergey A. Malenkov
+ */
+public final class EnumEditor implements PropertyEditor {
+ private final List<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>();
+
+ private final Class type;
+ private final String[] tags;
+
+ private Object value;
+
+ public EnumEditor( Class type ) {
+ Object[] values = type.getEnumConstants();
+ if ( values == null ) {
+ throw new IllegalArgumentException( "Unsupported " + type );
+ }
+ this.type = type;
+ this.tags = new String[values.length];
+ for ( int i = 0; i < values.length; i++ ) {
+ this.tags[i] = ( ( Enum )values[i] ).name();
+ }
+ }
+
+ public Object getValue() {
+ return this.value;
+ }
+
+ public void setValue( Object value ) {
+ if ( ( value != null ) && !this.type.isInstance( value ) ) {
+ throw new IllegalArgumentException( "Unsupported value: " + value );
+ }
+ Object oldValue;
+ PropertyChangeListener[] listeners;
+ synchronized ( this.listeners ) {
+ oldValue = this.value;
+ this.value = value;
+
+ if ( ( value == null ) ? oldValue == null : value.equals( oldValue ) ) {
+ return; // do not fire event if value is not changed
+ }
+ int size = this.listeners.size();
+ if ( size == 0 ) {
+ return; // do not fire event if there are no any listener
+ }
+ listeners = this.listeners.toArray( new PropertyChangeListener[size] );
+ }
+ PropertyChangeEvent event = new PropertyChangeEvent( this, null, oldValue, value );
+ for ( PropertyChangeListener listener : listeners ) {
+ listener.propertyChange( event );
+ }
+ }
+
+ public String getAsText() {
+ return ( this.value != null )
+ ? ( ( Enum )this.value ).name()
+ : null;
+ }
+
+ public void setAsText( String text ) {
+ setValue( ( text != null )
+ ? Enum.valueOf( this.type, text )
+ : null );
+ }
+
+ public String[] getTags() {
+ return this.tags.clone();
+ }
+
+ public String getJavaInitializationString() {
+ String name = getAsText();
+ return ( name != null )
+ ? this.type.getName() + '.' + name
+ : "null";
+ }
+
+ public boolean isPaintable() {
+ return false;
+ }
+
+ public void paintValue( Graphics gfx, Rectangle box ) {
+ }
+
+ public boolean supportsCustomEditor() {
+ return false;
+ }
+
+ public Component getCustomEditor() {
+ return null;
+ }
+
+ public void addPropertyChangeListener( PropertyChangeListener listener ) {
+ synchronized ( this.listeners ) {
+ this.listeners.add( listener );
+ }
+ }
+
+ public void removePropertyChangeListener( PropertyChangeListener listener ) {
+ synchronized ( this.listeners ) {
+ this.listeners.remove( listener );
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/FloatEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.beans.editors;
+
+/**
+ * Property editor for a java builtin "float" type.
+ *
+ */
+
+import java.beans.*;
+
+public class FloatEditor extends NumberEditor {
+
+ public String getJavaInitializationString() {
+ Object value = getValue();
+ return (value != null)
+ ? value + "F"
+ : "null";
+ }
+
+ public void setAsText(String text) throws IllegalArgumentException {
+ setValue((text == null) ? null : Float.valueOf(text));
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/FontEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.beans.editors;
+
+import java.awt.*;
+import java.beans.*;
+
+public class FontEditor extends Panel implements java.beans.PropertyEditor {
+ private static final long serialVersionUID = 6732704486002715933L;
+
+ public FontEditor() {
+ setLayout(null);
+
+ toolkit = Toolkit.getDefaultToolkit();
+ fonts = toolkit.getFontList();
+
+ familyChoser = new Choice();
+ for (int i = 0; i < fonts.length; i++) {
+ familyChoser.addItem(fonts[i]);
+ }
+ add(familyChoser);
+ familyChoser.reshape(20, 5, 100, 30);
+
+ styleChoser = new Choice();
+ for (int i = 0; i < styleNames.length; i++) {
+ styleChoser.addItem(styleNames[i]);
+ }
+ add(styleChoser);
+ styleChoser.reshape(145, 5, 70, 30);
+
+ sizeChoser = new Choice();
+ for (int i = 0; i < pointSizes.length; i++) {
+ sizeChoser.addItem("" + pointSizes[i]);
+ }
+ add(sizeChoser);
+ sizeChoser.reshape(220, 5, 70, 30);
+
+ resize(300,40);
+ }
+
+
+ public Dimension preferredSize() {
+ return new Dimension(300, 40);
+ }
+
+ public void setValue(Object o) {
+ font = (Font) o;
+ if (this.font == null)
+ return;
+
+ changeFont(font);
+ // Update the current GUI choices.
+ for (int i = 0; i < fonts.length; i++) {
+ if (fonts[i].equals(font.getFamily())) {
+ familyChoser.select(i);
+ break;
+ }
+ }
+ for (int i = 0; i < styleNames.length; i++) {
+ if (font.getStyle() == styles[i]) {
+ styleChoser.select(i);
+ break;
+ }
+ }
+ for (int i = 0; i < pointSizes.length; i++) {
+ if (font.getSize() <= pointSizes[i]) {
+ sizeChoser.select(i);
+ break;
+ }
+ }
+ }
+
+ private void changeFont(Font f) {
+ font = f;
+ if (sample != null) {
+ remove(sample);
+ }
+ sample = new Label(sampleText);
+ sample.setFont(font);
+ add(sample);
+ Component p = getParent();
+ if (p != null) {
+ p.invalidate();
+ p.layout();
+ }
+ invalidate();
+ layout();
+ repaint();
+ support.firePropertyChange("", null, null);
+ }
+
+ public Object getValue() {
+ return (font);
+ }
+
+ public String getJavaInitializationString() {
+ if (this.font == null)
+ return "null";
+
+ return "new java.awt.Font(\"" + font.getName() + "\", " +
+ font.getStyle() + ", " + font.getSize() + ")";
+ }
+
+ public boolean action(Event e, Object arg) {
+ String family = familyChoser.getSelectedItem();
+ int style = styles[styleChoser.getSelectedIndex()];
+ int size = pointSizes[sizeChoser.getSelectedIndex()];
+ try {
+ Font f = new Font(family, style, size);
+ changeFont(f);
+ } catch (Exception ex) {
+ System.err.println("Couldn't create font " + family + "-" +
+ styleNames[style] + "-" + size);
+ }
+ return (false);
+ }
+
+
+ public boolean isPaintable() {
+ return true;
+ }
+
+ public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) {
+ // Silent noop.
+ Font oldFont = gfx.getFont();
+ gfx.setFont(font);
+ FontMetrics fm = gfx.getFontMetrics();
+ int vpad = (box.height - fm.getAscent())/2;
+ gfx.drawString(sampleText, 0, box.height-vpad);
+ gfx.setFont(oldFont);
+ }
+
+ public String getAsText() {
+ if (this.font == null) {
+ return null;
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append(this.font.getName());
+ sb.append(' ');
+
+ boolean b = this.font.isBold();
+ if (b) {
+ sb.append("BOLD");
+ }
+ boolean i = this.font.isItalic();
+ if (i) {
+ sb.append("ITALIC");
+ }
+ if (b || i) {
+ sb.append(' ');
+ }
+ sb.append(this.font.getSize());
+ return sb.toString();
+ }
+
+ public void setAsText(String text) throws IllegalArgumentException {
+ setValue((text == null) ? null : Font.decode(text));
+ }
+
+ public String[] getTags() {
+ return null;
+ }
+
+ public java.awt.Component getCustomEditor() {
+ return this;
+ }
+
+ public boolean supportsCustomEditor() {
+ return true;
+ }
+
+ public void addPropertyChangeListener(PropertyChangeListener l) {
+ support.addPropertyChangeListener(l);
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener l) {
+ support.removePropertyChangeListener(l);
+ }
+
+ private Font font;
+ private Toolkit toolkit;
+ private String sampleText = "Abcde...";
+
+ private Label sample;
+ private Choice familyChoser;
+ private Choice styleChoser;
+ private Choice sizeChoser;
+
+ private String fonts[];
+ private String[] styleNames = { "plain", "bold", "italic" };
+ private int[] styles = { Font.PLAIN, Font.BOLD, Font.ITALIC };
+ private int[] pointSizes = { 3, 5, 8, 10, 12, 14, 18, 24, 36, 48 };
+
+ private PropertyChangeSupport support = new PropertyChangeSupport(this);
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/IntegerEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.beans.editors;
+
+/**
+ * Property editor for a java builtin "int" type.
+ *
+ */
+
+import java.beans.*;
+
+public class IntegerEditor extends NumberEditor {
+
+
+ public void setAsText(String text) throws IllegalArgumentException {
+ setValue((text == null) ? null : Integer.decode(text));
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/LongEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.beans.editors;
+
+/**
+ * Property editor for a java builtin "long" type.
+ *
+ */
+
+import java.beans.*;
+
+public class LongEditor extends NumberEditor {
+
+ public String getJavaInitializationString() {
+ Object value = getValue();
+ return (value != null)
+ ? value + "L"
+ : "null";
+ }
+
+ public void setAsText(String text) throws IllegalArgumentException {
+ setValue((text == null) ? null : Long.decode(text));
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/NumberEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.beans.editors;
+
+/**
+ * Abstract Property editor for a java builtin number types.
+ *
+ */
+
+import java.beans.*;
+
+abstract public class NumberEditor extends PropertyEditorSupport {
+
+ public String getJavaInitializationString() {
+ Object value = getValue();
+ return (value != null)
+ ? value.toString()
+ : "null";
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/ShortEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+package com.sun.beans.editors;
+
+/**
+ * Property editor for a java builtin "short" type.
+ *
+ */
+
+import java.beans.*;
+
+public class ShortEditor extends NumberEditor {
+
+ public String getJavaInitializationString() {
+ Object value = getValue();
+ return (value != null)
+ ? "((short)" + value + ")"
+ : "null";
+ }
+
+ public void setAsText(String text) throws IllegalArgumentException {
+ setValue((text == null) ? null : Short.decode(text));
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/editors/StringEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+package com.sun.beans.editors;
+
+import java.beans.*;
+
+public class StringEditor extends PropertyEditorSupport {
+
+ public String getJavaInitializationString() {
+ Object value = getValue();
+ if (value == null)
+ return "null";
+
+ String str = value.toString();
+ int length = str.length();
+ StringBuilder sb = new StringBuilder(length + 2);
+ sb.append('"');
+ for (int i = 0; i < length; i++) {
+ char ch = str.charAt(i);
+ switch (ch) {
+ case '\b': sb.append("\\b"); break;
+ case '\t': sb.append("\\t"); break;
+ case '\n': sb.append("\\n"); break;
+ case '\f': sb.append("\\f"); break;
+ case '\r': sb.append("\\r"); break;
+ case '\"': sb.append("\\\""); break;
+ case '\\': sb.append("\\\\"); break;
+ default:
+ if ((ch < ' ') || (ch > '~')) {
+ sb.append("\\u");
+ String hex = Integer.toHexString((int) ch);
+ for (int len = hex.length(); len < 4; len++) {
+ sb.append('0');
+ }
+ sb.append(hex);
+ } else {
+ sb.append(ch);
+ }
+ break;
+ }
+ }
+ sb.append('"');
+ return sb.toString();
+ }
+
+ public void setAsText(String text) {
+ setValue(text);
+ }
+
+}
--- a/jdk/src/share/classes/com/sun/beans/finder/BeanInfoFinder.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/beans/finder/BeanInfoFinder.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -42,6 +42,7 @@
extends InstanceFinder<BeanInfo> {
private static final String DEFAULT = "sun.beans.infos";
+ private static final String DEFAULT_NEW = "com.sun.beans.infos";
public BeanInfoFinder() {
super(BeanInfo.class, true, "BeanInfo", DEFAULT);
@@ -53,10 +54,13 @@
@Override
protected BeanInfo instantiate(Class<?> type, String prefix, String name) {
+ if (DEFAULT.equals(prefix)) {
+ prefix = DEFAULT_NEW;
+ }
// this optimization will only use the BeanInfo search path
// if is has changed from the original
// or trying to get the ComponentBeanInfo
- BeanInfo info = !DEFAULT.equals(prefix) || "ComponentBeanInfo".equals(name)
+ BeanInfo info = !DEFAULT_NEW.equals(prefix) || "ComponentBeanInfo".equals(name)
? super.instantiate(type, prefix, name)
: null;
--- a/jdk/src/share/classes/com/sun/beans/finder/ClassFinder.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/beans/finder/ClassFinder.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,8 @@
*/
package com.sun.beans.finder;
+import static sun.reflect.misc.ReflectUtil.checkPackageAccess;
+
/**
* This is utility class that provides {@code static} methods
* to find a class with the specified name using the specified class loader.
@@ -54,6 +56,7 @@
* @see Thread#getContextClassLoader()
*/
public static Class<?> findClass(String name) throws ClassNotFoundException {
+ checkPackageAccess(name);
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (loader == null) {
@@ -94,6 +97,7 @@
* @see Class#forName(String,boolean,ClassLoader)
*/
public static Class<?> findClass(String name, ClassLoader loader) throws ClassNotFoundException {
+ checkPackageAccess(name);
if (loader != null) {
try {
return Class.forName(name, false, loader);
--- a/jdk/src/share/classes/com/sun/beans/finder/ConstructorFinder.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/beans/finder/ConstructorFinder.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,8 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
+import static sun.reflect.misc.ReflectUtil.isPackageAccessible;
+
/**
* This utility class provides {@code static} methods
* to find a public constructor with specified parameter types
@@ -61,7 +63,7 @@
if (Modifier.isAbstract(type.getModifiers())) {
throw new NoSuchMethodException("Abstract class cannot be instantiated");
}
- if (!Modifier.isPublic(type.getModifiers())) {
+ if (!Modifier.isPublic(type.getModifiers()) || !isPackageAccessible(type)) {
throw new NoSuchMethodException("Class is not accessible");
}
PrimitiveWrapperMap.replacePrimitivesWithWrappers(args);
--- a/jdk/src/share/classes/com/sun/beans/finder/FieldFinder.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/beans/finder/FieldFinder.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,8 @@
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
+import static sun.reflect.misc.ReflectUtil.isPackageAccessible;
+
/**
* This utility class provides {@code static} methods
* to find a public field with specified name
@@ -56,7 +58,8 @@
if (!Modifier.isPublic(field.getModifiers())) {
throw new NoSuchFieldException("Field '" + name + "' is not public");
}
- if (!Modifier.isPublic(field.getDeclaringClass().getModifiers())) {
+ type = field.getDeclaringClass();
+ if (!Modifier.isPublic(type.getModifiers()) || !isPackageAccessible(type)) {
throw new NoSuchFieldException("Field '" + name + "' is not accessible");
}
return field;
--- a/jdk/src/share/classes/com/sun/beans/finder/MethodFinder.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/beans/finder/MethodFinder.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,6 +33,8 @@
import java.lang.reflect.Type;
import java.util.Arrays;
+import static sun.reflect.misc.ReflectUtil.isPackageAccessible;
+
/**
* This utility class provides {@code static} methods
* to find a public method with specified name and parameter types
@@ -120,7 +122,7 @@
*/
public static Method findAccessibleMethod(Method method) throws NoSuchMethodException {
Class<?> type = method.getDeclaringClass();
- if (Modifier.isPublic(type.getModifiers())) {
+ if (Modifier.isPublic(type.getModifiers()) && isPackageAccessible(type)) {
return method;
}
if (Modifier.isStatic(method.getModifiers())) {
--- a/jdk/src/share/classes/com/sun/beans/finder/PropertyEditorFinder.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/beans/finder/PropertyEditorFinder.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,14 +28,14 @@
import java.beans.PropertyEditor;
-import sun.beans.editors.BooleanEditor;
-import sun.beans.editors.ByteEditor;
-import sun.beans.editors.DoubleEditor;
-import sun.beans.editors.EnumEditor;
-import sun.beans.editors.FloatEditor;
-import sun.beans.editors.IntegerEditor;
-import sun.beans.editors.LongEditor;
-import sun.beans.editors.ShortEditor;
+import com.sun.beans.editors.BooleanEditor;
+import com.sun.beans.editors.ByteEditor;
+import com.sun.beans.editors.DoubleEditor;
+import com.sun.beans.editors.EnumEditor;
+import com.sun.beans.editors.FloatEditor;
+import com.sun.beans.editors.IntegerEditor;
+import com.sun.beans.editors.LongEditor;
+import com.sun.beans.editors.ShortEditor;
/**
* This is utility class that provides functionality
@@ -48,10 +48,13 @@
public final class PropertyEditorFinder
extends InstanceFinder<PropertyEditor> {
+ private static final String DEFAULT = "sun.beans.editors";
+ private static final String DEFAULT_NEW = "com.sun.beans.editors";
+
private final WeakCache<Class<?>, Class<?>> registry;
public PropertyEditorFinder() {
- super(PropertyEditor.class, false, "Editor", "sun.beans.editors");
+ super(PropertyEditor.class, false, "Editor", DEFAULT);
this.registry = new WeakCache<Class<?>, Class<?>>();
this.registry.put(Byte.TYPE, ByteEditor.class);
@@ -84,4 +87,9 @@
}
return editor;
}
+
+ @Override
+ protected PropertyEditor instantiate(Class<?> type, String prefix, String name) {
+ return super.instantiate(type, DEFAULT.equals(prefix) ? DEFAULT_NEW : prefix, name);
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/beans/infos/ComponentBeanInfo.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.beans.infos;
+
+import java.beans.*;
+
+/**
+ * BeanInfo descriptor for a standard AWT component.
+ */
+
+public class ComponentBeanInfo extends SimpleBeanInfo {
+ private static final Class<java.awt.Component> beanClass = java.awt.Component.class;
+
+ public PropertyDescriptor[] getPropertyDescriptors() {
+ try {
+ PropertyDescriptor
+ name = new PropertyDescriptor("name", beanClass),
+ background = new PropertyDescriptor("background", beanClass),
+ foreground = new PropertyDescriptor("foreground", beanClass),
+ font = new PropertyDescriptor("font", beanClass),
+ enabled = new PropertyDescriptor("enabled", beanClass),
+ visible = new PropertyDescriptor("visible", beanClass),
+ focusable = new PropertyDescriptor("focusable", beanClass);
+
+ enabled.setExpert(true);
+ visible.setHidden(true);
+
+ background.setBound(true);
+ foreground.setBound(true);
+ font.setBound(true);
+ focusable.setBound(true);
+
+ PropertyDescriptor[] rv = {name, background, foreground, font, enabled, visible, focusable };
+ return rv;
+ } catch (IntrospectionException e) {
+ throw new Error(e.toString());
+ }
+ }
+}
--- a/jdk/src/share/classes/com/sun/crypto/provider/AESCipher.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/crypto/provider/AESCipher.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -47,18 +47,122 @@
* @see OutputFeedback
*/
-public final class AESCipher extends CipherSpi {
+abstract class AESCipher extends CipherSpi {
+ public static final class General extends AESCipher {
+ public General() {
+ super(-1);
+ }
+ }
+ abstract static class OidImpl extends AESCipher {
+ protected OidImpl(int keySize, String mode, String padding) {
+ super(keySize);
+ try {
+ engineSetMode(mode);
+ engineSetPadding(padding);
+ } catch (GeneralSecurityException gse) {
+ // internal error; re-throw as provider exception
+ ProviderException pe =new ProviderException("Internal Error");
+ pe.initCause(gse);
+ throw pe;
+ }
+ }
+ }
+ public static final class AES128_ECB_NoPadding extends OidImpl {
+ public AES128_ECB_NoPadding() {
+ super(16, "ECB", "NOPADDING");
+ }
+ }
+ public static final class AES192_ECB_NoPadding extends OidImpl {
+ public AES192_ECB_NoPadding() {
+ super(24, "ECB", "NOPADDING");
+ }
+ }
+ public static final class AES256_ECB_NoPadding extends OidImpl {
+ public AES256_ECB_NoPadding() {
+ super(32, "ECB", "NOPADDING");
+ }
+ }
+ public static final class AES128_CBC_NoPadding extends OidImpl {
+ public AES128_CBC_NoPadding() {
+ super(16, "CBC", "NOPADDING");
+ }
+ }
+ public static final class AES192_CBC_NoPadding extends OidImpl {
+ public AES192_CBC_NoPadding() {
+ super(24, "CBC", "NOPADDING");
+ }
+ }
+ public static final class AES256_CBC_NoPadding extends OidImpl {
+ public AES256_CBC_NoPadding() {
+ super(32, "CBC", "NOPADDING");
+ }
+ }
+ public static final class AES128_OFB_NoPadding extends OidImpl {
+ public AES128_OFB_NoPadding() {
+ super(16, "OFB", "NOPADDING");
+ }
+ }
+ public static final class AES192_OFB_NoPadding extends OidImpl {
+ public AES192_OFB_NoPadding() {
+ super(24, "OFB", "NOPADDING");
+ }
+ }
+ public static final class AES256_OFB_NoPadding extends OidImpl {
+ public AES256_OFB_NoPadding() {
+ super(32, "OFB", "NOPADDING");
+ }
+ }
+ public static final class AES128_CFB_NoPadding extends OidImpl {
+ public AES128_CFB_NoPadding() {
+ super(16, "CFB", "NOPADDING");
+ }
+ }
+ public static final class AES192_CFB_NoPadding extends OidImpl {
+ public AES192_CFB_NoPadding() {
+ super(24, "CFB", "NOPADDING");
+ }
+ }
+ public static final class AES256_CFB_NoPadding extends OidImpl {
+ public AES256_CFB_NoPadding() {
+ super(32, "CFB", "NOPADDING");
+ }
+ }
+
+ // utility method used by AESCipher and AESWrapCipher
+ static final void checkKeySize(Key key, int fixedKeySize)
+ throws InvalidKeyException {
+ if (fixedKeySize != -1) {
+ if (key == null) {
+ throw new InvalidKeyException("The key must not be null");
+ }
+ byte[] value = key.getEncoded();
+ if (value == null) {
+ throw new InvalidKeyException("Key encoding must not be null");
+ } else if (value.length != fixedKeySize) {
+ throw new InvalidKeyException("The key must be " +
+ fixedKeySize*8 + " bits");
+ }
+ }
+ }
+
/*
* internal CipherCore object which does the real work.
*/
private CipherCore core = null;
+ /*
+ * needed to support AES oids which associates a fixed key size
+ * to the cipher object.
+ */
+ private final int fixedKeySize; // in bytes, -1 if no restriction
+
/**
* Creates an instance of AES cipher with default ECB mode and
* PKCS5Padding.
*/
- public AESCipher() {
+ protected AESCipher(int keySize) {
core = new CipherCore(new AESCrypt(), AESConstants.AES_BLOCK_SIZE);
+ fixedKeySize = keySize;
}
/**
@@ -183,6 +287,7 @@
*/
protected void engineInit(int opmode, Key key, SecureRandom random)
throws InvalidKeyException {
+ checkKeySize(key, fixedKeySize);
core.init(opmode, key, random);
}
@@ -214,6 +319,7 @@
AlgorithmParameterSpec params,
SecureRandom random)
throws InvalidKeyException, InvalidAlgorithmParameterException {
+ checkKeySize(key, fixedKeySize);
core.init(opmode, key, params, random);
}
@@ -221,6 +327,7 @@
AlgorithmParameters params,
SecureRandom random)
throws InvalidKeyException, InvalidAlgorithmParameterException {
+ checkKeySize(key, fixedKeySize);
core.init(opmode, key, params, random);
}
--- a/jdk/src/share/classes/com/sun/crypto/provider/AESWrapCipher.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/crypto/provider/AESWrapCipher.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -43,8 +43,27 @@
*
* @see AESCipher
*/
-public final class AESWrapCipher extends CipherSpi {
-
+abstract class AESWrapCipher extends CipherSpi {
+ public static final class General extends AESWrapCipher {
+ public General() {
+ super(-1);
+ }
+ }
+ public static final class AES128 extends AESWrapCipher {
+ public AES128() {
+ super(16);
+ }
+ }
+ public static final class AES192 extends AESWrapCipher {
+ public AES192() {
+ super(24);
+ }
+ }
+ public static final class AES256 extends AESWrapCipher {
+ public AES256() {
+ super(32);
+ }
+ }
private static final byte[] IV = {
(byte) 0xA6, (byte) 0xA6, (byte) 0xA6, (byte) 0xA6,
(byte) 0xA6, (byte) 0xA6, (byte) 0xA6, (byte) 0xA6
@@ -62,12 +81,20 @@
*/
private boolean decrypting = false;
+ /*
+ * needed to support AES oids which associates a fixed key size
+ * to the cipher object.
+ */
+ private final int fixedKeySize; // in bytes, -1 if no restriction
+
/**
* Creates an instance of AES KeyWrap cipher with default
* mode, i.e. "ECB" and padding scheme, i.e. "NoPadding".
*/
- public AESWrapCipher() {
+ public AESWrapCipher(int keySize) {
cipher = new AESCrypt();
+ fixedKeySize = keySize;
+
}
/**
@@ -170,6 +197,7 @@
throw new UnsupportedOperationException("This cipher can " +
"only be used for key wrapping and unwrapping");
}
+ AESCipher.checkKeySize(key, fixedKeySize);
cipher.init(decrypting, key.getAlgorithm(), key.getEncoded());
}
--- a/jdk/src/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -80,10 +80,10 @@
* @param random the source of randomness
*/
public void initialize(int keysize, SecureRandom random) {
- if ((keysize < 512) || (keysize > 1024) || (keysize % 64 != 0)) {
+ if ((keysize < 512) || (keysize > 2048) || (keysize % 64 != 0)) {
throw new InvalidParameterException("Keysize must be multiple "
+ "of 64, and can only range "
- + "from 512 to 1024 "
+ + "from 512 to 2048 "
+ "(inclusive)");
}
this.pSize = keysize;
@@ -115,11 +115,11 @@
params = (DHParameterSpec)algParams;
pSize = params.getP().bitLength();
- if ((pSize < 512) || (pSize > 1024) ||
+ if ((pSize < 512) || (pSize > 2048) ||
(pSize % 64 != 0)) {
throw new InvalidAlgorithmParameterException
("Prime size must be multiple of 64, and can only range "
- + "from 512 to 1024 (inclusive)");
+ + "from 512 to 2048 (inclusive)");
}
// exponent size is optional, could be 0
@@ -156,10 +156,11 @@
BigInteger g = params.getG();
if (lSize <= 0) {
+ lSize = pSize >> 1;
// use an exponent size of (pSize / 2) but at least 384 bits
- lSize = Math.max(384, pSize >> 1);
- // if lSize is larger than pSize, limit by pSize
- lSize = Math.min(lSize, pSize);
+ if (lSize < 384) {
+ lSize = 384;
+ }
}
BigInteger x;
--- a/jdk/src/share/classes/com/sun/crypto/provider/DHParameterGenerator.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/crypto/provider/DHParameterGenerator.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -67,10 +67,10 @@
* @param random the source of randomness
*/
protected void engineInit(int keysize, SecureRandom random) {
- if ((keysize < 512) || (keysize > 1024) || (keysize % 64 != 0)) {
+ if ((keysize < 512) || (keysize > 2048) || (keysize % 64 != 0)) {
throw new InvalidParameterException("Keysize must be multiple "
+ "of 64, and can only range "
- + "from 512 to 1024 "
+ + "from 512 to 2048 "
+ "(inclusive)");
}
this.primeSize = keysize;
@@ -99,10 +99,10 @@
DHGenParameterSpec dhParamSpec = (DHGenParameterSpec)genParamSpec;
primeSize = dhParamSpec.getPrimeSize();
- if ((primeSize<512) || (primeSize>1024) || (primeSize%64 != 0)) {
+ if ((primeSize<512) || (primeSize>2048) || (primeSize%64 != 0)) {
throw new InvalidAlgorithmParameterException
("Modulus size must be multiple of 64, and can only range "
- + "from 512 to 1024 (inclusive)");
+ + "from 512 to 2048 (inclusive)");
}
exponentSize = dhParamSpec.getExponentSize();
--- a/jdk/src/share/classes/com/sun/crypto/provider/SunJCE.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/crypto/provider/SunJCE.java Mon Sep 10 09:00:00 2012 -0400
@@ -167,17 +167,67 @@
put("Cipher.Blowfish SupportedPaddings", BLOCK_PADS);
put("Cipher.Blowfish SupportedKeyFormats", "RAW");
- put("Cipher.AES", "com.sun.crypto.provider.AESCipher");
+ put("Cipher.AES", "com.sun.crypto.provider.AESCipher$General");
put("Alg.Alias.Cipher.Rijndael", "AES");
put("Cipher.AES SupportedModes", BLOCK_MODES128);
put("Cipher.AES SupportedPaddings", BLOCK_PADS);
put("Cipher.AES SupportedKeyFormats", "RAW");
- put("Cipher.AESWrap", "com.sun.crypto.provider.AESWrapCipher");
+ put("Cipher.AES_128/ECB/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_ECB_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.1", "AES_128/ECB/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.1", "AES_128/ECB/NoPadding");
+ put("Cipher.AES_128/CBC/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_CBC_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.2", "AES_128/CBC/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.2", "AES_128/CBC/NoPadding");
+ put("Cipher.AES_128/OFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_OFB_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.3", "AES_128/OFB/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.3", "AES_128/OFB/NoPadding");
+ put("Cipher.AES_128/CFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_CFB_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.4", "AES_128/CFB/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.4", "AES_128/CFB/NoPadding");
+
+ put("Cipher.AES_192/ECB/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_ECB_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.21", "AES_192/ECB/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.21", "AES_192/ECB/NoPadding");
+ put("Cipher.AES_192/CBC/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_CBC_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.22", "AES_192/CBC/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.22", "AES_192/CBC/NoPadding");
+ put("Cipher.AES_192/OFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_OFB_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.23", "AES_192/OFB/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.23", "AES_192/OFB/NoPadding");
+ put("Cipher.AES_192/CFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_CFB_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.24", "AES_192/CFB/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.24", "AES_192/CFB/NoPadding");
+
+
+ put("Cipher.AES_256/ECB/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_ECB_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.41", "AES_256/ECB/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.41", "AES_256/ECB/NoPadding");
+ put("Cipher.AES_256/CBC/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_CBC_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.42", "AES_256/CBC/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.42", "AES_256/CBC/NoPadding");
+ put("Cipher.AES_256/OFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_OFB_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.43", "AES_256/OFB/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.43", "AES_256/OFB/NoPadding");
+ put("Cipher.AES_256/CFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_CFB_NoPadding");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.44", "AES_256/CFB/NoPadding");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.44", "AES_256/CFB/NoPadding");
+
+ put("Cipher.AESWrap", "com.sun.crypto.provider.AESWrapCipher$General");
put("Cipher.AESWrap SupportedModes", "ECB");
put("Cipher.AESWrap SupportedPaddings", "NOPADDING");
put("Cipher.AESWrap SupportedKeyFormats", "RAW");
+ put("Cipher.AESWrap_128", "com.sun.crypto.provider.AESWrapCipher$AES128");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.5", "AESWrap_128");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.5", "AESWrap_128");
+ put("Cipher.AESWrap_192", "com.sun.crypto.provider.AESWrapCipher$AES192");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.25", "AESWrap_192");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.25", "AESWrap_192");
+ put("Cipher.AESWrap_256", "com.sun.crypto.provider.AESWrapCipher$AES256");
+ put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.45", "AESWrap_256");
+ put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.45", "AESWrap_256");
+
put("Cipher.RC2",
"com.sun.crypto.provider.RC2Cipher");
put("Cipher.RC2 SupportedModes", BLOCK_MODES);
@@ -192,7 +242,7 @@
put("Cipher.ARCFOUR SupportedKeyFormats", "RAW");
/*
- * Key(pair) Generator engines
+ * Key(pair) Generator engines
*/
put("KeyGenerator.DES",
"com.sun.crypto.provider.DESKeyGenerator");
@@ -221,6 +271,8 @@
put("KeyGenerator.HmacSHA1",
"com.sun.crypto.provider.HmacSHA1KeyGenerator");
+ put("Alg.Alias.KeyGenerator.OID.1.2.840.113549.2.7", "HmacSHA1");
+ put("Alg.Alias.KeyGenerator.1.2.840.113549.2.7", "HmacSHA1");
put("KeyGenerator.HmacSHA224",
"com.sun.crypto.provider.KeyGeneratorCore$HmacSHA2KG$SHA224");
@@ -326,14 +378,12 @@
"com.sun.crypto.provider.AESParameters");
put("Alg.Alias.AlgorithmParameters.Rijndael", "AES");
-
put("AlgorithmParameters.RC2",
"com.sun.crypto.provider.RC2Parameters");
put("AlgorithmParameters.OAEP",
"com.sun.crypto.provider.OAEPParameters");
-
/*
* Key factories
*/
@@ -403,6 +453,8 @@
*/
put("Mac.HmacMD5", "com.sun.crypto.provider.HmacMD5");
put("Mac.HmacSHA1", "com.sun.crypto.provider.HmacSHA1");
+ put("Alg.Alias.Mac.OID.1.2.840.113549.2.7", "HmacSHA1");
+ put("Alg.Alias.Mac.1.2.840.113549.2.7", "HmacSHA1");
put("Mac.HmacSHA224",
"com.sun.crypto.provider.HmacCore$HmacSHA224");
put("Alg.Alias.Mac.OID.1.2.840.113549.2.8", "HmacSHA224");
--- a/jdk/src/share/classes/com/sun/rowset/JdbcRowSetImpl.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/com/sun/rowset/JdbcRowSetImpl.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,6 @@
import java.io.*;
import java.math.*;
import java.util.*;
-import java.beans.*;
import javax.sql.rowset.*;
@@ -83,12 +82,6 @@
*/
private ResultSetMetaData resMD;
- /**
- * The property that helps to fire the property changed event when certain
- * properties are changed in the <code>JdbcRowSet</code> object. This property
- * is being added to satisfy Rave requirements.
- */
- private PropertyChangeSupport propertyChangeSupport;
/**
* The Vector holding the Match Columns
@@ -145,7 +138,6 @@
throw new RuntimeException(ioe);
}
- propertyChangeSupport = new PropertyChangeSupport(this);
initParams();
@@ -268,7 +260,6 @@
throw new RuntimeException(ioe);
}
- propertyChangeSupport = new PropertyChangeSupport(this);
initParams();
// set the defaults
@@ -343,7 +334,6 @@
throw new RuntimeException(ioe);
}
- propertyChangeSupport = new PropertyChangeSupport(this);
initParams();
@@ -360,10 +350,6 @@
setMaxRows(0);
setMaxFieldSize(0);
- // to ensure connection to a db call connect now
- // and associate a conn with "this" object
- // in this case.
- conn = connect();
setParams();
setReadOnly(true);
@@ -435,7 +421,6 @@
throw new RuntimeException(ioe);
}
- propertyChangeSupport = new PropertyChangeSupport(this);
initParams();
@@ -620,12 +605,7 @@
}
- // An alternate solution is required instead of having the
- // connect method as protected.
- // This is a work around to assist Rave Team
- // :ah
-
- protected Connection connect() throws SQLException {
+ private Connection connect() throws SQLException {
// Get a JDBC connection.
@@ -4056,9 +4036,7 @@
// Added as per Rave requirements
if( conn.getHoldability() != HOLD_CURSORS_OVER_COMMIT) {
- ResultSet oldVal = rs;
rs = null;
- // propertyChangeSupport.firePropertyChange("ResultSet",oldVal,rs);
}
}
@@ -4119,9 +4097,7 @@
// Makes the result ste handle null after rollback
// Added as per Rave requirements
- ResultSet oldVal = rs;
rs = null;
- // propertyChangeSupport.firePropertyChange("ResultSet", oldVal,rs);
}
@@ -4247,12 +4223,6 @@
rs = resultSet;
}
-
- // Over riding the setCommand from BaseRowSet for
- // firing the propertyChangeSupport Event for
- // Rave requirements when this property's value
- // changes.
-
/**
* Sets this <code>JdbcRowSet</code> object's <code>command</code> property to
* the given <code>String</code> object and clears the parameters, if any,
@@ -4277,28 +4247,19 @@
* @see #getCommand
*/
public void setCommand(String command) throws SQLException {
- String oldVal;
if (getCommand() != null) {
if(!getCommand().equals(command)) {
- oldVal = getCommand();
super.setCommand(command);
ps = null;
rs = null;
- propertyChangeSupport.firePropertyChange("command", oldVal,command);
}
}
else {
super.setCommand(command);
- propertyChangeSupport.firePropertyChange("command", null,command);
}
}
- // Over riding the setDataSourceName from BaseRowSet for
- // firing the propertyChangeSupport Event for
- // Rave requirements when this property's values
- // changes.
-
/**
* Sets the <code>dataSourceName</code> property for this <code>JdbcRowSet</code>
* object to the given logical name and sets this <code>JdbcRowSet</code> object's
@@ -4329,28 +4290,20 @@
* @see #getDataSourceName
*/
public void setDataSourceName(String dsName) throws SQLException{
- String oldVal;
if(getDataSourceName() != null) {
if(!getDataSourceName().equals(dsName)) {
- oldVal = getDataSourceName();
super.setDataSourceName(dsName);
conn = null;
ps = null;
rs = null;
- propertyChangeSupport.firePropertyChange("dataSourceName",oldVal,dsName);
}
}
else {
super.setDataSourceName(dsName);
- propertyChangeSupport.firePropertyChange("dataSourceName",null,dsName);
}
}
- // Over riding the setUrl from BaseRowSet for
- // firing the propertyChangeSupport Event for
- // Rave requirements when this property's values
- // changes.
/**
* Sets the Url property for this <code>JdbcRowSet</code> object
@@ -4394,29 +4347,20 @@
*/
public void setUrl(String url) throws SQLException {
- String oldVal;
if(getUrl() != null) {
if(!getUrl().equals(url)) {
- oldVal = getUrl();
super.setUrl(url);
conn = null;
ps = null;
rs = null;
- propertyChangeSupport.firePropertyChange("url", oldVal, url);
}
}
else {
super.setUrl(url);
- propertyChangeSupport.firePropertyChange("url", null, url);
}
}
- // Over riding the setUsername from BaseRowSet for
- // firing the propertyChangeSupport Event for
- // Rave requirements when this property's values
- // changes.
-
/**
* Sets the username property for this <code>JdbcRowSet</code> object
* to the given user name. Because it
@@ -4438,29 +4382,20 @@
* @see #getUsername
*/
public void setUsername(String uname) {
- String oldVal;
if( getUsername() != null) {
if(!getUsername().equals(uname)) {
- oldVal = getUsername();
super.setUsername(uname);
conn = null;
ps = null;
rs = null;
- propertyChangeSupport.firePropertyChange("username",oldVal,uname);
}
}
else{
super.setUsername(uname);
- propertyChangeSupport.firePropertyChange("username",null,uname);
}
}
- // Over riding the setPassword from BaseRowSet for
- // firing the propertyChangeSupport Event for
- // Rave requirements when this property's values
- // changes.
-
/**
* Sets the password property for this <code>JdbcRowSet</code> object
* to the given <code>String</code> object. Because it
@@ -4481,21 +4416,17 @@
* that must be supplied to the database to create a connection
*/
public void setPassword(String password) {
- String oldVal;
if ( getPassword() != null) {
if(!getPassword().equals(password)) {
- oldVal = getPassword();
super.setPassword(password);
conn = null;
ps = null;
rs = null;
- propertyChangeSupport.firePropertyChange("password",oldVal,password);
}
}
else{
super.setPassword(password);
- propertyChangeSupport.firePropertyChange("password",null,password);
}
}
@@ -4528,7 +4459,6 @@
if(oldVal != type) {
super.setType(type);
- propertyChangeSupport.firePropertyChange("type",oldVal,type);
}
}
@@ -4561,78 +4491,6 @@
if(oldVal != concur) {
super.setConcurrency(concur);
- propertyChangeSupport.firePropertyChange("concurrency",oldVal,concur);
- }
-
- }
-
- /**
- * Sets the transaction isolation property for this JDBC <code>RowSet</code> object to the given
- * constant. The DBMS will use this transaction isolation level for
- * transactions if it can.
- * <p>
- * For <code>RowSet</code> implementations such as
- * the <code>CachedRowSet</code> that operate in a disconnected environment,
- * the <code>SyncProvider</code> object being used
- * offers complementary locking and data integrity options. The
- * options described below are pertinent only to connected <code>RowSet</code>
- * objects (<code>JdbcRowSet</code> objects).
- *
- * @param transIso one of the following constants, listed in ascending order:
- * <code>Connection.TRANSACTION_NONE</code>,
- * <code>Connection.TRANSACTION_READ_UNCOMMITTED</code>,
- * <code>Connection.TRANSACTION_READ_COMMITTED</code>,
- * <code>Connection.TRANSACTION_REPEATABLE_READ</code>, or
- * <code>Connection.TRANSACTION_SERIALIZABLE</code>
- * @throws SQLException if the given parameter is not one of the Connection
- * constants
- * @see javax.sql.rowset.spi.SyncFactory
- * @see javax.sql.rowset.spi.SyncProvider
- * @see #getTransactionIsolation
- */
- public void setTransactionIsolation(int transIso) throws SQLException {
-
- int oldVal;
-
- try {
- oldVal = getTransactionIsolation();
- }catch(NullPointerException ex) {
- oldVal = 0;
- }
-
- if(oldVal != transIso) {
- super.setTransactionIsolation(transIso);
- propertyChangeSupport.firePropertyChange("transactionIsolation",oldVal,transIso);
- }
-
- }
-
- /**
- * Sets the maximum number of rows that this <code>RowSet</code> object may contain to
- * the given number. If this limit is exceeded, the excess rows are
- * silently dropped.
- *
- * @param mRows an <code>int</code> indicating the current maximum number
- * of rows; zero means that there is no limit
- * @throws SQLException if an error occurs internally setting the
- * maximum limit on the number of rows that a JDBC <code>RowSet</code> object
- * can contain; or if <i>max</i> is less than <code>0</code>; or
- * if <i>max</i> is less than the <code>fetchSize</code> of the
- * <code>RowSet</code>
- */
- public void setMaxRows(int mRows) throws SQLException {
-
- int oldVal;
-
- try {
- oldVal = getMaxRows();
- }catch(NullPointerException ex) {
- oldVal = 0;
- }
-
- if(oldVal != mRows) {
- super.setMaxRows(mRows);
- propertyChangeSupport.firePropertyChange("maxRows",oldVal,mRows);
}
}
--- a/jdk/src/share/classes/java/awt/AWTEvent.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/AWTEvent.java Mon Sep 10 09:00:00 2012 -0400
@@ -35,8 +35,6 @@
import java.security.AccessControlContext;
import java.security.AccessController;
-import java.io.ObjectInputStream;
-import java.io.IOException;
/**
* The root event class for all AWT events.
@@ -262,9 +260,11 @@
public void setPosted(AWTEvent ev) {
ev.isPosted = true;
}
+
public void setSystemGenerated(AWTEvent ev) {
ev.isSystemGenerated = true;
}
+
public boolean isSystemGenerated(AWTEvent ev) {
return ev.isSystemGenerated;
}
@@ -272,6 +272,15 @@
public AccessControlContext getAccessControlContext(AWTEvent ev) {
return ev.getAccessControlContext();
}
+
+ public byte[] getBData(AWTEvent ev) {
+ return ev.bdata;
+ }
+
+ public void setBData(AWTEvent ev, byte[] bdata) {
+ ev.bdata = bdata;
+ }
+
});
}
--- a/jdk/src/share/classes/java/awt/CheckboxMenuItem.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/CheckboxMenuItem.java Mon Sep 10 09:00:00 2012 -0400
@@ -31,6 +31,7 @@
import java.io.ObjectInputStream;
import java.io.IOException;
import javax.accessibility.*;
+import sun.awt.AWTAccessor;
/**
@@ -68,6 +69,13 @@
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
+
+ AWTAccessor.setCheckboxMenuItemAccessor(
+ new AWTAccessor.CheckboxMenuItemAccessor() {
+ public boolean getState(CheckboxMenuItem cmi) {
+ return cmi.state;
+ }
+ });
}
/**
--- a/jdk/src/share/classes/java/awt/Component.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/Component.java Mon Sep 10 09:00:00 2012 -0400
@@ -150,7 +150,7 @@
* import java.awt.event.*;
* import java.io.Serializable;
*
- * class MyApp java.io.Serializable
+ * class MyApp implements java.io.Serializable
* {
* BigObjectThatShouldNotBeSerializedWithAButton bigOne;
* Button aButton = new Button();
--- a/jdk/src/share/classes/java/awt/Cursor.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/Cursor.java Mon Sep 10 09:00:00 2012 -0400
@@ -24,10 +24,6 @@
*/
package java.awt;
-import java.awt.AWTException;
-import java.awt.Point;
-import java.awt.Toolkit;
-
import java.io.File;
import java.io.FileInputStream;
@@ -39,6 +35,7 @@
import java.security.AccessController;
import sun.util.logging.PlatformLogger;
+import sun.awt.AWTAccessor;
/**
* A class to encapsulate the bitmap representation of the mouse cursor.
@@ -199,6 +196,21 @@
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
+
+ AWTAccessor.setCursorAccessor(
+ new AWTAccessor.CursorAccessor() {
+ public long getPData(Cursor cursor) {
+ return cursor.pData;
+ }
+
+ public void setPData(Cursor cursor, long pData) {
+ cursor.pData = pData;
+ }
+
+ public int getType(Cursor cursor) {
+ return cursor.type;
+ }
+ });
}
/**
--- a/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Mon Sep 10 09:00:00 2012 -0400
@@ -39,6 +39,7 @@
import sun.awt.AppContext;
import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
import sun.awt.CausedFocusEvent;
/**
@@ -75,6 +76,15 @@
typeAheadMarkers = new LinkedList();
private boolean consumeNextKeyTyped;
+ static {
+ AWTAccessor.setDefaultKeyboardFocusManagerAccessor(
+ new AWTAccessor.DefaultKeyboardFocusManagerAccessor() {
+ public void consumeNextKeyTyped(DefaultKeyboardFocusManager dkfm, KeyEvent e) {
+ dkfm.consumeNextKeyTyped(e);
+ }
+ });
+ }
+
private static class TypeAheadMarker {
long after;
Component untilFocused;
--- a/jdk/src/share/classes/java/awt/EventQueue.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/EventQueue.java Mon Sep 10 09:00:00 2012 -0400
@@ -36,6 +36,8 @@
import java.security.PrivilegedAction;
import java.util.EmptyStackException;
+
+import sun.awt.dnd.SunDropTargetEvent;
import sun.util.logging.PlatformLogger;
import sun.awt.AppContext;
@@ -50,7 +52,6 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.security.AccessControlContext;
-import java.security.ProtectionDomain;
import sun.misc.SharedSecrets;
import sun.misc.JavaSecurityAccess;
@@ -186,6 +187,17 @@
public boolean isDispatchThreadImpl(EventQueue eventQueue) {
return eventQueue.isDispatchThreadImpl();
}
+ public void removeSourceEvents(EventQueue eventQueue,
+ Object source,
+ boolean removeAllEvents) {
+ eventQueue.removeSourceEvents(source, removeAllEvents);
+ }
+ public boolean noEvents(EventQueue eventQueue) {
+ return eventQueue.noEvents();
+ }
+ public void wakeup(EventQueue eventQueue, boolean isShutdown) {
+ eventQueue.wakeup(isShutdown);
+ }
});
}
@@ -464,7 +476,9 @@
case MouseEvent.MOUSE_MOVED:
return MOVE;
case MouseEvent.MOUSE_DRAGGED:
- return DRAG;
+ // Return -1 for SunDropTargetEvent since they are usually synchronous
+ // and we don't want to skip them by coalescing with MouseEvent or other drag events
+ return e instanceof SunDropTargetEvent ? -1 : DRAG;
default:
return e instanceof PeerEvent ? PEER : -1;
}
--- a/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Mon Sep 10 09:00:00 2012 -0400
@@ -56,7 +56,6 @@
import sun.util.logging.PlatformLogger;
import sun.awt.AppContext;
-import sun.awt.HeadlessToolkit;
import sun.awt.SunToolkit;
import sun.awt.CausedFocusEvent;
import sun.awt.KeyboardFocusManagerPeerProvider;
@@ -148,6 +147,9 @@
public KeyboardFocusManager getCurrentKeyboardFocusManager(AppContext ctx) {
return KeyboardFocusManager.getCurrentKeyboardFocusManager(ctx);
}
+ public Container getCurrentFocusCycleRoot() {
+ return KeyboardFocusManager.currentFocusCycleRoot;
+ }
}
);
}
--- a/jdk/src/share/classes/java/awt/Menu.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/Menu.java Mon Sep 10 09:00:00 2012 -0400
@@ -31,6 +31,7 @@
import java.awt.peer.MenuPeer;
import java.awt.event.KeyEvent;
import javax.accessibility.*;
+import sun.awt.AWTAccessor;
/**
* A <code>Menu</code> object is a pull-down menu component
@@ -62,6 +63,13 @@
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
+
+ AWTAccessor.setMenuAccessor(
+ new AWTAccessor.MenuAccessor() {
+ public Vector getItems(Menu menu) {
+ return menu.items;
+ }
+ });
}
/**
--- a/jdk/src/share/classes/java/awt/MenuBar.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/MenuBar.java Mon Sep 10 09:00:00 2012 -0400
@@ -28,6 +28,7 @@
import java.io.ObjectInputStream;
import java.util.Vector;
import java.util.Enumeration;
+import sun.awt.AWTAccessor;
import java.awt.peer.MenuBarPeer;
import java.awt.event.KeyEvent;
import javax.accessibility.*;
@@ -74,6 +75,16 @@
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
+ AWTAccessor.setMenuBarAccessor(
+ new AWTAccessor.MenuBarAccessor() {
+ public Menu getHelpMenu(MenuBar menuBar) {
+ return menuBar.helpMenu;
+ }
+
+ public Vector getMenus(MenuBar menuBar) {
+ return menuBar.menus;
+ }
+ });
}
/**
--- a/jdk/src/share/classes/java/awt/MenuComponent.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/MenuComponent.java Mon Sep 10 09:00:00 2012 -0400
@@ -29,7 +29,6 @@
import java.io.IOException;
import java.io.ObjectInputStream;
import sun.awt.AppContext;
-import sun.awt.SunToolkit;
import sun.awt.AWTAccessor;
import javax.accessibility.*;
@@ -143,6 +142,9 @@
public MenuContainer getParent(MenuComponent menuComp) {
return menuComp.parent;
}
+ public Font getFont_NoClientCode(MenuComponent menuComp) {
+ return menuComp.getFont_NoClientCode();
+ }
});
}
--- a/jdk/src/share/classes/java/awt/MenuItem.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/MenuItem.java Mon Sep 10 09:00:00 2012 -0400
@@ -31,7 +31,7 @@
import java.io.ObjectInputStream;
import java.io.IOException;
import javax.accessibility.*;
-
+import sun.awt.AWTAccessor;
/**
* All items in a menu must belong to the class
@@ -76,6 +76,29 @@
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
+
+ AWTAccessor.setMenuItemAccessor(
+ new AWTAccessor.MenuItemAccessor() {
+ public boolean isEnabled(MenuItem item) {
+ return item.enabled;
+ }
+
+ public String getLabel(MenuItem item) {
+ return item.label;
+ }
+
+ public MenuShortcut getShortcut(MenuItem item) {
+ return item.shortcut;
+ }
+
+ public String getActionCommandImpl(MenuItem item) {
+ return item.getActionCommandImpl();
+ }
+
+ public boolean isItemEnabled(MenuItem item) {
+ return item.isItemEnabled();
+ }
+ });
}
/**
--- a/jdk/src/share/classes/java/awt/SystemTray.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/SystemTray.java Mon Sep 10 09:00:00 2012 -0400
@@ -33,6 +33,7 @@
import sun.awt.SunToolkit;
import sun.awt.HeadlessToolkit;
import sun.security.util.SecurityConstants;
+import sun.awt.AWTAccessor;
/**
* The <code>SystemTray</code> class represents the system tray for a
@@ -127,6 +128,18 @@
private static final TrayIcon[] EMPTY_TRAY_ARRAY = new TrayIcon[0];
+ static {
+ AWTAccessor.setSystemTrayAccessor(
+ new AWTAccessor.SystemTrayAccessor() {
+ public void firePropertyChange(SystemTray tray,
+ String propertyName,
+ Object oldValue,
+ Object newValue) {
+ tray.firePropertyChange(propertyName, oldValue, newValue);
+ }
+ });
+ }
+
/**
* Private <code>SystemTray</code> constructor.
*
--- a/jdk/src/share/classes/java/awt/TrayIcon.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/TrayIcon.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,19 +25,11 @@
package java.awt;
-import java.awt.Point;
-import java.awt.Toolkit;
-import java.awt.GraphicsEnvironment;
import java.awt.event.*;
-import java.awt.AWTEvent;
-import java.awt.AWTEventMulticaster;
-import java.awt.EventQueue;
-import java.awt.PopupMenu;
-import java.awt.Image;
-import java.util.EventListener;
import java.awt.peer.TrayIconPeer;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
import sun.awt.HeadlessToolkit;
import java.util.EventObject;
import java.security.AccessControlContext;
@@ -129,6 +121,16 @@
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
+
+ AWTAccessor.setTrayIconAccessor(
+ new AWTAccessor.TrayIconAccessor() {
+ public void addNotify(TrayIcon trayIcon) throws AWTException {
+ trayIcon.addNotify();
+ }
+ public void removeNotify(TrayIcon trayIcon) {
+ trayIcon.removeNotify();
+ }
+ });
}
private TrayIcon()
--- a/jdk/src/share/classes/java/awt/event/KeyEvent.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/awt/event/KeyEvent.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,12 +25,12 @@
package java.awt.event;
-import java.awt.Event;
import java.awt.Component;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.io.IOException;
import java.io.ObjectInputStream;
+import sun.awt.AWTAccessor;
/**
* An event which indicates that a keystroke occurred in a component.
@@ -914,6 +914,23 @@
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
+
+ AWTAccessor.setKeyEventAccessor(
+ new AWTAccessor.KeyEventAccessor() {
+ public void setRawCode(KeyEvent ev, long rawCode) {
+ ev.rawCode = rawCode;
+ }
+
+ public void setPrimaryLevelUnicode(KeyEvent ev,
+ long primaryLevelUnicode) {
+ ev.primaryLevelUnicode = primaryLevelUnicode;
+ }
+
+ public void setExtendedKeyCode(KeyEvent ev,
+ long extendedKeyCode) {
+ ev.extendedKeyCode = extendedKeyCode;
+ }
+ });
}
/**
--- a/jdk/src/share/classes/java/beans/PropertyDescriptor.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/beans/PropertyDescriptor.java Mon Sep 10 09:00:00 2012 -0400
@@ -657,7 +657,7 @@
throw new IntrospectionException("bad write method arg count: "
+ writeMethod);
}
- if (propertyType != null && propertyType != params[0]) {
+ if (propertyType != null && !params[0].isAssignableFrom(propertyType)) {
throw new IntrospectionException("type mismatch between read and write methods");
}
propertyType = params[0];
--- a/jdk/src/share/classes/java/security/interfaces/DSAKeyPairGenerator.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/java/security/interfaces/DSAKeyPairGenerator.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -62,6 +62,9 @@
* interface is all that is needed when you accept defaults for algorithm-specific
* parameters.
*
+ * <p>Note: Some earlier implementations of this interface may not support
+ * larger sizes of DSA parameters such as 2048 and 3072-bit.
+ *
* @see java.security.KeyPairGenerator
*/
public interface DSAKeyPairGenerator {
@@ -78,7 +81,7 @@
* can be null.
*
* @exception InvalidParameterException if the <code>params</code>
- * value is invalid or null.
+ * value is invalid, null, or unsupported.
*/
public void initialize(DSAParams params, SecureRandom random)
throws InvalidParameterException;
@@ -97,7 +100,7 @@
* default parameters for modulus lengths of 512 and 1024 bits.
*
* @param modlen the modulus length in bits. Valid values are any
- * multiple of 8 between 512 and 1024, inclusive.
+ * multiple of 64 between 512 and 1024, inclusive, 2048, and 3072.
*
* @param random the random bit source to use to generate key bits;
* can be null.
@@ -105,10 +108,9 @@
* @param genParams whether or not to generate new parameters for
* the modulus length requested.
*
- * @exception InvalidParameterException if <code>modlen</code> is not
- * between 512 and 1024, or if <code>genParams</code> is false and
- * there are no precomputed parameters for the requested modulus
- * length.
+ * @exception InvalidParameterException if <code>modlen</code> is
+ * invalid, or unsupported, or if <code>genParams</code> is false and there
+ * are no precomputed parameters for the requested modulus length.
*/
public void initialize(int modlen, boolean genParams, SecureRandom random)
throws InvalidParameterException;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/java/security/spec/DSAGenParameterSpec.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package java.security.spec;
+
+/**
+ * This immutable class specifies the set of parameters used for
+ * generating DSA parameters as specified in
+ * <a href="http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf">FIPS 186-3 Digital Signature Standard (DSS)</a>.
+ *
+ * @see AlgorithmParameterSpec
+ *
+ * @since 8
+ */
+public final class DSAGenParameterSpec implements AlgorithmParameterSpec {
+
+ private final int pLen;
+ private final int qLen;
+ private final int seedLen;
+
+ /**
+ * Creates a domain parameter specification for DSA parameter
+ * generation using <code>primePLen</code> and <code>subprimeQLen</code>.
+ * The value of <code>subprimeQLen</code> is also used as the default
+ * length of the domain parameter seed in bits.
+ * @param primePLen the desired length of the prime P in bits.
+ * @param subprimeQLen the desired length of the sub-prime Q in bits.
+ * @exception IllegalArgumentException if <code>primePLen</code>
+ * or <code>subprimeQLen</code> is illegal per the specification of
+ * FIPS 186-3.
+ */
+ public DSAGenParameterSpec(int primePLen, int subprimeQLen) {
+ this(primePLen, subprimeQLen, subprimeQLen);
+ }
+
+ /**
+ * Creates a domain parameter specification for DSA parameter
+ * generation using <code>primePLen</code>, <code>subprimeQLen</code>,
+ * and <code>seedLen</code>.
+ * @param primePLen the desired length of the prime P in bits.
+ * @param subprimeQLen the desired length of the sub-prime Q in bits.
+ * @param seedLen the desired length of the domain parameter seed in bits,
+ * shall be equal to or greater than <code>subprimeQLen</code>.
+ * @exception IllegalArgumentException if <code>primePLenLen</code>,
+ * <code>subprimeQLen</code>, or <code>seedLen</code> is illegal per the
+ * specification of FIPS 186-3.
+ */
+ public DSAGenParameterSpec(int primePLen, int subprimeQLen, int seedLen) {
+ switch (primePLen) {
+ case 1024:
+ if (subprimeQLen != 160) {
+ throw new IllegalArgumentException
+ ("subprimeQLen must be 160 when primePLen=1024");
+ }
+ break;
+ case 2048:
+ if (subprimeQLen != 224 && subprimeQLen != 256) {
+ throw new IllegalArgumentException
+ ("subprimeQLen must be 224 or 256 when primePLen=2048");
+ }
+ break;
+ case 3072:
+ if (subprimeQLen != 256) {
+ throw new IllegalArgumentException
+ ("subprimeQLen must be 256 when primePLen=3072");
+ }
+ break;
+ default:
+ throw new IllegalArgumentException
+ ("primePLen must be 1024, 2048, or 3072");
+ }
+ if (seedLen < subprimeQLen) {
+ throw new IllegalArgumentException
+ ("seedLen must be equal to or greater than subprimeQLen");
+ }
+ this.pLen = primePLen;
+ this.qLen = subprimeQLen;
+ this.seedLen = seedLen;
+ }
+
+ /**
+ * Returns the desired length of the prime P of the
+ * to-be-generated DSA domain parameters in bits.
+ * @return the length of the prime P.
+ */
+ public int getPrimePLength() {
+ return pLen;
+ }
+
+ /**
+ * Returns the desired length of the sub-prime Q of the
+ * to-be-generated DSA domain parameters in bits.
+ * @return the length of the sub-prime Q.
+ */
+ public int getSubprimeQLength() {
+ return qLen;
+ }
+
+ /**
+ * Returns the desired length of the domain parameter seed in bits.
+ * @return the length of the domain parameter seed.
+ */
+ public int getSeedLength() {
+ return seedLen;
+ }
+}
--- a/jdk/src/share/classes/javax/swing/ClientPropertyKey.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/javax/swing/ClientPropertyKey.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,6 +25,8 @@
package javax.swing;
+import sun.awt.AWTAccessor;
+
/**
* An enumeration for keys used as client properties within the Swing
* implementation.
@@ -86,6 +88,15 @@
*/
private final boolean reportValueNotSerializable;
+ static {
+ AWTAccessor.setClientPropertyKeyAccessor(
+ new AWTAccessor.ClientPropertyKeyAccessor() {
+ public Object getJComponent_TRANSFER_HANDLER() {
+ return JComponent_TRANSFER_HANDLER;
+ }
+ });
+ }
+
/**
* Constructs a key with the {@code reportValueNotSerializable} property
* set to {@code false}.
--- a/jdk/src/share/classes/javax/swing/JTable.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/javax/swing/JTable.java Mon Sep 10 09:00:00 2012 -0400
@@ -8590,7 +8590,7 @@
* <code>null</code> if this object is not on the screen
*/
public Point getLocationOnScreen() {
- if (parent != null) {
+ if (parent != null && parent.isShowing()) {
Point parentLocation = parent.getLocationOnScreen();
Point componentLocation = getLocation();
componentLocation.translate(parentLocation.x, parentLocation.y);
@@ -9391,7 +9391,7 @@
* <code>null</code> if this object is not on the screen
*/
public Point getLocationOnScreen() {
- if (parent != null) {
+ if (parent != null && parent.isShowing()) {
Point parentLocation = parent.getLocationOnScreen();
Point componentLocation = getLocation();
componentLocation.translate(parentLocation.x, parentLocation.y);
--- a/jdk/src/share/classes/sun/awt/AWTAccessor.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,12 +29,15 @@
import java.awt.*;
import java.awt.KeyboardFocusManager;
+import java.awt.DefaultKeyboardFocusManager;
import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
import java.awt.geom.Point2D;
import java.awt.peer.ComponentPeer;
import java.security.AccessControlContext;
import java.io.File;
+import java.util.Vector;
/**
* The AWTAccessor utility class.
@@ -314,7 +317,7 @@
void setTrayIconWindow(Window w, boolean isTrayIconWindow);
}
- /*
+ /**
* An accessor for the AWTEvent class.
*/
public interface AWTEventAccessor {
@@ -334,12 +337,20 @@
*/
boolean isSystemGenerated(AWTEvent ev);
-
- /*
+ /**
* Returns the acc this event was constructed with.
*/
AccessControlContext getAccessControlContext(AWTEvent ev);
+ /**
+ * Returns binary data associated with this event;
+ */
+ byte[] getBData(AWTEvent ev);
+
+ /**
+ * Associates binary data with this event;
+ */
+ void setBData(AWTEvent ev, byte[] bdata);
}
public interface InputEventAccessor {
@@ -367,11 +378,11 @@
Rectangle getMaximizedBounds(Frame frame);
}
- /*
+ /**
* An interface of accessor for the java.awt.KeyboardFocusManager class.
*/
public interface KeyboardFocusManagerAccessor {
- /*
+ /**
* Indicates whether the native implementation should
* proceed with a pending focus request for the heavyweight.
*/
@@ -381,7 +392,7 @@
boolean focusedWindowChangeAllowed,
long time,
CausedFocusEvent.Cause cause);
- /*
+ /**
* Delivers focus for the lightweight descendant of the heavyweight
* synchronously.
*/
@@ -390,23 +401,28 @@
boolean temporary,
boolean focusedWindowChangeAllowed,
long time);
- /*
+ /**
* Removes the last focus request for the heavyweight from the queue.
*/
void removeLastFocusRequest(Component heavyweight);
- /*
+ /**
* Sets the most recent focus owner in the window.
*/
void setMostRecentFocusOwner(Window window, Component component);
- /*
+ /**
* Returns current KFM of the specified AppContext.
*/
KeyboardFocusManager getCurrentKeyboardFocusManager(AppContext ctx);
+
+ /**
+ * Return the current focus cycle root
+ */
+ Container getCurrentFocusCycleRoot();
}
- /*
+ /**
* An accessor for the MenuComponent class.
*/
public interface MenuComponentAccessor {
@@ -424,20 +440,42 @@
* Returns the menu container of the menu component
*/
MenuContainer getParent(MenuComponent menuComp);
+
+ /**
+ * Gets the font used for this menu component.
+ */
+ Font getFont_NoClientCode(MenuComponent menuComp);
}
- /*
+ /**
* An accessor for the EventQueue class
*/
public interface EventQueueAccessor {
- /*
+ /**
* Gets the event dispatch thread.
*/
Thread getDispatchThread(EventQueue eventQueue);
- /*
+
+ /**
* Checks if the current thread is EDT for the given EQ.
*/
public boolean isDispatchThreadImpl(EventQueue eventQueue);
+
+ /**
+ * Removes any pending events for the specified source object.
+ */
+ void removeSourceEvents(EventQueue eventQueue, Object source, boolean removeAllEvents);
+
+ /**
+ * Returns whether an event is pending on any of the separate Queues.
+ */
+ boolean noEvents(EventQueue eventQueue);
+
+ /**
+ * Called from PostEventQueue.postEvent to notify that a new event
+ * appeared.
+ */
+ void wakeup(EventQueue eventQueue, boolean isShutdown);
}
/*
@@ -486,6 +524,148 @@
final int type);
}
+ /**
+ * An accessor for the CheckboxMenuItem class
+ */
+ public interface CheckboxMenuItemAccessor {
+ /**
+ * Returns whether menu item is checked
+ */
+ boolean getState(CheckboxMenuItem cmi);
+ }
+
+ /**
+ * An accessor for the Cursor class
+ */
+ public interface CursorAccessor {
+ /**
+ * Returns pData of the Cursor class
+ */
+ long getPData(Cursor cursor);
+
+ /**
+ * Sets pData to the Cursor class
+ */
+ void setPData(Cursor cursor, long pData);
+
+ /**
+ * Return type of the Cursor class
+ */
+ int getType(Cursor cursor);
+ }
+
+ /**
+ * An accessor for the MenuBar class
+ */
+ public interface MenuBarAccessor {
+ /**
+ * Returns help menu
+ */
+ Menu getHelpMenu(MenuBar menuBar);
+
+ /**
+ * Returns menus
+ */
+ Vector getMenus(MenuBar menuBar);
+ }
+
+ /**
+ * An accessor for the MenuItem class
+ */
+ public interface MenuItemAccessor {
+ /**
+ * Returns whether menu item is enabled
+ */
+ boolean isEnabled(MenuItem item);
+
+ /**
+ * Gets the command name of the action event that is fired
+ * by this menu item.
+ */
+ String getActionCommandImpl(MenuItem item);
+
+ /**
+ * Returns true if the item and all its ancestors are
+ * enabled, false otherwise
+ */
+ boolean isItemEnabled(MenuItem item);
+
+ /**
+ * Returns label
+ */
+ String getLabel(MenuItem item);
+
+ /**
+ * Returns shortcut
+ */
+ MenuShortcut getShortcut(MenuItem item);
+ }
+
+ /**
+ * An accessor for the Menu class
+ */
+ public interface MenuAccessor {
+ /**
+ * Returns vector of the items that are part of the Menu
+ */
+ Vector getItems(Menu menu);
+ }
+
+ /**
+ * An accessor for the KeyEvent class
+ */
+ public interface KeyEventAccessor {
+ /**
+ * Sets rawCode field for KeyEvent
+ */
+ void setRawCode(KeyEvent ev, long rawCode);
+
+ /**
+ * Sets primaryLevelUnicode field for KeyEvent
+ */
+ void setPrimaryLevelUnicode(KeyEvent ev, long primaryLevelUnicode);
+
+ /**
+ * Sets extendedKeyCode field for KeyEvent
+ */
+ void setExtendedKeyCode(KeyEvent ev, long extendedKeyCode);
+ }
+
+ /**
+ * An accessor for the ClientPropertyKey class
+ */
+ public interface ClientPropertyKeyAccessor {
+ /**
+ * Retrieves JComponent_TRANSFER_HANDLER enum object
+ */
+ Object getJComponent_TRANSFER_HANDLER();
+ }
+
+ /**
+ * An accessor for the SystemTray class
+ */
+ public interface SystemTrayAccessor {
+ /**
+ * Support for reporting bound property changes for Object properties.
+ */
+ void firePropertyChange(SystemTray tray, String propertyName, Object oldValue, Object newValue);
+ }
+
+ /**
+ * An accessor for the TrayIcon class
+ */
+ public interface TrayIconAccessor {
+ void addNotify(TrayIcon trayIcon) throws AWTException;
+ void removeNotify(TrayIcon trayIcon);
+ }
+
+ /**
+ * An accessor for the DefaultKeyboardFocusManager class
+ */
+ public interface DefaultKeyboardFocusManagerAccessor {
+ public void consumeNextKeyTyped(DefaultKeyboardFocusManager dkfm, KeyEvent e);
+ }
+
/*
* Accessor instances are initialized in the static initializers of
* corresponding AWT classes by using setters defined below.
@@ -502,6 +682,16 @@
private static PopupMenuAccessor popupMenuAccessor;
private static FileDialogAccessor fileDialogAccessor;
private static ScrollPaneAdjustableAccessor scrollPaneAdjustableAccessor;
+ private static CheckboxMenuItemAccessor checkboxMenuItemAccessor;
+ private static CursorAccessor cursorAccessor;
+ private static MenuBarAccessor menuBarAccessor;
+ private static MenuItemAccessor menuItemAccessor;
+ private static MenuAccessor menuAccessor;
+ private static KeyEventAccessor keyEventAccessor;
+ private static ClientPropertyKeyAccessor clientPropertyKeyAccessor;
+ private static SystemTrayAccessor systemTrayAccessor;
+ private static TrayIconAccessor trayIconAccessor;
+ private static DefaultKeyboardFocusManagerAccessor defaultKeyboardFocusManagerAccessor;
/*
* Set an accessor object for the java.awt.Component class.
@@ -709,4 +899,174 @@
}
return scrollPaneAdjustableAccessor;
}
+
+ /**
+ * Set an accessor object for the java.awt.CheckboxMenuItem class.
+ */
+ public static void setCheckboxMenuItemAccessor(CheckboxMenuItemAccessor cmia) {
+ checkboxMenuItemAccessor = cmia;
+ }
+
+ /**
+ * Retrieve the accessor object for the java.awt.CheckboxMenuItem class.
+ */
+ public static CheckboxMenuItemAccessor getCheckboxMenuItemAccessor() {
+ if (checkboxMenuItemAccessor == null) {
+ unsafe.ensureClassInitialized(CheckboxMenuItemAccessor.class);
+ }
+ return checkboxMenuItemAccessor;
+ }
+
+ /**
+ * Set an accessor object for the java.awt.Cursor class.
+ */
+ public static void setCursorAccessor(CursorAccessor ca) {
+ cursorAccessor = ca;
+ }
+
+ /**
+ * Retrieve the accessor object for the java.awt.Cursor class.
+ */
+ public static CursorAccessor getCursorAccessor() {
+ if (cursorAccessor == null) {
+ unsafe.ensureClassInitialized(CursorAccessor.class);
+ }
+ return cursorAccessor;
+ }
+
+ /**
+ * Set an accessor object for the java.awt.MenuBar class.
+ */
+ public static void setMenuBarAccessor(MenuBarAccessor mba) {
+ menuBarAccessor = mba;
+ }
+
+ /**
+ * Retrieve the accessor object for the java.awt.MenuBar class.
+ */
+ public static MenuBarAccessor getMenuBarAccessor() {
+ if (menuBarAccessor == null) {
+ unsafe.ensureClassInitialized(MenuBarAccessor.class);
+ }
+ return menuBarAccessor;
+ }
+
+ /**
+ * Set an accessor object for the java.awt.MenuItem class.
+ */
+ public static void setMenuItemAccessor(MenuItemAccessor mia) {
+ menuItemAccessor = mia;
+ }
+
+ /**
+ * Retrieve the accessor object for the java.awt.MenuItem class.
+ */
+ public static MenuItemAccessor getMenuItemAccessor() {
+ if (menuItemAccessor == null) {
+ unsafe.ensureClassInitialized(MenuItemAccessor.class);
+ }
+ return menuItemAccessor;
+ }
+
+ /**
+ * Set an accessor object for the java.awt.Menu class.
+ */
+ public static void setMenuAccessor(MenuAccessor ma) {
+ menuAccessor = ma;
+ }
+
+ /**
+ * Retrieve the accessor object for the java.awt.Menu class.
+ */
+ public static MenuAccessor getMenuAccessor() {
+ if (menuAccessor == null) {
+ unsafe.ensureClassInitialized(MenuAccessor.class);
+ }
+ return menuAccessor;
+ }
+
+ /**
+ * Set an accessor object for the java.awt.event.KeyEvent class.
+ */
+ public static void setKeyEventAccessor(KeyEventAccessor kea) {
+ keyEventAccessor = kea;
+ }
+
+ /**
+ * Retrieve the accessor object for the java.awt.event.KeyEvent class.
+ */
+ public static KeyEventAccessor getKeyEventAccessor() {
+ if (keyEventAccessor == null) {
+ unsafe.ensureClassInitialized(KeyEventAccessor.class);
+ }
+ return keyEventAccessor;
+ }
+
+ /**
+ * Set an accessor object for the javax.swing.ClientPropertyKey class.
+ */
+ public static void setClientPropertyKeyAccessor(ClientPropertyKeyAccessor cpka) {
+ clientPropertyKeyAccessor = cpka;
+ }
+
+ /**
+ * Retrieve the accessor object for the javax.swing.ClientPropertyKey class.
+ */
+ public static ClientPropertyKeyAccessor getClientPropertyKeyAccessor() {
+ if (clientPropertyKeyAccessor == null) {
+ unsafe.ensureClassInitialized(ClientPropertyKeyAccessor.class);
+ }
+ return clientPropertyKeyAccessor;
+ }
+
+ /**
+ * Set an accessor object for the java.awt.SystemTray class.
+ */
+ public static void setSystemTrayAccessor(SystemTrayAccessor sta) {
+ systemTrayAccessor = sta;
+ }
+
+ /**
+ * Retrieve the accessor object for the java.awt.SystemTray class.
+ */
+ public static SystemTrayAccessor getSystemTrayAccessor() {
+ if (systemTrayAccessor == null) {
+ unsafe.ensureClassInitialized(SystemTrayAccessor.class);
+ }
+ return systemTrayAccessor;
+ }
+
+ /**
+ * Set an accessor object for the java.awt.TrayIcon class.
+ */
+ public static void setTrayIconAccessor(TrayIconAccessor tia) {
+ trayIconAccessor = tia;
+ }
+
+ /**
+ * Retrieve the accessor object for the java.awt.TrayIcon class.
+ */
+ public static TrayIconAccessor getTrayIconAccessor() {
+ if (trayIconAccessor == null) {
+ unsafe.ensureClassInitialized(TrayIconAccessor.class);
+ }
+ return trayIconAccessor;
+ }
+
+ /**
+ * Set an accessor object for the java.awt.DefaultKeyboardFocusManager class.
+ */
+ public static void setDefaultKeyboardFocusManagerAccessor(DefaultKeyboardFocusManagerAccessor dkfma) {
+ defaultKeyboardFocusManagerAccessor = dkfma;
+ }
+
+ /**
+ * Retrieve the accessor object for the java.awt.DefaultKeyboardFocusManager class.
+ */
+ public static DefaultKeyboardFocusManagerAccessor getDefaultKeyboardFocusManagerAccessor() {
+ if (defaultKeyboardFocusManagerAccessor == null) {
+ unsafe.ensureClassInitialized(DefaultKeyboardFocusManagerAccessor.class);
+ }
+ return defaultKeyboardFocusManagerAccessor;
+ }
}
--- a/jdk/src/share/classes/sun/awt/EmbeddedFrame.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/awt/EmbeddedFrame.java Mon Sep 10 09:00:00 2012 -0400
@@ -29,12 +29,6 @@
import java.awt.event.*;
import java.awt.image.*;
import java.awt.peer.*;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Field;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.util.Set;
@@ -66,8 +60,6 @@
implements KeyEventDispatcher, PropertyChangeListener {
private boolean isCursorAllowed = true;
- private static Field fieldPeer;
- private static Field currentCycleRoot;
private boolean supportsXEmbed = false;
private KeyboardFocusManager appletKFM;
// JDK 1.1 compatibility
@@ -213,39 +205,8 @@
*/
public boolean dispatchKeyEvent(KeyEvent e) {
- // We can't guarantee that this is called on the same AppContext as EmbeddedFrame
- // belongs to. That's why we can't use public methods to find current focus cycle
- // root. Instead, we access KFM's private field directly.
- if (currentCycleRoot == null) {
- currentCycleRoot = AccessController.doPrivileged(new PrivilegedAction<Field>() {
- public Field run() {
- try {
- Field unaccessibleRoot = KeyboardFocusManager.class.
- getDeclaredField("currentFocusCycleRoot");
- if (unaccessibleRoot != null) {
- unaccessibleRoot.setAccessible(true);
- }
- return unaccessibleRoot;
- } catch (NoSuchFieldException e1) {
- assert false;
- } catch (SecurityException e2) {
- assert false;
- }
- return null;
- }
- });
- }
-
- Container currentRoot = null;
- if (currentCycleRoot != null) {
- try {
- // The field is static, so we can pass null to Field.get() as the argument.
- currentRoot = (Container)currentCycleRoot.get(null);
- } catch (IllegalAccessException e3) {
- // This is impossible: currentCycleRoot would be null if setAccessible failed.
- assert false;
- }
- }
+ Container currentRoot = AWTAccessor.getKeyboardFocusManagerAccessor()
+ .getCurrentFocusCycleRoot();
// if we are not in EmbeddedFrame's cycle, we should not try to leave.
if (this != currentRoot) {
@@ -389,32 +350,8 @@
@SuppressWarnings("deprecation")
protected void setPeer(final ComponentPeer p){
- if (fieldPeer == null) {
- fieldPeer = AccessController.doPrivileged(new PrivilegedAction<Field>() {
- public Field run() {
- try {
- Field lnkPeer = Component.class.getDeclaredField("peer");
- if (lnkPeer != null) {
- lnkPeer.setAccessible(true);
- }
- return lnkPeer;
- } catch (NoSuchFieldException e) {
- assert false;
- } catch (SecurityException e) {
- assert false;
- }
- return null;
- }//run
- });
- }
- try{
- if (fieldPeer != null){
- fieldPeer.set(EmbeddedFrame.this, p);
- }
- } catch (IllegalAccessException e) {
- assert false;
- }
- }; //setPeer method ends
+ AWTAccessor.getComponentAccessor().setPeer(EmbeddedFrame.this, p);
+ };
/**
* Synthesize native message to activate or deactivate EmbeddedFrame window
--- a/jdk/src/share/classes/sun/awt/SunToolkit.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/awt/SunToolkit.java Mon Sep 10 09:00:00 2012 -0400
@@ -51,14 +51,8 @@
import sun.awt.image.*;
import sun.security.action.GetPropertyAction;
import sun.security.action.GetBooleanAction;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
public abstract class SunToolkit extends Toolkit
implements WindowClosingSupport, WindowClosingListener,
@@ -80,7 +74,6 @@
*/
public static final int GRAB_EVENT_MASK = 0x80000000;
- private static Method wakeupMethod;
/* The key to put()/get() the PostEventQueue into/from the AppContext.
*/
private static final String POST_EVENT_QUEUE_KEY = "PostEventQueue";
@@ -295,52 +288,8 @@
return appContext;
}
- public static Field getField(final Class<?> klass, final String fieldName) {
- return AccessController.doPrivileged(new PrivilegedAction<Field>() {
- public Field run() {
- try {
- Field field = klass.getDeclaredField(fieldName);
- assert (field != null);
- field.setAccessible(true);
- return field;
- } catch (SecurityException e) {
- assert false;
- } catch (NoSuchFieldException e) {
- assert false;
- }
- return null;
- }//run
- });
- }
-
static void wakeupEventQueue(EventQueue q, boolean isShutdown){
- if (wakeupMethod == null){
- wakeupMethod = AccessController.doPrivileged(new PrivilegedAction<Method>() {
- public Method run() {
- try {
- Method method = EventQueue.class.getDeclaredMethod("wakeup",new Class [] {Boolean.TYPE} );
- if (method != null) {
- method.setAccessible(true);
- }
- return method;
- } catch (NoSuchMethodException e) {
- assert false;
- } catch (SecurityException e) {
- assert false;
- }
- return null;
- }//run
- });
- }
- try{
- if (wakeupMethod != null){
- wakeupMethod.invoke(q, new Object[]{Boolean.valueOf(isShutdown)});
- }
- } catch (InvocationTargetException e){
- assert false;
- } catch (IllegalAccessException e) {
- assert false;
- }
+ AWTAccessor.getEventQueueAccessor().wakeup(q, isShutdown);
}
/*
@@ -1460,22 +1409,6 @@
|| comp instanceof Window);
}
- public static Method getMethod(final Class<?> clz, final String methodName, final Class[] params) {
- Method res = null;
- try {
- res = AccessController.doPrivileged(new PrivilegedExceptionAction<Method>() {
- public Method run() throws Exception {
- Method m = clz.getDeclaredMethod(methodName, params);
- m.setAccessible(true);
- return m;
- }
- });
- } catch (PrivilegedActionException ex) {
- ex.printStackTrace();
- }
- return res;
- }
-
@SuppressWarnings("serial")
public static class OperationTimedOut extends RuntimeException {
public OperationTimedOut(String msg) {
@@ -1622,21 +1555,9 @@
private boolean queueEmpty = false;
private final Object waitLock = "Wait Lock";
- static Method eqNoEvents;
-
private boolean isEQEmpty() {
EventQueue queue = getSystemEventQueueImpl();
- synchronized(SunToolkit.class) {
- if (eqNoEvents == null) {
- eqNoEvents = getMethod(java.awt.EventQueue.class, "noEvents", null);
- }
- }
- try {
- return (Boolean)eqNoEvents.invoke(queue);
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
+ return AWTAccessor.getEventQueueAccessor().noEvents(queue);
}
/**
@@ -1892,20 +1813,14 @@
* consumeNextKeyTyped() method is not currently used,
* however Swing could use it in the future.
*/
- private static Method consumeNextKeyTypedMethod = null;
public static synchronized void consumeNextKeyTyped(KeyEvent keyEvent) {
- if (consumeNextKeyTypedMethod == null) {
- consumeNextKeyTypedMethod = getMethod(DefaultKeyboardFocusManager.class,
- "consumeNextKeyTyped",
- new Class<?>[] {KeyEvent.class});
- }
try {
- consumeNextKeyTypedMethod.invoke(KeyboardFocusManager.getCurrentKeyboardFocusManager(),
- keyEvent);
- } catch (IllegalAccessException iae) {
- iae.printStackTrace();
- } catch (InvocationTargetException ite) {
- ite.printStackTrace();
+ AWTAccessor.getDefaultKeyboardFocusManagerAccessor().consumeNextKeyTyped(
+ (DefaultKeyboardFocusManager)KeyboardFocusManager.
+ getCurrentKeyboardFocusManager(),
+ keyEvent);
+ } catch (ClassCastException cce) {
+ cce.printStackTrace();
}
}
@@ -1925,24 +1840,6 @@
return (Window)comp;
}
- /**
- * Returns the value of the system property indicated by the specified key.
- */
- public static String getSystemProperty(final String key) {
- return AccessController.doPrivileged(new PrivilegedAction<String>() {
- public String run() {
- return System.getProperty(key);
- }
- });
- }
-
- /**
- * Returns the boolean value of the system property indicated by the specified key.
- */
- protected static Boolean getBooleanSystemProperty(String key) {
- return AccessController.doPrivileged(new GetBooleanAction(key));
- }
-
private static Boolean sunAwtDisableMixing = null;
/**
@@ -1951,7 +1848,8 @@
*/
public synchronized static boolean getSunAwtDisableMixing() {
if (sunAwtDisableMixing == null) {
- sunAwtDisableMixing = getBooleanSystemProperty("sun.awt.disableMixing");
+ sunAwtDisableMixing = AccessController.doPrivileged(
+ new GetBooleanAction("sun.awt.disableMixing"));
}
return sunAwtDisableMixing.booleanValue();
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/awt/TextureSizeConstraining.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.awt;
+
+/**
+ * A GraphicsConfiguration implements the TextureSizeConstraining
+ * interface to indicate that it imposes certain limitations on the
+ * maximum size of supported textures.
+ */
+public interface TextureSizeConstraining {
+
+ /**
+ * Returns the maximum width of any texture image.
+ */
+ public int getMaxTextureWidth();
+
+ /**
+ * Returns the maximum height of any texture image.
+ */
+ public int getMaxTextureHeight();
+
+}
--- a/jdk/src/share/classes/sun/beans/editors/BooleanEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.beans.editors;
-
-/**
- * Property editor for a java builtin "boolean" type.
- */
-
-import java.beans.*;
-
-public class BooleanEditor extends PropertyEditorSupport {
-
-
- public String getJavaInitializationString() {
- Object value = getValue();
- return (value != null)
- ? value.toString()
- : "null";
- }
-
- public String getAsText() {
- Object value = getValue();
- return (value instanceof Boolean)
- ? getValidName((Boolean) value)
- : null;
- }
-
- public void setAsText(String text) throws java.lang.IllegalArgumentException {
- if (text == null) {
- setValue(null);
- } else if (isValidName(true, text)) {
- setValue(Boolean.TRUE);
- } else if (isValidName(false, text)) {
- setValue(Boolean.FALSE);
- } else {
- throw new java.lang.IllegalArgumentException(text);
- }
- }
-
- public String[] getTags() {
- return new String[] {getValidName(true), getValidName(false)};
- }
-
- // the following method should be localized (4890258)
-
- private String getValidName(boolean value) {
- return value ? "True" : "False";
- }
-
- private boolean isValidName(boolean value, String name) {
- return getValidName(value).equalsIgnoreCase(name);
- }
-}
--- a/jdk/src/share/classes/sun/beans/editors/ByteEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.beans.editors;
-
-/**
- * Property editor for a java builtin "byte" type.
- *
- */
-
-import java.beans.*;
-
-public class ByteEditor extends NumberEditor {
-
- public String getJavaInitializationString() {
- Object value = getValue();
- return (value != null)
- ? "((byte)" + value + ")"
- : "null";
- }
-
- public void setAsText(String text) throws IllegalArgumentException {
- setValue((text == null) ? null : Byte.decode(text));
- }
-
-}
--- a/jdk/src/share/classes/sun/beans/editors/ColorEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,214 +0,0 @@
-/*
- * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.beans.editors;
-
-import java.awt.*;
-import java.beans.*;
-
-public class ColorEditor extends Panel implements PropertyEditor {
- private static final long serialVersionUID = 1781257185164716054L;
-
- public ColorEditor() {
- setLayout(null);
-
- ourWidth = hPad;
-
- // Create a sample color block bordered in black
- Panel p = new Panel();
- p.setLayout(null);
- p.setBackground(Color.black);
- sample = new Canvas();
- p.add(sample);
- sample.reshape(2, 2, sampleWidth, sampleHeight);
- add(p);
- p.reshape(ourWidth, 2, sampleWidth+4, sampleHeight+4);
- ourWidth += sampleWidth + 4 + hPad;
-
- text = new TextField("", 14);
- add(text);
- text.reshape(ourWidth,0,100,30);
- ourWidth += 100 + hPad;
-
- choser = new Choice();
- int active = 0;
- for (int i = 0; i < colorNames.length; i++) {
- choser.addItem(colorNames[i]);
- }
- add(choser);
- choser.reshape(ourWidth,0,100,30);
- ourWidth += 100 + hPad;
-
- resize(ourWidth,40);
- }
-
- public void setValue(Object o) {
- Color c = (Color)o;
- changeColor(c);
- }
-
- public Dimension preferredSize() {
- return new Dimension(ourWidth, 40);
- }
-
- public boolean keyUp(Event e, int key) {
- if (e.target == text) {
- try {
- setAsText(text.getText());
- } catch (IllegalArgumentException ex) {
- // Quietly ignore.
- }
- }
- return (false);
- }
-
- public void setAsText(String s) throws java.lang.IllegalArgumentException {
- if (s == null) {
- changeColor(null);
- return;
- }
- int c1 = s.indexOf(',');
- int c2 = s.indexOf(',', c1+1);
- if (c1 < 0 || c2 < 0) {
- // Invalid string.
- throw new IllegalArgumentException(s);
- }
- try {
- int r = Integer.parseInt(s.substring(0,c1));
- int g = Integer.parseInt(s.substring(c1+1, c2));
- int b = Integer.parseInt(s.substring(c2+1));
- Color c = new Color(r,g,b);
- changeColor(c);
- } catch (Exception ex) {
- throw new IllegalArgumentException(s);
- }
-
- }
-
- public boolean action(Event e, Object arg) {
- if (e.target == choser) {
- changeColor(colors[choser.getSelectedIndex()]);
- }
- return false;
- }
-
- public String getJavaInitializationString() {
- return (this.color != null)
- ? "new java.awt.Color(" + this.color.getRGB() + ",true)"
- : "null";
- }
-
-
- private void changeColor(Color c) {
-
- if (c == null) {
- this.color = null;
- this.text.setText("");
- return;
- }
-
- color = c;
-
- text.setText("" + c.getRed() + "," + c.getGreen() + "," + c.getBlue());
-
- int active = 0;
- for (int i = 0; i < colorNames.length; i++) {
- if (color.equals(colors[i])) {
- active = i;
- }
- }
- choser.select(active);
-
- sample.setBackground(color);
- sample.repaint();
-
- support.firePropertyChange("", null, null);
- }
-
- public Object getValue() {
- return color;
- }
-
- public boolean isPaintable() {
- return true;
- }
-
- public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) {
- Color oldColor = gfx.getColor();
- gfx.setColor(Color.black);
- gfx.drawRect(box.x, box.y, box.width-3, box.height-3);
- gfx.setColor(color);
- gfx.fillRect(box.x+1, box.y+1, box.width-4, box.height-4);
- gfx.setColor(oldColor);
- }
-
- public String getAsText() {
- return (this.color != null)
- ? this.color.getRed() + "," + this.color.getGreen() + "," + this.color.getBlue()
- : null;
- }
-
- public String[] getTags() {
- return null;
- }
-
- public java.awt.Component getCustomEditor() {
- return this;
- }
-
- public boolean supportsCustomEditor() {
- return true;
- }
-
- public void addPropertyChangeListener(PropertyChangeListener l) {
- support.addPropertyChangeListener(l);
- }
-
- public void removePropertyChangeListener(PropertyChangeListener l) {
- support.removePropertyChangeListener(l);
- }
-
-
- private String colorNames[] = { " ", "white", "lightGray", "gray", "darkGray",
- "black", "red", "pink", "orange",
- "yellow", "green", "magenta", "cyan",
- "blue"};
- private Color colors[] = { null, Color.white, Color.lightGray, Color.gray, Color.darkGray,
- Color.black, Color.red, Color.pink, Color.orange,
- Color.yellow, Color.green, Color.magenta, Color.cyan,
- Color.blue};
-
- private Canvas sample;
- private int sampleHeight = 20;
- private int sampleWidth = 40;
- private int hPad = 5;
- private int ourWidth;
-
- private Color color;
- private TextField text;
- private Choice choser;
-
- private PropertyChangeSupport support = new PropertyChangeSupport(this);
-}
--- a/jdk/src/share/classes/sun/beans/editors/DoubleEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.beans.editors;
-
-/**
- * Property editor for a java builtin "double" type.
- *
- */
-
-import java.beans.*;
-
-public class DoubleEditor extends NumberEditor {
-
- public void setAsText(String text) throws IllegalArgumentException {
- setValue((text == null) ? null : Double.valueOf(text));
- }
-
-}
--- a/jdk/src/share/classes/sun/beans/editors/EnumEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-/*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package sun.beans.editors;
-
-import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.Rectangle;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyEditor;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Property editor for java.lang.Enum subclasses.
- *
- * @see PropertyEditor
- *
- * @since 1.7
- *
- * @author Sergey A. Malenkov
- */
-public final class EnumEditor implements PropertyEditor {
- private final List<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>();
-
- private final Class type;
- private final String[] tags;
-
- private Object value;
-
- public EnumEditor( Class type ) {
- Object[] values = type.getEnumConstants();
- if ( values == null ) {
- throw new IllegalArgumentException( "Unsupported " + type );
- }
- this.type = type;
- this.tags = new String[values.length];
- for ( int i = 0; i < values.length; i++ ) {
- this.tags[i] = ( ( Enum )values[i] ).name();
- }
- }
-
- public Object getValue() {
- return this.value;
- }
-
- public void setValue( Object value ) {
- if ( ( value != null ) && !this.type.isInstance( value ) ) {
- throw new IllegalArgumentException( "Unsupported value: " + value );
- }
- Object oldValue;
- PropertyChangeListener[] listeners;
- synchronized ( this.listeners ) {
- oldValue = this.value;
- this.value = value;
-
- if ( ( value == null ) ? oldValue == null : value.equals( oldValue ) ) {
- return; // do not fire event if value is not changed
- }
- int size = this.listeners.size();
- if ( size == 0 ) {
- return; // do not fire event if there are no any listener
- }
- listeners = this.listeners.toArray( new PropertyChangeListener[size] );
- }
- PropertyChangeEvent event = new PropertyChangeEvent( this, null, oldValue, value );
- for ( PropertyChangeListener listener : listeners ) {
- listener.propertyChange( event );
- }
- }
-
- public String getAsText() {
- return ( this.value != null )
- ? ( ( Enum )this.value ).name()
- : null;
- }
-
- public void setAsText( String text ) {
- setValue( ( text != null )
- ? Enum.valueOf( this.type, text )
- : null );
- }
-
- public String[] getTags() {
- return this.tags.clone();
- }
-
- public String getJavaInitializationString() {
- String name = getAsText();
- return ( name != null )
- ? this.type.getName() + '.' + name
- : "null";
- }
-
- public boolean isPaintable() {
- return false;
- }
-
- public void paintValue( Graphics gfx, Rectangle box ) {
- }
-
- public boolean supportsCustomEditor() {
- return false;
- }
-
- public Component getCustomEditor() {
- return null;
- }
-
- public void addPropertyChangeListener( PropertyChangeListener listener ) {
- synchronized ( this.listeners ) {
- this.listeners.add( listener );
- }
- }
-
- public void removePropertyChangeListener( PropertyChangeListener listener ) {
- synchronized ( this.listeners ) {
- this.listeners.remove( listener );
- }
- }
-}
--- a/jdk/src/share/classes/sun/beans/editors/FloatEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.beans.editors;
-
-/**
- * Property editor for a java builtin "float" type.
- *
- */
-
-import java.beans.*;
-
-public class FloatEditor extends NumberEditor {
-
- public String getJavaInitializationString() {
- Object value = getValue();
- return (value != null)
- ? value + "F"
- : "null";
- }
-
- public void setAsText(String text) throws IllegalArgumentException {
- setValue((text == null) ? null : Float.valueOf(text));
- }
-
-}
--- a/jdk/src/share/classes/sun/beans/editors/FontEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,219 +0,0 @@
-/*
- * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.beans.editors;
-
-import java.awt.*;
-import java.beans.*;
-
-public class FontEditor extends Panel implements java.beans.PropertyEditor {
- private static final long serialVersionUID = 6732704486002715933L;
-
- public FontEditor() {
- setLayout(null);
-
- toolkit = Toolkit.getDefaultToolkit();
- fonts = toolkit.getFontList();
-
- familyChoser = new Choice();
- for (int i = 0; i < fonts.length; i++) {
- familyChoser.addItem(fonts[i]);
- }
- add(familyChoser);
- familyChoser.reshape(20, 5, 100, 30);
-
- styleChoser = new Choice();
- for (int i = 0; i < styleNames.length; i++) {
- styleChoser.addItem(styleNames[i]);
- }
- add(styleChoser);
- styleChoser.reshape(145, 5, 70, 30);
-
- sizeChoser = new Choice();
- for (int i = 0; i < pointSizes.length; i++) {
- sizeChoser.addItem("" + pointSizes[i]);
- }
- add(sizeChoser);
- sizeChoser.reshape(220, 5, 70, 30);
-
- resize(300,40);
- }
-
-
- public Dimension preferredSize() {
- return new Dimension(300, 40);
- }
-
- public void setValue(Object o) {
- font = (Font) o;
- if (this.font == null)
- return;
-
- changeFont(font);
- // Update the current GUI choices.
- for (int i = 0; i < fonts.length; i++) {
- if (fonts[i].equals(font.getFamily())) {
- familyChoser.select(i);
- break;
- }
- }
- for (int i = 0; i < styleNames.length; i++) {
- if (font.getStyle() == styles[i]) {
- styleChoser.select(i);
- break;
- }
- }
- for (int i = 0; i < pointSizes.length; i++) {
- if (font.getSize() <= pointSizes[i]) {
- sizeChoser.select(i);
- break;
- }
- }
- }
-
- private void changeFont(Font f) {
- font = f;
- if (sample != null) {
- remove(sample);
- }
- sample = new Label(sampleText);
- sample.setFont(font);
- add(sample);
- Component p = getParent();
- if (p != null) {
- p.invalidate();
- p.layout();
- }
- invalidate();
- layout();
- repaint();
- support.firePropertyChange("", null, null);
- }
-
- public Object getValue() {
- return (font);
- }
-
- public String getJavaInitializationString() {
- if (this.font == null)
- return "null";
-
- return "new java.awt.Font(\"" + font.getName() + "\", " +
- font.getStyle() + ", " + font.getSize() + ")";
- }
-
- public boolean action(Event e, Object arg) {
- String family = familyChoser.getSelectedItem();
- int style = styles[styleChoser.getSelectedIndex()];
- int size = pointSizes[sizeChoser.getSelectedIndex()];
- try {
- Font f = new Font(family, style, size);
- changeFont(f);
- } catch (Exception ex) {
- System.err.println("Couldn't create font " + family + "-" +
- styleNames[style] + "-" + size);
- }
- return (false);
- }
-
-
- public boolean isPaintable() {
- return true;
- }
-
- public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) {
- // Silent noop.
- Font oldFont = gfx.getFont();
- gfx.setFont(font);
- FontMetrics fm = gfx.getFontMetrics();
- int vpad = (box.height - fm.getAscent())/2;
- gfx.drawString(sampleText, 0, box.height-vpad);
- gfx.setFont(oldFont);
- }
-
- public String getAsText() {
- if (this.font == null) {
- return null;
- }
- StringBuilder sb = new StringBuilder();
- sb.append(this.font.getName());
- sb.append(' ');
-
- boolean b = this.font.isBold();
- if (b) {
- sb.append("BOLD");
- }
- boolean i = this.font.isItalic();
- if (i) {
- sb.append("ITALIC");
- }
- if (b || i) {
- sb.append(' ');
- }
- sb.append(this.font.getSize());
- return sb.toString();
- }
-
- public void setAsText(String text) throws IllegalArgumentException {
- setValue((text == null) ? null : Font.decode(text));
- }
-
- public String[] getTags() {
- return null;
- }
-
- public java.awt.Component getCustomEditor() {
- return this;
- }
-
- public boolean supportsCustomEditor() {
- return true;
- }
-
- public void addPropertyChangeListener(PropertyChangeListener l) {
- support.addPropertyChangeListener(l);
- }
-
- public void removePropertyChangeListener(PropertyChangeListener l) {
- support.removePropertyChangeListener(l);
- }
-
- private Font font;
- private Toolkit toolkit;
- private String sampleText = "Abcde...";
-
- private Label sample;
- private Choice familyChoser;
- private Choice styleChoser;
- private Choice sizeChoser;
-
- private String fonts[];
- private String[] styleNames = { "plain", "bold", "italic" };
- private int[] styles = { Font.PLAIN, Font.BOLD, Font.ITALIC };
- private int[] pointSizes = { 3, 5, 8, 10, 12, 14, 18, 24, 36, 48 };
-
- private PropertyChangeSupport support = new PropertyChangeSupport(this);
-
-}
--- a/jdk/src/share/classes/sun/beans/editors/IntegerEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.beans.editors;
-
-/**
- * Property editor for a java builtin "int" type.
- *
- */
-
-import java.beans.*;
-
-public class IntegerEditor extends NumberEditor {
-
-
- public void setAsText(String text) throws IllegalArgumentException {
- setValue((text == null) ? null : Integer.decode(text));
- }
-
-}
--- a/jdk/src/share/classes/sun/beans/editors/LongEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.beans.editors;
-
-/**
- * Property editor for a java builtin "long" type.
- *
- */
-
-import java.beans.*;
-
-public class LongEditor extends NumberEditor {
-
- public String getJavaInitializationString() {
- Object value = getValue();
- return (value != null)
- ? value + "L"
- : "null";
- }
-
- public void setAsText(String text) throws IllegalArgumentException {
- setValue((text == null) ? null : Long.decode(text));
- }
-
-}
--- a/jdk/src/share/classes/sun/beans/editors/NumberEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 1996, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.beans.editors;
-
-/**
- * Abstract Property editor for a java builtin number types.
- *
- */
-
-import java.beans.*;
-
-abstract public class NumberEditor extends PropertyEditorSupport {
-
- public String getJavaInitializationString() {
- Object value = getValue();
- return (value != null)
- ? value.toString()
- : "null";
- }
-
-}
--- a/jdk/src/share/classes/sun/beans/editors/ShortEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-package sun.beans.editors;
-
-/**
- * Property editor for a java builtin "short" type.
- *
- */
-
-import java.beans.*;
-
-public class ShortEditor extends NumberEditor {
-
- public String getJavaInitializationString() {
- Object value = getValue();
- return (value != null)
- ? "((short)" + value + ")"
- : "null";
- }
-
- public void setAsText(String text) throws IllegalArgumentException {
- setValue((text == null) ? null : Short.decode(text));
- }
-
-}
--- a/jdk/src/share/classes/sun/beans/editors/StringEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-package sun.beans.editors;
-
-import java.beans.*;
-
-public class StringEditor extends PropertyEditorSupport {
-
- public String getJavaInitializationString() {
- Object value = getValue();
- if (value == null)
- return "null";
-
- String str = value.toString();
- int length = str.length();
- StringBuilder sb = new StringBuilder(length + 2);
- sb.append('"');
- for (int i = 0; i < length; i++) {
- char ch = str.charAt(i);
- switch (ch) {
- case '\b': sb.append("\\b"); break;
- case '\t': sb.append("\\t"); break;
- case '\n': sb.append("\\n"); break;
- case '\f': sb.append("\\f"); break;
- case '\r': sb.append("\\r"); break;
- case '\"': sb.append("\\\""); break;
- case '\\': sb.append("\\\\"); break;
- default:
- if ((ch < ' ') || (ch > '~')) {
- sb.append("\\u");
- String hex = Integer.toHexString((int) ch);
- for (int len = hex.length(); len < 4; len++) {
- sb.append('0');
- }
- sb.append(hex);
- } else {
- sb.append(ch);
- }
- break;
- }
- }
- sb.append('"');
- return sb.toString();
- }
-
- public void setAsText(String text) {
- setValue(text);
- }
-
-}
--- a/jdk/src/share/classes/sun/beans/infos/ComponentBeanInfo.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.beans.infos;
-
-import java.beans.*;
-
-/**
- * BeanInfo descriptor for a standard AWT component.
- */
-
-public class ComponentBeanInfo extends SimpleBeanInfo {
- private static final Class<java.awt.Component> beanClass = java.awt.Component.class;
-
- public PropertyDescriptor[] getPropertyDescriptors() {
- try {
- PropertyDescriptor
- name = new PropertyDescriptor("name", beanClass),
- background = new PropertyDescriptor("background", beanClass),
- foreground = new PropertyDescriptor("foreground", beanClass),
- font = new PropertyDescriptor("font", beanClass),
- enabled = new PropertyDescriptor("enabled", beanClass),
- visible = new PropertyDescriptor("visible", beanClass),
- focusable = new PropertyDescriptor("focusable", beanClass);
-
- enabled.setExpert(true);
- visible.setHidden(true);
-
- background.setBound(true);
- foreground.setBound(true);
- font.setBound(true);
- focusable.setBound(true);
-
- PropertyDescriptor[] rv = {name, background, foreground, font, enabled, visible, focusable };
- return rv;
- } catch (IntrospectionException e) {
- throw new Error(e.toString());
- }
- }
-}
--- a/jdk/src/share/classes/sun/security/ec/SunECEntries.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/ec/SunECEntries.java Mon Sep 10 09:00:00 2012 -0400
@@ -134,6 +134,9 @@
"sun.security.ec.ECDSASignature$Raw");
map.put("Signature.SHA1withECDSA",
"sun.security.ec.ECDSASignature$SHA1");
+ map.put("Alg.Alias.Signature.OID.1.2.840.10045.4.1", "SHA1withECDSA");
+ map.put("Alg.Alias.Signature.1.2.840.10045.4.1", "SHA1withECDSA");
+
map.put("Signature.SHA224withECDSA",
"sun.security.ec.ECDSASignature$SHA224");
map.put("Alg.Alias.Signature.OID.1.2.840.10045.4.3.1", "SHA224withECDSA");
--- a/jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java Mon Sep 10 09:00:00 2012 -0400
@@ -164,6 +164,10 @@
// if we do the padding
private int bytesBuffered;
+ // length of key size in bytes; currently only used by AES given its oid
+ // specification mandates a fixed size of the key
+ private int fixedKeySize = -1;
+
P11Cipher(Token token, String algorithm, long mechanism)
throws PKCS11Exception, NoSuchAlgorithmException {
super();
@@ -172,19 +176,26 @@
this.mechanism = mechanism;
String algoParts[] = algorithm.split("/");
- keyAlgorithm = algoParts[0];
- if (keyAlgorithm.equals("AES")) {
+ if (algoParts[0].startsWith("AES")) {
blockSize = 16;
- } else if (keyAlgorithm.equals("RC4") ||
- keyAlgorithm.equals("ARCFOUR")) {
- blockSize = 0;
- } else { // DES, DESede, Blowfish
- blockSize = 8;
+ int index = algoParts[0].indexOf('_');
+ if (index != -1) {
+ // should be well-formed since we specify what we support
+ fixedKeySize = Integer.parseInt(algoParts[0].substring(index+1))/8;
+ }
+ keyAlgorithm = "AES";
+ } else {
+ keyAlgorithm = algoParts[0];
+ if (keyAlgorithm.equals("RC4") ||
+ keyAlgorithm.equals("ARCFOUR")) {
+ blockSize = 0;
+ } else { // DES, DESede, Blowfish
+ blockSize = 8;
+ }
+ this.blockMode =
+ (algoParts.length > 1 ? parseMode(algoParts[1]) : MODE_ECB);
}
- this.blockMode =
- (algoParts.length > 1 ? parseMode(algoParts[1]) : MODE_ECB);
-
String defPadding = (blockSize == 0 ? "NoPadding" : "PKCS5Padding");
String paddingStr =
(algoParts.length > 2 ? algoParts[2] : defPadding);
@@ -333,6 +344,9 @@
SecureRandom random)
throws InvalidKeyException, InvalidAlgorithmParameterException {
cancelOperation();
+ if (fixedKeySize != -1 && key.getEncoded().length != fixedKeySize) {
+ throw new InvalidKeyException("Key size is invalid");
+ }
switch (opmode) {
case Cipher.ENCRYPT_MODE:
encrypt = true;
--- a/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java Mon Sep 10 09:00:00 2012 -0400
@@ -399,12 +399,8 @@
return System.identityHashCode(this);
}
- private static String[] s(String s1) {
- return new String[] {s1};
- }
-
- private static String[] s(String s1, String s2) {
- return new String[] {s1, s2};
+ private static String[] s(String ...aliases) {
+ return aliases;
}
private static final class Descriptor {
@@ -521,7 +517,8 @@
m(CKM_MD2));
d(MD, "MD5", P11Digest,
m(CKM_MD5));
- d(MD, "SHA1", P11Digest, s("SHA", "SHA-1"),
+ d(MD, "SHA1", P11Digest,
+ s("SHA", "SHA-1", "1.3.14.3.2.26", "OID.1.3.14.3.2.26"),
m(CKM_SHA_1));
d(MD, "SHA-224", P11Digest,
@@ -540,6 +537,7 @@
d(MAC, "HmacMD5", P11MAC,
m(CKM_MD5_HMAC));
d(MAC, "HmacSHA1", P11MAC,
+ s("1.2.840.113549.2.7", "OID.1.2.840.113549.2.7"),
m(CKM_SHA_1_HMAC));
d(MAC, "HmacSHA224", P11MAC,
s("1.2.840.113549.2.8", "OID.1.2.840.113549.2.8"),
@@ -561,6 +559,7 @@
d(KPG, "RSA", P11KeyPairGenerator,
m(CKM_RSA_PKCS_KEY_PAIR_GEN));
d(KPG, "DSA", P11KeyPairGenerator,
+ s("1.3.14.3.2.12", "1.2.840.10040.4.1", "OID.1.2.840.10040.4.1"),
m(CKM_DSA_KEY_PAIR_GEN));
d(KPG, "DH", P11KeyPairGenerator, s("DiffieHellman"),
m(CKM_DH_PKCS_KEY_PAIR_GEN));
@@ -583,6 +582,7 @@
d(KF, "RSA", P11RSAKeyFactory,
m(CKM_RSA_PKCS_KEY_PAIR_GEN, CKM_RSA_PKCS, CKM_RSA_X_509));
d(KF, "DSA", P11DSAKeyFactory,
+ s("1.3.14.3.2.12", "1.2.840.10040.4.1", "OID.1.2.840.10040.4.1"),
m(CKM_DSA_KEY_PAIR_GEN, CKM_DSA, CKM_DSA_SHA1));
d(KF, "DH", P11DHKeyFactory, s("DiffieHellman"),
m(CKM_DH_PKCS_KEY_PAIR_GEN, CKM_DH_PKCS_DERIVE));
@@ -609,6 +609,7 @@
d(SKF, "DESede", P11SecretKeyFactory,
m(CKM_DES3_CBC));
d(SKF, "AES", P11SecretKeyFactory,
+ s("2.16.840.1.101.3.4.1", "OID.2.16.840.1.101.3.4.1"),
m(CKM_AES_CBC));
d(SKF, "Blowfish", P11SecretKeyFactory,
m(CKM_BLOWFISH_CBC));
@@ -635,10 +636,28 @@
m(CKM_DES3_ECB));
d(CIP, "AES/CBC/NoPadding", P11Cipher,
m(CKM_AES_CBC));
+ d(CIP, "AES_128/CBC/NoPadding", P11Cipher,
+ s("2.16.840.1.101.3.4.1.2", "OID.2.16.840.1.101.3.4.1.2"),
+ m(CKM_AES_CBC));
+ d(CIP, "AES_192/CBC/NoPadding", P11Cipher,
+ s("2.16.840.1.101.3.4.1.22", "OID.2.16.840.1.101.3.4.1.22"),
+ m(CKM_AES_CBC));
+ d(CIP, "AES_256/CBC/NoPadding", P11Cipher,
+ s("2.16.840.1.101.3.4.1.42", "OID.2.16.840.1.101.3.4.1.42"),
+ m(CKM_AES_CBC));
d(CIP, "AES/CBC/PKCS5Padding", P11Cipher,
m(CKM_AES_CBC_PAD, CKM_AES_CBC));
d(CIP, "AES/ECB/NoPadding", P11Cipher,
m(CKM_AES_ECB));
+ d(CIP, "AES_128/ECB/NoPadding", P11Cipher,
+ s("2.16.840.1.101.3.4.1.1", "OID.2.16.840.1.101.3.4.1.1"),
+ m(CKM_AES_ECB));
+ d(CIP, "AES_192/ECB/NoPadding", P11Cipher,
+ s("2.16.840.1.101.3.4.1.21", "OID.2.16.840.1.101.3.4.1.21"),
+ m(CKM_AES_ECB));
+ d(CIP, "AES_256/ECB/NoPadding", P11Cipher,
+ s("2.16.840.1.101.3.4.1.41", "OID.2.16.840.1.101.3.4.1.41"),
+ m(CKM_AES_ECB));
d(CIP, "AES/ECB/PKCS5Padding", P11Cipher, s("AES"),
m(CKM_AES_ECB));
d(CIP, "AES/CTR/NoPadding", P11Cipher,
@@ -654,13 +673,16 @@
d(CIP, "RSA/ECB/NoPadding", P11RSACipher,
m(CKM_RSA_X_509));
- d(SIG, "RawDSA", P11Signature, s("NONEwithDSA"),
+ d(SIG, "RawDSA", P11Signature, s("NONEwithDSA"),
m(CKM_DSA));
- d(SIG, "DSA", P11Signature, s("SHA1withDSA"),
+ d(SIG, "DSA", P11Signature,
+ s("SHA1withDSA", "1.3.14.3.2.13", "1.3.14.3.2.27",
+ "1.2.840.10040.4.3", "OID.1.2.840.10040.4.3"),
m(CKM_DSA_SHA1, CKM_DSA));
d(SIG, "NONEwithECDSA", P11Signature,
m(CKM_ECDSA));
- d(SIG, "SHA1withECDSA", P11Signature, s("ECDSA"),
+ d(SIG, "SHA1withECDSA", P11Signature,
+ s("ECDSA", "1.2.840.10045.4.1", "OID.1.2.840.10045.4.1"),
m(CKM_ECDSA_SHA1, CKM_ECDSA));
d(SIG, "SHA224withECDSA", P11Signature,
s("1.2.840.10045.4.3.1", "OID.1.2.840.10045.4.3.1"),
@@ -675,10 +697,14 @@
s("1.2.840.10045.4.3.4", "OID.1.2.840.10045.4.3.4"),
m(CKM_ECDSA));
d(SIG, "MD2withRSA", P11Signature,
+ s("1.2.840.113549.1.1.2", "OID.1.2.840.113549.1.1.2"),
m(CKM_MD2_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509));
d(SIG, "MD5withRSA", P11Signature,
+ s("1.2.840.113549.1.1.4", "OID.1.2.840.113549.1.1.4"),
m(CKM_MD5_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509));
d(SIG, "SHA1withRSA", P11Signature,
+ s("1.2.840.113549.1.1.5", "OID.1.2.840.113549.1.1.5",
+ "1.3.14.3.2.29"),
m(CKM_SHA1_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509));
d(SIG, "SHA224withRSA", P11Signature,
s("1.2.840.113549.1.1.14", "OID.1.2.840.113549.1.1.14"),
--- a/jdk/src/share/classes/sun/security/provider/DSA.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/provider/DSA.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -45,14 +45,15 @@
/**
* The Digital Signature Standard (using the Digital Signature
- * Algorithm), as described in fips186 of the National Instute of
- * Standards and Technology (NIST), using fips180-1 (SHA-1).
+ * Algorithm), as described in fips186-3 of the National Instute of
+ * Standards and Technology (NIST), using SHA digest algorithms
+ * from FIPS180-3.
*
* This file contains both the signature implementation for the
- * commonly used SHA1withDSA (DSS) as well as RawDSA, used by TLS
- * among others. RawDSA expects the 20 byte SHA-1 digest as input
- * via update rather than the original data like other signature
- * implementations.
+ * commonly used SHA1withDSA (DSS), SHA224withDSA, SHA256withDSA,
+ * as well as RawDSA, used by TLS among others. RawDSA expects
+ * the 20 byte SHA-1 digest as input via update rather than the
+ * original data like other signature implementations.
*
* @author Benjamin Renaud
*
@@ -78,129 +79,19 @@
/* The private key, if any */
private BigInteger presetX;
- /* The random seed used to generate k */
- private int[] Kseed;
-
- /* The random seed used to generate k (specified by application) */
- private byte[] KseedAsByteArray;
-
- /*
- * The random seed used to generate k
- * (prevent the same Kseed from being used twice in a row
- */
- private int[] previousKseed;
-
/* The RNG used to output a seed for generating k */
private SecureRandom signingRandom;
+ /* The message digest object used */
+ private final MessageDigest md;
+
/**
* Construct a blank DSA object. It must be
* initialized before being usable for signing or verifying.
*/
- DSA() {
+ DSA(MessageDigest md) {
super();
- }
-
- /**
- * Return the 20 byte hash value and reset the digest.
- */
- abstract byte[] getDigest() throws SignatureException;
-
- /**
- * Reset the digest.
- */
- abstract void resetDigest();
-
- /**
- * Standard SHA1withDSA implementation.
- */
- public static final class SHA1withDSA extends DSA {
-
- /* The SHA hash for the data */
- private final MessageDigest dataSHA;
-
- public SHA1withDSA() throws NoSuchAlgorithmException {
- dataSHA = MessageDigest.getInstance("SHA-1");
- }
-
- /**
- * Update a byte to be signed or verified.
- */
- protected void engineUpdate(byte b) {
- dataSHA.update(b);
- }
-
- /**
- * Update an array of bytes to be signed or verified.
- */
- protected void engineUpdate(byte[] data, int off, int len) {
- dataSHA.update(data, off, len);
- }
-
- protected void engineUpdate(ByteBuffer b) {
- dataSHA.update(b);
- }
-
- byte[] getDigest() {
- return dataSHA.digest();
- }
-
- void resetDigest() {
- dataSHA.reset();
- }
- }
-
- /**
- * RawDSA implementation.
- *
- * RawDSA requires the data to be exactly 20 bytes long. If it is
- * not, a SignatureException is thrown when sign()/verify() is called
- * per JCA spec.
- */
- public static final class RawDSA extends DSA {
-
- // length of the SHA-1 digest (20 bytes)
- private final static int SHA1_LEN = 20;
-
- // 20 byte digest buffer
- private final byte[] digestBuffer;
-
- // offset into the buffer
- private int ofs;
-
- public RawDSA() {
- digestBuffer = new byte[SHA1_LEN];
- }
-
- protected void engineUpdate(byte b) {
- if (ofs == SHA1_LEN) {
- ofs = SHA1_LEN + 1;
- return;
- }
- digestBuffer[ofs++] = b;
- }
-
- protected void engineUpdate(byte[] data, int off, int len) {
- if (ofs + len > SHA1_LEN) {
- ofs = SHA1_LEN + 1;
- return;
- }
- System.arraycopy(data, off, digestBuffer, ofs, len);
- ofs += len;
- }
-
- byte[] getDigest() throws SignatureException {
- if (ofs != SHA1_LEN) {
- throw new SignatureException
- ("Data for RawDSA must be exactly 20 bytes long");
- }
- ofs = 0;
- return digestBuffer;
- }
-
- void resetDigest() {
- ofs = 0;
- }
+ this.md = md;
}
/**
@@ -217,13 +108,25 @@
throw new InvalidKeyException("not a DSA private key: " +
privateKey);
}
+
java.security.interfaces.DSAPrivateKey priv =
(java.security.interfaces.DSAPrivateKey)privateKey;
+
+ // check for algorithm specific constraints before doing initialization
+ DSAParams params = priv.getParams();
+ if (params == null) {
+ throw new InvalidKeyException("DSA private key lacks parameters");
+ }
+ checkKey(params);
+
+ this.params = params;
this.presetX = priv.getX();
this.presetY = null;
- initialize(priv.getParams());
+ this.presetP = params.getP();
+ this.presetQ = params.getQ();
+ this.presetG = params.getG();
+ this.md.reset();
}
-
/**
* Initialize the DSA object with a DSA public key.
*
@@ -240,17 +143,43 @@
}
java.security.interfaces.DSAPublicKey pub =
(java.security.interfaces.DSAPublicKey)publicKey;
+
+ // check for algorithm specific constraints before doing initialization
+ DSAParams params = pub.getParams();
+ if (params == null) {
+ throw new InvalidKeyException("DSA public key lacks parameters");
+ }
+ checkKey(params);
+
+ this.params = params;
this.presetY = pub.getY();
this.presetX = null;
- initialize(pub.getParams());
+ this.presetP = params.getP();
+ this.presetQ = params.getQ();
+ this.presetG = params.getG();
+ this.md.reset();
}
- private void initialize(DSAParams params) throws InvalidKeyException {
- resetDigest();
- setParams(params);
+ /**
+ * Update a byte to be signed or verified.
+ */
+ protected void engineUpdate(byte b) {
+ md.update(b);
}
/**
+ * Update an array of bytes to be signed or verified.
+ */
+ protected void engineUpdate(byte[] data, int off, int len) {
+ md.update(data, off, len);
+ }
+
+ protected void engineUpdate(ByteBuffer b) {
+ md.update(b);
+ }
+
+
+ /**
* Sign all the data thus far updated. The signature is formatted
* according to the Canonical Encoding Rules, returned as a DER
* sequence of Integer, r and s.
@@ -352,23 +281,51 @@
}
}
+ @Deprecated
+ protected void engineSetParameter(String key, Object param) {
+ throw new InvalidParameterException("No parameter accepted");
+ }
+
+ @Deprecated
+ protected Object engineGetParameter(String key) {
+ return null;
+ }
+
+ protected void checkKey(DSAParams params) throws InvalidKeyException {
+ // FIPS186-3 states in sec4.2 that a hash function which provides
+ // a lower security strength than the (L, N) pair ordinarily should
+ // not be used.
+ int valueN = params.getQ().bitLength();
+ if (valueN > md.getDigestLength()*8) {
+ throw new InvalidKeyException("Key is too strong for this signature algorithm");
+ }
+ }
+
private BigInteger generateR(BigInteger p, BigInteger q, BigInteger g,
BigInteger k) {
BigInteger temp = g.modPow(k, p);
- return temp.remainder(q);
- }
+ return temp.mod(q);
+ }
private BigInteger generateS(BigInteger x, BigInteger q,
BigInteger r, BigInteger k) throws SignatureException {
- byte[] s2 = getDigest();
- BigInteger temp = new BigInteger(1, s2);
+ byte[] s2;
+ try {
+ s2 = md.digest();
+ } catch (RuntimeException re) {
+ // Only for RawDSA due to its 20-byte length restriction
+ throw new SignatureException(re.getMessage());
+ }
+ // get the leftmost min(N, outLen) bits of the digest value
+ int nBytes = q.bitLength()/8;
+ if (nBytes < s2.length) {
+ s2 = Arrays.copyOfRange(s2, 0, nBytes);
+ }
+ BigInteger z = new BigInteger(1, s2);
BigInteger k1 = k.modInverse(q);
- BigInteger s = x.multiply(r);
- s = temp.add(s);
- s = k1.multiply(s);
- return s.remainder(q);
+ return x.multiply(r).add(z).multiply(k1).mod(q);
}
private BigInteger generateW(BigInteger p, BigInteger q,
@@ -380,54 +337,41 @@
BigInteger q, BigInteger g, BigInteger w, BigInteger r)
throws SignatureException {
- byte[] s2 = getDigest();
- BigInteger temp = new BigInteger(1, s2);
+ byte[] s2;
+ try {
+ s2 = md.digest();
+ } catch (RuntimeException re) {
+ // Only for RawDSA due to its 20-byte length restriction
+ throw new SignatureException(re.getMessage());
+ }
+ // get the leftmost min(N, outLen) bits of the digest value
+ int nBytes = q.bitLength()/8;
+ if (nBytes < s2.length) {
+ s2 = Arrays.copyOfRange(s2, 0, nBytes);
+ }
+ BigInteger z = new BigInteger(1, s2);
- temp = temp.multiply(w);
- BigInteger u1 = temp.remainder(q);
-
- BigInteger u2 = (r.multiply(w)).remainder(q);
+ BigInteger u1 = z.multiply(w).mod(q);
+ BigInteger u2 = (r.multiply(w)).mod(q);
BigInteger t1 = g.modPow(u1,p);
BigInteger t2 = y.modPow(u2,p);
BigInteger t3 = t1.multiply(t2);
- BigInteger t5 = t3.remainder(p);
- return t5.remainder(q);
+ BigInteger t5 = t3.mod(p);
+ return t5.mod(q);
}
- /*
- * Please read bug report 4044247 for an alternative, faster,
- * NON-FIPS approved method to generate K
- */
- private BigInteger generateK(BigInteger q) {
-
- BigInteger k = null;
-
- // The application specified a Kseed for us to use.
- // Note that we do not allow usage of the same Kseed twice in a row
- if (Kseed != null && !Arrays.equals(Kseed, previousKseed)) {
- k = generateK(Kseed, q);
- if (k.signum() > 0 && k.compareTo(q) < 0) {
- previousKseed = new int [Kseed.length];
- System.arraycopy(Kseed, 0, previousKseed, 0, Kseed.length);
- return k;
- }
- }
-
- // The application did not specify a Kseed for us to use.
- // We'll generate a new Kseed by getting random bytes from
- // a SecureRandom object.
+ // NOTE: This following impl is defined in FIPS 186-3 AppendixB.2.2.
+ // Original DSS algos such as SHA1withDSA and RawDSA uses a different
+ // algorithm defined in FIPS 186-1 Sec3.2, and thus need to override this.
+ protected BigInteger generateK(BigInteger q) {
SecureRandom random = getSigningRandom();
+ byte[] kValue = new byte[q.bitLength()/8];
while (true) {
- int[] seed = new int[5];
-
- for (int i = 0; i < 5; i++)
- seed[i] = random.nextInt();
- k = generateK(seed, q);
+ random.nextBytes(kValue);
+ BigInteger k = new BigInteger(1, kValue).mod(q);
if (k.signum() > 0 && k.compareTo(q) < 0) {
- previousKseed = new int [seed.length];
- System.arraycopy(seed, 0, previousKseed, 0, seed.length);
return k;
}
}
@@ -435,7 +379,7 @@
// Use the application-specified SecureRandom Object if provided.
// Otherwise, use our default SecureRandom Object.
- private SecureRandom getSigningRandom() {
+ protected SecureRandom getSigningRandom() {
if (signingRandom == null) {
if (appRandom != null) {
signingRandom = appRandom;
@@ -447,171 +391,6 @@
}
/**
- * Compute k for a DSA signature.
- *
- * @param seed the seed for generating k. This seed should be
- * secure. This is what is refered to as the KSEED in the DSA
- * specification.
- *
- * @param g the g parameter from the DSA key pair.
- */
- private BigInteger generateK(int[] seed, BigInteger q) {
-
- // check out t in the spec.
- int[] t = { 0xEFCDAB89, 0x98BADCFE, 0x10325476,
- 0xC3D2E1F0, 0x67452301 };
- //
- int[] tmp = DSA.SHA_7(seed, t);
- byte[] tmpBytes = new byte[tmp.length * 4];
- for (int i = 0; i < tmp.length; i++) {
- int k = tmp[i];
- for (int j = 0; j < 4; j++) {
- tmpBytes[(i * 4) + j] = (byte) (k >>> (24 - (j * 8)));
- }
- }
- BigInteger k = new BigInteger(1, tmpBytes).mod(q);
- return k;
- }
-
- // Constants for each round
- private static final int round1_kt = 0x5a827999;
- private static final int round2_kt = 0x6ed9eba1;
- private static final int round3_kt = 0x8f1bbcdc;
- private static final int round4_kt = 0xca62c1d6;
-
- /**
- * Computes set 1 thru 7 of SHA-1 on m1. */
- static int[] SHA_7(int[] m1, int[] h) {
-
- int[] W = new int[80];
- System.arraycopy(m1,0,W,0,m1.length);
- int temp = 0;
-
- for (int t = 16; t <= 79; t++){
- temp = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16];
- W[t] = ((temp << 1) | (temp >>>(32 - 1)));
- }
-
- int a = h[0],b = h[1],c = h[2], d = h[3], e = h[4];
- for (int i = 0; i < 20; i++) {
- temp = ((a<<5) | (a>>>(32-5))) +
- ((b&c)|((~b)&d))+ e + W[i] + round1_kt;
- e = d;
- d = c;
- c = ((b<<30) | (b>>>(32-30)));
- b = a;
- a = temp;
- }
-
- // Round 2
- for (int i = 20; i < 40; i++) {
- temp = ((a<<5) | (a>>>(32-5))) +
- (b ^ c ^ d) + e + W[i] + round2_kt;
- e = d;
- d = c;
- c = ((b<<30) | (b>>>(32-30)));
- b = a;
- a = temp;
- }
-
- // Round 3
- for (int i = 40; i < 60; i++) {
- temp = ((a<<5) | (a>>>(32-5))) +
- ((b&c)|(b&d)|(c&d)) + e + W[i] + round3_kt;
- e = d;
- d = c;
- c = ((b<<30) | (b>>>(32-30)));
- b = a;
- a = temp;
- }
-
- // Round 4
- for (int i = 60; i < 80; i++) {
- temp = ((a<<5) | (a>>>(32-5))) +
- (b ^ c ^ d) + e + W[i] + round4_kt;
- e = d;
- d = c;
- c = ((b<<30) | (b>>>(32-30)));
- b = a;
- a = temp;
- }
- int[] md = new int[5];
- md[0] = h[0] + a;
- md[1] = h[1] + b;
- md[2] = h[2] + c;
- md[3] = h[3] + d;
- md[4] = h[4] + e;
- return md;
- }
-
-
- /**
- * This implementation recognizes the following parameter:<dl>
- *
- * <dt><tt>Kseed</tt>
- *
- * <dd>a byte array.
- *
- * </dl>
- *
- * @deprecated
- */
- @Deprecated
- protected void engineSetParameter(String key, Object param) {
- if (key.equals("KSEED")) {
- if (param instanceof byte[]) {
- Kseed = byteArray2IntArray((byte[])param);
- KseedAsByteArray = (byte[])param;
- } else {
- debug("unrecognized param: " + key);
- throw new InvalidParameterException("Kseed not a byte array");
- }
- } else {
- throw new InvalidParameterException("invalid parameter");
- }
- }
-
- /**
- * Return the value of the requested parameter. Recognized
- * parameters are:
- *
- * <dl>
- *
- * <dt><tt>Kseed</tt>
- *
- * <dd>a byte array.
- *
- * </dl>
- *
- * @return the value of the requested parameter.
- *
- * @see java.security.SignatureEngine
- *
- * @deprecated
- */
- @Deprecated
- protected Object engineGetParameter(String key) {
- if (key.equals("KSEED")) {
- return KseedAsByteArray;
- } else {
- return null;
- }
- }
-
- /**
- * Set the algorithm object.
- */
- private void setParams(DSAParams params) throws InvalidKeyException {
- if (params == null) {
- throw new InvalidKeyException("DSA public key lacks parameters");
- }
- this.params = params;
- this.presetP = params.getP();
- this.presetQ = params.getQ();
- this.presetG = params.getG();
- }
-
- /**
* Return a human readable rendition of the engine.
*/
public String toString() {
@@ -632,38 +411,6 @@
return printable;
}
- /*
- * Utility routine for converting a byte array into an int array
- */
- private int[] byteArray2IntArray(byte[] byteArray) {
-
- int j = 0;
- byte[] newBA;
- int mod = byteArray.length % 4;
-
- // guarantee that the incoming byteArray is a multiple of 4
- // (pad with 0's)
- switch (mod) {
- case 3: newBA = new byte[byteArray.length + 1]; break;
- case 2: newBA = new byte[byteArray.length + 2]; break;
- case 1: newBA = new byte[byteArray.length + 3]; break;
- default: newBA = new byte[byteArray.length + 0]; break;
- }
- System.arraycopy(byteArray, 0, newBA, 0, byteArray.length);
-
- // copy each set of 4 bytes in the byte array into an integer
- int[] newSeed = new int[newBA.length / 4];
- for (int i = 0; i < newBA.length; i += 4) {
- newSeed[j] = newBA[i + 3] & 0xFF;
- newSeed[j] |= (newBA[i + 2] << 8) & 0xFF00;
- newSeed[j] |= (newBA[i + 1] << 16) & 0xFF0000;
- newSeed[j] |= (newBA[i + 0] << 24) & 0xFF000000;
- j++;
- }
-
- return newSeed;
- }
-
private static void debug(Exception e) {
if (debug) {
e.printStackTrace();
@@ -675,4 +422,325 @@
System.err.println(s);
}
}
+
+ /**
+ * Standard SHA224withDSA implementation as defined in FIPS186-3.
+ */
+ public static final class SHA224withDSA extends DSA {
+ public SHA224withDSA() throws NoSuchAlgorithmException {
+ super(MessageDigest.getInstance("SHA-224"));
+ }
+ }
+
+ /**
+ * Standard SHA256withDSA implementation as defined in FIPS186-3.
+ */
+ public static final class SHA256withDSA extends DSA {
+ public SHA256withDSA() throws NoSuchAlgorithmException {
+ super(MessageDigest.getInstance("SHA-256"));
+ }
+ }
+
+ static class LegacyDSA extends DSA {
+ /* The random seed used to generate k */
+ private int[] kSeed;
+ /* The random seed used to generate k (specified by application) */
+ private byte[] kSeedAsByteArray;
+ /*
+ * The random seed used to generate k
+ * (prevent the same Kseed from being used twice in a row
+ */
+ private int[] kSeedLast;
+
+ public LegacyDSA(MessageDigest md) throws NoSuchAlgorithmException {
+ super(md);
+ }
+
+ @Deprecated
+ protected void engineSetParameter(String key, Object param) {
+ if (key.equals("KSEED")) {
+ if (param instanceof byte[]) {
+ kSeed = byteArray2IntArray((byte[])param);
+ kSeedAsByteArray = (byte[])param;
+ } else {
+ debug("unrecognized param: " + key);
+ throw new InvalidParameterException("kSeed not a byte array");
+ }
+ } else {
+ throw new InvalidParameterException("Unsupported parameter");
+ }
+ }
+
+ @Deprecated
+ protected Object engineGetParameter(String key) {
+ if (key.equals("KSEED")) {
+ return kSeedAsByteArray;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ protected void checkKey(DSAParams params) throws InvalidKeyException {
+ int valueL = params.getP().bitLength();
+ if (valueL > 1024) {
+ throw new InvalidKeyException("Key is too long for this algorithm");
+ }
+ }
+
+ /*
+ * Please read bug report 4044247 for an alternative, faster,
+ * NON-FIPS approved method to generate K
+ */
+ @Override
+ protected BigInteger generateK(BigInteger q) {
+ BigInteger k = null;
+
+ // The application specified a kSeed for us to use.
+ // Note: we dis-allow usage of the same Kseed twice in a row
+ if (kSeed != null && !Arrays.equals(kSeed, kSeedLast)) {
+ k = generateKUsingKSeed(kSeed, q);
+ if (k.signum() > 0 && k.compareTo(q) < 0) {
+ kSeedLast = kSeed.clone();
+ return k;
+ }
+ }
+
+ // The application did not specify a Kseed for us to use.
+ // We'll generate a new Kseed by getting random bytes from
+ // a SecureRandom object.
+ SecureRandom random = getSigningRandom();
+
+ while (true) {
+ int[] seed = new int[5];
+
+ for (int i = 0; i < 5; i++) seed[i] = random.nextInt();
+
+ k = generateKUsingKSeed(seed, q);
+ if (k.signum() > 0 && k.compareTo(q) < 0) {
+ kSeedLast = seed;
+ return k;
+ }
+ }
+ }
+
+ /**
+ * Compute k for the DSA signature as defined in the original DSS,
+ * i.e. FIPS186.
+ *
+ * @param seed the seed for generating k. This seed should be
+ * secure. This is what is refered to as the KSEED in the DSA
+ * specification.
+ *
+ * @param g the g parameter from the DSA key pair.
+ */
+ private BigInteger generateKUsingKSeed(int[] seed, BigInteger q) {
+
+ // check out t in the spec.
+ int[] t = { 0xEFCDAB89, 0x98BADCFE, 0x10325476,
+ 0xC3D2E1F0, 0x67452301 };
+ //
+ int[] tmp = SHA_7(seed, t);
+ byte[] tmpBytes = new byte[tmp.length * 4];
+ for (int i = 0; i < tmp.length; i++) {
+ int k = tmp[i];
+ for (int j = 0; j < 4; j++) {
+ tmpBytes[(i * 4) + j] = (byte) (k >>> (24 - (j * 8)));
+ }
+ }
+ BigInteger k = new BigInteger(1, tmpBytes).mod(q);
+ return k;
+ }
+
+ // Constants for each round
+ private static final int round1_kt = 0x5a827999;
+ private static final int round2_kt = 0x6ed9eba1;
+ private static final int round3_kt = 0x8f1bbcdc;
+ private static final int round4_kt = 0xca62c1d6;
+
+ /**
+ * Computes set 1 thru 7 of SHA-1 on m1. */
+ static int[] SHA_7(int[] m1, int[] h) {
+
+ int[] W = new int[80];
+ System.arraycopy(m1,0,W,0,m1.length);
+ int temp = 0;
+
+ for (int t = 16; t <= 79; t++){
+ temp = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16];
+ W[t] = ((temp << 1) | (temp >>>(32 - 1)));
+ }
+
+ int a = h[0],b = h[1],c = h[2], d = h[3], e = h[4];
+ for (int i = 0; i < 20; i++) {
+ temp = ((a<<5) | (a>>>(32-5))) +
+ ((b&c)|((~b)&d))+ e + W[i] + round1_kt;
+ e = d;
+ d = c;
+ c = ((b<<30) | (b>>>(32-30)));
+ b = a;
+ a = temp;
+ }
+
+ // Round 2
+ for (int i = 20; i < 40; i++) {
+ temp = ((a<<5) | (a>>>(32-5))) +
+ (b ^ c ^ d) + e + W[i] + round2_kt;
+ e = d;
+ d = c;
+ c = ((b<<30) | (b>>>(32-30)));
+ b = a;
+ a = temp;
+ }
+
+ // Round 3
+ for (int i = 40; i < 60; i++) {
+ temp = ((a<<5) | (a>>>(32-5))) +
+ ((b&c)|(b&d)|(c&d)) + e + W[i] + round3_kt;
+ e = d;
+ d = c;
+ c = ((b<<30) | (b>>>(32-30)));
+ b = a;
+ a = temp;
+ }
+
+ // Round 4
+ for (int i = 60; i < 80; i++) {
+ temp = ((a<<5) | (a>>>(32-5))) +
+ (b ^ c ^ d) + e + W[i] + round4_kt;
+ e = d;
+ d = c;
+ c = ((b<<30) | (b>>>(32-30)));
+ b = a;
+ a = temp;
+ }
+ int[] md = new int[5];
+ md[0] = h[0] + a;
+ md[1] = h[1] + b;
+ md[2] = h[2] + c;
+ md[3] = h[3] + d;
+ md[4] = h[4] + e;
+ return md;
+ }
+
+ /*
+ * Utility routine for converting a byte array into an int array
+ */
+ private int[] byteArray2IntArray(byte[] byteArray) {
+
+ int j = 0;
+ byte[] newBA;
+ int mod = byteArray.length % 4;
+
+ // guarantee that the incoming byteArray is a multiple of 4
+ // (pad with 0's)
+ switch (mod) {
+ case 3: newBA = new byte[byteArray.length + 1]; break;
+ case 2: newBA = new byte[byteArray.length + 2]; break;
+ case 1: newBA = new byte[byteArray.length + 3]; break;
+ default: newBA = new byte[byteArray.length + 0]; break;
+ }
+ System.arraycopy(byteArray, 0, newBA, 0, byteArray.length);
+
+ // copy each set of 4 bytes in the byte array into an integer
+ int[] newSeed = new int[newBA.length / 4];
+ for (int i = 0; i < newBA.length; i += 4) {
+ newSeed[j] = newBA[i + 3] & 0xFF;
+ newSeed[j] |= (newBA[i + 2] << 8) & 0xFF00;
+ newSeed[j] |= (newBA[i + 1] << 16) & 0xFF0000;
+ newSeed[j] |= (newBA[i + 0] << 24) & 0xFF000000;
+ j++;
+ }
+
+ return newSeed;
+ }
+ }
+
+ public static final class SHA1withDSA extends LegacyDSA {
+ public SHA1withDSA() throws NoSuchAlgorithmException {
+ super(MessageDigest.getInstance("SHA-1"));
+ }
+ }
+
+ /**
+ * RawDSA implementation.
+ *
+ * RawDSA requires the data to be exactly 20 bytes long. If it is
+ * not, a SignatureException is thrown when sign()/verify() is called
+ * per JCA spec.
+ */
+ public static final class RawDSA extends LegacyDSA {
+ // Internal special-purpose MessageDigest impl for RawDSA
+ // Only override whatever methods used
+ // NOTE: no clone support
+ public static final class NullDigest20 extends MessageDigest {
+ // 20 byte digest buffer
+ private final byte[] digestBuffer = new byte[20];
+
+ // offset into the buffer; use Integer.MAX_VALUE to indicate
+ // out-of-bound condition
+ private int ofs = 0;
+
+ protected NullDigest20() {
+ super("NullDigest20");
+ }
+ protected void engineUpdate(byte input) {
+ if (ofs == digestBuffer.length) {
+ ofs = Integer.MAX_VALUE;
+ } else {
+ digestBuffer[ofs++] = input;
+ }
+ }
+ protected void engineUpdate(byte[] input, int offset, int len) {
+ if (ofs + len > digestBuffer.length) {
+ ofs = Integer.MAX_VALUE;
+ } else {
+ System.arraycopy(input, offset, digestBuffer, ofs, len);
+ ofs += len;
+ }
+ }
+ protected final void engineUpdate(ByteBuffer input) {
+ int inputLen = input.remaining();
+ if (ofs + inputLen > digestBuffer.length) {
+ ofs = Integer.MAX_VALUE;
+ } else {
+ input.get(digestBuffer, ofs, inputLen);
+ ofs += inputLen;
+ }
+ }
+ protected byte[] engineDigest() throws RuntimeException {
+ if (ofs != digestBuffer.length) {
+ throw new RuntimeException
+ ("Data for RawDSA must be exactly 20 bytes long");
+ }
+ reset();
+ return digestBuffer;
+ }
+ protected int engineDigest(byte[] buf, int offset, int len)
+ throws DigestException {
+ if (ofs != digestBuffer.length) {
+ throw new DigestException
+ ("Data for RawDSA must be exactly 20 bytes long");
+ }
+ if (len < digestBuffer.length) {
+ throw new DigestException
+ ("Output buffer too small; must be at least 20 bytes");
+ }
+ System.arraycopy(digestBuffer, 0, buf, offset, digestBuffer.length);
+ reset();
+ return digestBuffer.length;
+ }
+
+ protected void engineReset() {
+ ofs = 0;
+ }
+ protected final int engineGetDigestLength() {
+ return digestBuffer.length;
+ }
+ }
+
+ public RawDSA() throws NoSuchAlgorithmException {
+ super(new NullDigest20());
+ }
+ }
}
--- a/jdk/src/share/classes/sun/security/provider/DSAKeyPairGenerator.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/provider/DSAKeyPairGenerator.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -48,8 +48,9 @@
public class DSAKeyPairGenerator extends KeyPairGenerator
implements java.security.interfaces.DSAKeyPairGenerator {
- /* The modulus length */
- private int modlen;
+ /* Length for prime P and subPrime Q in bits */
+ private int plen;
+ private int qlen;
/* whether to force new parameters to be generated for each KeyPair */
private boolean forceNewParameters;
@@ -65,20 +66,23 @@
initialize(1024, null);
}
- private static void checkStrength(int strength) {
- if ((strength < 512) || (strength > 1024) || (strength % 64 != 0)) {
+ private static void checkStrength(int sizeP, int sizeQ) {
+ if ((sizeP >= 512) && (sizeP <= 1024) && (sizeP % 64 == 0)
+ && sizeQ == 160) {
+ // traditional - allow for backward compatibility
+ // L=multiples of 64 and between 512 and 1024 (inclusive)
+ // N=160
+ } else if (sizeP == 2048 && (sizeQ == 224 || sizeQ == 256)) {
+ // L=2048, N=224 or 256
+ } else {
throw new InvalidParameterException
- ("Modulus size must range from 512 to 1024 "
- + "and be a multiple of 64");
+ ("Unsupported prime and subprime size combination: " +
+ sizeP + ", " + sizeQ);
}
}
public void initialize(int modlen, SecureRandom random) {
- checkStrength(modlen);
- this.random = random;
- this.modlen = modlen;
- this.params = null;
- this.forceNewParameters = false;
+ initialize(modlen, false, random);
}
/**
@@ -86,18 +90,27 @@
* is false, a set of pre-computed parameters is used.
*/
public void initialize(int modlen, boolean genParams, SecureRandom random) {
- checkStrength(modlen);
+ int subPrimeLen = -1;
+ if (modlen <= 1024) {
+ subPrimeLen = 160;
+ } else if (modlen == 2048) {
+ subPrimeLen = 224;
+ }
+ checkStrength(modlen, subPrimeLen);
if (genParams) {
params = null;
} else {
- params = ParameterCache.getCachedDSAParameterSpec(modlen);
+ params = ParameterCache.getCachedDSAParameterSpec(modlen,
+ subPrimeLen);
if (params == null) {
throw new InvalidParameterException
("No precomputed parameters for requested modulus size "
+ "available");
}
+
}
- this.modlen = modlen;
+ this.plen = modlen;
+ this.qlen = subPrimeLen;
this.random = random;
this.forceNewParameters = genParams;
}
@@ -136,9 +149,11 @@
}
private void initialize0(DSAParameterSpec params, SecureRandom random) {
- int modlen = params.getP().bitLength();
- checkStrength(modlen);
- this.modlen = modlen;
+ int sizeP = params.getP().bitLength();
+ int sizeQ = params.getQ().bitLength();
+ checkStrength(sizeP, sizeQ);
+ this.plen = sizeP;
+ this.qlen = sizeQ;
this.params = params;
this.random = random;
this.forceNewParameters = false;
@@ -156,11 +171,11 @@
try {
if (forceNewParameters) {
// generate new parameters each time
- spec = ParameterCache.getNewDSAParameterSpec(modlen, random);
+ spec = ParameterCache.getNewDSAParameterSpec(plen, qlen, random);
} else {
if (params == null) {
params =
- ParameterCache.getDSAParameterSpec(modlen, random);
+ ParameterCache.getDSAParameterSpec(plen, qlen, random);
}
spec = params;
}
@@ -203,43 +218,14 @@
*/
private BigInteger generateX(SecureRandom random, BigInteger q) {
BigInteger x = null;
+ byte[] temp = new byte[qlen];
while (true) {
- int[] seed = new int[5];
- for (int i = 0; i < 5; i++) {
- seed[i] = random.nextInt();
- }
- x = generateX(seed, q);
+ random.nextBytes(temp);
+ x = new BigInteger(1, temp).mod(q);
if (x.signum() > 0 && (x.compareTo(q) < 0)) {
- break;
+ return x;
}
}
- return x;
- }
-
- /**
- * Given a seed, generate the private key component of the key
- * pair. In the terminology used in the DSA specification
- * (FIPS-186) seed is the XSEED quantity.
- *
- * @param seed the seed to use to generate the private key.
- */
- BigInteger generateX(int[] seed, BigInteger q) {
-
- // check out t in the spec.
- int[] t = { 0x67452301, 0xEFCDAB89, 0x98BADCFE,
- 0x10325476, 0xC3D2E1F0 };
- //
-
- int[] tmp = DSA.SHA_7(seed, t);
- byte[] tmpBytes = new byte[tmp.length * 4];
- for (int i = 0; i < tmp.length; i++) {
- int k = tmp[i];
- for (int j = 0; j < 4; j++) {
- tmpBytes[(i * 4) + j] = (byte) (k >>> (24 - (j * 8)));
- }
- }
- BigInteger x = new BigInteger(1, tmpBytes).mod(q);
- return x;
}
/**
--- a/jdk/src/share/classes/sun/security/provider/DSAParameterGenerator.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/provider/DSAParameterGenerator.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -32,10 +32,12 @@
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.InvalidParameterException;
+import java.security.MessageDigest;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.InvalidParameterSpecException;
import java.security.spec.DSAParameterSpec;
+import java.security.spec.DSAGenParameterSpec;
/**
* This class generates parameters for the DSA algorithm. It uses a default
@@ -54,8 +56,14 @@
public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi {
- // the modulus length
- private int modLen = 1024; // default
+ // the default parameters
+ private static final DSAGenParameterSpec DEFAULTS =
+ new DSAGenParameterSpec(1024, 160, 160);
+
+ // the length of prime P, subPrime Q, and seed in bits
+ private int valueL = -1;
+ private int valueN = -1;
+ private int seedLen = -1;
// the source of randomness
private SecureRandom random;
@@ -65,11 +73,7 @@
private static final BigInteger ONE = BigInteger.valueOf(1);
private static final BigInteger TWO = BigInteger.valueOf(2);
- // Make a SHA-1 hash function
- private SHA sha;
-
public DSAParameterGenerator() {
- this.sha = new SHA();
}
/**
@@ -80,19 +84,18 @@
* @param random the source of randomness
*/
protected void engineInit(int strength, SecureRandom random) {
- /*
- * Bruce Schneier, "Applied Cryptography", 2nd Edition,
- * Description of DSA:
- * [...] The algorithm uses the following parameter:
- * p=a prime number L bits long, when L ranges from 512 to 1024 and is
- * a multiple of 64. [...]
- */
- if ((strength < 512) || (strength > 1024) || (strength % 64 != 0)) {
+ if ((strength >= 512) && (strength <= 1024) && (strength % 64 == 0)) {
+ this.valueN = 160;
+ } else if (strength == 2048) {
+ this.valueN = 224;
+// } else if (strength == 3072) {
+// this.valueN = 256;
+ } else {
throw new InvalidParameterException
- ("Prime size must range from 512 to 1024 "
- + "and be a multiple of 64");
+ ("Prime size should be 512 - 1024, or 2048");
}
- this.modLen = strength;
+ this.valueL = strength;
+ this.seedLen = valueN;
this.random = random;
}
@@ -100,7 +103,7 @@
* Initializes this parameter generator with a set of
* algorithm-specific parameter generation values.
*
- * @param params the set of algorithm-specific parameter generation values
+ * @param genParamSpec the set of algorithm-specific parameter generation values
* @param random the source of randomness
*
* @exception InvalidAlgorithmParameterException if the given parameter
@@ -109,7 +112,19 @@
protected void engineInit(AlgorithmParameterSpec genParamSpec,
SecureRandom random)
throws InvalidAlgorithmParameterException {
+ if (!(genParamSpec instanceof DSAGenParameterSpec)) {
throw new InvalidAlgorithmParameterException("Invalid parameter");
+ }
+ DSAGenParameterSpec dsaGenParams = (DSAGenParameterSpec) genParamSpec;
+ if (dsaGenParams.getPrimePLength() > 2048) {
+ throw new InvalidParameterException
+ ("Prime size should be 512 - 1024, or 2048");
+ }
+ // directly initialize using the already validated values
+ this.valueL = dsaGenParams.getPrimePLength();
+ this.valueN = dsaGenParams.getSubprimeQLength();
+ this.seedLen = dsaGenParams.getSeedLength();
+ this.random = random;
}
/**
@@ -123,15 +138,21 @@
if (this.random == null) {
this.random = new SecureRandom();
}
-
- BigInteger[] pAndQ = generatePandQ(this.random, this.modLen);
+ if (valueL == -1) {
+ try {
+ engineInit(DEFAULTS, this.random);
+ } catch (InvalidAlgorithmParameterException iape) {
+ // should never happen
+ }
+ }
+ BigInteger[] pAndQ = generatePandQ(this.random, valueL,
+ valueN, seedLen);
BigInteger paramP = pAndQ[0];
BigInteger paramQ = pAndQ[1];
BigInteger paramG = generateG(paramP, paramQ);
- DSAParameterSpec dsaParamSpec = new DSAParameterSpec(paramP,
- paramQ,
- paramG);
+ DSAParameterSpec dsaParamSpec =
+ new DSAParameterSpec(paramP, paramQ, paramG);
algParams = AlgorithmParameters.getInstance("DSA", "SUN");
algParams.init(dsaParamSpec);
} catch (InvalidParameterSpecException e) {
@@ -156,102 +177,98 @@
*
* @param random the source of randomness to generate the
* seed
- * @param L the size of <code>p</code>, in bits.
+ * @param valueL the size of <code>p</code>, in bits.
+ * @param valueN the size of <code>q</code>, in bits.
+ * @param seedLen the length of <code>seed</code>, in bits.
*
* @return an array of BigInteger, with <code>p</code> at index 0 and
- * <code>q</code> at index 1.
+ * <code>q</code> at index 1, the seed at index 2, and the counter value
+ * at index 3.
*/
- BigInteger[] generatePandQ(SecureRandom random, int L) {
- BigInteger[] result = null;
- byte[] seed = new byte[20];
-
- while(result == null) {
- for (int i = 0; i < 20; i++) {
- seed[i] = (byte)random.nextInt();
- }
- result = generatePandQ(seed, L);
+ private static BigInteger[] generatePandQ(SecureRandom random, int valueL,
+ int valueN, int seedLen) {
+ String hashAlg = null;
+ if (valueN == 160) {
+ hashAlg = "SHA";
+ } else if (valueN == 224) {
+ hashAlg = "SHA-224";
+ } else if (valueN == 256) {
+ hashAlg = "SHA-256";
}
- return result;
- }
+ MessageDigest hashObj = null;
+ try {
+ hashObj = MessageDigest.getInstance(hashAlg);
+ } catch (NoSuchAlgorithmException nsae) {
+ // should never happen
+ nsae.printStackTrace();
+ }
- /*
- * Generates the prime and subprime parameters for DSA.
- *
- * <p>The seed parameter corresponds to the <code>SEED</code> parameter
- * referenced in the FIPS specification of the DSA algorithm,
- * and L is the size of <code>p</code>, in bits.
- *
- * @param seed the seed to generate the parameters
- * @param L the size of <code>p</code>, in bits.
- *
- * @return an array of BigInteger, with <code>p</code> at index 0,
- * <code>q</code> at index 1, the seed at index 2, and the counter value
- * at index 3, or null if the seed does not yield suitable numbers.
- */
- BigInteger[] generatePandQ(byte[] seed, int L) {
+ /* Step 3, 4: Useful variables */
+ int outLen = hashObj.getDigestLength()*8;
+ int n = (valueL - 1) / outLen;
+ int b = (valueL - 1) % outLen;
+ byte[] seedBytes = new byte[seedLen/8];
+ BigInteger twoSl = TWO.pow(seedLen);
+ int primeCertainty = 80; // for 1024-bit prime P
+ if (valueL == 2048) {
+ primeCertainty = 112;
+ //} else if (valueL == 3072) {
+ // primeCertainty = 128;
+ }
- /* Useful variables */
- int g = seed.length * 8;
- int n = (L - 1) / 160;
- int b = (L - 1) % 160;
-
- BigInteger SEED = new BigInteger(1, seed);
- BigInteger TWOG = TWO.pow(2 * g);
-
- /* Step 2 (Step 1 is getting seed). */
- byte[] U1 = SHA(seed);
- byte[] U2 = SHA(toByteArray((SEED.add(ONE)).mod(TWOG)));
-
- xor(U1, U2);
- byte[] U = U1;
+ BigInteger resultP, resultQ, seed = null;
+ int counter;
+ while (true) {
+ do {
+ /* Step 5 */
+ random.nextBytes(seedBytes);
+ seed = new BigInteger(1, seedBytes);
- /* Step 3: For q by setting the msb and lsb to 1 */
- U[0] |= 0x80;
- U[19] |= 1;
- BigInteger q = new BigInteger(1, U);
-
- /* Step 5 */
- if (!q.isProbablePrime(80)) {
- return null;
+ /* Step 6 */
+ BigInteger U = new BigInteger(1, hashObj.digest(seedBytes)).
+ mod(TWO.pow(valueN - 1));
- } else {
- BigInteger V[] = new BigInteger[n + 1];
- BigInteger offset = TWO;
-
- /* Step 6 */
- for (int counter = 0; counter < 4096; counter++) {
-
- /* Step 7 */
- for (int k = 0; k <= n; k++) {
- BigInteger K = BigInteger.valueOf(k);
- BigInteger tmp = (SEED.add(offset).add(K)).mod(TWOG);
- V[k] = new BigInteger(1, SHA(toByteArray(tmp)));
- }
+ /* Step 7 */
+ resultQ = TWO.pow(valueN - 1).add(U).add(ONE). subtract(U.mod(TWO));
+ } while (!resultQ.isProbablePrime(primeCertainty));
- /* Step 8 */
- BigInteger W = V[0];
- for (int i = 1; i < n; i++) {
- W = W.add(V[i].multiply(TWO.pow(i * 160)));
- }
- W = W.add((V[n].mod(TWO.pow(b))).multiply(TWO.pow(n * 160)));
-
- BigInteger TWOLm1 = TWO.pow(L - 1);
- BigInteger X = W.add(TWOLm1);
+ /* Step 10 */
+ BigInteger offset = ONE;
+ /* Step 11 */
+ for (counter = 0; counter < 4*valueL; counter++) {
+ BigInteger V[] = new BigInteger[n + 1];
+ /* Step 11.1 */
+ for (int j = 0; j <= n; j++) {
+ BigInteger J = BigInteger.valueOf(j);
+ BigInteger tmp = (seed.add(offset).add(J)).mod(twoSl);
+ byte[] vjBytes = hashObj.digest(toByteArray(tmp));
+ V[j] = new BigInteger(1, vjBytes);
+ }
+ /* Step 11.2 */
+ BigInteger W = V[0];
+ for (int i = 1; i < n; i++) {
+ W = W.add(V[i].multiply(TWO.pow(i * outLen)));
+ }
+ W = W.add((V[n].mod(TWO.pow(b))).multiply(TWO.pow(n * outLen)));
+ /* Step 11.3 */
+ BigInteger twoLm1 = TWO.pow(valueL - 1);
+ BigInteger X = W.add(twoLm1);
+ /* Step 11.4, 11.5 */
+ BigInteger c = X.mod(resultQ.multiply(TWO));
+ resultP = X.subtract(c.subtract(ONE));
+ /* Step 11.6, 11.7 */
+ if (resultP.compareTo(twoLm1) > -1
+ && resultP.isProbablePrime(primeCertainty)) {
+ /* Step 11.8 */
+ BigInteger[] result = {resultP, resultQ, seed,
+ BigInteger.valueOf(counter)};
+ return result;
+ }
+ /* Step 11.9 */
+ offset = offset.add(BigInteger.valueOf(n)).add(ONE);
+ }
+ }
- /* Step 9 */
- BigInteger c = X.mod(q.multiply(TWO));
- BigInteger p = X.subtract(c.subtract(ONE));
-
- /* Step 10 - 13 */
- if (p.compareTo(TWOLm1) > -1 && p.isProbablePrime(80)) {
- BigInteger[] result = {p, q, SEED,
- BigInteger.valueOf(counter)};
- return result;
- }
- offset = offset.add(BigInteger.valueOf(n)).add(ONE);
- }
- return null;
- }
}
/*
@@ -262,31 +279,24 @@
*
* @param the <code>g</code>
*/
- BigInteger generateG(BigInteger p, BigInteger q) {
+ private static BigInteger generateG(BigInteger p, BigInteger q) {
BigInteger h = ONE;
+ /* Step 1 */
BigInteger pMinusOneOverQ = (p.subtract(ONE)).divide(q);
- BigInteger g = ONE;
- while (g.compareTo(TWO) < 0) {
- g = h.modPow(pMinusOneOverQ, p);
+ BigInteger resultG = ONE;
+ while (resultG.compareTo(TWO) < 0) {
+ /* Step 3 */
+ resultG = h.modPow(pMinusOneOverQ, p);
h = h.add(ONE);
}
- return g;
- }
-
- /*
- * Returns the SHA-1 digest of some data
- */
- private byte[] SHA(byte[] array) {
- sha.engineReset();
- sha.engineUpdate(array, 0, array.length);
- return sha.engineDigest();
+ return resultG;
}
/*
* Converts the result of a BigInteger.toByteArray call to an exact
* signed magnitude representation for any positive number.
*/
- private byte[] toByteArray(BigInteger bigInt) {
+ private static byte[] toByteArray(BigInteger bigInt) {
byte[] result = bigInt.toByteArray();
if (result[0] == 0) {
byte[] tmp = new byte[result.length - 1];
@@ -295,13 +305,4 @@
}
return result;
}
-
- /*
- * XORs U2 into U1
- */
- private void xor(byte[] U1, byte[] U2) {
- for (int i = 0; i < U1.length; i++) {
- U1[i] ^= U2[i];
- }
- }
}
--- a/jdk/src/share/classes/sun/security/provider/ParameterCache.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/provider/ParameterCache.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
package sun.security.provider;
import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
import java.math.BigInteger;
import java.security.*;
@@ -55,11 +56,17 @@
private final static Map<Integer,DHParameterSpec> dhCache;
/**
- * Return cached DSA parameters for the given keylength, or null if none
- * are available in the cache.
+ * Return cached DSA parameters for the given length combination of
+ * prime and subprime, or null if none are available in the cache.
*/
- public static DSAParameterSpec getCachedDSAParameterSpec(int keyLength) {
- return dsaCache.get(Integer.valueOf(keyLength));
+ public static DSAParameterSpec getCachedDSAParameterSpec(int primeLen,
+ int subprimeLen) {
+ // ensure the sum is unique in all cases, i.e.
+ // case#1: (512 <= p <= 1024) AND q=160
+ // case#2: p=2048 AND q=224
+ // case#3: p=2048 AND q=256
+ // (NOT-YET-SUPPORTED)case#4: p=3072 AND q=256
+ return dsaCache.get(Integer.valueOf(primeLen+subprimeLen));
}
/**
@@ -71,18 +78,39 @@
}
/**
- * Return DSA parameters for the given keylength. Uses cache if possible,
- * generates new parameters and adds them to the cache otherwise.
+ * Return DSA parameters for the given primeLen. Uses cache if
+ * possible, generates new parameters and adds them to the cache
+ * otherwise.
*/
- public static DSAParameterSpec getDSAParameterSpec(int keyLength,
+ public static DSAParameterSpec getDSAParameterSpec(int primeLen,
SecureRandom random)
- throws NoSuchAlgorithmException, InvalidParameterSpecException {
- DSAParameterSpec spec = getCachedDSAParameterSpec(keyLength);
+ throws NoSuchAlgorithmException, InvalidParameterSpecException,
+ InvalidAlgorithmParameterException {
+ if (primeLen <= 1024) {
+ return getDSAParameterSpec(primeLen, 160, random);
+ } else if (primeLen == 2048) {
+ return getDSAParameterSpec(primeLen, 224, random);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Return DSA parameters for the given primeLen and subprimeLen.
+ * Uses cache if possible, generates new parameters and adds them to the
+ * cache otherwise.
+ */
+ public static DSAParameterSpec getDSAParameterSpec(int primeLen,
+ int subprimeLen, SecureRandom random)
+ throws NoSuchAlgorithmException, InvalidParameterSpecException,
+ InvalidAlgorithmParameterException {
+ DSAParameterSpec spec =
+ getCachedDSAParameterSpec(primeLen, subprimeLen);
if (spec != null) {
return spec;
}
- spec = getNewDSAParameterSpec(keyLength, random);
- dsaCache.put(Integer.valueOf(keyLength), spec);
+ spec = getNewDSAParameterSpec(primeLen, subprimeLen, random);
+ dsaCache.put(Integer.valueOf(primeLen + subprimeLen), spec);
return spec;
}
@@ -107,28 +135,28 @@
}
/**
- * Return new DSA parameters for the given keylength. Do not lookup in
- * cache and do not cache the newly generated parameters. This method
- * really only exists for the legacy method
+ * Return new DSA parameters for the given length combination of prime and
+ * sub prime. Do not lookup in cache and do not cache the newly generated
+ * parameters. This method really only exists for the legacy method
* DSAKeyPairGenerator.initialize(int, boolean, SecureRandom).
*/
- public static DSAParameterSpec getNewDSAParameterSpec(int keyLength,
- SecureRandom random)
- throws NoSuchAlgorithmException, InvalidParameterSpecException {
+ public static DSAParameterSpec getNewDSAParameterSpec(int primeLen,
+ int subprimeLen, SecureRandom random)
+ throws NoSuchAlgorithmException, InvalidParameterSpecException,
+ InvalidAlgorithmParameterException {
AlgorithmParameterGenerator gen =
AlgorithmParameterGenerator.getInstance("DSA");
- gen.init(keyLength, random);
+ DSAGenParameterSpec genParams =
+ new DSAGenParameterSpec(primeLen, subprimeLen);
+ gen.init(genParams, random);
AlgorithmParameters params = gen.generateParameters();
DSAParameterSpec spec = params.getParameterSpec(DSAParameterSpec.class);
return spec;
}
static {
- // XXX change to ConcurrentHashMap once available
- dhCache = Collections.synchronizedMap
- (new HashMap<Integer,DHParameterSpec>());
- dsaCache = Collections.synchronizedMap
- (new HashMap<Integer,DSAParameterSpec>());
+ dhCache = new ConcurrentHashMap<Integer,DHParameterSpec>();
+ dsaCache = new ConcurrentHashMap<Integer,DSAParameterSpec>();
/*
* We support precomputed parameter for 512, 768 and 1024 bit
@@ -210,17 +238,99 @@
"83dfe15ae59f06928b665e807b552564014c3bfecf" +
"492a", 16);
- dsaCache.put(Integer.valueOf(512),
+ dsaCache.put(Integer.valueOf(512+160),
new DSAParameterSpec(p512, q512, g512));
- dsaCache.put(Integer.valueOf(768),
+ dsaCache.put(Integer.valueOf(768+160),
new DSAParameterSpec(p768, q768, g768));
- dsaCache.put(Integer.valueOf(1024),
+ dsaCache.put(Integer.valueOf(1024+160),
new DSAParameterSpec(p1024, q1024, g1024));
+ /*
+ * L = 2048, N = 224
+ * SEED = 584236080cfa43c09b02354135f4cc5198a19efada08bd866d601ba4
+ * counter = 2666
+ */
+ BigInteger p2048_224 =
+ new BigInteger("8f7935d9b9aae9bfabed887acf4951b6f32ec59e3b" +
+ "af3718e8eac4961f3efd3606e74351a9c4183339b8" +
+ "09e7c2ae1c539ba7475b85d011adb8b47987754984" +
+ "695cac0e8f14b3360828a22ffa27110a3d62a99345" +
+ "3409a0fe696c4658f84bdd20819c3709a01057b195" +
+ "adcd00233dba5484b6291f9d648ef883448677979c" +
+ "ec04b434a6ac2e75e9985de23db0292fc1118c9ffa" +
+ "9d8181e7338db792b730d7b9e349592f6809987215" +
+ "3915ea3d6b8b4653c633458f803b32a4c2e0f27290" +
+ "256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea1" +
+ "43de4b66ff04903ed5cf1623e158d487c608e97f21" +
+ "1cd81dca23cb6e380765f822e342be484c05763939" +
+ "601cd667", 16);
+
+ BigInteger q2048_224 =
+ new BigInteger("baf696a68578f7dfdee7fa67c977c785ef32b233ba" +
+ "e580c0bcd5695d", 16);
+
+ BigInteger g2048_224 =
+ new BigInteger("16a65c58204850704e7502a39757040d34da3a3478" +
+ "c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f" +
+ "37eeb1e09f3182d23c9043cb642f88004160edf9ca" +
+ "09b32076a79c32a627f2473e91879ba2c4e744bd20" +
+ "81544cb55b802c368d1fa83ed489e94e0fa0688e32" +
+ "428a5c78c478c68d0527b71c9a3abb0b0be12c4468" +
+ "9639e7d3ce74db101a65aa2b87f64c6826db3ec72f" +
+ "4b5599834bb4edb02f7c90e9a496d3a55d535bebfc" +
+ "45d4f619f63f3dedbb873925c2f224e07731296da8" +
+ "87ec1e4748f87efb5fdeb75484316b2232dee553dd" +
+ "af02112b0d1f02da30973224fe27aeda8b9d4b2922" +
+ "d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1" +
+ "ef17dbde", 16);
+ dsaCache.put(Integer.valueOf(2048+224),
+ new DSAParameterSpec(p2048_224, q2048_224, g2048_224));
+
+ /*
+ * L = 2048, N = 256
+ * SEED = b0b4417601b59cbc9d8ac8f935cadaec4f5fbb2f23785609ae466748d9b5a536
+ * counter = 497
+ */
+ BigInteger p2048_256 =
+ new BigInteger("95475cf5d93e596c3fcd1d902add02f427f5f3c721" +
+ "0313bb45fb4d5bb2e5fe1cbd678cd4bbdd84c9836b" +
+ "e1f31c0777725aeb6c2fc38b85f48076fa76bcd814" +
+ "6cc89a6fb2f706dd719898c2083dc8d896f84062e2" +
+ "c9c94d137b054a8d8096adb8d51952398eeca852a0" +
+ "af12df83e475aa65d4ec0c38a9560d5661186ff98b" +
+ "9fc9eb60eee8b030376b236bc73be3acdbd74fd61c" +
+ "1d2475fa3077b8f080467881ff7e1ca56fee066d79" +
+ "506ade51edbb5443a563927dbc4ba520086746175c" +
+ "8885925ebc64c6147906773496990cb714ec667304" +
+ "e261faee33b3cbdf008e0c3fa90650d97d3909c927" +
+ "5bf4ac86ffcb3d03e6dfc8ada5934242dd6d3bcca2" +
+ "a406cb0b", 16);
+
+ BigInteger q2048_256 =
+ new BigInteger("f8183668ba5fc5bb06b5981e6d8b795d30b8978d43" +
+ "ca0ec572e37e09939a9773", 16);
+
+ BigInteger g2048_256 =
+ new BigInteger("42debb9da5b3d88cc956e08787ec3f3a09bba5f48b" +
+ "889a74aaf53174aa0fbe7e3c5b8fcd7a53bef563b0" +
+ "e98560328960a9517f4014d3325fc7962bf1e04937" +
+ "0d76d1314a76137e792f3f0db859d095e4a5b93202" +
+ "4f079ecf2ef09c797452b0770e1350782ed57ddf79" +
+ "4979dcef23cb96f183061965c4ebc93c9c71c56b92" +
+ "5955a75f94cccf1449ac43d586d0beee43251b0b22" +
+ "87349d68de0d144403f13e802f4146d882e057af19" +
+ "b6f6275c6676c8fa0e3ca2713a3257fd1b27d0639f" +
+ "695e347d8d1cf9ac819a26ca9b04cb0eb9b7b03598" +
+ "8d15bbac65212a55239cfc7e58fae38d7250ab9991" +
+ "ffbc97134025fe8ce04c4399ad96569be91a546f49" +
+ "78693c7a", 16);
+ dsaCache.put(Integer.valueOf(2048+256),
+ new DSAParameterSpec(p2048_256, q2048_256, g2048_256));
// use DSA parameters for DH as well
dhCache.put(Integer.valueOf(512), new DHParameterSpec(p512, g512));
dhCache.put(Integer.valueOf(768), new DHParameterSpec(p768, g768));
dhCache.put(Integer.valueOf(1024), new DHParameterSpec(p1024, g1024));
+ dhCache.put(Integer.valueOf(2048), new DHParameterSpec(p2048_224, g2048_224));
}
}
--- a/jdk/src/share/classes/sun/security/provider/SunEntries.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/provider/SunEntries.java Mon Sep 10 09:00:00 2012 -0400
@@ -47,6 +47,10 @@
* SHA-2 family of hash functions includes SHA-224, SHA-256, SHA-384,
* and SHA-512.
*
+ * - SHA-224withDSA/SHA-256withDSA are the signature schemes
+ * described in FIPS 186-3. The associated object identifiers are
+ * "OID.2.16.840.1.101.3.4.3.1", and "OID.2.16.840.1.101.3.4.3.2".
+
* - DSA is the key generation scheme as described in FIPS 186.
* Aliases for DSA include the OID strings "OID.1.3.14.3.2.12"
* and "OID.1.2.840.10040.4.1".
@@ -106,11 +110,15 @@
map.put("Signature.SHA1withDSA", "sun.security.provider.DSA$SHA1withDSA");
map.put("Signature.NONEwithDSA", "sun.security.provider.DSA$RawDSA");
map.put("Alg.Alias.Signature.RawDSA", "NONEwithDSA");
+ map.put("Signature.SHA224withDSA", "sun.security.provider.DSA$SHA224withDSA");
+ map.put("Signature.SHA256withDSA", "sun.security.provider.DSA$SHA256withDSA");
String dsaKeyClasses = "java.security.interfaces.DSAPublicKey" +
"|java.security.interfaces.DSAPrivateKey";
map.put("Signature.SHA1withDSA SupportedKeyClasses", dsaKeyClasses);
map.put("Signature.NONEwithDSA SupportedKeyClasses", dsaKeyClasses);
+ map.put("Signature.SHA224withDSA SupportedKeyClasses", dsaKeyClasses);
+ map.put("Signature.SHA256withDSA SupportedKeyClasses", dsaKeyClasses);
map.put("Alg.Alias.Signature.DSA", "SHA1withDSA");
map.put("Alg.Alias.Signature.DSS", "SHA1withDSA");
@@ -124,6 +132,10 @@
map.put("Alg.Alias.Signature.1.2.840.10040.4.3", "SHA1withDSA");
map.put("Alg.Alias.Signature.1.3.14.3.2.13", "SHA1withDSA");
map.put("Alg.Alias.Signature.1.3.14.3.2.27", "SHA1withDSA");
+ map.put("Alg.Alias.Signature.OID.2.16.840.1.101.3.4.3.1", "SHA224withDSA");
+ map.put("Alg.Alias.Signature.2.16.840.1.101.3.4.3.1", "SHA224withDSA");
+ map.put("Alg.Alias.Signature.OID.2.16.840.1.101.3.4.3.2", "SHA256withDSA");
+ map.put("Alg.Alias.Signature.2.16.840.1.101.3.4.3.2", "SHA256withDSA");
/*
* Key Pair Generator engines
@@ -143,6 +155,8 @@
map.put("Alg.Alias.MessageDigest.SHA-1", "SHA");
map.put("Alg.Alias.MessageDigest.SHA1", "SHA");
+ map.put("Alg.Alias.MessageDigest.1.3.14.3.2.26", "SHA");
+ map.put("Alg.Alias.MessageDigest.OID.1.3.14.3.2.26", "SHA");
map.put("MessageDigest.SHA-224", "sun.security.provider.SHA2$SHA224");
map.put("Alg.Alias.MessageDigest.2.16.840.1.101.3.4.2.4", "SHA-224");
@@ -169,15 +183,17 @@
*/
map.put("AlgorithmParameters.DSA",
"sun.security.provider.DSAParameters");
+ map.put("Alg.Alias.AlgorithmParameters.OID.1.2.840.10040.4.1", "DSA");
+ map.put("Alg.Alias.AlgorithmParameters.1.2.840.10040.4.1", "DSA");
map.put("Alg.Alias.AlgorithmParameters.1.3.14.3.2.12", "DSA");
- map.put("Alg.Alias.AlgorithmParameters.1.2.840.10040.4.1", "DSA");
/*
* Key factories
*/
map.put("KeyFactory.DSA", "sun.security.provider.DSAKeyFactory");
+ map.put("Alg.Alias.KeyFactory.OID.1.2.840.10040.4.1", "DSA");
+ map.put("Alg.Alias.KeyFactory.1.2.840.10040.4.1", "DSA");
map.put("Alg.Alias.KeyFactory.1.3.14.3.2.12", "DSA");
- map.put("Alg.Alias.KeyFactory.1.2.840.10040.4.1", "DSA");
/*
* Certificates
@@ -234,9 +250,13 @@
/*
* KeySize
*/
+ map.put("Signature.NONEwithDSA KeySize", "1024");
map.put("Signature.SHA1withDSA KeySize", "1024");
- map.put("KeyPairGenerator.DSA KeySize", "1024");
- map.put("AlgorithmParameterGenerator.DSA KeySize", "1024");
+ map.put("Signature.SHA224withDSA KeySize", "2048");
+ map.put("Signature.SHA256withDSA KeySize", "2048");
+
+ map.put("KeyPairGenerator.DSA KeySize", "2048");
+ map.put("AlgorithmParameterGenerator.DSA KeySize", "2048");
/*
* Implementation type: software or hardware
--- a/jdk/src/share/classes/sun/security/x509/AlgorithmId.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/x509/AlgorithmId.java Mon Sep 10 09:00:00 2012 -0400
@@ -498,6 +498,9 @@
if (name.equalsIgnoreCase("EC")) {
return EC_oid;
}
+ if (name.equalsIgnoreCase("ECDH")) {
+ return AlgorithmId.ECDH_oid;
+ }
// Common signature types
if (name.equalsIgnoreCase("MD5withRSA")
@@ -517,6 +520,12 @@
|| name.equalsIgnoreCase("SHA-1/DSA")) {
return AlgorithmId.sha1WithDSA_oid;
}
+ if (name.equalsIgnoreCase("SHA224WithDSA")) {
+ return AlgorithmId.sha224WithDSA_oid;
+ }
+ if (name.equalsIgnoreCase("SHA256WithDSA")) {
+ return AlgorithmId.sha256WithDSA_oid;
+ }
if (name.equalsIgnoreCase("SHA1WithRSA")
|| name.equalsIgnoreCase("SHA1/RSA")) {
return AlgorithmId.sha1WithRSAEncryption_oid;
@@ -647,6 +656,7 @@
public static final ObjectIdentifier DSA_oid;
public static final ObjectIdentifier DSA_OIW_oid;
public static final ObjectIdentifier EC_oid = oid(1, 2, 840, 10045, 2, 1);
+ public static final ObjectIdentifier ECDH_oid = oid(1, 3, 132, 1, 12);
public static final ObjectIdentifier RSA_oid;
public static final ObjectIdentifier RSAEncryption_oid;
@@ -687,6 +697,10 @@
public static final ObjectIdentifier shaWithDSA_OIW_oid;
public static final ObjectIdentifier sha1WithDSA_OIW_oid;
public static final ObjectIdentifier sha1WithDSA_oid;
+ public static final ObjectIdentifier sha224WithDSA_oid =
+ oid(2, 16, 840, 1, 101, 3, 4, 3, 1);
+ public static final ObjectIdentifier sha256WithDSA_oid =
+ oid(2, 16, 840, 1, 101, 3, 4, 3, 2);
public static final ObjectIdentifier sha1WithECDSA_oid =
oid(1, 2, 840, 10045, 4, 1);
@@ -718,7 +732,6 @@
public static ObjectIdentifier pbeWithSHA1AndRC2_40_oid =
ObjectIdentifier.newInternal(new int[] {1, 2, 840, 113549, 1, 12, 1, 6});
-
static {
/*
* Note the preferred OIDs are named simply with no "OIW" or
@@ -878,6 +891,8 @@
nameTable.put(DSA_oid, "DSA");
nameTable.put(DSA_OIW_oid, "DSA");
nameTable.put(EC_oid, "EC");
+ nameTable.put(ECDH_oid, "ECDH");
+
nameTable.put(sha1WithECDSA_oid, "SHA1withECDSA");
nameTable.put(sha224WithECDSA_oid, "SHA224withECDSA");
nameTable.put(sha256WithECDSA_oid, "SHA256withECDSA");
@@ -888,6 +903,8 @@
nameTable.put(sha1WithDSA_oid, "SHA1withDSA");
nameTable.put(sha1WithDSA_OIW_oid, "SHA1withDSA");
nameTable.put(shaWithDSA_OIW_oid, "SHA1withDSA");
+ nameTable.put(sha224WithDSA_oid, "SHA224withDSA");
+ nameTable.put(sha256WithDSA_oid, "SHA256withDSA");
nameTable.put(sha1WithRSAEncryption_oid, "SHA1withRSA");
nameTable.put(sha1WithRSAEncryption_OIW_oid, "SHA1withRSA");
nameTable.put(sha224WithRSAEncryption_oid, "SHA224withRSA");
--- a/jdk/src/share/classes/sun/security/x509/CertificateIssuerUniqueIdentity.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.x509;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Enumeration;
-
-import sun.security.util.*;
-
-/**
- * This class defines the subject/issuer unique identity attribute
- * for the Certificate.
- *
- * @author Amit Kapoor
- * @author Hemma Prafullchandra
- * @see CertAttrSet
- */
-public class CertificateIssuerUniqueIdentity implements CertAttrSet<String> {
- private UniqueIdentity id;
-
- /**
- * Identifier for this attribute, to be used with the
- * get, set, delete methods of Certificate, x509 type.
- */
- public static final String IDENT = "x509.info.issuerID";
- /**
- * Sub attributes name for this CertAttrSet.
- */
- public static final String NAME = "issuerID";
- public static final String ID = "id";
-
- /**
- * Default constructor for the certificate attribute.
- *
- * @param key the UniqueIdentity
- */
- public CertificateIssuerUniqueIdentity(UniqueIdentity id) {
- this.id = id;
- }
-
- /**
- * Create the object, decoding the values from the passed DER stream.
- *
- * @param in the DerInputStream to read the UniqueIdentity from.
- * @exception IOException on decoding errors.
- */
- public CertificateIssuerUniqueIdentity(DerInputStream in)
- throws IOException {
- id = new UniqueIdentity(in);
- }
-
- /**
- * Create the object, decoding the values from the passed stream.
- *
- * @param in the InputStream to read the UniqueIdentity from.
- * @exception IOException on decoding errors.
- */
- public CertificateIssuerUniqueIdentity(InputStream in)
- throws IOException {
- DerValue val = new DerValue(in);
- id = new UniqueIdentity(val);
- }
-
- /**
- * Create the object, decoding the values from the passed DER value.
- *
- * @param in the DerValue to read the UniqueIdentity from.
- * @exception IOException on decoding errors.
- */
- public CertificateIssuerUniqueIdentity(DerValue val)
- throws IOException {
- id = new UniqueIdentity(val);
- }
-
- /**
- * Return the identity as user readable string.
- */
- public String toString() {
- if (id == null) return "";
- return (id.toString());
- }
-
- /**
- * Encode the identity in DER form to the stream.
- *
- * @param out the DerOutputStream to marshal the contents to.
- * @exception IOException on errors.
- */
- public void encode(OutputStream out) throws IOException {
- DerOutputStream tmp = new DerOutputStream();
- id.encode(tmp,DerValue.createTag(DerValue.TAG_CONTEXT,false,(byte)1));
-
- out.write(tmp.toByteArray());
- }
-
- /**
- * Set the attribute value.
- */
- public void set(String name, Object obj) throws IOException {
- if (!(obj instanceof UniqueIdentity)) {
- throw new IOException("Attribute must be of type UniqueIdentity.");
- }
- if (name.equalsIgnoreCase(ID)) {
- id = (UniqueIdentity)obj;
- } else {
- throw new IOException("Attribute name not recognized by " +
- "CertAttrSet: CertificateIssuerUniqueIdentity.");
- }
- }
-
- /**
- * Get the attribute value.
- */
- public UniqueIdentity get(String name) throws IOException {
- if (name.equalsIgnoreCase(ID)) {
- return (id);
- } else {
- throw new IOException("Attribute name not recognized by " +
- "CertAttrSet: CertificateIssuerUniqueIdentity.");
- }
- }
-
- /**
- * Delete the attribute value.
- */
- public void delete(String name) throws IOException {
- if (name.equalsIgnoreCase(ID)) {
- id = null;
- } else {
- throw new IOException("Attribute name not recognized by " +
- "CertAttrSet: CertificateIssuerUniqueIdentity.");
- }
- }
-
- /**
- * Return an enumeration of names of attributes existing within this
- * attribute.
- */
- public Enumeration<String> getElements() {
- AttributeNameEnumeration elements = new AttributeNameEnumeration();
- elements.addElement(ID);
-
- return (elements.elements());
- }
-
- /**
- * Return the name of this attribute.
- */
- public String getName() {
- return (NAME);
- }
-}
--- a/jdk/src/share/classes/sun/security/x509/CertificateSubjectUniqueIdentity.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package sun.security.x509;
-
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Enumeration;
-
-import sun.security.util.*;
-
-/**
- * This class defines the subject/issuer unique identity attribute
- * for the Certificate.
- *
- * @author Amit Kapoor
- * @author Hemma Prafullchandra
- * @see CertAttrSet
- */
-public class CertificateSubjectUniqueIdentity implements CertAttrSet<String> {
- /**
- * Identifier for this attribute, to be used with the
- * get, set, delete methods of Certificate, x509 type.
- */
- public static final String IDENT = "x509.info.subjectID";
- /**
- * Sub attributes name for this CertAttrSet.
- */
- public static final String NAME = "subjectID";
- public static final String ID = "id";
-
- private UniqueIdentity id;
-
- /**
- * Default constructor for the certificate attribute.
- *
- * @param key the UniqueIdentity
- */
- public CertificateSubjectUniqueIdentity(UniqueIdentity id) {
- this.id = id;
- }
-
- /**
- * Create the object, decoding the values from the passed DER stream.
- *
- * @param in the DerInputStream to read the UniqueIdentity from.
- * @exception IOException on decoding errors.
- */
- public CertificateSubjectUniqueIdentity(DerInputStream in)
- throws IOException {
- id = new UniqueIdentity(in);
- }
-
- /**
- * Create the object, decoding the values from the passed stream.
- *
- * @param in the InputStream to read the UniqueIdentity from.
- * @exception IOException on decoding errors.
- */
- public CertificateSubjectUniqueIdentity(InputStream in)
- throws IOException {
- DerValue val = new DerValue(in);
- id = new UniqueIdentity(val);
- }
-
- /**
- * Create the object, decoding the values from the passed DER value.
- *
- * @param in the DerValue to read the UniqueIdentity from.
- * @exception IOException on decoding errors.
- */
- public CertificateSubjectUniqueIdentity(DerValue val)
- throws IOException {
- id = new UniqueIdentity(val);
- }
-
- /**
- * Return the identity as user readable string.
- */
- public String toString() {
- if (id == null) return "";
- return(id.toString());
- }
-
- /**
- * Encode the identity in DER form to the stream.
- *
- * @param out the DerOutputStream to marshal the contents to.
- * @exception IOException on errors.
- */
- public void encode(OutputStream out) throws IOException {
- DerOutputStream tmp = new DerOutputStream();
- id.encode(tmp,DerValue.createTag(DerValue.TAG_CONTEXT,false,(byte)2));
-
- out.write(tmp.toByteArray());
- }
-
- /**
- * Set the attribute value.
- */
- public void set(String name, Object obj) throws IOException {
- if (!(obj instanceof UniqueIdentity)) {
- throw new IOException("Attribute must be of type UniqueIdentity.");
- }
- if (name.equalsIgnoreCase(ID)) {
- id = (UniqueIdentity)obj;
- } else {
- throw new IOException("Attribute name not recognized by " +
- "CertAttrSet: CertificateSubjectUniqueIdentity.");
- }
- }
-
- /**
- * Get the attribute value.
- */
- public UniqueIdentity get(String name) throws IOException {
- if (name.equalsIgnoreCase(ID)) {
- return(id);
- } else {
- throw new IOException("Attribute name not recognized by " +
- "CertAttrSet: CertificateSubjectUniqueIdentity.");
- }
- }
-
- /**
- * Delete the attribute value.
- */
- public void delete(String name) throws IOException {
- if (name.equalsIgnoreCase(ID)) {
- id = null;
- } else {
- throw new IOException("Attribute name not recognized by " +
- "CertAttrSet: CertificateSubjectUniqueIdentity.");
- }
- }
-
- /**
- * Return an enumeration of names of attributes existing within this
- * attribute.
- */
- public Enumeration<String> getElements() {
- AttributeNameEnumeration elements = new AttributeNameEnumeration();
- elements.addElement(ID);
-
- return (elements.elements());
- }
-
- /**
- * Return the name of this attribute.
- */
- public String getName() {
- return (NAME);
- }
-}
--- a/jdk/src/share/classes/sun/security/x509/X509CertImpl.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/x509/X509CertImpl.java Mon Sep 10 09:00:00 2012 -0400
@@ -1070,8 +1070,7 @@
return null;
try {
UniqueIdentity id = (UniqueIdentity)info.get(
- CertificateIssuerUniqueIdentity.NAME
- + DOT + CertificateIssuerUniqueIdentity.ID);
+ X509CertInfo.ISSUER_ID);
if (id == null)
return null;
else
@@ -1091,8 +1090,7 @@
return null;
try {
UniqueIdentity id = (UniqueIdentity)info.get(
- CertificateSubjectUniqueIdentity.NAME
- + DOT + CertificateSubjectUniqueIdentity.ID);
+ X509CertInfo.SUBJECT_ID);
if (id == null)
return null;
else
--- a/jdk/src/share/classes/sun/security/x509/X509CertInfo.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/classes/sun/security/x509/X509CertInfo.java Mon Sep 10 09:00:00 2012 -0400
@@ -75,8 +75,8 @@
public static final String VALIDITY = CertificateValidity.NAME;
public static final String SUBJECT = CertificateSubjectName.NAME;
public static final String KEY = CertificateX509Key.NAME;
- public static final String ISSUER_ID = CertificateIssuerUniqueIdentity.NAME;
- public static final String SUBJECT_ID = CertificateSubjectUniqueIdentity.NAME;
+ public static final String ISSUER_ID = "issuerID";
+ public static final String SUBJECT_ID = "subjectID";
public static final String EXTENSIONS = CertificateExtensions.NAME;
// X509.v1 data
@@ -89,8 +89,8 @@
protected CertificateX509Key pubKey = null;
// X509.v2 & v3 extensions
- protected CertificateIssuerUniqueIdentity issuerUniqueId = null;
- protected CertificateSubjectUniqueIdentity subjectUniqueId = null;
+ protected UniqueIdentity issuerUniqueId = null;
+ protected UniqueIdentity subjectUniqueId = null;
// X509.v3 extensions
protected CertificateExtensions extensions = null;
@@ -431,19 +431,11 @@
break;
case ATTR_ISSUER_ID:
- if (suffix == null) {
- setIssuerUniqueId(val);
- } else {
- issuerUniqueId.set(suffix, val);
- }
+ setIssuerUniqueId(val);
break;
case ATTR_SUBJECT_ID:
- if (suffix == null) {
- setSubjectUniqueId(val);
- } else {
- subjectUniqueId.set(suffix, val);
- }
+ setSubjectUniqueId(val);
break;
case ATTR_EXTENSIONS:
@@ -529,18 +521,10 @@
}
break;
case (ATTR_ISSUER_ID):
- if (suffix == null) {
- issuerUniqueId = null;
- } else {
- issuerUniqueId.delete(suffix);
- }
+ issuerUniqueId = null;
break;
case (ATTR_SUBJECT_ID):
- if (suffix == null) {
- subjectUniqueId = null;
- } else {
- subjectUniqueId.delete(suffix);
- }
+ subjectUniqueId = null;
break;
case (ATTR_EXTENSIONS):
if (suffix == null) {
@@ -626,23 +610,9 @@
return(serialNum.get(suffix));
}
case (ATTR_ISSUER_ID):
- if (suffix == null) {
- return(issuerUniqueId);
- } else {
- if (issuerUniqueId == null)
- return null;
- else
- return(issuerUniqueId.get(suffix));
- }
+ return(issuerUniqueId);
case (ATTR_SUBJECT_ID):
- if (suffix == null) {
- return(subjectUniqueId);
- } else {
- if (subjectUniqueId == null)
- return null;
- else
- return(subjectUniqueId.get(suffix));
- }
+ return(subjectUniqueId);
}
return null;
}
@@ -711,7 +681,7 @@
// Get the issuerUniqueId if present
tmp = in.getDerValue();
if (tmp.isContextSpecific((byte)1)) {
- issuerUniqueId = new CertificateIssuerUniqueIdentity(tmp);
+ issuerUniqueId = new UniqueIdentity(tmp);
if (in.available() == 0)
return;
tmp = in.getDerValue();
@@ -719,7 +689,7 @@
// Get the subjectUniqueId if present.
if (tmp.isContextSpecific((byte)2)) {
- subjectUniqueId = new CertificateSubjectUniqueIdentity(tmp);
+ subjectUniqueId = new UniqueIdentity(tmp);
if (in.available() == 0)
return;
tmp = in.getDerValue();
@@ -814,10 +784,12 @@
// Encode issuerUniqueId & subjectUniqueId.
if (issuerUniqueId != null) {
- issuerUniqueId.encode(tmp);
+ issuerUniqueId.encode(tmp, DerValue.createTag(DerValue.TAG_CONTEXT,
+ false,(byte)1));
}
if (subjectUniqueId != null) {
- subjectUniqueId.encode(tmp);
+ subjectUniqueId.encode(tmp, DerValue.createTag(DerValue.TAG_CONTEXT,
+ false,(byte)2));
}
// Write all the extensions.
@@ -946,11 +918,11 @@
if (version.compare(CertificateVersion.V2) < 0) {
throw new CertificateException("Invalid version");
}
- if (!(val instanceof CertificateIssuerUniqueIdentity)) {
+ if (!(val instanceof UniqueIdentity)) {
throw new CertificateException(
"IssuerUniqueId class type invalid.");
}
- issuerUniqueId = (CertificateIssuerUniqueIdentity)val;
+ issuerUniqueId = (UniqueIdentity)val;
}
/**
@@ -963,11 +935,11 @@
if (version.compare(CertificateVersion.V2) < 0) {
throw new CertificateException("Invalid version");
}
- if (!(val instanceof CertificateSubjectUniqueIdentity)) {
+ if (!(val instanceof UniqueIdentity)) {
throw new CertificateException(
"SubjectUniqueId class type invalid.");
}
- subjectUniqueId = (CertificateSubjectUniqueIdentity)val;
+ subjectUniqueId = (UniqueIdentity)val;
}
/**
--- a/jdk/src/share/native/sun/awt/medialib/mlib_sys.c Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/share/native/sun/awt/medialib/mlib_sys.c Mon Sep 10 09:00:00 2012 -0400
@@ -29,6 +29,8 @@
#ifdef MACOSX
#include <unistd.h>
#include <sys/param.h>
+#else
+#include <malloc.h>
#endif
#include <mlib_types.h>
#include <mlib_sys_proto.h>
--- a/jdk/src/solaris/bin/jexec.c Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/bin/jexec.c Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -80,6 +80,7 @@
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
+# include "jni.h"
# include "manifest_info.h"
#endif
--- a/jdk/src/solaris/classes/sun/awt/X11/XCheckboxMenuItemPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XCheckboxMenuItemPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -29,27 +29,12 @@
import java.awt.peer.*;
import java.awt.event.*;
-import java.lang.reflect.Field;
-import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
class XCheckboxMenuItemPeer extends XMenuItemPeer implements CheckboxMenuItemPeer {
/************************************************
*
- * Data members
- *
- ************************************************/
-
- /*
- * CheckboxMenuItem's fields
- */
- private final static Field f_state;
- static {
- f_state = SunToolkit.getField(CheckboxMenuItem.class, "state");
- }
-
- /************************************************
- *
* Construction
*
************************************************/
@@ -74,16 +59,8 @@
*
************************************************/
boolean getTargetState() {
- MenuItem target = getTarget();
- if (target == null) {
- return false;
- }
- try {
- return f_state.getBoolean(target);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return false;
+ return AWTAccessor.getCheckboxMenuItemAccessor()
+ .getState((CheckboxMenuItem)getTarget());
}
/************************************************
--- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedCanvasPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedCanvasPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -29,13 +29,8 @@
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetListener;
import java.awt.event.*;
-import java.awt.image.ColorModel;
-import java.awt.image.ImageObserver;
-import java.awt.image.ImageProducer;
-import java.awt.image.VolatileImage;
-import java.awt.peer.*;
import sun.awt.*;
-import java.lang.reflect.*;
+import sun.awt.AWTAccessor;
import sun.util.logging.PlatformLogger;
import java.util.*;
import static sun.awt.X11.XEmbedHelper.*;
@@ -454,16 +449,8 @@
}
}
- static Field bdataField;
static byte[] getBData(KeyEvent e) {
- try {
- if (bdataField == null) {
- bdataField = SunToolkit.getField(java.awt.AWTEvent.class, "bdata");
- }
- return (byte[])bdataField.get(e);
- } catch (IllegalAccessException ex) {
- return null;
- }
+ return AWTAccessor.getAWTEventAccessor().getBData(e);
}
void forwardKeyEvent(KeyEvent e) {
--- a/jdk/src/solaris/classes/sun/awt/X11/XEmbeddingContainer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbeddingContainer.java Mon Sep 10 09:00:00 2012 -0400
@@ -29,7 +29,7 @@
import java.util.HashMap;
import java.awt.event.KeyEvent;
import java.lang.reflect.*;
-import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
public class XEmbeddingContainer extends XEmbedHelper implements XEventDispatcher {
HashMap children = new HashMap();
@@ -127,20 +127,8 @@
}
}
- static Field bdata;
- byte[] getBData(KeyEvent e) {
- try {
- if (bdata == null) {
- bdata = SunToolkit.getField(java.awt.AWTEvent.class, "bdata");
- }
- return (byte[])bdata.get(e);
- } catch (IllegalAccessException ex) {
- return null;
- }
- }
-
void forwardKeyEvent(long child, KeyEvent e) {
- byte[] bdata = getBData(e);
+ byte[] bdata = AWTAccessor.getAWTEventAccessor().getBData(e);
long data = Native.toData(bdata);
if (data == 0) {
return;
--- a/jdk/src/solaris/classes/sun/awt/X11/XGlobalCursorManager.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XGlobalCursorManager.java Mon Sep 10 09:00:00 2012 -0400
@@ -27,10 +27,7 @@
import java.awt.*;
import java.awt.peer.ComponentPeer;
-import java.awt.peer.LightweightPeer;
import java.lang.ref.WeakReference;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
import sun.awt.AWTAccessor;
import sun.awt.GlobalCursorManager;
@@ -38,23 +35,6 @@
public final class XGlobalCursorManager extends GlobalCursorManager {
- private static Field field_pData;
- private static Field field_type;
- private static Class cursorClass;
- private static Method method_setPData;
- static {
- cursorClass = java.awt.Cursor.class;
- field_pData = SunToolkit.getField(cursorClass, "pData");
- field_type = SunToolkit.getField(cursorClass, "type");
- method_setPData = SunToolkit.getMethod(cursorClass, "setPData", new Class[] {long.class});
- if (field_pData == null || field_type == null || method_setPData == null) {
- System.out.println("Unable to initialize XGlobalCursorManager: ");
- Thread.dumpStack();
-
- }
- }
-
-
// cached nativeContainer
private WeakReference<Component> nativeContainer;
@@ -213,8 +193,8 @@
long pData = 0;
int type = 0;
try {
- pData = field_pData.getLong(c);
- type = field_type.getInt(c);
+ pData = AWTAccessor.getCursorAccessor().getPData(c);
+ type = AWTAccessor.getCursorAccessor().getType(c);
}
catch (Exception e)
{
@@ -284,7 +264,7 @@
static void setPData(Cursor c, long pData) {
try {
- method_setPData.invoke(c, pData);
+ AWTAccessor.getCursorAccessor().setPData(c, pData);
}
catch (Exception e)
{
--- a/jdk/src/solaris/classes/sun/awt/X11/XMenuBarPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XMenuBarPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -28,10 +28,9 @@
import java.awt.peer.*;
import java.awt.event.*;
-import java.lang.reflect.Field;
import java.util.Vector;
import sun.util.logging.PlatformLogger;
-import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
public class XMenuBarPeer extends XBaseMenuWindow implements MenuBarPeer {
@@ -67,15 +66,6 @@
private final static int BAR_ITEM_MARGIN_TOP = 2;
private final static int BAR_ITEM_MARGIN_BOTTOM = 2;
- //fields
- private static Field f_helpMenu;
- private static Field f_menus;
-
- static {
- f_helpMenu = SunToolkit.getField(MenuBar.class, "helpMenu");
- f_menus = SunToolkit.getField(MenuBar.class, "menus");
- }
-
/************************************************
*
* Mapping data
@@ -204,16 +194,12 @@
*/
void postInit(XCreateWindowParams params) {
super.postInit(params);
- Vector targetMenuVector = null;
- Menu targetHelpMenu = null;
- try {
- // Get menus from the target.
- targetMenuVector = (Vector)f_menus.get(menuBarTarget);
- targetHelpMenu = (Menu)f_helpMenu.get(menuBarTarget);
- reloadItems(targetMenuVector);
- } catch (IllegalAccessException iae) {
- iae.printStackTrace();
- }
+ // Get menus from the target.
+ Vector targetMenuVector = AWTAccessor.getMenuBarAccessor()
+ .getMenus(menuBarTarget);
+ Menu targetHelpMenu = AWTAccessor.getMenuBarAccessor()
+ .getHelpMenu(menuBarTarget);
+ reloadItems(targetMenuVector);
if (targetHelpMenu != null) {
addHelpMenu(targetHelpMenu);
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XMenuItemPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XMenuItemPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -28,10 +28,7 @@
import java.awt.peer.*;
import java.awt.event.*;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
public class XMenuItemPeer implements MenuItemPeer {
@@ -81,24 +78,6 @@
private final static int SEPARATOR_WIDTH = 20;
private final static int SEPARATOR_HEIGHT = 5;
- /*
- * MenuItem's fields & methods
- */
- private final static Field f_enabled;
- private final static Field f_label;
- private final static Field f_shortcut;
- private final static Method m_getFont;
- private final static Method m_isItemEnabled;
- private final static Method m_getActionCommand;
- static {
- f_enabled = SunToolkit.getField(MenuItem.class, "enabled");
- f_label = SunToolkit.getField(MenuItem.class, "label");
- f_shortcut = SunToolkit.getField(MenuItem.class, "shortcut");
-
- m_getFont = SunToolkit.getMethod(MenuComponent.class, "getFont_NoClientCode", null);
- m_getActionCommand = SunToolkit.getMethod(MenuItem.class, "getActionCommandImpl", null);
- m_isItemEnabled = SunToolkit.getMethod(MenuItem.class, "isItemEnabled", null);
- }
/************************************************
*
* Text Metrics
@@ -216,39 +195,22 @@
if (target == null) {
return XWindow.getDefaultFont();
}
- try {
- return (Font)m_getFont.invoke(target, new Object[0]);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- return XWindow.getDefaultFont();
+ return AWTAccessor.getMenuComponentAccessor().getFont_NoClientCode(target);
}
String getTargetLabel() {
if (target == null) {
return "";
}
- try {
- String label = (String)f_label.get(target);
- return (label == null) ? "" : label;
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return "";
+ String label = AWTAccessor.getMenuItemAccessor().getLabel(target);
+ return (label == null) ? "" : label;
}
boolean isTargetEnabled() {
if (target == null) {
return false;
}
- try {
- return f_enabled.getBoolean(target);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return false;
+ return AWTAccessor.getMenuItemAccessor().isEnabled(target);
}
/**
@@ -260,40 +222,21 @@
if (target == null) {
return false;
}
- try {
- return ((Boolean)m_isItemEnabled.invoke(target, new Object[0])).booleanValue();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- return false;
+ return AWTAccessor.getMenuItemAccessor().isItemEnabled(target);
}
String getTargetActionCommand() {
if (target == null) {
return "";
}
- try {
- return (String) m_getActionCommand.invoke(target,(Object[]) null);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- return "";
+ return AWTAccessor.getMenuItemAccessor().getActionCommandImpl(target);
}
MenuShortcut getTargetShortcut() {
if (target == null) {
return null;
}
- try {
- return (MenuShortcut)f_shortcut.get(target);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return null;
+ return AWTAccessor.getMenuItemAccessor().getShortcut(target);
}
String getShortcutText() {
--- a/jdk/src/solaris/classes/sun/awt/X11/XMenuPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XMenuPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -27,10 +27,9 @@
import java.awt.*;
import java.awt.peer.*;
-import java.lang.reflect.Field;
import java.util.Vector;
import sun.util.logging.PlatformLogger;
-import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
public class XMenuPeer extends XMenuItemPeer implements MenuPeer {
@@ -46,16 +45,6 @@
*/
XMenuWindow menuWindow;
-
- /*
- * Menu's fields & methods
- */
- private final static Field f_items;
-
- static {
- f_items = SunToolkit.getField(Menu.class, "items");
- }
-
/************************************************
*
* Construction
@@ -153,12 +142,7 @@
*
************************************************/
Vector getTargetItems() {
- try {
- return (Vector)f_items.get(getTarget());
- } catch (IllegalAccessException iae) {
- iae.printStackTrace();
- return null;
- }
+ return AWTAccessor.getMenuAccessor().getItems((Menu)getTarget());
}
/************************************************
--- a/jdk/src/solaris/classes/sun/awt/X11/XPopupMenuPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XPopupMenuPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -28,15 +28,10 @@
import java.awt.peer.*;
import java.awt.event.*;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-
import java.util.Vector;
+import sun.awt.AWTAccessor;
import sun.util.logging.PlatformLogger;
-import sun.awt.SunToolkit;
-
public class XPopupMenuPeer extends XMenuWindow implements PopupMenuPeer {
/************************************************
@@ -66,24 +61,6 @@
private final static int CAPTION_MARGIN_TOP = 4;
private final static int CAPTION_SEPARATOR_HEIGHT = 6;
- /*
- * Menu's fields & methods
- */
- //Fix for 6184485: Popup menu is not disabled on XToolkit even when calling setEnabled (false)
- private final static Field f_enabled;
- //Fix for 6267144: PIT: Popup menu label is not shown, XToolkit
- private final static Field f_label;
- private final static Method m_getFont;
- private final static Field f_items;
-
- static {
- f_enabled = SunToolkit.getField(MenuItem.class, "enabled");
- f_label = SunToolkit.getField(MenuItem.class, "label");
- f_items = SunToolkit.getField(Menu.class, "items");
- m_getFont = SunToolkit.getMethod(MenuComponent.class, "getFont_NoClientCode", null);
- }
-
-
/************************************************
*
* Construction
@@ -96,7 +73,7 @@
/************************************************
*
- * Implementaion of interface methods
+ * Implementation of interface methods
*
************************************************/
/*
@@ -189,27 +166,16 @@
if (popupMenuTarget == null) {
return XWindow.getDefaultFont();
}
- try {
- return (Font)m_getFont.invoke(popupMenuTarget, new Object[0]);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- return XWindow.getDefaultFont();
+ return AWTAccessor.getMenuComponentAccessor()
+ .getFont_NoClientCode(popupMenuTarget);
}
+ //Fix for 6267144: PIT: Popup menu label is not shown, XToolkit
String getTargetLabel() {
if (target == null) {
return "";
}
- try {
- String label = (String)f_label.get(popupMenuTarget);
- return (label == null) ? "" : label;
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return "";
+ return AWTAccessor.getMenuItemAccessor().getLabel(popupMenuTarget);
}
//Fix for 6184485: Popup menu is not disabled on XToolkit even when calling setEnabled (false)
@@ -217,21 +183,14 @@
if (popupMenuTarget == null) {
return false;
}
- try {
- return f_enabled.getBoolean(popupMenuTarget);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return false;
+ return AWTAccessor.getMenuItemAccessor().isEnabled(popupMenuTarget);
}
Vector getMenuTargetItems() {
- try {
- return (Vector)f_items.get(popupMenuTarget);
- } catch (IllegalAccessException iae) {
- iae.printStackTrace();
+ if (popupMenuTarget == null) {
return null;
}
+ return AWTAccessor.getMenuAccessor().getItems(popupMenuTarget);
}
/************************************************
--- a/jdk/src/solaris/classes/sun/awt/X11/XScrollPanePeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XScrollPanePeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -31,7 +31,6 @@
import java.lang.reflect.*;
import sun.awt.AWTAccessor;
-import sun.awt.SunToolkit;
class XScrollPanePeer extends XComponentPeer implements ScrollPanePeer, XScrollbarClient {
--- a/jdk/src/solaris/classes/sun/awt/X11/XSystemTrayPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XSystemTrayPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -27,10 +27,9 @@
import java.awt.*;
import java.awt.peer.SystemTrayPeer;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
import sun.awt.SunToolkit;
import sun.awt.AppContext;
+import sun.awt.AWTAccessor;
import sun.util.logging.PlatformLogger;
public class XSystemTrayPeer implements SystemTrayPeer, XMSelectionListener {
@@ -42,11 +41,6 @@
private volatile boolean available;
private final XMSelection selection = new XMSelection("_NET_SYSTEM_TRAY");
- private static final Method firePropertyChangeMethod =
- XToolkit.getMethod(SystemTray.class, "firePropertyChange", new Class[] {String.class, Object.class, Object.class});
- private static final Method addNotifyMethod = XToolkit.getMethod(TrayIcon.class, "addNotify", null);
- private static final Method removeNotifyMethod = XToolkit.getMethod(TrayIcon.class, "removeNotify", null);
-
private static final int SCREEN = 0;
private static final String SYSTEM_TRAY_PROPERTY_NAME = "systemTray";
private static final XAtom _NET_SYSTEM_TRAY = XAtom.get("_NET_SYSTEM_TRAY_S" + SCREEN);
@@ -157,44 +151,43 @@
return peerInstance;
}
- private void firePropertyChange(final String propertyName, final Object oldValue, final Object newValue) {
+ private void firePropertyChange(final String propertyName,
+ final Object oldValue,
+ final Object newValue) {
Runnable runnable = new Runnable() {
public void run() {
- Object[] args = new Object[] {propertyName, oldValue, newValue};
- invokeMethod(firePropertyChangeMethod, target, args);
+ AWTAccessor.getSystemTrayAccessor()
+ .firePropertyChange(target, propertyName, oldValue, newValue);
}
};
invokeOnEachAppContext(runnable);
}
private void createTrayPeers() {
- invokeOnEachTrayIcon(addNotifyMethod);
- }
-
- private void removeTrayPeers() {
- invokeOnEachTrayIcon(removeNotifyMethod);
- }
-
- private void invokeOnEachTrayIcon(final Method method) {
Runnable runnable = new Runnable() {
public void run() {
TrayIcon[] icons = target.getTrayIcons();
- for (TrayIcon ti : icons) {
- invokeMethod(method, ti, (Object[]) null);
+ try {
+ for (TrayIcon ti : icons) {
+ AWTAccessor.getTrayIconAccessor().addNotify(ti);
+ }
+ } catch (AWTException e) {
}
}
};
invokeOnEachAppContext(runnable);
}
- private void invokeMethod(Method method, Object obj, Object[] args) {
- try{
- method.invoke(obj, args);
- } catch (InvocationTargetException e){
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
+ private void removeTrayPeers() {
+ Runnable runnable = new Runnable() {
+ public void run() {
+ TrayIcon[] icons = target.getTrayIcons();
+ for (TrayIcon ti : icons) {
+ AWTAccessor.getTrayIconAccessor().removeNotify(ti);
+ }
+ }
+ };
+ invokeOnEachAppContext(runnable);
}
private void invokeOnEachAppContext(Runnable runnable) {
--- a/jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -1008,8 +1008,10 @@
// loading SystemFlavorMap and associated classes.
public void setTransferHandler(TransferHandler newHandler) {
TransferHandler oldHandler = (TransferHandler)
- getClientProperty(XTextTransferHelper.getTransferHandlerKey());
- putClientProperty(XTextTransferHelper.getTransferHandlerKey(),
+ getClientProperty(AWTAccessor.getClientPropertyKeyAccessor()
+ .getJComponent_TRANSFER_HANDLER());
+ putClientProperty(AWTAccessor.getClientPropertyKeyAccessor()
+ .getJComponent_TRANSFER_HANDLER(),
newHandler);
firePropertyChange("transferHandler", oldHandler, newHandler);
--- a/jdk/src/solaris/classes/sun/awt/X11/XTextFieldPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTextFieldPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -691,8 +691,10 @@
// loading SystemFlavorMap and associated classes.
public void setTransferHandler(TransferHandler newHandler) {
TransferHandler oldHandler = (TransferHandler)
- getClientProperty(XTextTransferHelper.getTransferHandlerKey());
- putClientProperty(XTextTransferHelper.getTransferHandlerKey(),
+ getClientProperty(AWTAccessor.getClientPropertyKeyAccessor()
+ .getJComponent_TRANSFER_HANDLER());
+ putClientProperty(AWTAccessor.getClientPropertyKeyAccessor()
+ .getJComponent_TRANSFER_HANDLER(),
newHandler);
firePropertyChange("transferHandler", oldHandler, newHandler);
--- a/jdk/src/solaris/classes/sun/awt/X11/XTextTransferHelper.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.awt.X11;
-
-import java.lang.reflect.Field;
-import sun.awt.SunToolkit;
-
-class XTextTransferHelper {
- private static Object transferHandlerKey = null;
- static Object getTransferHandlerKey() {
- if (transferHandlerKey == null) {
- try {
- Class clazz = Class.forName("javax.swing.ClientPropertyKey");
- Field field = SunToolkit.getField(clazz, "JComponent_TRANSFER_HANDLER");
- transferHandlerKey = field.get(null);
- } catch (IllegalAccessException ex) {
- return null;
- } catch (ClassNotFoundException cnfe) {
- cnfe.printStackTrace();
- }
- }
- return transferHandlerKey;
- }
-}
--- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Mon Sep 10 09:00:00 2012 -0400
@@ -41,8 +41,6 @@
import java.awt.image.ColorModel;
import java.awt.peer.*;
import java.beans.PropertyChangeListener;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.*;
@@ -50,10 +48,10 @@
import javax.swing.UIDefaults;
import sun.awt.*;
import sun.font.FontConfigManager;
-import sun.font.FontManager;
import sun.java2d.SunGraphicsEnvironment;
import sun.misc.PerformanceLogger;
import sun.print.PrintJob2D;
+import sun.security.action.GetPropertyAction;
import sun.security.action.GetBooleanAction;
import sun.util.logging.PlatformLogger;
@@ -113,7 +111,6 @@
private static volatile int screenWidth = -1, screenHeight = -1; // Dimensions of default screen
static long awt_defaultFg; // Pixel
private static XMouseInfoPeer xPeer;
- private static Method m_removeSourceEvents;
static {
initSecurityWarning();
@@ -131,8 +128,6 @@
initIDs();
setBackingStoreType();
}
- m_removeSourceEvents = SunToolkit.getMethod(EventQueue.class, "removeSourceEvents", new Class[] {Object.class, Boolean.TYPE}) ;
-
noisyAwtHandler = AccessController.doPrivileged(new GetBooleanAction("sun.awt.noisyerrorhandler"));
}
@@ -223,7 +218,8 @@
static void initSecurityWarning() {
// Enable warning only for internal builds
- String runtime = getSystemProperty("java.runtime.version");
+ String runtime = AccessController.doPrivileged(
+ new GetPropertyAction("java.runtime.version"));
securityWarningEnabled = (runtime != null && runtime.contains("internal"));
}
@@ -1101,8 +1097,8 @@
*/
public synchronized static boolean getSunAwtDisableGtkFileDialogs() {
if (sunAwtDisableGtkFileDialogs == null) {
- sunAwtDisableGtkFileDialogs =
- getBooleanSystemProperty("sun.awt.disableGtkFileDialogs");
+ sunAwtDisableGtkFileDialogs = AccessController.doPrivileged(
+ new GetBooleanAction("sun.awt.disableGtkFileDialogs"));
}
return sunAwtDisableGtkFileDialogs.booleanValue();
}
@@ -2090,17 +2086,11 @@
return null;
}
- static void removeSourceEvents(EventQueue queue, Object source, boolean removeAllEvents) {
- try {
- m_removeSourceEvents.invoke(queue, source, removeAllEvents);
- }
- catch (IllegalAccessException e)
- {
- e.printStackTrace();
- }
- catch (InvocationTargetException e) {
- e.printStackTrace();
- }
+ static void removeSourceEvents(EventQueue queue,
+ Object source,
+ boolean removeAllEvents) {
+ AWTAccessor.getEventQueueAccessor()
+ .removeSourceEvents(queue, source, removeAllEvents);
}
public boolean isAlwaysOnTopSupported() {
--- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java Mon Sep 10 09:00:00 2012 -0400
@@ -126,10 +126,6 @@
native void getWindowBounds(long window, long x, long y, long width, long height);
private native static void initIDs();
- private static Field isPostedField;
- private static Field rawCodeField;
- private static Field primaryLevelUnicodeField;
- private static Field extendedKeyCodeField;
static {
initIDs();
}
@@ -398,20 +394,11 @@
static Method m_sendMessage;
static void sendEvent(final AWTEvent e) {
- if (isPostedField == null) {
- isPostedField = SunToolkit.getField(AWTEvent.class, "isPosted");
- }
// The uses of this method imply that the incoming event is system-generated
SunToolkit.setSystemGenerated(e);
PeerEvent pe = new PeerEvent(Toolkit.getDefaultToolkit(), new Runnable() {
public void run() {
- try {
- isPostedField.setBoolean(e, true);
- } catch (IllegalArgumentException e) {
- assert(false);
- } catch (IllegalAccessException e) {
- assert(false);
- }
+ AWTAccessor.getAWTEventAccessor().setPosted(e);
((Component)e.getSource()).dispatchEvent(e);
}
}, PeerEvent.ULTIMATE_PRIORITY_EVENT);
@@ -1428,16 +1415,8 @@
}
- static Field bdata;
static void setBData(KeyEvent e, byte[] data) {
- try {
- if (bdata == null) {
- bdata = SunToolkit.getField(java.awt.AWTEvent.class, "bdata");
- }
- bdata.set(e, data);
- } catch (IllegalAccessException ex) {
- assert false;
- }
+ AWTAccessor.getAWTEventAccessor().setBData(e, data);
}
public void postKeyEvent(int id, long when, int keyCode, int keyChar,
@@ -1447,15 +1426,6 @@
{
long jWhen = XToolkit.nowMillisUTC_offset(when);
int modifiers = getModifiers(state, 0, keyCode);
- if (rawCodeField == null) {
- rawCodeField = XToolkit.getField(KeyEvent.class, "rawCode");
- }
- if (primaryLevelUnicodeField == null) {
- primaryLevelUnicodeField = XToolkit.getField(KeyEvent.class, "primaryLevelUnicode");
- }
- if (extendedKeyCodeField == null) {
- extendedKeyCodeField = XToolkit.getField(KeyEvent.class, "extendedKeyCode");
- }
KeyEvent ke = new KeyEvent((Component)getEventSource(), id, jWhen,
modifiers, keyCode, (char)keyChar, keyLocation);
@@ -1463,15 +1433,11 @@
byte[] data = Native.toBytes(event, eventSize);
setBData(ke, data);
}
- try {
- rawCodeField.set(ke, rawCode);
- primaryLevelUnicodeField.set(ke, (long)unicodeFromPrimaryKeysym);
- extendedKeyCodeField.set(ke, (long)extendedKeyCode);
- } catch (IllegalArgumentException e) {
- assert(false);
- } catch (IllegalAccessException e) {
- assert(false);
- }
+
+ AWTAccessor.KeyEventAccessor kea = AWTAccessor.getKeyEventAccessor();
+ kea.setRawCode(ke, rawCode);
+ kea.setPrimaryLevelUnicode(ke, (long)unicodeFromPrimaryKeysym);
+ kea.setExtendedKeyCode(ke, (long)extendedKeyCode);
postEventToEventQueue(ke);
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Mon Sep 10 09:00:00 2012 -0400
@@ -27,6 +27,7 @@
import java.security.AccessController;
import java.security.PrivilegedAction;
+import sun.security.action.GetPropertyAction;
import sun.misc.*;
final public class XlibWrapper
@@ -590,12 +591,8 @@
static final boolean isBuildInternal;
static {
- String dataModelProp = (String)AccessController.doPrivileged(
- new PrivilegedAction() {
- public Object run() {
- return System.getProperty("sun.arch.data.model");
- }
- });
+ String dataModelProp = AccessController.doPrivileged(
+ new GetPropertyAction("sun.arch.data.model"));
try {
dataModel = Integer.parseInt(dataModelProp);
} catch (Exception e) {
@@ -647,7 +644,8 @@
}
private static boolean getBuildInternal() {
- String javaVersion = XToolkit.getSystemProperty("java.version");
+ String javaVersion = AccessController.doPrivileged(
+ new GetPropertyAction("java.version"));
return javaVersion != null && javaVersion.contains("internal");
}
--- a/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -27,7 +27,6 @@
import java.awt.*;
import java.awt.peer.*;
import java.lang.ref.WeakReference;
-import java.lang.reflect.Method;
import sun.awt.SunToolkit;
import sun.awt.Win32GraphicsDevice;
import sun.awt.PaintEventDispatcher;
--- a/jdk/src/windows/classes/sun/awt/windows/WMouseDragGestureRecognizer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WMouseDragGestureRecognizer.java Mon Sep 10 09:00:00 2012 -0400
@@ -39,8 +39,6 @@
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
-import java.lang.reflect.*;
-
import sun.awt.dnd.SunDragSourceContextPeer;
/**
--- a/jdk/src/windows/classes/sun/awt/windows/WPopupMenuPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WPopupMenuPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -26,9 +26,7 @@
import java.awt.*;
import java.awt.peer.*;
-import java.lang.reflect.Field;
-import sun.awt.SunToolkit;
import sun.awt.AWTAccessor;
public class WPopupMenuPeer extends WMenuPeer implements PopupMenuPeer {
--- a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Mon Sep 10 09:00:00 2012 -0400
@@ -31,8 +31,6 @@
import java.beans.*;
-import java.lang.reflect.*;
-
import java.util.*;
import java.util.List;
import sun.util.logging.PlatformLogger;
--- a/jdk/test/com/sun/crypto/provider/Cipher/DES/PaddingTest.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/com/sun/crypto/provider/Cipher/DES/PaddingTest.java Mon Sep 10 09:00:00 2012 -0400
@@ -195,7 +195,7 @@
private static void diff(String fname1, String fname2) throws Exception {
if (!Arrays.equals(Files.readAllBytes(Paths.get(fname1)),
- Files.readAllBytes(Paths.get(fname1)))) {
+ Files.readAllBytes(Paths.get(fname2)))) {
throw new Exception(
"files " + fname1 + " and " + fname2 + " differ");
}
--- a/jdk/test/com/sun/crypto/provider/KeyAgreement/TestExponentSize.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/com/sun/crypto/provider/KeyAgreement/TestExponentSize.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 6330287 6331386
+ * @bug 6330287 6331386 7044060
* @summary verify that DHKeyPairGenerator returns keys of the expected size
* (modulus and exponent)
* -and-
@@ -57,7 +57,8 @@
* Sizes and values for various lengths.
*/
private enum Sizes {
- two56(256), three84(384), five12(512), seven68(768), ten24(1024);
+ two56(256), three84(384), five12(512), seven68(768), ten24(1024),
+ twenty48(2048);
private final int intSize;
private final BigInteger bigIntValue;
@@ -82,7 +83,8 @@
KeyPair kp;
KeyPairGenerator kpg = KeyPairGenerator.getInstance("DH", "SunJCE");
- // Sun's default uses a default psize of 1024/lsize of 512
+ // Sun's default uses a default psize of 1024 and
+ // lsize of (pSize / 2) but at least 384 bits
kp = kpg.generateKeyPair();
checkKeyPair(kp, Sizes.ten24, Sizes.five12);
@@ -114,6 +116,20 @@
kp = kpg.generateKeyPair();
checkKeyPair(kp, Sizes.seven68, Sizes.three84);
+ // test w/ only pSize
+ kpg.initialize(Sizes.twenty48.getIntSize());
+ kp = kpg.generateKeyPair();
+ checkKeyPair(kp, Sizes.twenty48, Sizes.ten24);
+
+ publicKey = (DHPublicKey)kp.getPublic();
+ p = publicKey.getParams().getP();
+ g = publicKey.getParams().getG();
+
+ // test w/ all values specified
+ kpg.initialize(new DHParameterSpec(p, g, Sizes.five12.getIntSize()));
+ kp = kpg.generateKeyPair();
+ checkKeyPair(kp, Sizes.twenty48, Sizes.five12);
+
System.out.println("OK");
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Frame/HugeFrame/HugeFrame.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ @test
+ @bug 7160609
+ @summary A window with huge dimensions shouldn't crash JVM
+ @author anthony.petrov@oracle.com: area=awt.toplevel
+ @run main HugeFrame
+*/
+
+import java.awt.*;
+
+public class HugeFrame {
+ public static void main(String[] args) throws Exception {
+ Frame f = new Frame("Huge");
+
+ // 8193+ should already produce a crash, but let's go extreme...
+ f.setBounds(10, 10, 30000, 500000);
+ f.setVisible(true);
+
+ // We would crash by now if the bug wasn't fixed
+ Thread.sleep(1000);
+ System.err.println(f.getBounds());
+
+ // Cleanup
+ f.dispose();
+ }
+}
--- a/jdk/test/java/beans/Introspector/4520754/Test4520754.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/beans/Introspector/4520754/Test4520754.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -58,7 +58,7 @@
public static void main(String[] args) {
// ensure that 4168475 does not regress
test4168475(Component.class);
- // AWT classes (sun.beans.infos.ComponentBeanInfo)
+ // AWT classes (com.sun.beans.infos.ComponentBeanInfo)
test(null, Button.class, Component.class, List.class, Menu.class, Panel.class);
// Swing classes (dt.jar)
test(null, JApplet.class, JButton.class, JCheckBox.class);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/Introspector/Test7189112.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7189112
+ * @summary Tests overridden getter
+ * @author Sergey Malenkov
+ */
+
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+
+public class Test7189112 {
+
+ public static void main(String[] args) throws IntrospectionException {
+ for (PropertyDescriptor pd : Introspector.getBeanInfo(MyBean.class).getPropertyDescriptors()) {
+ if (pd.getName().equals("value") && (null == pd.getWriteMethod())) {
+ throw new Error("The property setter is not found");
+ }
+ }
+ }
+
+ public static class BaseBean {
+
+ private Object value;
+
+ public Object getValue() {
+ return this.value;
+ }
+
+ public void setValue(Object value) {
+ this.value = value;
+ }
+ }
+
+ public static class MyBean extends BaseBean {
+ @Override
+ public String getValue() {
+ return (String) super.getValue();
+ }
+ }
+}
--- a/jdk/test/java/beans/PropertyEditor/6380849/TestPropertyEditor.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/beans/PropertyEditor/6380849/TestPropertyEditor.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,8 @@
* @bug 6380849
* @summary Tests PropertyEditor finder
* @author Sergey Malenkov
+ * @compile -XDignore.symbol.file TestPropertyEditor.java
+ * @run main TestPropertyEditor
*/
import editors.SecondBeanEditor;
@@ -36,17 +38,17 @@
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
-import sun.beans.editors.BooleanEditor;
-import sun.beans.editors.ByteEditor;
-import sun.beans.editors.ColorEditor;
-import sun.beans.editors.DoubleEditor;
-import sun.beans.editors.EnumEditor;
-import sun.beans.editors.FloatEditor;
-import sun.beans.editors.FontEditor;
-import sun.beans.editors.IntegerEditor;
-import sun.beans.editors.LongEditor;
-import sun.beans.editors.ShortEditor;
-import sun.beans.editors.StringEditor;
+import com.sun.beans.editors.BooleanEditor;
+import com.sun.beans.editors.ByteEditor;
+import com.sun.beans.editors.ColorEditor;
+import com.sun.beans.editors.DoubleEditor;
+import com.sun.beans.editors.EnumEditor;
+import com.sun.beans.editors.FloatEditor;
+import com.sun.beans.editors.FontEditor;
+import com.sun.beans.editors.IntegerEditor;
+import com.sun.beans.editors.LongEditor;
+import com.sun.beans.editors.ShortEditor;
+import com.sun.beans.editors.StringEditor;
public class TestPropertyEditor implements Runnable {
--- a/jdk/test/java/beans/PropertyEditor/Test6963811.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/beans/PropertyEditor/Test6963811.java Mon Sep 10 09:00:00 2012 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,10 +26,12 @@
* @bug 6963811
* @summary Tests deadlock in PropertyEditorManager
* @author Sergey Malenkov
+ * @compile -XDignore.symbol.file Test6963811.java
+ * @run main Test6963811
*/
import java.beans.PropertyEditorManager;
-import sun.beans.editors.StringEditor;
+import com.sun.beans.editors.StringEditor;
public class Test6963811 implements Runnable {
private final long time;
--- a/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java Mon Sep 10 09:00:00 2012 -0400
@@ -48,7 +48,7 @@
private static Map<String, PoolRecord> result = new HashMap<>();
private static boolean trace = false;
private static boolean testFailed = false;
- private static final int EXPECTED_NUM_POOLS = 2;
+ private static int numMemoryPools = 1;
private static final int NUM_GCS = 3;
private static final int THRESHOLD = 10;
private static Checker checker;
@@ -129,14 +129,19 @@
for (MemoryPoolMXBean p : pools) {
MemoryUsage u = p.getUsage();
if (p.isUsageThresholdSupported() && p.isCollectionUsageThresholdSupported()) {
+ if (p.getName().toLowerCase().contains("perm")) {
+ // if we have a "perm gen" pool increase the number of expected
+ // memory pools by one.
+ numMemoryPools++;
+ }
PoolRecord pr = new PoolRecord(p);
result.put(p.getName(), pr);
- if (result.size() == EXPECTED_NUM_POOLS) {
+ if (result.size() == numMemoryPools) {
break;
}
}
}
- if (result.size() != EXPECTED_NUM_POOLS) {
+ if (result.size() != numMemoryPools) {
throw new RuntimeException("Unexpected number of selected pools");
}
@@ -209,7 +214,7 @@
public void run() {
while (true) {
try {
- signals.acquire(EXPECTED_NUM_POOLS);
+ signals.acquire(numMemoryPools);
checkResult();
} catch (InterruptedException e) {
throw new RuntimeException(e);
--- a/jdk/test/java/lang/management/MemoryMXBean/MemoryTest.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/lang/management/MemoryMXBean/MemoryTest.java Mon Sep 10 09:00:00 2012 -0400
@@ -58,8 +58,11 @@
// They are: Copy/Scavenger + MSC + CodeCache manager
// (or equivalent for other collectors)
// Number of GC memory managers = 2
- private static int[] expectedMinNumPools = {3, 2};
- private static int[] expectedMaxNumPools = {3, 4};
+
+ // Hotspot VM 1.8+ after perm gen removal is expected to have only
+ // one non-heap memory pool
+ private static int[] expectedMinNumPools = {3, 1};
+ private static int[] expectedMaxNumPools = {3, 1};
private static int expectedNumGCMgrs = 2;
private static int expectedNumMgrs = expectedNumGCMgrs + 1;
private static String[] types = { "heap", "non-heap" };
@@ -80,6 +83,7 @@
private static void checkMemoryPools() throws Exception {
List pools = ManagementFactory.getMemoryPoolMXBeans();
+ boolean hasPerm = false;
int[] numPools = new int[NUM_TYPES];
for (ListIterator iter = pools.listIterator(); iter.hasNext();) {
@@ -90,6 +94,16 @@
if (pool.getType() == MemoryType.NON_HEAP) {
numPools[NONHEAP]++;
}
+ if (pool.getName().toLowerCase().contains("perm")) {
+ hasPerm = true;
+ }
+ }
+
+ if (hasPerm) {
+ // If the VM has perm gen there will be between 2 and 4 non heap
+ // pools (4 if class data sharing is used)
+ expectedMinNumPools[NONHEAP] = 2;
+ expectedMaxNumPools[NONHEAP] = 4;
}
// Check the number of Memory pools
--- a/jdk/test/java/net/Authenticator/B4678055.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/Authenticator/B4678055.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 4678055
* @library ../../../sun/net/www/httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main B4678055
* @summary Basic Authentication fails with multiple realms
*/
@@ -119,13 +119,13 @@
is.close();
}
- static HttpServer server;
+ static TestHttpServer server;
public static void main (String[] args) throws Exception {
MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth);
try {
- server = new HttpServer (new B4678055(), 1, 10, 0);
+ server = new TestHttpServer (new B4678055(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort());
client ("http://localhost:"+server.getLocalPort()+"/d1/foo.html");
client ("http://localhost:"+server.getLocalPort()+"/d2/foo.html");
--- a/jdk/test/java/net/Authenticator/B4722333.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/Authenticator/B4722333.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 4722333
* @library ../../../sun/net/www/httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main B4722333
* @summary JRE Proxy Authentication Not Working with ISA2000
*/
@@ -114,13 +114,13 @@
is.close();
}
- static HttpServer server;
+ static TestHttpServer server;
public static void main (String[] args) throws Exception {
MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth);
try {
- server = new HttpServer (new B4722333(), 1, 10, 0);
+ server = new TestHttpServer (new B4722333(), 1, 10, 0);
System.out.println ("Server started: listening on port: " + server.getLocalPort());
client ("http://localhost:"+server.getLocalPort()+"/d1/d2/d3/foo.html");
client ("http://localhost:"+server.getLocalPort()+"/ASD/d3/x.html");
--- a/jdk/test/java/net/Authenticator/B4759514.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/Authenticator/B4759514.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 4759514
* @library ../../../sun/net/www/httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main B4759514
* @summary Digest Authentication is erroniously quoting the nc value, contrary to RFC 2617
*/
@@ -91,13 +91,13 @@
is.close();
}
- static HttpServer server;
+ static TestHttpServer server;
public static void main (String[] args) throws Exception {
MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth);
try {
- server = new HttpServer (new B4759514(), 1, 10, 0);
+ server = new TestHttpServer (new B4759514(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort());
client ("http://localhost:"+server.getLocalPort()+"/d1/foo.html");
} catch (Exception e) {
--- a/jdk/test/java/net/Authenticator/B4769350.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/Authenticator/B4769350.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 4769350
* @library ../../../sun/net/www/httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction AbstractCallback
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction AbstractCallback
* @run main/othervm B4769350 server
* @run main/othervm B4769350 proxy
* @summary proxy authentication username and password caching only works in serial case
@@ -142,10 +142,10 @@
switch (count) {
case 0:
errorReply (req, "Basic realm=\"realm1\"");
- HttpServer.rendezvous ("one", 2);
+ TestHttpServer.rendezvous ("one", 2);
break;
case 1:
- HttpServer.waitForCondition ("cond2");
+ TestHttpServer.waitForCondition ("cond2");
okReply (req);
break;
default:
@@ -158,11 +158,11 @@
switch (count) {
case 0:
errorReply (req, "Basic realm=\"realm2\"");
- HttpServer.rendezvous ("one", 2);
- HttpServer.setCondition ("cond1");
+ TestHttpServer.rendezvous ("one", 2);
+ TestHttpServer.setCondition ("cond1");
break;
case 1:
- HttpServer.waitForCondition ("cond2");
+ TestHttpServer.waitForCondition ("cond2");
okReply (req);
break;
default:
@@ -174,7 +174,7 @@
switch (count) {
case 0:
errorReply (req, "Basic realm=\"realm1\"");
- HttpServer.rendezvous ("two", 2);
+ TestHttpServer.rendezvous ("two", 2);
break;
case 1:
okReply (req);
@@ -188,8 +188,8 @@
switch (count) {
case 0:
errorReply (req, "Basic realm=\"realm2\"");
- HttpServer.rendezvous ("two", 2);
- HttpServer.setCondition ("cond2");
+ TestHttpServer.rendezvous ("two", 2);
+ TestHttpServer.setCondition ("cond2");
break;
case 1:
okReply (req);
@@ -207,7 +207,7 @@
void doT2a (HttpTransaction req, int count) throws IOException {
/* This will be called several times */
if (count == 1) {
- HttpServer.setCondition ("T2cond1");
+ TestHttpServer.setCondition ("T2cond1");
}
errorReply (req, "Basic realm=\"realm3\"");
}
@@ -233,7 +233,7 @@
switch (count) {
case 0:
proxyReply (req, "Basic realm=\"proxy\"");
- HttpServer.setCondition ("T3cond1");
+ TestHttpServer.setCondition ("T3cond1");
break;
case 1:
errorReply (req, "Basic realm=\"realm4\"");
@@ -260,7 +260,7 @@
}
};
- static HttpServer server;
+ static TestHttpServer server;
static MyAuthenticator auth = new MyAuthenticator ();
static int redirects = 4;
@@ -276,7 +276,7 @@
c4 = new Client (authority, "/test/realm2/t1d", false);
c1.start(); c2.start();
- HttpServer.waitForCondition ("cond1");
+ TestHttpServer.waitForCondition ("cond1");
c3.start(); c4.start();
c1.join(); c2.join(); c3.join(); c4.join();
@@ -294,7 +294,7 @@
c5 = new Client (authority, "/test/realm3/t2a", true);
c6 = new Client (authority, "/test/realm3/t2b", false);
c5.start ();
- HttpServer.waitForCondition ("T2cond1");
+ TestHttpServer.waitForCondition ("T2cond1");
c6.start ();
c5.join(); c6.join();
@@ -313,7 +313,7 @@
c8 = new Client (authority, "/test/realm4/t3b", false);
c9 = new Client (authority, "/test/realm4/t3c", false);
c7.start ();
- HttpServer.waitForCondition ("T3cond1");
+ TestHttpServer.waitForCondition ("T3cond1");
c8.start ();
c9.start ();
c7.join(); c8.join(); c9.join();
@@ -333,7 +333,7 @@
Authenticator.setDefault (auth);
boolean proxy = args[0].equals ("proxy");
try {
- server = new HttpServer (new CallBack(), 10, 1, 0);
+ server = new TestHttpServer (new CallBack(), 10, 1, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort());
if (proxy) {
System.setProperty ("http.proxyHost", "localhost");
--- a/jdk/test/java/net/Authenticator/B4921848.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/Authenticator/B4921848.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 4921848
* @library ../../../sun/net/www/httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main/othervm -Dhttp.auth.preference=basic B4921848
* @summary Allow user control over authentication schemes
*/
@@ -82,13 +82,13 @@
is.close();
}
- static HttpServer server;
+ static TestHttpServer server;
public static void main (String[] args) throws Exception {
MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth);
try {
- server = new HttpServer (new B4921848(), 1, 10, 0);
+ server = new TestHttpServer (new B4921848(), 1, 10, 0);
System.out.println ("Server started: listening on port: " + server.getLocalPort());
client ("http://localhost:"+server.getLocalPort()+"/d1/d2/d3/foo.html");
} catch (Exception e) {
--- a/jdk/test/java/net/Authenticator/B4933582.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/Authenticator/B4933582.java Mon Sep 10 09:00:00 2012 -0400
@@ -119,7 +119,7 @@
is.close();
}
- static HttpServer server;
+ static TestHttpServer server;
public static void main (String[] args) throws Exception {
firstTime = args[0].equals ("first");
@@ -128,11 +128,11 @@
CacheImpl cache;
try {
if (firstTime) {
- server = new HttpServer (new B4933582(), 1, 10, 0);
+ server = new TestHttpServer (new B4933582(), 1, 10, 0);
cache = new CacheImpl (server.getLocalPort());
} else {
cache = new CacheImpl ();
- server = new HttpServer(new B4933582(), 1, 10, cache.getPort());
+ server = new TestHttpServer(new B4933582(), 1, 10, cache.getPort());
}
AuthCacheValue.setAuthCache (cache);
System.out.println ("Server: listening on port: " + server.getLocalPort());
--- a/jdk/test/java/net/Authenticator/B4962064.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/Authenticator/B4962064.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 4962064
* @library ../../../sun/net/www/httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main/othervm B4962064
* @summary Extend Authenticator to provide access to request URI and server/proxy
*/
@@ -85,12 +85,12 @@
is.close();
}
- static HttpServer server;
+ static TestHttpServer server;
static URL urlsave;
public static void main (String[] args) throws Exception {
try {
- server = new HttpServer (new B4962064(), 1, 10, 0);
+ server = new TestHttpServer (new B4962064(), 1, 10, 0);
int port = server.getLocalPort();
System.setProperty ("http.proxyHost", "localhost");
System.setProperty ("http.proxyPort", Integer.toString (port));
--- a/jdk/test/java/net/CookieHandler/CookieManagerTest.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/CookieHandler/CookieManagerTest.java Mon Sep 10 09:00:00 2012 -0400
@@ -26,7 +26,7 @@
* @summary Unit test for java.net.CookieManager
* @bug 6244040
* @library ../../../sun/net/www/httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main/othervm -ea CookieManagerTest
* @author Edward Wang
*/
@@ -38,7 +38,7 @@
public class CookieManagerTest {
static CookieHttpTransaction httpTrans;
- static HttpServer server;
+ static TestHttpServer server;
public static void main(String[] args) throws Exception {
startHttpServer();
@@ -52,7 +52,7 @@
public static void startHttpServer() {
try {
httpTrans = new CookieHttpTransaction();
- server = new HttpServer(httpTrans, 1, 1, 0);
+ server = new TestHttpServer(httpTrans, 1, 1, 0);
} catch (IOException e) {
e.printStackTrace();
}
--- a/jdk/test/java/net/InetAddress/GetLocalHostWithSM.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/InetAddress/GetLocalHostWithSM.java Mon Sep 10 09:00:00 2012 -0400
@@ -41,14 +41,13 @@
public static void main(String[] args) throws Exception {
// try setting the local hostname
- try {
- System.setProperty("host.name", InetAddress.
- getLocalHost().
- getHostName());
- } catch (UnknownHostException e) {
- System.out.println("Cannot find the local hostname, " +
- "no nameserver entry found");
+ InetAddress localHost = InetAddress.getLocalHost();
+ if (localHost.isLoopbackAddress()) {
+ System.err.println("Local host name is resolved into a loopback address. Quit now!");
+ return;
}
+ System.setProperty("host.name", localHost.
+ getHostName());
String policyFileName = System.getProperty("test.src", ".") +
"/" + "policy.file";
System.setProperty("java.security.policy", policyFileName);
@@ -66,6 +65,7 @@
new MyAction(), null);
if (localHost1.equals(localHost2)) {
+ System.out.println("localHost1 = " + localHost1);
throw new RuntimeException("InetAddress.getLocalHost() test " +
" fails. localHost2 should be " +
" the real address instead of " +
--- a/jdk/test/java/net/ProxySelector/LoopbackAddresses.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/ProxySelector/LoopbackAddresses.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @bug 4924226
* @summary PIT: Can no launch jnlp application via 127.0.0.1 address on the web server
* @library ../../../sun/net/www/httptest/
- * @build ClosedChannelList HttpServer HttpTransaction HttpCallback
+ * @build ClosedChannelList TestHttpServer HttpTransaction HttpCallback
* @compile LoopbackAddresses.java
* @run main/othervm LoopbackAddresses
*/
@@ -39,7 +39,7 @@
*/
public class LoopbackAddresses implements HttpCallback {
- static HttpServer server;
+ static TestHttpServer server;
public void request (HttpTransaction req) {
req.setResponseEntityBody ("Hello .");
@@ -52,7 +52,7 @@
public static void main(String[] args) {
try {
- server = new HttpServer (new LoopbackAddresses(), 1, 10, 0);
+ server = new TestHttpServer (new LoopbackAddresses(), 1, 10, 0);
ProxyServer pserver = new ProxyServer(InetAddress.getByName("localhost"), server.getLocalPort());
// start proxy server
new Thread(pserver).start();
--- a/jdk/test/java/net/ProxySelector/ProxyTest.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/ProxySelector/ProxyTest.java Mon Sep 10 09:00:00 2012 -0400
@@ -26,7 +26,7 @@
* @bug 4696512
* @summary HTTP client: Improve proxy server configuration and selection
* @library ../../../sun/net/www/httptest/
- * @build ClosedChannelList HttpServer HttpTransaction HttpCallback
+ * @build ClosedChannelList TestHttpServer HttpTransaction HttpCallback
* @compile ProxyTest.java
* @run main/othervm -Dhttp.proxyHost=inexistant -Dhttp.proxyPort=8080 ProxyTest
*/
@@ -36,7 +36,7 @@
import java.util.ArrayList;
public class ProxyTest implements HttpCallback {
- static HttpServer server;
+ static TestHttpServer server;
public ProxyTest() {
}
@@ -74,7 +74,7 @@
throw new RuntimeException("Default ProxySelector is null");
ProxySelector.setDefault(new MyProxySelector());
try {
- server = new HttpServer (new ProxyTest(), 1, 10, 0);
+ server = new TestHttpServer (new ProxyTest(), 1, 10, 0);
URL url = new URL("http://localhost:"+server.getLocalPort());
System.out.println ("client opening connection to: " + url);
HttpURLConnection urlc = (HttpURLConnection)url.openConnection ();
--- a/jdk/test/java/net/URL/PerConnectionProxy.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/URL/PerConnectionProxy.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @bug 4920526
* @summary Needs per connection proxy support for URLs
* @library ../../../sun/net/www/httptest/
- * @build ClosedChannelList HttpServer HttpTransaction HttpCallback
+ * @build ClosedChannelList TestHttpServer HttpTransaction HttpCallback
* @compile PerConnectionProxy.java
* @run main/othervm -Dhttp.proxyHost=inexistant -Dhttp.proxyPort=8080 PerConnectionProxy
*/
@@ -35,7 +35,7 @@
import sun.net.www.*;
public class PerConnectionProxy implements HttpCallback {
- static HttpServer server;
+ static TestHttpServer server;
public void request (HttpTransaction req) {
req.setResponseEntityBody ("Hello .");
@@ -48,7 +48,7 @@
public static void main(String[] args) {
try {
- server = new HttpServer (new PerConnectionProxy(), 1, 10, 0);
+ server = new TestHttpServer (new PerConnectionProxy(), 1, 10, 0);
ProxyServer pserver = new ProxyServer(InetAddress.getByName("localhost"), server.getLocalPort());
// start proxy server
new Thread(pserver).start();
--- a/jdk/test/java/net/URLConnection/B5052093.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/java/net/URLConnection/B5052093.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 5052093
* @library ../../../sun/net/www/httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main B5052093
* @summary URLConnection doesn't support large files
*/
@@ -34,7 +34,7 @@
import sun.net.www.protocol.file.FileURLConnection;
public class B5052093 implements HttpCallback {
- private static HttpServer server;
+ private static TestHttpServer server;
private static long testSize = ((long) (Integer.MAX_VALUE)) + 2;
public static class LargeFile extends File {
@@ -63,7 +63,7 @@
}
public static void main(String[] args) throws Exception {
- server = new HttpServer(new B5052093(), 1, 10, 0);
+ server = new TestHttpServer(new B5052093(), 1, 10, 0);
try {
URL url = new URL("http://localhost:"+server.getLocalPort()+"/foo");
URLConnection conn = url.openConnection();
--- a/jdk/test/javax/swing/JColorChooser/Test4380468.html Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-<html>
-<body>
-1. Click the HSB tab at the ColorChooser.
-2. Click in the lower left corner of the gradient palette
- in order to select a color such that all three RGB values
- are single digit colors (such as 0, 0, 0 or 5, 3, 1).
-3. Click another tab, then click back to the HSB tab.
-4. Now click the lighter colors that should have
- 2 and 3 digit RGB values (in the upper right corner).
-
-If all digits of each RGB value are shown then test passes.
-If only the last digit of their values are shown then test fails.
-
-<applet width="500" height="400" code="Test4380468.class">
-</applet>
-</body>
-</html>
--- a/jdk/test/javax/swing/JColorChooser/Test4380468.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @bug 4380468
- * @summary JColorChooser's HSB panel should display all RGB digits
- * @author Andrey Pikalev
- * @run applet/manual=yesno Test4380468.html
- */
-
-import java.awt.Color;
-import javax.swing.JApplet;
-import javax.swing.JColorChooser;
-
-public class Test4380468 extends JApplet {
- public void init() {
- add(new JColorChooser(Color.GREEN));
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JSplitPane/4201995/bug4201995.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 4201995
+ * @summary Tests that JSplitPane is opaque
+ * @author Scott Violet
+ */
+
+import javax.swing.*;
+
+public class bug4201995 {
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ boolean expectedOpaqueValue = !"Nimbus".equals(UIManager.getLookAndFeel().getName());
+ JSplitPane sp = new JSplitPane();
+
+ if (sp.isOpaque() != expectedOpaqueValue) {
+ throw new RuntimeException("JSplitPane has incorrect default opaque value");
+ }
+ }
+ });
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JTable/4235420/bug4235420.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ @bug 4235420
+ @summary Tests that JTable delays creating Renderers and Editors
+ @author Peter Zhelezniakov
+*/
+
+import javax.swing.*;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class bug4235420 {
+
+ public static void main(String[] argv) throws Exception {
+ if ("Nimbus".equals(UIManager.getLookAndFeel().getName())) {
+ System.out.println("The test is skipped for Nimbus");
+
+ return;
+ }
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ Table table = new Table();
+
+ table.test();
+ }
+ });
+ }
+
+ private static class Table extends JTable {
+ public void test() {
+ // Renderers
+ Class[] rendererClasses = {Object.class, Number.class, Date.class, ImageIcon.class, Boolean.class};
+
+ Map copy = new HashMap(defaultRenderersByColumnClass);
+
+ for (Class rendererClass : rendererClasses) {
+ Object obj = copy.get(rendererClass);
+
+ if (obj instanceof TableCellRenderer) {
+ throw new Error("Failed: TableCellRenderer created for " +
+ rendererClass.getClass().getName());
+ }
+ }
+
+ // Editors
+ Class[] editorClasses = {Object.class, Number.class, Boolean.class};
+
+ copy = new HashMap(defaultEditorsByColumnClass);
+
+ for (Class editorClass : editorClasses) {
+ Object obj = copy.get(editorClass);
+
+ if (obj instanceof TableCellEditor) {
+ throw new Error("Failed: TableCellEditor created for " +
+ editorClass.getClass().getName());
+ }
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JTable/7188612/JTableAccessibleGetLocationOnScreen.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Portions Copyright (c) 2012 IBM Corporation
+ */
+
+/* @test
+ * @bug 7188612
+ * @summary AccessibleTableHeader and AccessibleJTableCell should stick to
+ * AccessibleComponent.getLocationOnScreen api.
+ * @author Frank Ding
+ */
+
+import javax.accessibility.AccessibleComponent;
+import javax.accessibility.AccessibleTable;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JTable;
+import javax.swing.SwingUtilities;
+
+public class JTableAccessibleGetLocationOnScreen {
+ private static JFrame frame;
+ private static JTable table;
+
+ public static void main(String[] args) throws Exception {
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+
+ @Override
+ public void run() {
+ constructInEDT();
+ try {
+ assertGetLocation();
+ } finally {
+ frame.dispose();
+ }
+ }
+ });
+
+ }
+
+ private static void constructInEDT() {
+ String[] columnNames = { "col1", "col2", };
+ Object[][] data = { { "row1, col1", "row1, col2" },
+ { "row2, col1", "row2, col2" }, };
+
+ frame = new JFrame(
+ "JTable AccessibleTableHeader and AccessibleJTableCell test");
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ table = new JTable(data, columnNames);
+ frame.add(table);
+ frame.pack();
+ }
+
+ private static void assertGetLocation() {
+ // the frame is now invisible
+ // test getLocationOnScreen() of
+ // JTable$AccessibleJTable$AccessibleJTableHeaderCell
+ // and JTable$AccessibleJTable$AccessibleJTableCell
+ AccessibleTable accessibleTable = (AccessibleTable) table
+ .getAccessibleContext();
+ AccessibleTable header = accessibleTable.getAccessibleColumnHeader();
+ AccessibleComponent accessibleComp1 = (AccessibleComponent) header
+ .getAccessibleAt(0, 0);
+ // getLocation() must be null according to its javadoc and no exception
+ // is thrown
+ if (null != accessibleComp1.getLocationOnScreen()) {
+ throw new RuntimeException(
+ "JTable$AccessibleJTable$AccessibleJTableHeaderCell."
+ + "getLocation() must be null");
+ }
+
+ JComponent.AccessibleJComponent accessibleJComponent =
+ (JComponent.AccessibleJComponent) table.getAccessibleContext();
+ AccessibleComponent accessibleComp2 = (AccessibleComponent)
+ accessibleJComponent.getAccessibleChild(3);
+ // getLocation() must be null according to its javadoc and no exception
+ // is thrown
+ if (null != accessibleComp2.getLocationOnScreen()) {
+ throw new RuntimeException("JTable$AccessibleJTable$"
+ + "AccessibleJTableCell.getLocation() must be null");
+ }
+
+ }
+}
--- a/jdk/test/sun/net/www/AuthHeaderTest.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/net/www/AuthHeaderTest.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 4804309
* @library ../../../sun/net/www/httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main AuthHeaderTest
* @summary AuthHeaderTest bug
*/
@@ -90,13 +90,13 @@
is.close();
}
- static HttpServer server;
+ static TestHttpServer server;
public static void main (String[] args) throws Exception {
MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth);
try {
- server = new HttpServer (new AuthHeaderTest(), 1, 10, 0);
+ server = new TestHttpServer (new AuthHeaderTest(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort());
client ("http://localhost:"+server.getLocalPort()+"/d1/foo.html");
} catch (Exception e) {
--- a/jdk/test/sun/net/www/http/ChunkedInputStream/ChunkedEncodingWithProgressMonitorTest.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/net/www/http/ChunkedInputStream/ChunkedEncodingWithProgressMonitorTest.java Mon Sep 10 09:00:00 2012 -0400
@@ -24,8 +24,6 @@
/**
* @test
* @bug 4333920 4994372
- * @library ../../../../../sun/net/www/httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
* @run main ChunkedEncodingWithProgressMonitorTest
* @summary ChunkedEncoding unit test; MeteredStream/ProgressData problem
*/
--- a/jdk/test/sun/net/www/http/KeepAliveCache/B5045306.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/net/www/http/KeepAliveCache/B5045306.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 5045306 6356004 6993490
* @library ../../httptest/
- * @build HttpCallback HttpServer HttpTransaction
+ * @build HttpCallback TestHttpServer HttpTransaction
* @run main/othervm B5045306
* @summary Http keep-alive implementation is not efficient
*/
@@ -50,7 +50,7 @@
public class B5045306
{
static SimpleHttpTransaction httpTrans;
- static HttpServer server;
+ static TestHttpServer server;
public static void main(String[] args) throws Exception {
startHttpServer();
@@ -60,7 +60,7 @@
public static void startHttpServer() {
try {
httpTrans = new SimpleHttpTransaction();
- server = new HttpServer(httpTrans, 1, 10, 0);
+ server = new TestHttpServer(httpTrans, 1, 10, 0);
} catch (IOException e) {
e.printStackTrace();
}
--- a/jdk/test/sun/net/www/httptest/HttpServer.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,728 +0,0 @@
-/*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.net.*;
-import java.io.*;
-import java.nio.*;
-import java.nio.channels.*;
-import sun.net.www.MessageHeader;
-import java.util.*;
-
-/**
- * This class implements a simple HTTP server. It uses multiple threads to
- * handle connections in parallel, and also multiple connections/requests
- * can be handled per thread.
- * <p>
- * It must be instantiated with a {@link HttpCallback} object to which
- * requests are given and must be handled.
- * <p>
- * Simple synchronization between the client(s) and server can be done
- * using the {@link #waitForCondition(String)}, {@link #setCondition(String)} and
- * {@link #rendezvous(String,int)} methods.
- *
- * NOTE NOTE NOTE NOTE NOTE NOTE NOTE
- *
- * If changes are made here, please sure they are propagated to
- * the HTTPS equivalent in the JSSE regression test suite.
- *
- * NOTE NOTE NOTE NOTE NOTE NOTE NOTE
- */
-
-public class HttpServer {
-
- ServerSocketChannel schan;
- int threads;
- int cperthread;
- HttpCallback cb;
- Server[] servers;
-
- /**
- * Create a <code>HttpServer<code> instance with the specified callback object
- * for handling requests. One thread is created to handle requests,
- * and up to ten TCP connections will be handled simultaneously.
- * @param cb the callback object which is invoked to handle each
- * incoming request
- */
-
- public HttpServer (HttpCallback cb) throws IOException {
- this (cb, 1, 10, 0);
- }
-
- /**
- * Create a <code>HttpServer<code> instance with the specified number of
- * threads and maximum number of connections per thread. This functions
- * the same as the 4 arg constructor, where the port argument is set to zero.
- * @param cb the callback object which is invoked to handle each
- * incoming request
- * @param threads the number of threads to create to handle requests
- * in parallel
- * @param cperthread the number of simultaneous TCP connections to
- * handle per thread
- */
-
- public HttpServer (HttpCallback cb, int threads, int cperthread)
- throws IOException {
- this (cb, threads, cperthread, 0);
- }
-
- /**
- * Create a <code>HttpServer<code> instance with the specified number
- * of threads and maximum number of connections per thread and running on
- * the specified port. The specified number of threads are created to
- * handle incoming requests, and each thread is allowed
- * to handle a number of simultaneous TCP connections.
- * @param cb the callback object which is invoked to handle
- * each incoming request
- * @param threads the number of threads to create to handle
- * requests in parallel
- * @param cperthread the number of simultaneous TCP connections
- * to handle per thread
- * @param port the port number to bind the server to. <code>Zero</code>
- * means choose any free port.
- */
-
- public HttpServer (HttpCallback cb, int threads, int cperthread, int port)
- throws IOException {
- schan = ServerSocketChannel.open ();
- InetSocketAddress addr = new InetSocketAddress (port);
- schan.socket().bind (addr);
- this.threads = threads;
- this.cb = cb;
- this.cperthread = cperthread;
- servers = new Server [threads];
- for (int i=0; i<threads; i++) {
- servers[i] = new Server (cb, schan, cperthread);
- servers[i].start();
- }
- }
-
- /** Tell all threads in the server to exit within 5 seconds.
- * This is an abortive termination. Just prior to the thread exiting
- * all channels in that thread waiting to be closed are forceably closed.
- */
-
- public void terminate () {
- for (int i=0; i<threads; i++) {
- servers[i].terminate ();
- }
- }
-
- /**
- * return the local port number to which the server is bound.
- * @return the local port number
- */
-
- public int getLocalPort () {
- return schan.socket().getLocalPort ();
- }
-
- static class Server extends Thread {
-
- ServerSocketChannel schan;
- Selector selector;
- SelectionKey listenerKey;
- SelectionKey key; /* the current key being processed */
- HttpCallback cb;
- ByteBuffer consumeBuffer;
- int maxconn;
- int nconn;
- ClosedChannelList clist;
- boolean shutdown;
-
- Server (HttpCallback cb, ServerSocketChannel schan, int maxconn) {
- this.schan = schan;
- this.maxconn = maxconn;
- this.cb = cb;
- nconn = 0;
- consumeBuffer = ByteBuffer.allocate (512);
- clist = new ClosedChannelList ();
- try {
- selector = Selector.open ();
- schan.configureBlocking (false);
- listenerKey = schan.register (selector, SelectionKey.OP_ACCEPT);
- } catch (IOException e) {
- System.err.println ("Server could not start: " + e);
- }
- }
-
- /* Stop the thread as soon as possible */
- public synchronized void terminate () {
- shutdown = true;
- }
-
- public void run () {
- try {
- while (true) {
- selector.select (1000);
- Set selected = selector.selectedKeys();
- Iterator iter = selected.iterator();
- while (iter.hasNext()) {
- key = (SelectionKey)iter.next();
- if (key.equals (listenerKey)) {
- SocketChannel sock = schan.accept ();
- if (sock == null) {
- /* false notification */
- iter.remove();
- continue;
- }
- sock.configureBlocking (false);
- sock.register (selector, SelectionKey.OP_READ);
- nconn ++;
- System.out.println("SERVER: new connection. chan[" + sock + "]");
- if (nconn == maxconn) {
- /* deregister */
- listenerKey.cancel ();
- listenerKey = null;
- }
- } else {
- if (key.isReadable()) {
- boolean closed;
- SocketChannel chan = (SocketChannel) key.channel();
- System.out.println("SERVER: connection readable. chan[" + chan + "]");
- if (key.attachment() != null) {
- System.out.println("Server: comsume");
- closed = consume (chan);
- } else {
- closed = read (chan, key);
- }
- if (closed) {
- chan.close ();
- key.cancel ();
- if (nconn == maxconn) {
- listenerKey = schan.register (selector, SelectionKey.OP_ACCEPT);
- }
- nconn --;
- }
- }
- }
- iter.remove();
- }
- clist.check();
- if (shutdown) {
- clist.terminate ();
- return;
- }
- }
- } catch (IOException e) {
- System.out.println ("Server exception: " + e);
- // TODO finish
- }
- }
-
- /* read all the data off the channel without looking at it
- * return true if connection closed
- */
- boolean consume (SocketChannel chan) {
- try {
- consumeBuffer.clear ();
- int c = chan.read (consumeBuffer);
- if (c == -1)
- return true;
- } catch (IOException e) {
- return true;
- }
- return false;
- }
-
- /* return true if the connection is closed, false otherwise */
-
- private boolean read (SocketChannel chan, SelectionKey key) {
- HttpTransaction msg;
- boolean res;
- try {
- InputStream is = new BufferedInputStream (new NioInputStream (chan));
- String requestline = readLine (is);
- MessageHeader mhead = new MessageHeader (is);
- String clen = mhead.findValue ("Content-Length");
- String trferenc = mhead.findValue ("Transfer-Encoding");
- String data = null;
- if (trferenc != null && trferenc.equals ("chunked"))
- data = new String (readChunkedData (is));
- else if (clen != null)
- data = new String (readNormalData (is, Integer.parseInt (clen)));
- String[] req = requestline.split (" ");
- if (req.length < 2) {
- /* invalid request line */
- return false;
- }
- String cmd = req[0];
- URI uri = null;
- try {
- uri = new URI (req[1]);
- msg = new HttpTransaction (this, cmd, uri, mhead, data, null, key);
- cb.request (msg);
- } catch (URISyntaxException e) {
- System.err.println ("Invalid URI: " + e);
- msg = new HttpTransaction (this, cmd, null, null, null, null, key);
- msg.sendResponse (501, "Whatever");
- }
- res = false;
- } catch (IOException e) {
- res = true;
- }
- return res;
- }
-
- byte[] readNormalData (InputStream is, int len) throws IOException {
- byte [] buf = new byte [len];
- int c, off=0, remain=len;
- while (remain > 0 && ((c=is.read (buf, off, remain))>0)) {
- remain -= c;
- off += c;
- }
- return buf;
- }
-
- private void readCRLF(InputStream is) throws IOException {
- int cr = is.read();
- int lf = is.read();
-
- if (((cr & 0xff) != 0x0d) ||
- ((lf & 0xff) != 0x0a)) {
- throw new IOException(
- "Expected <CR><LF>: got '" + cr + "/" + lf + "'");
- }
- }
-
- byte[] readChunkedData (InputStream is) throws IOException {
- LinkedList l = new LinkedList ();
- int total = 0;
- for (int len=readChunkLen(is); len!=0; len=readChunkLen(is)) {
- l.add (readNormalData(is, len));
- total += len;
- readCRLF(is); // CRLF at end of chunk
- }
- readCRLF(is); // CRLF at end of Chunked Stream.
- byte[] buf = new byte [total];
- Iterator i = l.iterator();
- int x = 0;
- while (i.hasNext()) {
- byte[] b = (byte[])i.next();
- System.arraycopy (b, 0, buf, x, b.length);
- x += b.length;
- }
- return buf;
- }
-
- private int readChunkLen (InputStream is) throws IOException {
- int c, len=0;
- boolean done=false, readCR=false;
- while (!done) {
- c = is.read ();
- if (c == '\n' && readCR) {
- done = true;
- } else {
- if (c == '\r' && !readCR) {
- readCR = true;
- } else {
- int x=0;
- if (c >= 'a' && c <= 'f') {
- x = c - 'a' + 10;
- } else if (c >= 'A' && c <= 'F') {
- x = c - 'A' + 10;
- } else if (c >= '0' && c <= '9') {
- x = c - '0';
- }
- len = len * 16 + x;
- }
- }
- }
- return len;
- }
-
- private String readLine (InputStream is) throws IOException {
- boolean done=false, readCR=false;
- byte[] b = new byte [512];
- int c, l = 0;
-
- while (!done) {
- c = is.read ();
- if (c == '\n' && readCR) {
- done = true;
- } else {
- if (c == '\r' && !readCR) {
- readCR = true;
- } else {
- b[l++] = (byte)c;
- }
- }
- }
- return new String (b);
- }
-
- /** close the channel associated with the current key by:
- * 1. shutdownOutput (send a FIN)
- * 2. mark the key so that incoming data is to be consumed and discarded
- * 3. After a period, close the socket
- */
-
- synchronized void orderlyCloseChannel (SelectionKey key) throws IOException {
- SocketChannel ch = (SocketChannel)key.channel ();
- System.out.println("SERVER: orderlyCloseChannel chan[" + ch + "]");
- ch.socket().shutdownOutput();
- key.attach (this);
- clist.add (key);
- }
-
- synchronized void abortiveCloseChannel (SelectionKey key) throws IOException {
- SocketChannel ch = (SocketChannel)key.channel ();
- System.out.println("SERVER: abortiveCloseChannel chan[" + ch + "]");
-
- Socket s = ch.socket ();
- s.setSoLinger (true, 0);
- ch.close();
- }
- }
-
-
- /**
- * Implements blocking reading semantics on top of a non-blocking channel
- */
-
- static class NioInputStream extends InputStream {
- SocketChannel channel;
- Selector selector;
- ByteBuffer chanbuf;
- SelectionKey key;
- int available;
- byte[] one;
- boolean closed;
- ByteBuffer markBuf; /* reads may be satisifed from this buffer */
- boolean marked;
- boolean reset;
- int readlimit;
-
- public NioInputStream (SocketChannel chan) throws IOException {
- this.channel = chan;
- selector = Selector.open();
- chanbuf = ByteBuffer.allocate (1024);
- key = chan.register (selector, SelectionKey.OP_READ);
- available = 0;
- one = new byte[1];
- closed = marked = reset = false;
- }
-
- public synchronized int read (byte[] b) throws IOException {
- return read (b, 0, b.length);
- }
-
- public synchronized int read () throws IOException {
- return read (one, 0, 1);
- }
-
- public synchronized int read (byte[] b, int off, int srclen) throws IOException {
-
- int canreturn, willreturn;
-
- if (closed)
- return -1;
-
- if (reset) { /* satisfy from markBuf */
- canreturn = markBuf.remaining ();
- willreturn = canreturn>srclen ? srclen : canreturn;
- markBuf.get(b, off, willreturn);
- if (canreturn == willreturn) {
- reset = false;
- }
- } else { /* satisfy from channel */
- canreturn = available();
- if (canreturn == 0) {
- block ();
- canreturn = available();
- }
- willreturn = canreturn>srclen ? srclen : canreturn;
- chanbuf.get(b, off, willreturn);
- available -= willreturn;
-
- if (marked) { /* copy into markBuf */
- try {
- markBuf.put (b, off, willreturn);
- } catch (BufferOverflowException e) {
- marked = false;
- }
- }
- }
- return willreturn;
- }
-
- public synchronized int available () throws IOException {
- if (closed)
- throw new IOException ("Stream is closed");
-
- if (reset)
- return markBuf.remaining();
-
- if (available > 0)
- return available;
-
- chanbuf.clear ();
- available = channel.read (chanbuf);
- if (available > 0)
- chanbuf.flip();
- else if (available == -1)
- throw new IOException ("Stream is closed");
- return available;
- }
-
- /**
- * block() only called when available==0 and buf is empty
- */
- private synchronized void block () throws IOException {
- //assert available == 0;
- int n = selector.select ();
- //assert n == 1;
- selector.selectedKeys().clear();
- available ();
- }
-
- public void close () throws IOException {
- if (closed)
- return;
- channel.close ();
- closed = true;
- }
-
- public synchronized void mark (int readlimit) {
- if (closed)
- return;
- this.readlimit = readlimit;
- markBuf = ByteBuffer.allocate (readlimit);
- marked = true;
- reset = false;
- }
-
- public synchronized void reset () throws IOException {
- if (closed )
- return;
- if (!marked)
- throw new IOException ("Stream not marked");
- marked = false;
- reset = true;
- markBuf.flip ();
- }
- }
-
- static class NioOutputStream extends OutputStream {
- SocketChannel channel;
- ByteBuffer buf;
- SelectionKey key;
- Selector selector;
- boolean closed;
- byte[] one;
-
- public NioOutputStream (SocketChannel channel) throws IOException {
- this.channel = channel;
- selector = Selector.open ();
- key = channel.register (selector, SelectionKey.OP_WRITE);
- closed = false;
- one = new byte [1];
- }
-
- public synchronized void write (int b) throws IOException {
- one[0] = (byte)b;
- write (one, 0, 1);
- }
-
- public synchronized void write (byte[] b) throws IOException {
- write (b, 0, b.length);
- }
-
- public synchronized void write (byte[] b, int off, int len) throws IOException {
- if (closed)
- throw new IOException ("stream is closed");
-
- buf = ByteBuffer.allocate (len);
- buf.put (b, off, len);
- buf.flip ();
- int n;
- while ((n = channel.write (buf)) < len) {
- len -= n;
- if (len == 0)
- return;
- selector.select ();
- selector.selectedKeys().clear ();
- }
- }
-
- public void close () throws IOException {
- if (closed)
- return;
- channel.close ();
- closed = true;
- }
- }
-
- /**
- * Utilities for synchronization. A condition is
- * identified by a string name, and is initialized
- * upon first use (ie. setCondition() or waitForCondition()). Threads
- * are blocked until some thread calls (or has called) setCondition() for the same
- * condition.
- * <P>
- * A rendezvous built on a condition is also provided for synchronizing
- * N threads.
- */
-
- private static HashMap conditions = new HashMap();
-
- /*
- * Modifiable boolean object
- */
- private static class BValue {
- boolean v;
- }
-
- /*
- * Modifiable int object
- */
- private static class IValue {
- int v;
- IValue (int i) {
- v =i;
- }
- }
-
-
- private static BValue getCond (String condition) {
- synchronized (conditions) {
- BValue cond = (BValue) conditions.get (condition);
- if (cond == null) {
- cond = new BValue();
- conditions.put (condition, cond);
- }
- return cond;
- }
- }
-
- /**
- * Set the condition to true. Any threads that are currently blocked
- * waiting on the condition, will be unblocked and allowed to continue.
- * Threads that subsequently call waitForCondition() will not block.
- * If the named condition did not exist prior to the call, then it is created
- * first.
- */
-
- public static void setCondition (String condition) {
- BValue cond = getCond (condition);
- synchronized (cond) {
- if (cond.v) {
- return;
- }
- cond.v = true;
- cond.notifyAll();
- }
- }
-
- /**
- * If the named condition does not exist, then it is created and initialized
- * to false. If the condition exists or has just been created and its value
- * is false, then the thread blocks until another thread sets the condition.
- * If the condition exists and is already set to true, then this call returns
- * immediately without blocking.
- */
-
- public static void waitForCondition (String condition) {
- BValue cond = getCond (condition);
- synchronized (cond) {
- if (!cond.v) {
- try {
- cond.wait();
- } catch (InterruptedException e) {}
- }
- }
- }
-
- /* conditions must be locked when accessing this */
- static HashMap rv = new HashMap();
-
- /**
- * Force N threads to rendezvous (ie. wait for each other) before proceeding.
- * The first thread(s) to call are blocked until the last
- * thread makes the call. Then all threads continue.
- * <p>
- * All threads that call with the same condition name, must use the same value
- * for N (or the results may be not be as expected).
- * <P>
- * Obviously, if fewer than N threads make the rendezvous then the result
- * will be a hang.
- */
-
- public static void rendezvous (String condition, int N) {
- BValue cond;
- IValue iv;
- String name = "RV_"+condition;
-
- /* get the condition */
-
- synchronized (conditions) {
- cond = (BValue)conditions.get (name);
- if (cond == null) {
- /* we are first caller */
- if (N < 2) {
- throw new RuntimeException ("rendezvous must be called with N >= 2");
- }
- cond = new BValue ();
- conditions.put (name, cond);
- iv = new IValue (N-1);
- rv.put (name, iv);
- } else {
- /* already initialised, just decrement the counter */
- iv = (IValue) rv.get (name);
- iv.v --;
- }
- }
-
- if (iv.v > 0) {
- waitForCondition (name);
- } else {
- setCondition (name);
- synchronized (conditions) {
- clearCondition (name);
- rv.remove (name);
- }
- }
- }
-
- /**
- * If the named condition exists and is set then remove it, so it can
- * be re-initialized and used again. If the condition does not exist, or
- * exists but is not set, then the call returns without doing anything.
- * Note, some higher level synchronization
- * may be needed between clear and the other operations.
- */
-
- public static void clearCondition(String condition) {
- BValue cond;
- synchronized (conditions) {
- cond = (BValue) conditions.get (condition);
- if (cond == null) {
- return;
- }
- synchronized (cond) {
- if (cond.v) {
- conditions.remove (condition);
- }
- }
- }
- }
-}
--- a/jdk/test/sun/net/www/httptest/HttpTransaction.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/net/www/httptest/HttpTransaction.java Mon Sep 10 09:00:00 2012 -0400
@@ -37,7 +37,7 @@
String command;
URI requesturi;
- HttpServer.Server server;
+ TestHttpServer.Server server;
MessageHeader reqheaders, reqtrailers;
String reqbody;
byte[] rspbody;
@@ -46,7 +46,7 @@
int rspbodylen;
boolean rspchunked;
- HttpTransaction (HttpServer.Server server, String command,
+ HttpTransaction (TestHttpServer.Server server, String command,
URI requesturi, MessageHeader headers,
String body, MessageHeader trailers, SelectionKey key) {
this.command = command;
@@ -290,7 +290,7 @@
* @param rTag the response string to send with the response code
*/
public void sendResponse (int rCode, String rTag) throws IOException {
- OutputStream os = new HttpServer.NioOutputStream(channel());
+ OutputStream os = new TestHttpServer.NioOutputStream(channel());
PrintStream ps = new PrintStream (os);
ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n");
if (rspheaders != null) {
@@ -314,7 +314,7 @@
/* sends one byte less than intended */
public void sendPartialResponse (int rCode, String rTag)throws IOException {
- OutputStream os = new HttpServer.NioOutputStream(channel());
+ OutputStream os = new TestHttpServer.NioOutputStream(channel());
PrintStream ps = new PrintStream (os);
ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n");
ps.flush();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/net/www/httptest/TestHttpServer.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,728 @@
+/*
+ * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.*;
+import java.nio.channels.*;
+import sun.net.www.MessageHeader;
+import java.util.*;
+
+/**
+ * This class implements a simple HTTP server. It uses multiple threads to
+ * handle connections in parallel, and also multiple connections/requests
+ * can be handled per thread.
+ * <p>
+ * It must be instantiated with a {@link HttpCallback} object to which
+ * requests are given and must be handled.
+ * <p>
+ * Simple synchronization between the client(s) and server can be done
+ * using the {@link #waitForCondition(String)}, {@link #setCondition(String)} and
+ * {@link #rendezvous(String,int)} methods.
+ *
+ * NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+ *
+ * If changes are made here, please sure they are propagated to
+ * the HTTPS equivalent in the JSSE regression test suite.
+ *
+ * NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+ */
+
+public class TestHttpServer {
+
+ ServerSocketChannel schan;
+ int threads;
+ int cperthread;
+ HttpCallback cb;
+ Server[] servers;
+
+ /**
+ * Create a <code>TestHttpServer<code> instance with the specified callback object
+ * for handling requests. One thread is created to handle requests,
+ * and up to ten TCP connections will be handled simultaneously.
+ * @param cb the callback object which is invoked to handle each
+ * incoming request
+ */
+
+ public TestHttpServer (HttpCallback cb) throws IOException {
+ this (cb, 1, 10, 0);
+ }
+
+ /**
+ * Create a <code>TestHttpServer<code> instance with the specified number of
+ * threads and maximum number of connections per thread. This functions
+ * the same as the 4 arg constructor, where the port argument is set to zero.
+ * @param cb the callback object which is invoked to handle each
+ * incoming request
+ * @param threads the number of threads to create to handle requests
+ * in parallel
+ * @param cperthread the number of simultaneous TCP connections to
+ * handle per thread
+ */
+
+ public TestHttpServer (HttpCallback cb, int threads, int cperthread)
+ throws IOException {
+ this (cb, threads, cperthread, 0);
+ }
+
+ /**
+ * Create a <code>TestHttpServer<code> instance with the specified number
+ * of threads and maximum number of connections per thread and running on
+ * the specified port. The specified number of threads are created to
+ * handle incoming requests, and each thread is allowed
+ * to handle a number of simultaneous TCP connections.
+ * @param cb the callback object which is invoked to handle
+ * each incoming request
+ * @param threads the number of threads to create to handle
+ * requests in parallel
+ * @param cperthread the number of simultaneous TCP connections
+ * to handle per thread
+ * @param port the port number to bind the server to. <code>Zero</code>
+ * means choose any free port.
+ */
+
+ public TestHttpServer (HttpCallback cb, int threads, int cperthread, int port)
+ throws IOException {
+ schan = ServerSocketChannel.open ();
+ InetSocketAddress addr = new InetSocketAddress (port);
+ schan.socket().bind (addr);
+ this.threads = threads;
+ this.cb = cb;
+ this.cperthread = cperthread;
+ servers = new Server [threads];
+ for (int i=0; i<threads; i++) {
+ servers[i] = new Server (cb, schan, cperthread);
+ servers[i].start();
+ }
+ }
+
+ /** Tell all threads in the server to exit within 5 seconds.
+ * This is an abortive termination. Just prior to the thread exiting
+ * all channels in that thread waiting to be closed are forceably closed.
+ */
+
+ public void terminate () {
+ for (int i=0; i<threads; i++) {
+ servers[i].terminate ();
+ }
+ }
+
+ /**
+ * return the local port number to which the server is bound.
+ * @return the local port number
+ */
+
+ public int getLocalPort () {
+ return schan.socket().getLocalPort ();
+ }
+
+ static class Server extends Thread {
+
+ ServerSocketChannel schan;
+ Selector selector;
+ SelectionKey listenerKey;
+ SelectionKey key; /* the current key being processed */
+ HttpCallback cb;
+ ByteBuffer consumeBuffer;
+ int maxconn;
+ int nconn;
+ ClosedChannelList clist;
+ boolean shutdown;
+
+ Server (HttpCallback cb, ServerSocketChannel schan, int maxconn) {
+ this.schan = schan;
+ this.maxconn = maxconn;
+ this.cb = cb;
+ nconn = 0;
+ consumeBuffer = ByteBuffer.allocate (512);
+ clist = new ClosedChannelList ();
+ try {
+ selector = Selector.open ();
+ schan.configureBlocking (false);
+ listenerKey = schan.register (selector, SelectionKey.OP_ACCEPT);
+ } catch (IOException e) {
+ System.err.println ("Server could not start: " + e);
+ }
+ }
+
+ /* Stop the thread as soon as possible */
+ public synchronized void terminate () {
+ shutdown = true;
+ }
+
+ public void run () {
+ try {
+ while (true) {
+ selector.select (1000);
+ Set selected = selector.selectedKeys();
+ Iterator iter = selected.iterator();
+ while (iter.hasNext()) {
+ key = (SelectionKey)iter.next();
+ if (key.equals (listenerKey)) {
+ SocketChannel sock = schan.accept ();
+ if (sock == null) {
+ /* false notification */
+ iter.remove();
+ continue;
+ }
+ sock.configureBlocking (false);
+ sock.register (selector, SelectionKey.OP_READ);
+ nconn ++;
+ System.out.println("SERVER: new connection. chan[" + sock + "]");
+ if (nconn == maxconn) {
+ /* deregister */
+ listenerKey.cancel ();
+ listenerKey = null;
+ }
+ } else {
+ if (key.isReadable()) {
+ boolean closed;
+ SocketChannel chan = (SocketChannel) key.channel();
+ System.out.println("SERVER: connection readable. chan[" + chan + "]");
+ if (key.attachment() != null) {
+ System.out.println("Server: comsume");
+ closed = consume (chan);
+ } else {
+ closed = read (chan, key);
+ }
+ if (closed) {
+ chan.close ();
+ key.cancel ();
+ if (nconn == maxconn) {
+ listenerKey = schan.register (selector, SelectionKey.OP_ACCEPT);
+ }
+ nconn --;
+ }
+ }
+ }
+ iter.remove();
+ }
+ clist.check();
+ if (shutdown) {
+ clist.terminate ();
+ return;
+ }
+ }
+ } catch (IOException e) {
+ System.out.println ("Server exception: " + e);
+ // TODO finish
+ }
+ }
+
+ /* read all the data off the channel without looking at it
+ * return true if connection closed
+ */
+ boolean consume (SocketChannel chan) {
+ try {
+ consumeBuffer.clear ();
+ int c = chan.read (consumeBuffer);
+ if (c == -1)
+ return true;
+ } catch (IOException e) {
+ return true;
+ }
+ return false;
+ }
+
+ /* return true if the connection is closed, false otherwise */
+
+ private boolean read (SocketChannel chan, SelectionKey key) {
+ HttpTransaction msg;
+ boolean res;
+ try {
+ InputStream is = new BufferedInputStream (new NioInputStream (chan));
+ String requestline = readLine (is);
+ MessageHeader mhead = new MessageHeader (is);
+ String clen = mhead.findValue ("Content-Length");
+ String trferenc = mhead.findValue ("Transfer-Encoding");
+ String data = null;
+ if (trferenc != null && trferenc.equals ("chunked"))
+ data = new String (readChunkedData (is));
+ else if (clen != null)
+ data = new String (readNormalData (is, Integer.parseInt (clen)));
+ String[] req = requestline.split (" ");
+ if (req.length < 2) {
+ /* invalid request line */
+ return false;
+ }
+ String cmd = req[0];
+ URI uri = null;
+ try {
+ uri = new URI (req[1]);
+ msg = new HttpTransaction (this, cmd, uri, mhead, data, null, key);
+ cb.request (msg);
+ } catch (URISyntaxException e) {
+ System.err.println ("Invalid URI: " + e);
+ msg = new HttpTransaction (this, cmd, null, null, null, null, key);
+ msg.sendResponse (501, "Whatever");
+ }
+ res = false;
+ } catch (IOException e) {
+ res = true;
+ }
+ return res;
+ }
+
+ byte[] readNormalData (InputStream is, int len) throws IOException {
+ byte [] buf = new byte [len];
+ int c, off=0, remain=len;
+ while (remain > 0 && ((c=is.read (buf, off, remain))>0)) {
+ remain -= c;
+ off += c;
+ }
+ return buf;
+ }
+
+ private void readCRLF(InputStream is) throws IOException {
+ int cr = is.read();
+ int lf = is.read();
+
+ if (((cr & 0xff) != 0x0d) ||
+ ((lf & 0xff) != 0x0a)) {
+ throw new IOException(
+ "Expected <CR><LF>: got '" + cr + "/" + lf + "'");
+ }
+ }
+
+ byte[] readChunkedData (InputStream is) throws IOException {
+ LinkedList l = new LinkedList ();
+ int total = 0;
+ for (int len=readChunkLen(is); len!=0; len=readChunkLen(is)) {
+ l.add (readNormalData(is, len));
+ total += len;
+ readCRLF(is); // CRLF at end of chunk
+ }
+ readCRLF(is); // CRLF at end of Chunked Stream.
+ byte[] buf = new byte [total];
+ Iterator i = l.iterator();
+ int x = 0;
+ while (i.hasNext()) {
+ byte[] b = (byte[])i.next();
+ System.arraycopy (b, 0, buf, x, b.length);
+ x += b.length;
+ }
+ return buf;
+ }
+
+ private int readChunkLen (InputStream is) throws IOException {
+ int c, len=0;
+ boolean done=false, readCR=false;
+ while (!done) {
+ c = is.read ();
+ if (c == '\n' && readCR) {
+ done = true;
+ } else {
+ if (c == '\r' && !readCR) {
+ readCR = true;
+ } else {
+ int x=0;
+ if (c >= 'a' && c <= 'f') {
+ x = c - 'a' + 10;
+ } else if (c >= 'A' && c <= 'F') {
+ x = c - 'A' + 10;
+ } else if (c >= '0' && c <= '9') {
+ x = c - '0';
+ }
+ len = len * 16 + x;
+ }
+ }
+ }
+ return len;
+ }
+
+ private String readLine (InputStream is) throws IOException {
+ boolean done=false, readCR=false;
+ byte[] b = new byte [512];
+ int c, l = 0;
+
+ while (!done) {
+ c = is.read ();
+ if (c == '\n' && readCR) {
+ done = true;
+ } else {
+ if (c == '\r' && !readCR) {
+ readCR = true;
+ } else {
+ b[l++] = (byte)c;
+ }
+ }
+ }
+ return new String (b);
+ }
+
+ /** close the channel associated with the current key by:
+ * 1. shutdownOutput (send a FIN)
+ * 2. mark the key so that incoming data is to be consumed and discarded
+ * 3. After a period, close the socket
+ */
+
+ synchronized void orderlyCloseChannel (SelectionKey key) throws IOException {
+ SocketChannel ch = (SocketChannel)key.channel ();
+ System.out.println("SERVER: orderlyCloseChannel chan[" + ch + "]");
+ ch.socket().shutdownOutput();
+ key.attach (this);
+ clist.add (key);
+ }
+
+ synchronized void abortiveCloseChannel (SelectionKey key) throws IOException {
+ SocketChannel ch = (SocketChannel)key.channel ();
+ System.out.println("SERVER: abortiveCloseChannel chan[" + ch + "]");
+
+ Socket s = ch.socket ();
+ s.setSoLinger (true, 0);
+ ch.close();
+ }
+ }
+
+
+ /**
+ * Implements blocking reading semantics on top of a non-blocking channel
+ */
+
+ static class NioInputStream extends InputStream {
+ SocketChannel channel;
+ Selector selector;
+ ByteBuffer chanbuf;
+ SelectionKey key;
+ int available;
+ byte[] one;
+ boolean closed;
+ ByteBuffer markBuf; /* reads may be satisifed from this buffer */
+ boolean marked;
+ boolean reset;
+ int readlimit;
+
+ public NioInputStream (SocketChannel chan) throws IOException {
+ this.channel = chan;
+ selector = Selector.open();
+ chanbuf = ByteBuffer.allocate (1024);
+ key = chan.register (selector, SelectionKey.OP_READ);
+ available = 0;
+ one = new byte[1];
+ closed = marked = reset = false;
+ }
+
+ public synchronized int read (byte[] b) throws IOException {
+ return read (b, 0, b.length);
+ }
+
+ public synchronized int read () throws IOException {
+ return read (one, 0, 1);
+ }
+
+ public synchronized int read (byte[] b, int off, int srclen) throws IOException {
+
+ int canreturn, willreturn;
+
+ if (closed)
+ return -1;
+
+ if (reset) { /* satisfy from markBuf */
+ canreturn = markBuf.remaining ();
+ willreturn = canreturn>srclen ? srclen : canreturn;
+ markBuf.get(b, off, willreturn);
+ if (canreturn == willreturn) {
+ reset = false;
+ }
+ } else { /* satisfy from channel */
+ canreturn = available();
+ if (canreturn == 0) {
+ block ();
+ canreturn = available();
+ }
+ willreturn = canreturn>srclen ? srclen : canreturn;
+ chanbuf.get(b, off, willreturn);
+ available -= willreturn;
+
+ if (marked) { /* copy into markBuf */
+ try {
+ markBuf.put (b, off, willreturn);
+ } catch (BufferOverflowException e) {
+ marked = false;
+ }
+ }
+ }
+ return willreturn;
+ }
+
+ public synchronized int available () throws IOException {
+ if (closed)
+ throw new IOException ("Stream is closed");
+
+ if (reset)
+ return markBuf.remaining();
+
+ if (available > 0)
+ return available;
+
+ chanbuf.clear ();
+ available = channel.read (chanbuf);
+ if (available > 0)
+ chanbuf.flip();
+ else if (available == -1)
+ throw new IOException ("Stream is closed");
+ return available;
+ }
+
+ /**
+ * block() only called when available==0 and buf is empty
+ */
+ private synchronized void block () throws IOException {
+ //assert available == 0;
+ int n = selector.select ();
+ //assert n == 1;
+ selector.selectedKeys().clear();
+ available ();
+ }
+
+ public void close () throws IOException {
+ if (closed)
+ return;
+ channel.close ();
+ closed = true;
+ }
+
+ public synchronized void mark (int readlimit) {
+ if (closed)
+ return;
+ this.readlimit = readlimit;
+ markBuf = ByteBuffer.allocate (readlimit);
+ marked = true;
+ reset = false;
+ }
+
+ public synchronized void reset () throws IOException {
+ if (closed )
+ return;
+ if (!marked)
+ throw new IOException ("Stream not marked");
+ marked = false;
+ reset = true;
+ markBuf.flip ();
+ }
+ }
+
+ static class NioOutputStream extends OutputStream {
+ SocketChannel channel;
+ ByteBuffer buf;
+ SelectionKey key;
+ Selector selector;
+ boolean closed;
+ byte[] one;
+
+ public NioOutputStream (SocketChannel channel) throws IOException {
+ this.channel = channel;
+ selector = Selector.open ();
+ key = channel.register (selector, SelectionKey.OP_WRITE);
+ closed = false;
+ one = new byte [1];
+ }
+
+ public synchronized void write (int b) throws IOException {
+ one[0] = (byte)b;
+ write (one, 0, 1);
+ }
+
+ public synchronized void write (byte[] b) throws IOException {
+ write (b, 0, b.length);
+ }
+
+ public synchronized void write (byte[] b, int off, int len) throws IOException {
+ if (closed)
+ throw new IOException ("stream is closed");
+
+ buf = ByteBuffer.allocate (len);
+ buf.put (b, off, len);
+ buf.flip ();
+ int n;
+ while ((n = channel.write (buf)) < len) {
+ len -= n;
+ if (len == 0)
+ return;
+ selector.select ();
+ selector.selectedKeys().clear ();
+ }
+ }
+
+ public void close () throws IOException {
+ if (closed)
+ return;
+ channel.close ();
+ closed = true;
+ }
+ }
+
+ /**
+ * Utilities for synchronization. A condition is
+ * identified by a string name, and is initialized
+ * upon first use (ie. setCondition() or waitForCondition()). Threads
+ * are blocked until some thread calls (or has called) setCondition() for the same
+ * condition.
+ * <P>
+ * A rendezvous built on a condition is also provided for synchronizing
+ * N threads.
+ */
+
+ private static HashMap conditions = new HashMap();
+
+ /*
+ * Modifiable boolean object
+ */
+ private static class BValue {
+ boolean v;
+ }
+
+ /*
+ * Modifiable int object
+ */
+ private static class IValue {
+ int v;
+ IValue (int i) {
+ v =i;
+ }
+ }
+
+
+ private static BValue getCond (String condition) {
+ synchronized (conditions) {
+ BValue cond = (BValue) conditions.get (condition);
+ if (cond == null) {
+ cond = new BValue();
+ conditions.put (condition, cond);
+ }
+ return cond;
+ }
+ }
+
+ /**
+ * Set the condition to true. Any threads that are currently blocked
+ * waiting on the condition, will be unblocked and allowed to continue.
+ * Threads that subsequently call waitForCondition() will not block.
+ * If the named condition did not exist prior to the call, then it is created
+ * first.
+ */
+
+ public static void setCondition (String condition) {
+ BValue cond = getCond (condition);
+ synchronized (cond) {
+ if (cond.v) {
+ return;
+ }
+ cond.v = true;
+ cond.notifyAll();
+ }
+ }
+
+ /**
+ * If the named condition does not exist, then it is created and initialized
+ * to false. If the condition exists or has just been created and its value
+ * is false, then the thread blocks until another thread sets the condition.
+ * If the condition exists and is already set to true, then this call returns
+ * immediately without blocking.
+ */
+
+ public static void waitForCondition (String condition) {
+ BValue cond = getCond (condition);
+ synchronized (cond) {
+ if (!cond.v) {
+ try {
+ cond.wait();
+ } catch (InterruptedException e) {}
+ }
+ }
+ }
+
+ /* conditions must be locked when accessing this */
+ static HashMap rv = new HashMap();
+
+ /**
+ * Force N threads to rendezvous (ie. wait for each other) before proceeding.
+ * The first thread(s) to call are blocked until the last
+ * thread makes the call. Then all threads continue.
+ * <p>
+ * All threads that call with the same condition name, must use the same value
+ * for N (or the results may be not be as expected).
+ * <P>
+ * Obviously, if fewer than N threads make the rendezvous then the result
+ * will be a hang.
+ */
+
+ public static void rendezvous (String condition, int N) {
+ BValue cond;
+ IValue iv;
+ String name = "RV_"+condition;
+
+ /* get the condition */
+
+ synchronized (conditions) {
+ cond = (BValue)conditions.get (name);
+ if (cond == null) {
+ /* we are first caller */
+ if (N < 2) {
+ throw new RuntimeException ("rendezvous must be called with N >= 2");
+ }
+ cond = new BValue ();
+ conditions.put (name, cond);
+ iv = new IValue (N-1);
+ rv.put (name, iv);
+ } else {
+ /* already initialised, just decrement the counter */
+ iv = (IValue) rv.get (name);
+ iv.v --;
+ }
+ }
+
+ if (iv.v > 0) {
+ waitForCondition (name);
+ } else {
+ setCondition (name);
+ synchronized (conditions) {
+ clearCondition (name);
+ rv.remove (name);
+ }
+ }
+ }
+
+ /**
+ * If the named condition exists and is set then remove it, so it can
+ * be re-initialized and used again. If the condition does not exist, or
+ * exists but is not set, then the call returns without doing anything.
+ * Note, some higher level synchronization
+ * may be needed between clear and the other operations.
+ */
+
+ public static void clearCondition(String condition) {
+ BValue cond;
+ synchronized (conditions) {
+ cond = (BValue) conditions.get (condition);
+ if (cond == null) {
+ return;
+ }
+ synchronized (cond) {
+ if (cond.v) {
+ conditions.remove (condition);
+ }
+ }
+ }
+ }
+}
--- a/jdk/test/sun/net/www/protocol/http/B6296310.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/net/www/protocol/http/B6296310.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 6296310
* @library ../../httptest/
- * @build HttpCallback HttpServer HttpTransaction
+ * @build HttpCallback TestHttpServer HttpTransaction
* @run main/othervm B6296310
* @summary REGRESSION: AppletClassLoader.getResourceAsStream() behaviour is wrong in some cases
*/
@@ -42,7 +42,7 @@
public class B6296310
{
static SimpleHttpTransaction httpTrans;
- static HttpServer server;
+ static TestHttpServer server;
public static void main(String[] args)
{
@@ -55,7 +55,7 @@
public static void startHttpServer() {
try {
httpTrans = new SimpleHttpTransaction();
- server = new HttpServer(httpTrans, 1, 10, 0);
+ server = new TestHttpServer(httpTrans, 1, 10, 0);
} catch (IOException e) {
e.printStackTrace();
}
--- a/jdk/test/sun/net/www/protocol/http/B6299712.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/net/www/protocol/http/B6299712.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 6299712
* @library ../../httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main/othervm B6299712
* @summary NullPointerException in sun.net.www.protocol.http.HttpURLConnection.followRedirect
*/
@@ -49,7 +49,7 @@
*/
public class B6299712 {
static SimpleHttpTransaction httpTrans;
- static HttpServer server;
+ static TestHttpServer server;
public static void main(String[] args) throws Exception {
ResponseCache.setDefault(new DeployCacheHandler());
@@ -61,7 +61,7 @@
public static void startHttpServer() {
try {
httpTrans = new SimpleHttpTransaction();
- server = new HttpServer(httpTrans, 1, 10, 0);
+ server = new TestHttpServer(httpTrans, 1, 10, 0);
} catch (IOException e) {
e.printStackTrace();
}
--- a/jdk/test/sun/net/www/protocol/http/RelativeRedirect.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/net/www/protocol/http/RelativeRedirect.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 4726087
* @library ../../httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main RelativeRedirect
* @summary URLConnection cannot handle redirects
*/
@@ -35,7 +35,7 @@
public class RelativeRedirect implements HttpCallback {
static int count = 0;
- static HttpServer server;
+ static TestHttpServer server;
static class MyAuthenticator extends Authenticator {
public MyAuthenticator () {
@@ -89,7 +89,7 @@
MyAuthenticator auth = new MyAuthenticator ();
Authenticator.setDefault (auth);
try {
- server = new HttpServer (new RelativeRedirect(), 1, 10, 0);
+ server = new TestHttpServer (new RelativeRedirect(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort());
URL url = new URL("http://localhost:"+server.getLocalPort());
System.out.println ("client opening connection to: " + url);
--- a/jdk/test/sun/net/www/protocol/http/ResponseCacheStream.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/net/www/protocol/http/ResponseCacheStream.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 6262486
* @library ../../httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ * @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main/othervm -Dhttp.keepAlive=false ResponseCacheStream
* @summary COMPATIBILITY: jagex_com - Monkey Puzzle applet fails to load
*/
@@ -91,13 +91,13 @@
}
}
- static HttpServer server;
+ static TestHttpServer server;
public static void main(String[] args) throws Exception {
MyResponseCache cache = new MyResponseCache();
try {
ResponseCache.setDefault(cache);
- server = new HttpServer (new ResponseCacheStream());
+ server = new TestHttpServer (new ResponseCacheStream());
System.out.println ("Server: listening on port: " + server.getLocalPort());
URL url = new URL ("http://127.0.0.1:"+server.getLocalPort()+"/");
System.out.println ("Client: connecting to " + url);
--- a/jdk/test/sun/net/www/protocol/http/SetChunkedStreamingMode.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/net/www/protocol/http/SetChunkedStreamingMode.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 5049976
* @library ../../httptest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction
+ @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @run main SetChunkedStreamingMode
* @summary Unspecified NPE is thrown when streaming output mode is enabled
*/
@@ -60,11 +60,11 @@
System.out.println ("finished reading");
}
- static HttpServer server;
+ static TestHttpServer server;
public static void main (String[] args) throws Exception {
try {
- server = new HttpServer (new SetChunkedStreamingMode(), 1, 10, 0);
+ server = new TestHttpServer (new SetChunkedStreamingMode(), 1, 10, 0);
System.out.println ("Server: listening on port: " + server.getLocalPort());
URL url = new URL ("http://127.0.0.1:"+server.getLocalPort()+"/");
System.out.println ("Client: connecting to " + url);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/ec/TestECDH2.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 6405536
+ * @summary basic test of ECDSA signatures for P-256 and P-384 from the
+ * example data in "Suite B Implementer's Guide to FIPS 186-3".
+ * @library ..
+ * @library ../../../../java/security/testlibrary
+ * @compile -XDignore.symbol.file TestECDH2.java
+ * @run main TestECDH2
+ */
+
+import java.io.*;
+import java.util.*;
+import java.math.BigInteger;
+
+import java.security.*;
+import java.security.spec.*;
+import java.security.interfaces.*;
+import javax.crypto.*;
+
+import sun.security.ec.NamedCurve;
+
+public class TestECDH2 extends PKCS11Test {
+
+ // values of the keys we use for the tests
+
+ // keypair using NIST P-256
+ private final static String privD256 = "70a12c2db16845ed56ff68cfc21a472b3f04d7d6851bf6349f2d7d5b3452b38a";
+ private final static String pubX256 = "8101ece47464a6ead70cf69a6e2bd3d88691a3262d22cba4f7635eaff26680a8";
+ private final static String pubY256 = "d8a12ba61d599235f67d9cb4d58f1783d3ca43e78f0a5abaa624079936c0c3a9";
+
+ // keypair using NIST P-384
+ private final static String privD384 = "c838b85253ef8dc7394fa5808a5183981c7deef5a69ba8f4f2117ffea39cfcd90e95f6cbc854abacab701d50c1f3cf24";
+ private final static String pubX384 = "1fbac8eebd0cbf35640b39efe0808dd774debff20a2a329e91713baf7d7f3c3e81546d883730bee7e48678f857b02ca0";
+ private final static String pubY384 = "eb213103bd68ce343365a8a4c3d4555fa385f5330203bdd76ffad1f3affb95751c132007e1b240353cb0a4cf1693bdf9";
+
+ private KeyFactory kf = null;
+ private KeyPairGenerator kpg = null;
+
+ private static void testKeyAgreement(KeyPair kpA, KeyPair kpB, Provider p)
+ throws Exception {
+ KeyAgreement ka1 = KeyAgreement.getInstance("ECDH", p);
+ ka1.init(kpA.getPrivate());
+ ka1.doPhase(kpB.getPublic(), true);
+ byte[] s1 = ka1.generateSecret();
+
+ KeyAgreement ka2 = KeyAgreement.getInstance("ECDH", p);
+ ka2.init(kpB.getPrivate());
+ ka2.doPhase(kpA.getPublic(), true);
+ byte[] s2 = ka2.generateSecret();
+ if (Arrays.equals(s1, s2) == false) {
+ System.out.println("expected: " + toString(s1));
+ System.out.println("actual: " + toString(s2));
+ throw new Exception("Generated secrets do not match");
+ }
+ }
+
+ private KeyPair genECKeyPair(String curvName, String privD, String pubX,
+ String pubY) throws Exception {
+ ECParameterSpec ecParams = NamedCurve.getECParameterSpec(curvName);
+ ECPrivateKeySpec privKeySpec =
+ new ECPrivateKeySpec(new BigInteger(privD, 16), ecParams);
+ ECPublicKeySpec pubKeySpec =
+ new ECPublicKeySpec(new ECPoint(new BigInteger(pubX, 16),
+ new BigInteger(pubY, 16)),
+ ecParams);
+ PrivateKey privKey = kf.generatePrivate(privKeySpec);
+ PublicKey pubKey = kf.generatePublic(pubKeySpec);
+ return new KeyPair(pubKey, privKey);
+ }
+ private KeyPair genECKeyPair(String curvName) throws Exception {
+ ECGenParameterSpec genParams = new ECGenParameterSpec(curvName);
+ kpg.initialize(genParams, null);
+ return kpg.generateKeyPair();
+ }
+ public static void main(String[] args) throws Exception {
+ main(new TestECDH2());
+ }
+
+ public void main(Provider provider) throws Exception {
+ if (provider.getService("KeyAgreement", "ECDH") == null) {
+ System.out.println("ECDH not supported, skipping");
+ return;
+ }
+
+ kf = KeyFactory.getInstance("EC", provider);
+ kpg = KeyPairGenerator.getInstance("EC", provider);
+
+ System.out.println("Testing against NIST P-256");
+
+ long start = System.currentTimeMillis();
+ KeyPair kp256A = genECKeyPair("secp256r1", privD256, pubX256, pubY256);
+ KeyPair kp256B = genECKeyPair("secp256r1");
+ testKeyAgreement(kp256A, kp256B, provider);
+
+ System.out.println("Testing against NIST P-384");
+ KeyPair kp384A = genECKeyPair("secp384r1", privD384, pubX384, pubY384);
+ KeyPair kp384B = genECKeyPair("secp384r1");
+ testKeyAgreement(kp384A, kp384B, provider);
+
+ long stop = System.currentTimeMillis();
+ System.out.println("All tests passed (" + (stop - start) + " ms).");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/ec/TestECDSA2.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 6405536
+ * @summary basic test of ECDSA signatures for P-256 and P-384 from the
+ * example data in "Suite B Implementer's Guide to FIPS 186-3".
+ * @library ..
+ * @library ../../../../java/security/testlibrary
+ * @compile -XDignore.symbol.file TestECDSA2.java
+ * @run main TestECDSA2
+ */
+
+import java.io.*;
+import java.util.*;
+import java.math.BigInteger;
+
+import java.security.*;
+import java.security.spec.*;
+import java.security.interfaces.*;
+
+import sun.security.ec.NamedCurve;
+
+public class TestECDSA2 extends PKCS11Test {
+
+ // values of the keys we use for the tests
+
+ // keypair using NIST P-256
+ private final static String privD256 = "70a12c2db16845ed56ff68cfc21a472b3f04d7d6851bf6349f2d7d5b3452b38a";
+ private final static String pubX256 = "8101ece47464a6ead70cf69a6e2bd3d88691a3262d22cba4f7635eaff26680a8";
+ private final static String pubY256 = "d8a12ba61d599235f67d9cb4d58f1783d3ca43e78f0a5abaa624079936c0c3a9";
+
+ // keypair using NIST P-384
+ private final static String privD384 = "c838b85253ef8dc7394fa5808a5183981c7deef5a69ba8f4f2117ffea39cfcd90e95f6cbc854abacab701d50c1f3cf24";
+ private final static String pubX384 = "1fbac8eebd0cbf35640b39efe0808dd774debff20a2a329e91713baf7d7f3c3e81546d883730bee7e48678f857b02ca0";
+ private final static String pubY384 = "eb213103bd68ce343365a8a4c3d4555fa385f5330203bdd76ffad1f3affb95751c132007e1b240353cb0a4cf1693bdf9";
+
+ // data to be signed
+ private final static byte[] data = "This is only a test message. It is 48 bytes long".getBytes();
+
+ private KeyFactory kf = null;
+
+ private static void testSignAndVerify(String alg, KeyPair kp, Provider p) throws Exception {
+ Signature s = Signature.getInstance(alg, p);
+ s.initSign(kp.getPrivate());
+ s.update(data);
+ byte[] result = s.sign();
+
+ s.initVerify(kp.getPublic());
+ s.update(data);
+ if (!s.verify(result)) {
+ throw new Exception("Error: Signature verification failed");
+ }
+ System.out.println(p.getName() + ": " + alg + " Passed");
+ }
+
+ private KeyPair genECKeyPair(String curvName, String privD, String pubX, String pubY) throws Exception {
+ ECParameterSpec ecParams = NamedCurve.getECParameterSpec(curvName);
+ ECPrivateKeySpec privKeySpec =
+ new ECPrivateKeySpec(new BigInteger(privD, 16), ecParams);
+ ECPublicKeySpec pubKeySpec =
+ new ECPublicKeySpec(new ECPoint(new BigInteger(pubX, 16), new BigInteger(pubY, 16)),
+ ecParams);
+ PrivateKey privKey = kf.generatePrivate(privKeySpec);
+ PublicKey pubKey = kf.generatePublic(pubKeySpec);
+ return new KeyPair(pubKey, privKey);
+ }
+
+ public static void main(String[] args) throws Exception {
+ main(new TestECDSA2());
+ }
+
+ public void main(Provider provider) throws Exception {
+ boolean testP256 =
+ (provider.getService("Signature", "SHA256withECDSA") != null);
+
+ boolean testP384 =
+ (provider.getService("Signature", "SHA384withECDSA") != null);
+
+ if (!testP256 && !testP384) {
+ System.out.println("ECDSA not supported, skipping");
+ return;
+ }
+
+ kf = KeyFactory.getInstance("EC", provider);
+
+ long start = System.currentTimeMillis();
+ if (testP256) {
+ // can use secp256r1, NIST P-256, X9.62 prime256v1, or 1.2.840.10045.3.1.7
+ KeyPair kp = genECKeyPair("secp256r1", privD256, pubX256, pubY256);
+ testSignAndVerify("SHA256withECDSA", kp, provider);
+ }
+ if (testP384) {
+ // can use secp384r1, NIST P-384, 1.3.132.0.34
+ KeyPair kp = genECKeyPair("secp384r1", privD384, pubX384, pubY384);
+ testSignAndVerify("SHA384withECDSA", kp, provider);
+ }
+ long stop = System.currentTimeMillis();
+ System.out.println("All tests passed (" + (stop - start) + " ms).");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/provider/DSA/TestAlgParameterGenerator.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7044060
+ * @summary verify that DSA parameter generation works
+ * @run main/othervm/timeout=300 TestAlgParameterGenerator
+ */
+import java.security.*;
+import java.security.spec.*;
+import java.security.interfaces.*;
+
+public class TestAlgParameterGenerator {
+
+ private static void checkParamStrength(AlgorithmParameters param,
+ int strength) throws Exception {
+ String algo = param.getAlgorithm();
+ if (!algo.equalsIgnoreCase("DSA")) {
+ throw new Exception("Unexpected type of parameters: " + algo);
+ }
+ DSAParameterSpec spec = param.getParameterSpec(DSAParameterSpec.class);
+ int valueL = spec.getP().bitLength();
+ if (strength != valueL) {
+ System.out.println("Expected " + strength + " but actual " + valueL);
+ throw new Exception("Wrong P strength");
+ }
+ }
+ private static void checkParamStrength(AlgorithmParameters param,
+ DSAGenParameterSpec genParam)
+ throws Exception {
+ String algo = param.getAlgorithm();
+ if (!algo.equalsIgnoreCase("DSA")) {
+ throw new Exception("Unexpected type of parameters: " + algo);
+ }
+ DSAParameterSpec spec = param.getParameterSpec(DSAParameterSpec.class);
+ int valueL = spec.getP().bitLength();
+ int strength = genParam.getPrimePLength();
+ if (strength != valueL) {
+ System.out.println("P: Expected " + strength + " but actual " + valueL);
+ throw new Exception("Wrong P strength");
+ }
+ int valueN = spec.getQ().bitLength();
+ strength = genParam.getSubprimeQLength();
+ if (strength != valueN) {
+ System.out.println("Q: Expected " + strength + " but actual " + valueN);
+ throw new Exception("Wrong Q strength");
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ AlgorithmParameterGenerator apg =
+ AlgorithmParameterGenerator.getInstance("DSA", "SUN");
+
+ long start, stop;
+ // make sure no-init still works
+ start = System.currentTimeMillis();
+ AlgorithmParameters param = apg.generateParameters();
+ stop = System.currentTimeMillis();
+ System.out.println("Time: " + (stop - start) + " ms.");
+ checkParamStrength(param, 1024);
+
+ // make sure the old model works
+ int[] strengths = { 512, 768, 1024 };
+ for (int i = 0; i < strengths.length; i++) {
+ int sizeP = strengths[i];
+ System.out.println("Generating " + sizeP + "-bit DSA Parameters");
+ start = System.currentTimeMillis();
+ apg.init(sizeP);
+ param = apg.generateParameters();
+ stop = System.currentTimeMillis();
+ System.out.println("Time: " + (stop - start) + " ms.");
+ checkParamStrength(param, sizeP);
+ }
+
+ // now the newer model
+ DSAGenParameterSpec spec1 = new DSAGenParameterSpec(1024, 160);
+ DSAGenParameterSpec spec2 = new DSAGenParameterSpec(2048, 224);
+ DSAGenParameterSpec spec3 = new DSAGenParameterSpec(2048, 256);
+ //DSAGenParameterSpec spec4 = new DSAGenParameterSpec(3072, 256);
+ DSAGenParameterSpec[] specSet = {
+ spec1, spec2, spec3//, spec4
+ };
+ for (int i = 0; i < specSet.length; i++) {
+ DSAGenParameterSpec genParam = specSet[i];
+ System.out.println("Generating (" + genParam.getPrimePLength() +
+ ", " + genParam.getSubprimeQLength() +
+ ") DSA Parameters");
+ start = System.currentTimeMillis();
+ apg.init(genParam, null);
+ param = apg.generateParameters();
+ stop = System.currentTimeMillis();
+ System.out.println("Time: " + (stop - start) + " ms.");
+ checkParamStrength(param, genParam);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/provider/DSA/TestDSA2.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 7044060
+ * @run main/othervm/timeout=250 TestDSA2
+ * @summary verify that DSA signature works using SHA and SHA-224 and SHA-256 digests.
+ */
+
+
+import java.security.*;
+import java.security.spec.*;
+import java.security.interfaces.*;
+
+public class TestDSA2 {
+
+ // NOTE: need to explictly specify provider since the more
+ // preferred provider SunPKCS11 provider only supports up
+ // 1024 bits.
+ private static final String PROV = "SUN";
+
+ private static final String[] SIG_ALGOS = {
+ "SHA1withDSA", "SHA224withDSA", "SHA256withDSA"
+ };
+
+ private static final int[] KEYSIZES = {
+ 1024, 2048
+ };
+
+ public static void main(String[] args) throws Exception {
+ boolean[] expectedToPass = { true, true, true };
+ test(1024, expectedToPass);
+ boolean[] expectedToPass2 = { false, true, true };
+ test(2048, expectedToPass2);
+ }
+
+ private static void test(int keySize, boolean[] testStatus)
+ throws Exception {
+ byte[] data = "1234567890".getBytes();
+ System.out.println("Test against key size: " + keySize);
+
+ KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", PROV);
+ keyGen.initialize(keySize, new SecureRandom());
+ KeyPair pair = keyGen.generateKeyPair();
+
+ if (testStatus.length != SIG_ALGOS.length) {
+ throw new RuntimeException("TestError: incorrect status array!");
+ }
+ for (int i = 0; i < SIG_ALGOS.length; i++) {
+ Signature dsa = Signature.getInstance(SIG_ALGOS[i], PROV);
+ try {
+ dsa.initSign(pair.getPrivate());
+ dsa.update(data);
+ byte[] sig = dsa.sign();
+ dsa.initVerify(pair.getPublic());
+ dsa.update(data);
+ boolean verifies = dsa.verify(sig);
+ if (verifies == testStatus[i]) {
+ System.out.println(SIG_ALGOS[i] + ": Passed");
+ } else {
+ System.out.println(SIG_ALGOS[i] + ": should " +
+ (testStatus[i]? "pass":"fail"));
+ throw new RuntimeException(SIG_ALGOS[i] + ": Unexpected Test result!");
+
+ }
+ } catch (Exception ex) {
+ if (testStatus[i]) {
+ ex.printStackTrace();
+ throw new RuntimeException(SIG_ALGOS[i] + ": Unexpected exception " + ex);
+ } else {
+ System.out.println(SIG_ALGOS[i] + ": Passed, expected " + ex);
+ }
+ }
+ }
+ }
+}
--- a/jdk/test/sun/security/provider/DSA/TestKeyPairGenerator.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/security/provider/DSA/TestKeyPairGenerator.java Mon Sep 10 09:00:00 2012 -0400
@@ -24,7 +24,7 @@
/*
* @test
* @bug 4800108
- * @summary verify that precomputed DSA parameters are always used (512, 768, 1024 bit)
+ * @summary verify that precomputed DSA parameters are always used (512, 768, 1024, 2048 bit)
* @run main/othervm/timeout=15 TestKeyPairGenerator
*/
@@ -78,6 +78,10 @@
kp = kpg.generateKeyPair();
checkKeyLength(kp, 512);
+ kpg.initialize(2048);
+ kp = kpg.generateKeyPair();
+ checkKeyLength(kp, 2048);
+
long stop = System.currentTimeMillis();
System.out.println("Time: " + (stop - start) + " ms.");
}
--- a/jdk/test/sun/security/ssl/sun/net/www/http/ChunkedOutputStream/Test.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/security/ssl/sun/net/www/http/ChunkedOutputStream/Test.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,6 +25,7 @@
* @test
* @bug 5026745
* @library ../../httpstest/
+ * @build TestHttpsServer HttpCallback
* @run main/othervm Test
*
* SunJSSE does not support dynamic system properties, no way to re-use
@@ -275,7 +276,7 @@
}
}
- static HttpServer server;
+ static TestHttpsServer server;
public static void main (String[] args) throws Exception {
// setup properties to do ssl
@@ -296,7 +297,7 @@
HttpsURLConnection.setDefaultHostnameVerifier(new NameVerifier());
try {
- server = new HttpServer (new Test(), 1, 10, 0);
+ server = new TestHttpsServer (new Test(), 1, 10, 0);
System.out.println ("Server started: listening on port: " + server.getLocalPort());
// the test server doesn't support keep-alive yet
// test1("http://localhost:"+server.getLocalPort()+"/d0");
--- a/jdk/test/sun/security/ssl/sun/net/www/httpstest/HttpServer.java Mon Sep 10 08:57:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,933 +0,0 @@
-/*
- * Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.net.*;
-import java.io.*;
-import java.nio.*;
-import java.nio.channels.*;
-import sun.net.www.MessageHeader;
-import java.util.*;
-import javax.net.ssl.*;
-import javax.net.ssl.SSLEngineResult.*;
-import java.security.*;
-
-/**
- * This class implements a simple HTTPS server. It uses multiple threads to
- * handle connections in parallel, and will spin off a new thread to handle
- * each request. (this is easier to implement with SSLEngine)
- * <p>
- * It must be instantiated with a {@link HttpCallback} object to which
- * requests are given and must be handled.
- * <p>
- * Simple synchronization between the client(s) and server can be done
- * using the {@link #waitForCondition(String)}, {@link #setCondition(String)} and
- * {@link #rendezvous(String,int)} methods.
- *
- * NOTE NOTE NOTE NOTE NOTE NOTE NOTE
- *
- * If you make a change in here, please don't forget to make the
- * corresponding change in the J2SE equivalent.
- *
- * NOTE NOTE NOTE NOTE NOTE NOTE NOTE
- */
-
-public class HttpServer {
-
- ServerSocketChannel schan;
- int threads;
- int cperthread;
- HttpCallback cb;
- Server[] servers;
-
- // ssl related fields
- static SSLContext sslCtx;
-
- /**
- * Create a <code>HttpServer<code> instance with the specified callback object
- * for handling requests. One thread is created to handle requests,
- * and up to ten TCP connections will be handled simultaneously.
- * @param cb the callback object which is invoked to handle each
- * incoming request
- */
-
- public HttpServer (HttpCallback cb) throws IOException {
- this (cb, 1, 10, 0);
- }
-
- /**
- * Create a <code>HttpServer<code> instance with the specified number of
- * threads and maximum number of connections per thread. This functions
- * the same as the 4 arg constructor, where the port argument is set to zero.
- * @param cb the callback object which is invoked to handle each
- * incoming request
- * @param threads the number of threads to create to handle requests
- * in parallel
- * @param cperthread the number of simultaneous TCP connections to
- * handle per thread
- */
-
- public HttpServer (HttpCallback cb, int threads, int cperthread)
- throws IOException {
- this (cb, threads, cperthread, 0);
- }
-
- /**
- * Create a <code>HttpServer<code> instance with the specified number
- * of threads and maximum number of connections per thread and running on
- * the specified port. The specified number of threads are created to
- * handle incoming requests, and each thread is allowed
- * to handle a number of simultaneous TCP connections.
- * @param cb the callback object which is invoked to handle
- * each incoming request
- * @param threads the number of threads to create to handle
- * requests in parallel
- * @param cperthread the number of simultaneous TCP connections
- * to handle per thread
- * @param port the port number to bind the server to. <code>Zero</code>
- * means choose any free port.
- */
-
- public HttpServer (HttpCallback cb, int threads, int cperthread, int port)
- throws IOException {
- schan = ServerSocketChannel.open ();
- InetSocketAddress addr = new InetSocketAddress (port);
- schan.socket().bind (addr);
- this.threads = threads;
- this.cb = cb;
- this.cperthread = cperthread;
-
- try {
- // create and initialize a SSLContext
- KeyStore ks = KeyStore.getInstance("JKS");
- KeyStore ts = KeyStore.getInstance("JKS");
- char[] passphrase = "passphrase".toCharArray();
-
- ks.load(new FileInputStream(System.getProperty("javax.net.ssl.keyStore")), passphrase);
- ts.load(new FileInputStream(System.getProperty("javax.net.ssl.trustStore")), passphrase);
-
- KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
- kmf.init(ks, passphrase);
-
- TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
- tmf.init(ts);
-
- sslCtx = SSLContext.getInstance("TLS");
-
- sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
-
- servers = new Server [threads];
- for (int i=0; i<threads; i++) {
- servers[i] = new Server (cb, schan, cperthread);
- servers[i].start();
- }
- } catch (Exception ex) {
- throw new RuntimeException("test failed. cause: "+ex.getMessage());
- }
- }
-
- /** Tell all threads in the server to exit within 5 seconds.
- * This is an abortive termination. Just prior to the thread exiting
- * all channels in that thread waiting to be closed are forceably closed.
- */
-
- public void terminate () {
- for (int i=0; i<threads; i++) {
- servers[i].terminate ();
- }
- }
-
- /**
- * return the local port number to which the server is bound.
- * @return the local port number
- */
-
- public int getLocalPort () {
- return schan.socket().getLocalPort ();
- }
-
- static class Server extends Thread {
-
- ServerSocketChannel schan;
- Selector selector;
- SelectionKey listenerKey;
- SelectionKey key; /* the current key being processed */
- HttpCallback cb;
- ByteBuffer consumeBuffer;
- int maxconn;
- int nconn;
- ClosedChannelList clist;
- boolean shutdown;
-
- Server (HttpCallback cb, ServerSocketChannel schan, int maxconn) {
- this.schan = schan;
- this.maxconn = maxconn;
- this.cb = cb;
- nconn = 0;
- consumeBuffer = ByteBuffer.allocate (512);
- clist = new ClosedChannelList ();
- try {
- selector = Selector.open ();
- schan.configureBlocking (false);
- listenerKey = schan.register (selector, SelectionKey.OP_ACCEPT);
- } catch (IOException e) {
- System.err.println ("Server could not start: " + e);
- }
- }
-
- /* Stop the thread as soon as possible */
- public synchronized void terminate () {
- shutdown = true;
- }
-
- public void run () {
- try {
- while (true) {
- selector.select (1000);
- Set selected = selector.selectedKeys();
- Iterator iter = selected.iterator();
- while (iter.hasNext()) {
- key = (SelectionKey)iter.next();
- if (key.equals (listenerKey)) {
- SocketChannel sock = schan.accept ();
- if (sock == null) {
- /* false notification */
- iter.remove();
- continue;
- }
- sock.configureBlocking (true);
- SSLEngine sslEng = sslCtx.createSSLEngine();
- sslEng.setUseClientMode(false);
- new ServerWorker(cb, sock, sslEng).start();
- nconn ++;
- if (nconn == maxconn) {
- /* deregister */
- listenerKey.cancel ();
- listenerKey = null;
- }
- } else {
- if (key.isReadable()) {
- boolean closed = false;
- SocketChannel chan = (SocketChannel) key.channel();
- if (key.attachment() != null) {
- closed = consume (chan);
- }
-
- if (closed) {
- chan.close ();
- key.cancel ();
- if (nconn == maxconn) {
- listenerKey = schan.register (selector, SelectionKey.OP_ACCEPT);
- }
- nconn --;
- }
- }
- }
- iter.remove();
- }
- clist.check();
-
- synchronized (this) {
- if (shutdown) {
- clist.terminate ();
- return;
- }
- }
- }
- } catch (IOException e) {
- System.out.println ("Server exception: " + e);
- // TODO finish
- }
- }
-
- /* read all the data off the channel without looking at it
- * return true if connection closed
- */
- boolean consume (SocketChannel chan) {
- try {
- consumeBuffer.clear ();
- int c = chan.read (consumeBuffer);
- if (c == -1)
- return true;
- } catch (IOException e) {
- return true;
- }
- return false;
- }
- }
-
- static class ServerWorker extends Thread {
- private ByteBuffer inNetBB;
- private ByteBuffer outNetBB;
- private ByteBuffer inAppBB;
- private ByteBuffer outAppBB;
-
- SSLEngine sslEng;
- SocketChannel schan;
- HttpCallback cb;
- HandshakeStatus currentHSStatus;
- boolean initialHSComplete;
- /*
- * All inbound data goes through this buffer.
- *
- * It might be nice to use a cache of ByteBuffers so we're
- * not alloc/dealloc'ing all over the place.
- */
-
- /*
- * Application buffers, also used for handshaking
- */
- private int appBBSize;
-
- ServerWorker (HttpCallback cb, SocketChannel schan, SSLEngine sslEng) {
- this.sslEng = sslEng;
- this.schan = schan;
- this.cb = cb;
- currentHSStatus = HandshakeStatus.NEED_UNWRAP;
- initialHSComplete = false;
- int netBBSize = sslEng.getSession().getPacketBufferSize();
- inNetBB = ByteBuffer.allocate(netBBSize);
- outNetBB = ByteBuffer.allocate(netBBSize);
- appBBSize = sslEng.getSession().getApplicationBufferSize();
- inAppBB = ByteBuffer.allocate(appBBSize);
- outAppBB = ByteBuffer.allocate(appBBSize);
- }
-
- public SSLEngine getSSLEngine() {
- return sslEng;
- }
-
- public ByteBuffer outNetBB() {
- return outNetBB;
- }
-
- public ByteBuffer outAppBB() {
- return outAppBB;
- }
-
- public void run () {
- try {
- SSLEngineResult result;
-
- while (!initialHSComplete) {
-
- switch (currentHSStatus) {
-
- case NEED_UNWRAP:
- int bytes = schan.read(inNetBB);
-
-needIO:
- while (currentHSStatus == HandshakeStatus.NEED_UNWRAP) {
- /*
- * Don't need to resize requestBB, since no app data should
- * be generated here.
- */
- inNetBB.flip();
- result = sslEng.unwrap(inNetBB, inAppBB);
- inNetBB.compact();
- currentHSStatus = result.getHandshakeStatus();
-
- switch (result.getStatus()) {
-
- case OK:
- switch (currentHSStatus) {
- case NOT_HANDSHAKING:
- throw new IOException(
- "Not handshaking during initial handshake");
-
- case NEED_TASK:
- Runnable task;
- while ((task = sslEng.getDelegatedTask()) != null) {
- task.run();
- currentHSStatus = sslEng.getHandshakeStatus();
- }
- break;
- }
-
- break;
-
- case BUFFER_UNDERFLOW:
- break needIO;
-
- default: // BUFFER_OVERFLOW/CLOSED:
- throw new IOException("Received" + result.getStatus() +
- "during initial handshaking");
- }
- }
-
- /*
- * Just transitioned from read to write.
- */
- if (currentHSStatus != HandshakeStatus.NEED_WRAP) {
- break;
- }
-
- // Fall through and fill the write buffer.
-
- case NEED_WRAP:
- /*
- * The flush above guarantees the out buffer to be empty
- */
- outNetBB.clear();
- result = sslEng.wrap(inAppBB, outNetBB);
- outNetBB.flip();
- schan.write (outNetBB);
- outNetBB.compact();
- currentHSStatus = result.getHandshakeStatus();
-
- switch (result.getStatus()) {
- case OK:
-
- if (currentHSStatus == HandshakeStatus.NEED_TASK) {
- Runnable task;
- while ((task = sslEng.getDelegatedTask()) != null) {
- task.run();
- currentHSStatus = sslEng.getHandshakeStatus();
- }
- }
-
- break;
-
- default: // BUFFER_OVERFLOW/BUFFER_UNDERFLOW/CLOSED:
- throw new IOException("Received" + result.getStatus() +
- "during initial handshaking");
- }
- break;
-
- case FINISHED:
- initialHSComplete = true;
- break;
- default: // NOT_HANDSHAKING/NEED_TASK
- throw new RuntimeException("Invalid Handshaking State" +
- currentHSStatus);
- } // switch
- }
- // read the application data; using non-blocking mode
- schan.configureBlocking(false);
- read(schan, sslEng);
- } catch (Exception ex) {
- throw new RuntimeException(ex);
- }
- }
-
- /* return true if the connection is closed, false otherwise */
-
- private boolean read (SocketChannel chan, SSLEngine sslEng) {
- HttpTransaction msg;
- boolean res;
- try {
- InputStream is = new BufferedInputStream (new NioInputStream (chan, sslEng, inNetBB, inAppBB));
- String requestline = readLine (is);
- MessageHeader mhead = new MessageHeader (is);
- String clen = mhead.findValue ("Content-Length");
- String trferenc = mhead.findValue ("Transfer-Encoding");
- String data = null;
- if (trferenc != null && trferenc.equals ("chunked"))
- data = new String (readChunkedData (is));
- else if (clen != null)
- data = new String (readNormalData (is, Integer.parseInt (clen)));
- String[] req = requestline.split (" ");
- if (req.length < 2) {
- /* invalid request line */
- return false;
- }
- String cmd = req[0];
- URI uri = null;
- try {
- uri = new URI (req[1]);
- msg = new HttpTransaction (this, cmd, uri, mhead, data, null, chan);
- cb.request (msg);
- } catch (URISyntaxException e) {
- System.err.println ("Invalid URI: " + e);
- msg = new HttpTransaction (this, cmd, null, null, null, null, chan);
- msg.sendResponse (501, "Whatever");
- }
- res = false;
- } catch (IOException e) {
- res = true;
- }
- return res;
- }
-
- byte[] readNormalData (InputStream is, int len) throws IOException {
- byte [] buf = new byte [len];
- int c, off=0, remain=len;
- while (remain > 0 && ((c=is.read (buf, off, remain))>0)) {
- remain -= c;
- off += c;
- }
- return buf;
- }
-
- private void readCRLF(InputStream is) throws IOException {
- int cr = is.read();
- int lf = is.read();
-
- if (((cr & 0xff) != 0x0d) ||
- ((lf & 0xff) != 0x0a)) {
- throw new IOException(
- "Expected <CR><LF>: got '" + cr + "/" + lf + "'");
- }
- }
-
- byte[] readChunkedData (InputStream is) throws IOException {
- LinkedList l = new LinkedList ();
- int total = 0;
- for (int len=readChunkLen(is); len!=0; len=readChunkLen(is)) {
- l.add (readNormalData(is, len));
- total += len;
- readCRLF(is); // CRLF at end of chunk
- }
- readCRLF(is); // CRLF at end of Chunked Stream.
- byte[] buf = new byte [total];
- Iterator i = l.iterator();
- int x = 0;
- while (i.hasNext()) {
- byte[] b = (byte[])i.next();
- System.arraycopy (b, 0, buf, x, b.length);
- x += b.length;
- }
- return buf;
- }
-
- private int readChunkLen (InputStream is) throws IOException {
- int c, len=0;
- boolean done=false, readCR=false;
- while (!done) {
- c = is.read ();
- if (c == '\n' && readCR) {
- done = true;
- } else {
- if (c == '\r' && !readCR) {
- readCR = true;
- } else {
- int x=0;
- if (c >= 'a' && c <= 'f') {
- x = c - 'a' + 10;
- } else if (c >= 'A' && c <= 'F') {
- x = c - 'A' + 10;
- } else if (c >= '0' && c <= '9') {
- x = c - '0';
- }
- len = len * 16 + x;
- }
- }
- }
- return len;
- }
-
- private String readLine (InputStream is) throws IOException {
- boolean done=false, readCR=false;
- byte[] b = new byte [512];
- int c, l = 0;
-
- while (!done) {
- c = is.read ();
- if (c == '\n' && readCR) {
- done = true;
- } else {
- if (c == '\r' && !readCR) {
- readCR = true;
- } else {
- b[l++] = (byte)c;
- }
- }
- }
- return new String (b);
- }
-
- /** close the channel associated with the current key by:
- * 1. shutdownOutput (send a FIN)
- * 2. mark the key so that incoming data is to be consumed and discarded
- * 3. After a period, close the socket
- */
-
- synchronized void orderlyCloseChannel (SocketChannel ch) throws IOException {
- ch.socket().shutdownOutput();
- }
-
- synchronized void abortiveCloseChannel (SocketChannel ch) throws IOException {
- Socket s = ch.socket ();
- s.setSoLinger (true, 0);
- ch.close();
- }
- }
-
-
- /**
- * Implements blocking reading semantics on top of a non-blocking channel
- */
-
- static class NioInputStream extends InputStream {
- SSLEngine sslEng;
- SocketChannel channel;
- Selector selector;
- ByteBuffer inNetBB;
- ByteBuffer inAppBB;
- SelectionKey key;
- int available;
- byte[] one;
- boolean closed;
- ByteBuffer markBuf; /* reads may be satisifed from this buffer */
- boolean marked;
- boolean reset;
- int readlimit;
-
- public NioInputStream (SocketChannel chan, SSLEngine sslEng, ByteBuffer inNetBB, ByteBuffer inAppBB) throws IOException {
- this.sslEng = sslEng;
- this.channel = chan;
- selector = Selector.open();
- this.inNetBB = inNetBB;
- this.inAppBB = inAppBB;
- key = chan.register (selector, SelectionKey.OP_READ);
- available = 0;
- one = new byte[1];
- closed = marked = reset = false;
- }
-
- public synchronized int read (byte[] b) throws IOException {
- return read (b, 0, b.length);
- }
-
- public synchronized int read () throws IOException {
- return read (one, 0, 1);
- }
-
- public synchronized int read (byte[] b, int off, int srclen) throws IOException {
-
- int canreturn, willreturn;
-
- if (closed)
- return -1;
-
- if (reset) { /* satisfy from markBuf */
- canreturn = markBuf.remaining ();
- willreturn = canreturn>srclen ? srclen : canreturn;
- markBuf.get(b, off, willreturn);
- if (canreturn == willreturn) {
- reset = false;
- }
- } else { /* satisfy from channel */
- canreturn = available();
- if (canreturn == 0) {
- block ();
- canreturn = available();
- }
- willreturn = canreturn>srclen ? srclen : canreturn;
- inAppBB.get(b, off, willreturn);
- available -= willreturn;
-
- if (marked) { /* copy into markBuf */
- try {
- markBuf.put (b, off, willreturn);
- } catch (BufferOverflowException e) {
- marked = false;
- }
- }
- }
- return willreturn;
- }
-
- public synchronized int available () throws IOException {
- if (closed)
- throw new IOException ("Stream is closed");
-
- if (reset)
- return markBuf.remaining();
-
- if (available > 0)
- return available;
-
- inAppBB.clear ();
- int bytes = channel.read (inNetBB);
-
- int needed = sslEng.getSession().getApplicationBufferSize();
- if (needed > inAppBB.remaining()) {
- inAppBB = ByteBuffer.allocate(needed);
- }
- inNetBB.flip();
- SSLEngineResult result = sslEng.unwrap(inNetBB, inAppBB);
- inNetBB.compact();
- available = result.bytesProduced();
-
- if (available > 0)
- inAppBB.flip();
- else if (available == -1)
- throw new IOException ("Stream is closed");
- return available;
- }
-
- /**
- * block() only called when available==0 and buf is empty
- */
- private synchronized void block () throws IOException {
- //assert available == 0;
- int n = selector.select ();
- //assert n == 1;
- selector.selectedKeys().clear();
- available ();
- }
-
- public void close () throws IOException {
- if (closed)
- return;
- channel.close ();
- closed = true;
- }
-
- public synchronized void mark (int readlimit) {
- if (closed)
- return;
- this.readlimit = readlimit;
- markBuf = ByteBuffer.allocate (readlimit);
- marked = true;
- reset = false;
- }
-
- public synchronized void reset () throws IOException {
- if (closed )
- return;
- if (!marked)
- throw new IOException ("Stream not marked");
- marked = false;
- reset = true;
- markBuf.flip ();
- }
- }
-
- static class NioOutputStream extends OutputStream {
- SSLEngine sslEng;
- SocketChannel channel;
- ByteBuffer outNetBB;
- ByteBuffer outAppBB;
- SelectionKey key;
- Selector selector;
- boolean closed;
- byte[] one;
-
- public NioOutputStream (SocketChannel channel, SSLEngine sslEng, ByteBuffer outNetBB, ByteBuffer outAppBB) throws IOException {
- this.sslEng = sslEng;
- this.channel = channel;
- this.outNetBB = outNetBB;
- this.outAppBB = outAppBB;
- selector = Selector.open ();
- key = channel.register (selector, SelectionKey.OP_WRITE);
- closed = false;
- one = new byte [1];
- }
-
- public synchronized void write (int b) throws IOException {
- one[0] = (byte)b;
- write (one, 0, 1);
- }
-
- public synchronized void write (byte[] b) throws IOException {
- write (b, 0, b.length);
- }
-
- public synchronized void write (byte[] b, int off, int len) throws IOException {
- if (closed)
- throw new IOException ("stream is closed");
-
- outAppBB = ByteBuffer.allocate (len);
- outAppBB.put (b, off, len);
- outAppBB.flip ();
- int n;
- outNetBB.clear();
- int needed = sslEng.getSession().getPacketBufferSize();
- if (outNetBB.capacity() < needed) {
- outNetBB = ByteBuffer.allocate(needed);
- }
- SSLEngineResult ret = sslEng.wrap(outAppBB, outNetBB);
- outNetBB.flip();
- int newLen = ret.bytesProduced();
- while ((n = channel.write (outNetBB)) < newLen) {
- newLen -= n;
- if (newLen == 0)
- return;
- selector.select ();
- selector.selectedKeys().clear ();
- }
- }
-
- public void close () throws IOException {
- if (closed)
- return;
- channel.close ();
- closed = true;
- }
- }
-
- /**
- * Utilities for synchronization. A condition is
- * identified by a string name, and is initialized
- * upon first use (ie. setCondition() or waitForCondition()). Threads
- * are blocked until some thread calls (or has called) setCondition() for the same
- * condition.
- * <P>
- * A rendezvous built on a condition is also provided for synchronizing
- * N threads.
- */
-
- private static HashMap conditions = new HashMap();
-
- /*
- * Modifiable boolean object
- */
- private static class BValue {
- boolean v;
- }
-
- /*
- * Modifiable int object
- */
- private static class IValue {
- int v;
- IValue (int i) {
- v =i;
- }
- }
-
-
- private static BValue getCond (String condition) {
- synchronized (conditions) {
- BValue cond = (BValue) conditions.get (condition);
- if (cond == null) {
- cond = new BValue();
- conditions.put (condition, cond);
- }
- return cond;
- }
- }
-
- /**
- * Set the condition to true. Any threads that are currently blocked
- * waiting on the condition, will be unblocked and allowed to continue.
- * Threads that subsequently call waitForCondition() will not block.
- * If the named condition did not exist prior to the call, then it is created
- * first.
- */
-
- public static void setCondition (String condition) {
- BValue cond = getCond (condition);
- synchronized (cond) {
- if (cond.v) {
- return;
- }
- cond.v = true;
- cond.notifyAll();
- }
- }
-
- /**
- * If the named condition does not exist, then it is created and initialized
- * to false. If the condition exists or has just been created and its value
- * is false, then the thread blocks until another thread sets the condition.
- * If the condition exists and is already set to true, then this call returns
- * immediately without blocking.
- */
-
- public static void waitForCondition (String condition) {
- BValue cond = getCond (condition);
- synchronized (cond) {
- if (!cond.v) {
- try {
- cond.wait();
- } catch (InterruptedException e) {}
- }
- }
- }
-
- /* conditions must be locked when accessing this */
- static HashMap rv = new HashMap();
-
- /**
- * Force N threads to rendezvous (ie. wait for each other) before proceeding.
- * The first thread(s) to call are blocked until the last
- * thread makes the call. Then all threads continue.
- * <p>
- * All threads that call with the same condition name, must use the same value
- * for N (or the results may be not be as expected).
- * <P>
- * Obviously, if fewer than N threads make the rendezvous then the result
- * will be a hang.
- */
-
- public static void rendezvous (String condition, int N) {
- BValue cond;
- IValue iv;
- String name = "RV_"+condition;
-
- /* get the condition */
-
- synchronized (conditions) {
- cond = (BValue)conditions.get (name);
- if (cond == null) {
- /* we are first caller */
- if (N < 2) {
- throw new RuntimeException ("rendezvous must be called with N >= 2");
- }
- cond = new BValue ();
- conditions.put (name, cond);
- iv = new IValue (N-1);
- rv.put (name, iv);
- } else {
- /* already initialised, just decrement the counter */
- iv = (IValue) rv.get (name);
- iv.v --;
- }
- }
-
- if (iv.v > 0) {
- waitForCondition (name);
- } else {
- setCondition (name);
- synchronized (conditions) {
- clearCondition (name);
- rv.remove (name);
- }
- }
- }
-
- /**
- * If the named condition exists and is set then remove it, so it can
- * be re-initialized and used again. If the condition does not exist, or
- * exists but is not set, then the call returns without doing anything.
- * Note, some higher level synchronization
- * may be needed between clear and the other operations.
- */
-
- public static void clearCondition(String condition) {
- BValue cond;
- synchronized (conditions) {
- cond = (BValue) conditions.get (condition);
- if (cond == null) {
- return;
- }
- synchronized (cond) {
- if (cond.v) {
- conditions.remove (condition);
- }
- }
- }
- }
-}
--- a/jdk/test/sun/security/ssl/sun/net/www/httpstest/HttpTransaction.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/security/ssl/sun/net/www/httpstest/HttpTransaction.java Mon Sep 10 09:00:00 2012 -0400
@@ -37,7 +37,7 @@
String command;
URI requesturi;
- HttpServer.ServerWorker server;
+ TestHttpsServer.ServerWorker server;
MessageHeader reqheaders, reqtrailers;
String reqbody;
byte[] rspbody;
@@ -46,7 +46,7 @@
int rspbodylen;
boolean rspchunked;
- HttpTransaction (HttpServer.ServerWorker server, String command,
+ HttpTransaction (TestHttpsServer.ServerWorker server, String command,
URI requesturi, MessageHeader headers,
String body, MessageHeader trailers, SocketChannel ch) {
this.command = command;
@@ -290,7 +290,7 @@
* @param rTag the response string to send with the response code
*/
public void sendResponse (int rCode, String rTag) throws IOException {
- OutputStream os = new HttpServer.NioOutputStream(channel(), server.getSSLEngine(), server.outNetBB(), server.outAppBB());
+ OutputStream os = new TestHttpsServer.NioOutputStream(channel(), server.getSSLEngine(), server.outNetBB(), server.outAppBB());
PrintStream ps = new PrintStream (os);
ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n");
if (rspheaders != null) {
@@ -314,7 +314,7 @@
/* sends one byte less than intended */
public void sendPartialResponse (int rCode, String rTag)throws IOException {
- OutputStream os = new HttpServer.NioOutputStream(channel(), server.getSSLEngine(), server.outNetBB(), server.outAppBB());
+ OutputStream os = new TestHttpsServer.NioOutputStream(channel(), server.getSSLEngine(), server.outNetBB(), server.outAppBB());
PrintStream ps = new PrintStream (os);
ps.print ("HTTP/1.1 " + rCode + " " + rTag + "\r\n");
ps.flush();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/ssl/sun/net/www/httpstest/TestHttpsServer.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,933 @@
+/*
+ * Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.*;
+import java.nio.channels.*;
+import sun.net.www.MessageHeader;
+import java.util.*;
+import javax.net.ssl.*;
+import javax.net.ssl.SSLEngineResult.*;
+import java.security.*;
+
+/**
+ * This class implements a simple HTTPS server. It uses multiple threads to
+ * handle connections in parallel, and will spin off a new thread to handle
+ * each request. (this is easier to implement with SSLEngine)
+ * <p>
+ * It must be instantiated with a {@link HttpCallback} object to which
+ * requests are given and must be handled.
+ * <p>
+ * Simple synchronization between the client(s) and server can be done
+ * using the {@link #waitForCondition(String)}, {@link #setCondition(String)} and
+ * {@link #rendezvous(String,int)} methods.
+ *
+ * NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+ *
+ * If you make a change in here, please don't forget to make the
+ * corresponding change in the J2SE equivalent.
+ *
+ * NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+ */
+
+public class TestHttpsServer {
+
+ ServerSocketChannel schan;
+ int threads;
+ int cperthread;
+ HttpCallback cb;
+ Server[] servers;
+
+ // ssl related fields
+ static SSLContext sslCtx;
+
+ /**
+ * Create a <code>TestHttpsServer<code> instance with the specified callback object
+ * for handling requests. One thread is created to handle requests,
+ * and up to ten TCP connections will be handled simultaneously.
+ * @param cb the callback object which is invoked to handle each
+ * incoming request
+ */
+
+ public TestHttpsServer (HttpCallback cb) throws IOException {
+ this (cb, 1, 10, 0);
+ }
+
+ /**
+ * Create a <code>TestHttpsServer<code> instance with the specified number of
+ * threads and maximum number of connections per thread. This functions
+ * the same as the 4 arg constructor, where the port argument is set to zero.
+ * @param cb the callback object which is invoked to handle each
+ * incoming request
+ * @param threads the number of threads to create to handle requests
+ * in parallel
+ * @param cperthread the number of simultaneous TCP connections to
+ * handle per thread
+ */
+
+ public TestHttpsServer (HttpCallback cb, int threads, int cperthread)
+ throws IOException {
+ this (cb, threads, cperthread, 0);
+ }
+
+ /**
+ * Create a <code>TestHttpsServer<code> instance with the specified number
+ * of threads and maximum number of connections per thread and running on
+ * the specified port. The specified number of threads are created to
+ * handle incoming requests, and each thread is allowed
+ * to handle a number of simultaneous TCP connections.
+ * @param cb the callback object which is invoked to handle
+ * each incoming request
+ * @param threads the number of threads to create to handle
+ * requests in parallel
+ * @param cperthread the number of simultaneous TCP connections
+ * to handle per thread
+ * @param port the port number to bind the server to. <code>Zero</code>
+ * means choose any free port.
+ */
+
+ public TestHttpsServer (HttpCallback cb, int threads, int cperthread, int port)
+ throws IOException {
+ schan = ServerSocketChannel.open ();
+ InetSocketAddress addr = new InetSocketAddress (port);
+ schan.socket().bind (addr);
+ this.threads = threads;
+ this.cb = cb;
+ this.cperthread = cperthread;
+
+ try {
+ // create and initialize a SSLContext
+ KeyStore ks = KeyStore.getInstance("JKS");
+ KeyStore ts = KeyStore.getInstance("JKS");
+ char[] passphrase = "passphrase".toCharArray();
+
+ ks.load(new FileInputStream(System.getProperty("javax.net.ssl.keyStore")), passphrase);
+ ts.load(new FileInputStream(System.getProperty("javax.net.ssl.trustStore")), passphrase);
+
+ KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+ kmf.init(ks, passphrase);
+
+ TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+ tmf.init(ts);
+
+ sslCtx = SSLContext.getInstance("TLS");
+
+ sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
+
+ servers = new Server [threads];
+ for (int i=0; i<threads; i++) {
+ servers[i] = new Server (cb, schan, cperthread);
+ servers[i].start();
+ }
+ } catch (Exception ex) {
+ throw new RuntimeException("test failed. cause: "+ex.getMessage());
+ }
+ }
+
+ /** Tell all threads in the server to exit within 5 seconds.
+ * This is an abortive termination. Just prior to the thread exiting
+ * all channels in that thread waiting to be closed are forceably closed.
+ */
+
+ public void terminate () {
+ for (int i=0; i<threads; i++) {
+ servers[i].terminate ();
+ }
+ }
+
+ /**
+ * return the local port number to which the server is bound.
+ * @return the local port number
+ */
+
+ public int getLocalPort () {
+ return schan.socket().getLocalPort ();
+ }
+
+ static class Server extends Thread {
+
+ ServerSocketChannel schan;
+ Selector selector;
+ SelectionKey listenerKey;
+ SelectionKey key; /* the current key being processed */
+ HttpCallback cb;
+ ByteBuffer consumeBuffer;
+ int maxconn;
+ int nconn;
+ ClosedChannelList clist;
+ boolean shutdown;
+
+ Server (HttpCallback cb, ServerSocketChannel schan, int maxconn) {
+ this.schan = schan;
+ this.maxconn = maxconn;
+ this.cb = cb;
+ nconn = 0;
+ consumeBuffer = ByteBuffer.allocate (512);
+ clist = new ClosedChannelList ();
+ try {
+ selector = Selector.open ();
+ schan.configureBlocking (false);
+ listenerKey = schan.register (selector, SelectionKey.OP_ACCEPT);
+ } catch (IOException e) {
+ System.err.println ("Server could not start: " + e);
+ }
+ }
+
+ /* Stop the thread as soon as possible */
+ public synchronized void terminate () {
+ shutdown = true;
+ }
+
+ public void run () {
+ try {
+ while (true) {
+ selector.select (1000);
+ Set selected = selector.selectedKeys();
+ Iterator iter = selected.iterator();
+ while (iter.hasNext()) {
+ key = (SelectionKey)iter.next();
+ if (key.equals (listenerKey)) {
+ SocketChannel sock = schan.accept ();
+ if (sock == null) {
+ /* false notification */
+ iter.remove();
+ continue;
+ }
+ sock.configureBlocking (true);
+ SSLEngine sslEng = sslCtx.createSSLEngine();
+ sslEng.setUseClientMode(false);
+ new ServerWorker(cb, sock, sslEng).start();
+ nconn ++;
+ if (nconn == maxconn) {
+ /* deregister */
+ listenerKey.cancel ();
+ listenerKey = null;
+ }
+ } else {
+ if (key.isReadable()) {
+ boolean closed = false;
+ SocketChannel chan = (SocketChannel) key.channel();
+ if (key.attachment() != null) {
+ closed = consume (chan);
+ }
+
+ if (closed) {
+ chan.close ();
+ key.cancel ();
+ if (nconn == maxconn) {
+ listenerKey = schan.register (selector, SelectionKey.OP_ACCEPT);
+ }
+ nconn --;
+ }
+ }
+ }
+ iter.remove();
+ }
+ clist.check();
+
+ synchronized (this) {
+ if (shutdown) {
+ clist.terminate ();
+ return;
+ }
+ }
+ }
+ } catch (IOException e) {
+ System.out.println ("Server exception: " + e);
+ // TODO finish
+ }
+ }
+
+ /* read all the data off the channel without looking at it
+ * return true if connection closed
+ */
+ boolean consume (SocketChannel chan) {
+ try {
+ consumeBuffer.clear ();
+ int c = chan.read (consumeBuffer);
+ if (c == -1)
+ return true;
+ } catch (IOException e) {
+ return true;
+ }
+ return false;
+ }
+ }
+
+ static class ServerWorker extends Thread {
+ private ByteBuffer inNetBB;
+ private ByteBuffer outNetBB;
+ private ByteBuffer inAppBB;
+ private ByteBuffer outAppBB;
+
+ SSLEngine sslEng;
+ SocketChannel schan;
+ HttpCallback cb;
+ HandshakeStatus currentHSStatus;
+ boolean initialHSComplete;
+ /*
+ * All inbound data goes through this buffer.
+ *
+ * It might be nice to use a cache of ByteBuffers so we're
+ * not alloc/dealloc'ing all over the place.
+ */
+
+ /*
+ * Application buffers, also used for handshaking
+ */
+ private int appBBSize;
+
+ ServerWorker (HttpCallback cb, SocketChannel schan, SSLEngine sslEng) {
+ this.sslEng = sslEng;
+ this.schan = schan;
+ this.cb = cb;
+ currentHSStatus = HandshakeStatus.NEED_UNWRAP;
+ initialHSComplete = false;
+ int netBBSize = sslEng.getSession().getPacketBufferSize();
+ inNetBB = ByteBuffer.allocate(netBBSize);
+ outNetBB = ByteBuffer.allocate(netBBSize);
+ appBBSize = sslEng.getSession().getApplicationBufferSize();
+ inAppBB = ByteBuffer.allocate(appBBSize);
+ outAppBB = ByteBuffer.allocate(appBBSize);
+ }
+
+ public SSLEngine getSSLEngine() {
+ return sslEng;
+ }
+
+ public ByteBuffer outNetBB() {
+ return outNetBB;
+ }
+
+ public ByteBuffer outAppBB() {
+ return outAppBB;
+ }
+
+ public void run () {
+ try {
+ SSLEngineResult result;
+
+ while (!initialHSComplete) {
+
+ switch (currentHSStatus) {
+
+ case NEED_UNWRAP:
+ int bytes = schan.read(inNetBB);
+
+needIO:
+ while (currentHSStatus == HandshakeStatus.NEED_UNWRAP) {
+ /*
+ * Don't need to resize requestBB, since no app data should
+ * be generated here.
+ */
+ inNetBB.flip();
+ result = sslEng.unwrap(inNetBB, inAppBB);
+ inNetBB.compact();
+ currentHSStatus = result.getHandshakeStatus();
+
+ switch (result.getStatus()) {
+
+ case OK:
+ switch (currentHSStatus) {
+ case NOT_HANDSHAKING:
+ throw new IOException(
+ "Not handshaking during initial handshake");
+
+ case NEED_TASK:
+ Runnable task;
+ while ((task = sslEng.getDelegatedTask()) != null) {
+ task.run();
+ currentHSStatus = sslEng.getHandshakeStatus();
+ }
+ break;
+ }
+
+ break;
+
+ case BUFFER_UNDERFLOW:
+ break needIO;
+
+ default: // BUFFER_OVERFLOW/CLOSED:
+ throw new IOException("Received" + result.getStatus() +
+ "during initial handshaking");
+ }
+ }
+
+ /*
+ * Just transitioned from read to write.
+ */
+ if (currentHSStatus != HandshakeStatus.NEED_WRAP) {
+ break;
+ }
+
+ // Fall through and fill the write buffer.
+
+ case NEED_WRAP:
+ /*
+ * The flush above guarantees the out buffer to be empty
+ */
+ outNetBB.clear();
+ result = sslEng.wrap(inAppBB, outNetBB);
+ outNetBB.flip();
+ schan.write (outNetBB);
+ outNetBB.compact();
+ currentHSStatus = result.getHandshakeStatus();
+
+ switch (result.getStatus()) {
+ case OK:
+
+ if (currentHSStatus == HandshakeStatus.NEED_TASK) {
+ Runnable task;
+ while ((task = sslEng.getDelegatedTask()) != null) {
+ task.run();
+ currentHSStatus = sslEng.getHandshakeStatus();
+ }
+ }
+
+ break;
+
+ default: // BUFFER_OVERFLOW/BUFFER_UNDERFLOW/CLOSED:
+ throw new IOException("Received" + result.getStatus() +
+ "during initial handshaking");
+ }
+ break;
+
+ case FINISHED:
+ initialHSComplete = true;
+ break;
+ default: // NOT_HANDSHAKING/NEED_TASK
+ throw new RuntimeException("Invalid Handshaking State" +
+ currentHSStatus);
+ } // switch
+ }
+ // read the application data; using non-blocking mode
+ schan.configureBlocking(false);
+ read(schan, sslEng);
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /* return true if the connection is closed, false otherwise */
+
+ private boolean read (SocketChannel chan, SSLEngine sslEng) {
+ HttpTransaction msg;
+ boolean res;
+ try {
+ InputStream is = new BufferedInputStream (new NioInputStream (chan, sslEng, inNetBB, inAppBB));
+ String requestline = readLine (is);
+ MessageHeader mhead = new MessageHeader (is);
+ String clen = mhead.findValue ("Content-Length");
+ String trferenc = mhead.findValue ("Transfer-Encoding");
+ String data = null;
+ if (trferenc != null && trferenc.equals ("chunked"))
+ data = new String (readChunkedData (is));
+ else if (clen != null)
+ data = new String (readNormalData (is, Integer.parseInt (clen)));
+ String[] req = requestline.split (" ");
+ if (req.length < 2) {
+ /* invalid request line */
+ return false;
+ }
+ String cmd = req[0];
+ URI uri = null;
+ try {
+ uri = new URI (req[1]);
+ msg = new HttpTransaction (this, cmd, uri, mhead, data, null, chan);
+ cb.request (msg);
+ } catch (URISyntaxException e) {
+ System.err.println ("Invalid URI: " + e);
+ msg = new HttpTransaction (this, cmd, null, null, null, null, chan);
+ msg.sendResponse (501, "Whatever");
+ }
+ res = false;
+ } catch (IOException e) {
+ res = true;
+ }
+ return res;
+ }
+
+ byte[] readNormalData (InputStream is, int len) throws IOException {
+ byte [] buf = new byte [len];
+ int c, off=0, remain=len;
+ while (remain > 0 && ((c=is.read (buf, off, remain))>0)) {
+ remain -= c;
+ off += c;
+ }
+ return buf;
+ }
+
+ private void readCRLF(InputStream is) throws IOException {
+ int cr = is.read();
+ int lf = is.read();
+
+ if (((cr & 0xff) != 0x0d) ||
+ ((lf & 0xff) != 0x0a)) {
+ throw new IOException(
+ "Expected <CR><LF>: got '" + cr + "/" + lf + "'");
+ }
+ }
+
+ byte[] readChunkedData (InputStream is) throws IOException {
+ LinkedList l = new LinkedList ();
+ int total = 0;
+ for (int len=readChunkLen(is); len!=0; len=readChunkLen(is)) {
+ l.add (readNormalData(is, len));
+ total += len;
+ readCRLF(is); // CRLF at end of chunk
+ }
+ readCRLF(is); // CRLF at end of Chunked Stream.
+ byte[] buf = new byte [total];
+ Iterator i = l.iterator();
+ int x = 0;
+ while (i.hasNext()) {
+ byte[] b = (byte[])i.next();
+ System.arraycopy (b, 0, buf, x, b.length);
+ x += b.length;
+ }
+ return buf;
+ }
+
+ private int readChunkLen (InputStream is) throws IOException {
+ int c, len=0;
+ boolean done=false, readCR=false;
+ while (!done) {
+ c = is.read ();
+ if (c == '\n' && readCR) {
+ done = true;
+ } else {
+ if (c == '\r' && !readCR) {
+ readCR = true;
+ } else {
+ int x=0;
+ if (c >= 'a' && c <= 'f') {
+ x = c - 'a' + 10;
+ } else if (c >= 'A' && c <= 'F') {
+ x = c - 'A' + 10;
+ } else if (c >= '0' && c <= '9') {
+ x = c - '0';
+ }
+ len = len * 16 + x;
+ }
+ }
+ }
+ return len;
+ }
+
+ private String readLine (InputStream is) throws IOException {
+ boolean done=false, readCR=false;
+ byte[] b = new byte [512];
+ int c, l = 0;
+
+ while (!done) {
+ c = is.read ();
+ if (c == '\n' && readCR) {
+ done = true;
+ } else {
+ if (c == '\r' && !readCR) {
+ readCR = true;
+ } else {
+ b[l++] = (byte)c;
+ }
+ }
+ }
+ return new String (b);
+ }
+
+ /** close the channel associated with the current key by:
+ * 1. shutdownOutput (send a FIN)
+ * 2. mark the key so that incoming data is to be consumed and discarded
+ * 3. After a period, close the socket
+ */
+
+ synchronized void orderlyCloseChannel (SocketChannel ch) throws IOException {
+ ch.socket().shutdownOutput();
+ }
+
+ synchronized void abortiveCloseChannel (SocketChannel ch) throws IOException {
+ Socket s = ch.socket ();
+ s.setSoLinger (true, 0);
+ ch.close();
+ }
+ }
+
+
+ /**
+ * Implements blocking reading semantics on top of a non-blocking channel
+ */
+
+ static class NioInputStream extends InputStream {
+ SSLEngine sslEng;
+ SocketChannel channel;
+ Selector selector;
+ ByteBuffer inNetBB;
+ ByteBuffer inAppBB;
+ SelectionKey key;
+ int available;
+ byte[] one;
+ boolean closed;
+ ByteBuffer markBuf; /* reads may be satisifed from this buffer */
+ boolean marked;
+ boolean reset;
+ int readlimit;
+
+ public NioInputStream (SocketChannel chan, SSLEngine sslEng, ByteBuffer inNetBB, ByteBuffer inAppBB) throws IOException {
+ this.sslEng = sslEng;
+ this.channel = chan;
+ selector = Selector.open();
+ this.inNetBB = inNetBB;
+ this.inAppBB = inAppBB;
+ key = chan.register (selector, SelectionKey.OP_READ);
+ available = 0;
+ one = new byte[1];
+ closed = marked = reset = false;
+ }
+
+ public synchronized int read (byte[] b) throws IOException {
+ return read (b, 0, b.length);
+ }
+
+ public synchronized int read () throws IOException {
+ return read (one, 0, 1);
+ }
+
+ public synchronized int read (byte[] b, int off, int srclen) throws IOException {
+
+ int canreturn, willreturn;
+
+ if (closed)
+ return -1;
+
+ if (reset) { /* satisfy from markBuf */
+ canreturn = markBuf.remaining ();
+ willreturn = canreturn>srclen ? srclen : canreturn;
+ markBuf.get(b, off, willreturn);
+ if (canreturn == willreturn) {
+ reset = false;
+ }
+ } else { /* satisfy from channel */
+ canreturn = available();
+ if (canreturn == 0) {
+ block ();
+ canreturn = available();
+ }
+ willreturn = canreturn>srclen ? srclen : canreturn;
+ inAppBB.get(b, off, willreturn);
+ available -= willreturn;
+
+ if (marked) { /* copy into markBuf */
+ try {
+ markBuf.put (b, off, willreturn);
+ } catch (BufferOverflowException e) {
+ marked = false;
+ }
+ }
+ }
+ return willreturn;
+ }
+
+ public synchronized int available () throws IOException {
+ if (closed)
+ throw new IOException ("Stream is closed");
+
+ if (reset)
+ return markBuf.remaining();
+
+ if (available > 0)
+ return available;
+
+ inAppBB.clear ();
+ int bytes = channel.read (inNetBB);
+
+ int needed = sslEng.getSession().getApplicationBufferSize();
+ if (needed > inAppBB.remaining()) {
+ inAppBB = ByteBuffer.allocate(needed);
+ }
+ inNetBB.flip();
+ SSLEngineResult result = sslEng.unwrap(inNetBB, inAppBB);
+ inNetBB.compact();
+ available = result.bytesProduced();
+
+ if (available > 0)
+ inAppBB.flip();
+ else if (available == -1)
+ throw new IOException ("Stream is closed");
+ return available;
+ }
+
+ /**
+ * block() only called when available==0 and buf is empty
+ */
+ private synchronized void block () throws IOException {
+ //assert available == 0;
+ int n = selector.select ();
+ //assert n == 1;
+ selector.selectedKeys().clear();
+ available ();
+ }
+
+ public void close () throws IOException {
+ if (closed)
+ return;
+ channel.close ();
+ closed = true;
+ }
+
+ public synchronized void mark (int readlimit) {
+ if (closed)
+ return;
+ this.readlimit = readlimit;
+ markBuf = ByteBuffer.allocate (readlimit);
+ marked = true;
+ reset = false;
+ }
+
+ public synchronized void reset () throws IOException {
+ if (closed )
+ return;
+ if (!marked)
+ throw new IOException ("Stream not marked");
+ marked = false;
+ reset = true;
+ markBuf.flip ();
+ }
+ }
+
+ static class NioOutputStream extends OutputStream {
+ SSLEngine sslEng;
+ SocketChannel channel;
+ ByteBuffer outNetBB;
+ ByteBuffer outAppBB;
+ SelectionKey key;
+ Selector selector;
+ boolean closed;
+ byte[] one;
+
+ public NioOutputStream (SocketChannel channel, SSLEngine sslEng, ByteBuffer outNetBB, ByteBuffer outAppBB) throws IOException {
+ this.sslEng = sslEng;
+ this.channel = channel;
+ this.outNetBB = outNetBB;
+ this.outAppBB = outAppBB;
+ selector = Selector.open ();
+ key = channel.register (selector, SelectionKey.OP_WRITE);
+ closed = false;
+ one = new byte [1];
+ }
+
+ public synchronized void write (int b) throws IOException {
+ one[0] = (byte)b;
+ write (one, 0, 1);
+ }
+
+ public synchronized void write (byte[] b) throws IOException {
+ write (b, 0, b.length);
+ }
+
+ public synchronized void write (byte[] b, int off, int len) throws IOException {
+ if (closed)
+ throw new IOException ("stream is closed");
+
+ outAppBB = ByteBuffer.allocate (len);
+ outAppBB.put (b, off, len);
+ outAppBB.flip ();
+ int n;
+ outNetBB.clear();
+ int needed = sslEng.getSession().getPacketBufferSize();
+ if (outNetBB.capacity() < needed) {
+ outNetBB = ByteBuffer.allocate(needed);
+ }
+ SSLEngineResult ret = sslEng.wrap(outAppBB, outNetBB);
+ outNetBB.flip();
+ int newLen = ret.bytesProduced();
+ while ((n = channel.write (outNetBB)) < newLen) {
+ newLen -= n;
+ if (newLen == 0)
+ return;
+ selector.select ();
+ selector.selectedKeys().clear ();
+ }
+ }
+
+ public void close () throws IOException {
+ if (closed)
+ return;
+ channel.close ();
+ closed = true;
+ }
+ }
+
+ /**
+ * Utilities for synchronization. A condition is
+ * identified by a string name, and is initialized
+ * upon first use (ie. setCondition() or waitForCondition()). Threads
+ * are blocked until some thread calls (or has called) setCondition() for the same
+ * condition.
+ * <P>
+ * A rendezvous built on a condition is also provided for synchronizing
+ * N threads.
+ */
+
+ private static HashMap conditions = new HashMap();
+
+ /*
+ * Modifiable boolean object
+ */
+ private static class BValue {
+ boolean v;
+ }
+
+ /*
+ * Modifiable int object
+ */
+ private static class IValue {
+ int v;
+ IValue (int i) {
+ v =i;
+ }
+ }
+
+
+ private static BValue getCond (String condition) {
+ synchronized (conditions) {
+ BValue cond = (BValue) conditions.get (condition);
+ if (cond == null) {
+ cond = new BValue();
+ conditions.put (condition, cond);
+ }
+ return cond;
+ }
+ }
+
+ /**
+ * Set the condition to true. Any threads that are currently blocked
+ * waiting on the condition, will be unblocked and allowed to continue.
+ * Threads that subsequently call waitForCondition() will not block.
+ * If the named condition did not exist prior to the call, then it is created
+ * first.
+ */
+
+ public static void setCondition (String condition) {
+ BValue cond = getCond (condition);
+ synchronized (cond) {
+ if (cond.v) {
+ return;
+ }
+ cond.v = true;
+ cond.notifyAll();
+ }
+ }
+
+ /**
+ * If the named condition does not exist, then it is created and initialized
+ * to false. If the condition exists or has just been created and its value
+ * is false, then the thread blocks until another thread sets the condition.
+ * If the condition exists and is already set to true, then this call returns
+ * immediately without blocking.
+ */
+
+ public static void waitForCondition (String condition) {
+ BValue cond = getCond (condition);
+ synchronized (cond) {
+ if (!cond.v) {
+ try {
+ cond.wait();
+ } catch (InterruptedException e) {}
+ }
+ }
+ }
+
+ /* conditions must be locked when accessing this */
+ static HashMap rv = new HashMap();
+
+ /**
+ * Force N threads to rendezvous (ie. wait for each other) before proceeding.
+ * The first thread(s) to call are blocked until the last
+ * thread makes the call. Then all threads continue.
+ * <p>
+ * All threads that call with the same condition name, must use the same value
+ * for N (or the results may be not be as expected).
+ * <P>
+ * Obviously, if fewer than N threads make the rendezvous then the result
+ * will be a hang.
+ */
+
+ public static void rendezvous (String condition, int N) {
+ BValue cond;
+ IValue iv;
+ String name = "RV_"+condition;
+
+ /* get the condition */
+
+ synchronized (conditions) {
+ cond = (BValue)conditions.get (name);
+ if (cond == null) {
+ /* we are first caller */
+ if (N < 2) {
+ throw new RuntimeException ("rendezvous must be called with N >= 2");
+ }
+ cond = new BValue ();
+ conditions.put (name, cond);
+ iv = new IValue (N-1);
+ rv.put (name, iv);
+ } else {
+ /* already initialised, just decrement the counter */
+ iv = (IValue) rv.get (name);
+ iv.v --;
+ }
+ }
+
+ if (iv.v > 0) {
+ waitForCondition (name);
+ } else {
+ setCondition (name);
+ synchronized (conditions) {
+ clearCondition (name);
+ rv.remove (name);
+ }
+ }
+ }
+
+ /**
+ * If the named condition exists and is set then remove it, so it can
+ * be re-initialized and used again. If the condition does not exist, or
+ * exists but is not set, then the call returns without doing anything.
+ * Note, some higher level synchronization
+ * may be needed between clear and the other operations.
+ */
+
+ public static void clearCondition(String condition) {
+ BValue cond;
+ synchronized (conditions) {
+ cond = (BValue) conditions.get (condition);
+ if (cond == null) {
+ return;
+ }
+ synchronized (cond) {
+ if (cond.v) {
+ conditions.remove (condition);
+ }
+ }
+ }
+ }
+}
--- a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/B6216082.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/B6216082.java Mon Sep 10 09:00:00 2012 -0400
@@ -25,7 +25,7 @@
* @test
* @bug 6216082
* @library ../../../httpstest/
- * @build HttpCallback HttpServer ClosedChannelList HttpTransaction TunnelProxy
+ * @build HttpCallback TestHttpsServer ClosedChannelList HttpTransaction TunnelProxy
* @summary Redirect problem with HttpsURLConnection using a proxy
* SunJSSE does not support dynamic system properties, no way to re-use
* system properties in samevm/agentvm mode.
@@ -39,7 +39,7 @@
public class B6216082 {
static SimpleHttpTransaction httpTrans;
- static HttpServer server;
+ static TestHttpsServer server;
static TunnelProxy proxy;
// it seems there's no proxy ever if a url points to 'localhost',
@@ -133,7 +133,7 @@
// Both the https server and the proxy let the
// system pick up an ephemeral port.
httpTrans = new SimpleHttpTransaction();
- server = new HttpServer(httpTrans, 1, 10, 0);
+ server = new TestHttpsServer(httpTrans, 1, 10, 0);
proxy = new TunnelProxy(1, 10, 0);
}
--- a/jdk/test/sun/tools/jstatd/jpsOutput1.awk Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/sun/tools/jstatd/jpsOutput1.awk Mon Sep 10 09:00:00 2012 -0400
@@ -7,7 +7,7 @@
matched++;
}
-/^[0-9]+ -- process information unavailable$/ {
+/^[0-9]+ -- .*$/ {
matched++;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/BigJar.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7194005
+ * @summary launcher handling of zip64 archives (Scenario A and B)
+ * @compile -XDignore.symbol.file BigJar.java
+ * @run main/timeout=600 BigJar
+ */
+/*
+ * This test consists of two scenarios:
+ *
+ * Scenario A: create a jar with entries exceeding 64K, add a main class and
+ * see if the launcher can handle it.
+ *
+ * Scenario A1: create a jar as in A, but add a zipfile comment as well.
+ *
+ * Scenario B: create a jar with a large enough file exceeding 4GB, and
+ * similarly test the launcher. This test can be run optionally by using the
+ * following jtreg option:
+ * "-javaoptions:-DBigJar_testScenarioB=true"
+ * or set
+ * "BigJar_testScenarioB" environment variable.
+ *
+ * Note this test will only run iff all the disk requirements are met at runtime.
+ */
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.zip.CRC32;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class BigJar extends TestHelper {
+
+ private static final long GIGA = 1024 * 1024 * 1024;
+ private static final int BUFFER_LEN = Short.MAX_VALUE * 2;
+
+ long getCount(long minlength) {
+ return (minlength / BUFFER_LEN) + 1;
+ }
+
+ long computeCRC(long minlength) {
+ CRC32 crc = new CRC32();
+ byte[] buffer = new byte[BUFFER_LEN];
+ long count = getCount(minlength);
+ for (long i = 0; i < count; i++) {
+ crc.update(buffer);
+ }
+ return crc.getValue();
+ }
+
+ long computeCRC(File inFile) throws IOException {
+ byte[] buffer = new byte[8192];
+ CRC32 crc = new CRC32();
+ try (FileInputStream fis = new FileInputStream(inFile);
+ BufferedInputStream bis = new BufferedInputStream(fis)) {
+ int n = bis.read(buffer);
+ while (n > 0) {
+ crc.update(buffer, 0, n);
+ n = bis.read(buffer);
+ }
+ }
+ return crc.getValue();
+ }
+
+ void createLargeFile(OutputStream os, long minlength) throws IOException {
+ byte[] buffer = new byte[BUFFER_LEN];
+ long count = getCount(minlength);
+ for (long i = 0; i < count; i++) {
+ os.write(buffer);
+ }
+ os.flush();
+ }
+
+ Manifest createMainClass(File javaFile) throws IOException {
+ javaFile.delete();
+ List<String> content = new ArrayList<>();
+ content.add("public class " + baseName(javaFile) + "{");
+ content.add("public static void main(String... args) {");
+ content.add("System.out.println(\"Hello World\\n\");");
+ content.add("System.exit(0);");
+ content.add("}");
+ content.add("}");
+ createFile(javaFile, content);
+ compile(javaFile.getName());
+ Manifest manifest = new Manifest();
+ manifest.clear();
+ manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
+ manifest.getMainAttributes().put(Attributes.Name.MAIN_CLASS, baseName(javaFile));
+ System.out.println(manifest.getMainAttributes().keySet());
+ System.out.println(manifest.getMainAttributes().values());
+ return manifest;
+ }
+
+ void createJarWithLargeFile(File jarFile, long minlength) throws IOException {
+ File javaFile = new File("Foo.java");
+ Manifest manifest = createMainClass(javaFile);
+ File classFile = getClassFile(javaFile);
+ try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(jarFile), manifest);
+ BufferedOutputStream bos = new BufferedOutputStream(jos);
+ FileInputStream fis = new FileInputStream(classFile);) {
+ jos.setLevel(ZipOutputStream.STORED);
+ jos.setMethod(0);
+
+ JarEntry je = new JarEntry("large.data");
+ je.setCompressedSize(getCount(minlength) * BUFFER_LEN);
+ je.setSize(getCount(minlength) * BUFFER_LEN);
+ je.setCrc(computeCRC(minlength));
+ je.setMethod(ZipEntry.STORED);
+ jos.putNextEntry(je);
+ createLargeFile(bos, minlength);
+
+ je = new JarEntry(classFile.getName());
+ je.setCompressedSize(classFile.length());
+ je.setSize(classFile.length());
+ je.setCrc(computeCRC(classFile));
+ je.setMethod(ZipEntry.STORED);
+ jos.putNextEntry(je);
+ copyStream(fis, bos);
+ bos.flush();
+ jos.closeEntry();
+ }
+ }
+
+ void createLargeJar(File jarFile, String comment) throws IOException {
+ final int MAX = Short.MAX_VALUE * 2 + 10;
+ JarEntry je = null;
+ File javaFile = new File("Foo.java");
+ File classFile = getClassFile(javaFile);
+ Manifest manifest = createMainClass(javaFile);
+ try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(jarFile), manifest);
+ FileInputStream fis = new FileInputStream(classFile)) {
+ jos.setLevel(JarOutputStream.STORED);
+ jos.setMethod(JarOutputStream.STORED);
+ for (int i = 0; i < MAX; i++) {
+ je = new JarEntry("X" + i + ".txt");
+ je.setSize(0);
+ je.setCompressedSize(0);
+ je.setCrc(0);
+ jos.putNextEntry(je);
+ }
+
+ // add a class file
+ je = new JarEntry(classFile.getName());
+ je.setCompressedSize(classFile.length());
+ je.setSize(classFile.length());
+ je.setCrc(computeCRC(classFile));
+ jos.putNextEntry(je);
+ copyStream(fis, jos);
+ jos.closeEntry();
+ if (comment != null) {
+ jos.setComment(comment);
+ }
+ }
+ }
+
+ void testTheJar(File theJar) throws Exception {
+ try {
+ TestResult tr = doExec(javaCmd, "-jar", theJar.getName());
+ tr.checkPositive();
+ if (!tr.testStatus) {
+ System.out.println(tr);
+ throw new Exception("Failed");
+ }
+ } finally {
+ theJar.delete();
+ }
+ }
+
+ // a jar with entries exceeding 64k + a class file for the existential test
+ @Test
+ void testScenarioA() throws Exception {
+ File largeJar = new File("large.jar");
+ createLargeJar(largeJar, null);
+ testTheJar(largeJar);
+ }
+
+ // a jar with entries exceeding 64k and zip comment
+ @Test
+ void testScenarioA1() throws Exception {
+ File largeJar = new File("largewithcomment.jar");
+ createLargeJar(largeJar, "A really large jar with a comment");
+ testTheJar(largeJar);
+ }
+
+ // a jar with an enormous file + a class file for the existential test
+ @Test
+ void testScenarioB() throws Exception {
+ final String testString = "BigJar_testScenarioB";
+ if (Boolean.getBoolean(testString) == false &&
+ System.getenv(testString) == null) {
+ System.out.println("Warning: testScenarioB passes vacuously");
+ return;
+ }
+ final File largeJar = new File("huge.jar");
+
+ final Path path = largeJar.getAbsoluteFile().getParentFile().toPath();
+ final long available = Files.getFileStore(path).getUsableSpace();
+ final long MAX_VALUE = 0xFFFF_FFFFL;
+
+ final long absolute = MAX_VALUE + 1L;
+ final long required = (long) (absolute * 1.1); // pad for sundries
+ System.out.println("\tavailable: " + available / GIGA + " GB");
+ System.out.println("\trequired: " + required / GIGA + " GB");
+
+ if (available > required) {
+ createJarWithLargeFile(largeJar, absolute);
+ testTheJar(largeJar);
+ } else {
+ System.out.println("Warning: testScenarioB passes vacuously,"
+ + " requirements exceeds available space");
+ }
+ }
+
+ public static void main(String... args) throws Exception {
+ BigJar bj = new BigJar();
+ bj.run(args);
+ if (testExitValue > 0) {
+ System.out.println("Total of " + testExitValue + " failed");
+ System.exit(1);
+ } else {
+ System.out.println("All tests pass");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/RunpathTest.java Mon Sep 10 09:00:00 2012 -0400
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7190813
+ * @summary Check for extended RPATHs on *nixes
+ * @compile -XDignore.symbol.file RunpathTest.java
+ * @run main RunpathTest
+ * @author ksrini
+ */
+
+import java.io.File;
+
+public class RunpathTest extends TestHelper {
+
+ final String elfreaderCmd;
+ RunpathTest() {
+ elfreaderCmd = findElfReader();
+ }
+
+ final String findElfReader() {
+ String[] paths = {"/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/ccs/bin"};
+ final String cmd = isSolaris ? "elfdump" : "readelf";
+ for (String x : paths) {
+ File p = new File(x);
+ File e = new File(p, cmd);
+ if (e.canExecute()) {
+ return e.getAbsolutePath();
+ }
+ }
+ System.err.println("Warning: no suitable elf reader!");
+ return null;
+ }
+
+ void elfCheck(String javacmd, String expectedRpath) {
+ final TestResult tr = doExec(elfreaderCmd, "-d", javacmd);
+ if (!tr.matches(expectedRpath)) {
+ System.out.println(tr);
+ throw new RuntimeException("FAILED: RPATH strings " +
+ expectedRpath + " not found in " + javaCmd);
+ }
+ System.out.println(javacmd + " contains expected RPATHS");
+ }
+
+ void testRpath() {
+ if (isDualMode && is64Bit) {
+ String expectedRpath = ".*RPATH.*\\$ORIGIN/../../lib/" + getJreArch()
+ + ":\\$ORIGIN/../../jre/lib/" + getJreArch() + ".*";
+ elfCheck(java64Cmd, expectedRpath);
+ } else {
+ String expectedRpath = ".*RPATH.*\\$ORIGIN/../lib/" + getJreArch()
+ + ":\\$ORIGIN/../jre/lib/" + getJreArch() + ".*";
+ elfCheck(javaCmd, expectedRpath);
+ }
+ }
+
+ public static void main(String... args) throws Exception {
+ if (isSolaris || isLinux) {
+ RunpathTest rp = new RunpathTest();
+ rp.testRpath();
+ }
+ }
+}
--- a/jdk/test/tools/launcher/TestHelper.java Mon Sep 10 08:57:51 2012 -0400
+++ b/jdk/test/tools/launcher/TestHelper.java Mon Sep 10 09:00:00 2012 -0400
@@ -21,6 +21,8 @@
* questions.
*/
+import java.io.OutputStream;
+import java.io.InputStream;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -243,6 +245,21 @@
return null;
}
+ static File getClassFile(File javaFile) {
+ String s = javaFile.getAbsolutePath().replace(JAVA_FILE_EXT, CLASS_FILE_EXT);
+ return new File(s);
+ }
+
+ static File getJavaFile(File classFile) {
+ String s = classFile.getAbsolutePath().replace(CLASS_FILE_EXT, JAVA_FILE_EXT);
+ return new File(s);
+ }
+
+ static String baseName(File f) {
+ String s = f.getName();
+ return s.substring(0, s.indexOf("."));
+ }
+
/*
* A convenience method to create a jar with jar file name and defs
*/
@@ -324,6 +341,15 @@
}
}
+ static void copyStream(InputStream in, OutputStream out) throws IOException {
+ byte[] buf = new byte[8192];
+ int n = in.read(buf);
+ while (n > 0) {
+ out.write(buf, 0, n);
+ n = in.read(buf);
+ }
+ }
+
static void copyFile(File src, File dst) throws IOException {
Path parent = dst.toPath().getParent();
if (parent != null) {