Merge
This commit is contained in:
commit
31b21fc4a4
@ -134,3 +134,4 @@ fb1bc13260d76447e269e843859eb593fe2a8ab2 jdk8-b08
|
||||
a6c4c248e8fa350c35014fa94bab5ac1a1ac3299 jdk8-b10
|
||||
1defbc57940a56f0aa41e9dee87b71e8c8b71103 jdk8-b11
|
||||
8e2104d565baee473895d5eba20e39f85ab4bf9f jdk8-b12
|
||||
26fb81a1e9ceb9baffba216acd9ded62e9e9d5ab jdk8-b13
|
||||
|
@ -134,3 +134,4 @@ a891732c1a83082177ff7a4cf1506068d9cc0a47 jdk8-b09
|
||||
cda87f7fefcee3b89742a57ce5ad9b03a54c210d jdk8-b10
|
||||
0199e4fef5cc2bd234c65b93220459ef7a3bb3b1 jdk8-b11
|
||||
31d70911b712c6b4e580a3110363d5f044cfed7a jdk8-b12
|
||||
5b9d9b839d3d7fe02347827221c97c6d242a6f96 jdk8-b13
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 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
|
||||
@ -2243,6 +2243,10 @@ public class IIOPInputStream
|
||||
}
|
||||
|
||||
try {
|
||||
Class fieldCl = fields[i].getClazz();
|
||||
if (objectValue != null && !fieldCl.isInstance(objectValue)) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
bridge.putObject( o, fields[i].getFieldID(), objectValue ) ;
|
||||
// reflective code: fields[i].getField().set( o, objectValue ) ;
|
||||
} catch (IllegalArgumentException e) {
|
||||
@ -2553,6 +2557,10 @@ public class IIOPInputStream
|
||||
{
|
||||
try {
|
||||
Field fld = c.getDeclaredField( fieldName ) ;
|
||||
Class fieldCl = fld.getType();
|
||||
if(v != null && !fieldCl.isInstance(v)) {
|
||||
throw new Exception();
|
||||
}
|
||||
long key = bridge.objectFieldOffset( fld ) ;
|
||||
bridge.putObject( o, key, v ) ;
|
||||
} catch (Exception e) {
|
||||
|
@ -197,3 +197,4 @@ d815de2e85e511b7deab2a83cf80c0224d011da9 jdk8-b10
|
||||
6534482ff68ad79066dfe15dfb6d8905f09681bd hs23-b04
|
||||
1d3900713a67a0a39faf4e12c9c158d55aebef87 jdk8-b12
|
||||
3e609627e780736f372eb14d29bb9b5e53b21fbf hs23-b05
|
||||
b92ca8e229d29004f840c67e620833d23a346761 jdk8-b13
|
||||
|
@ -134,3 +134,4 @@ de4794dd69c48b08029d158a972993ff9d5627df jdk8-b08
|
||||
d21a4d5141c04bc9e88f2c0253121d449b66d667 jdk8-b10
|
||||
d1b7a4f6dd2065fdeafbcdfd9dcc0072da8c6881 jdk8-b11
|
||||
ca977d167697a561c04894187fc1c4d927582ffa jdk8-b12
|
||||
bcc739229f6384786c7ac0b52c1822c85674dcf1 jdk8-b13
|
||||
|
@ -134,3 +134,4 @@ acffff22a9465005e8eb206224fae9f2ea4fd469 jdk8-b06
|
||||
8e7fdc8e3c758644ca6d0fd70bb255e9d2e64cda jdk8-b10
|
||||
a12ab897a249feb7859a6e6cd84b49411f4c06ac jdk8-b11
|
||||
e6eed2ff5d5f62bdc815beb5276d23347600c760 jdk8-b12
|
||||
adf2a6b5fde14090beb9ebc40c4114132ddee731 jdk8-b13
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2007, 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
|
||||
@ -25,15 +25,15 @@
|
||||
|
||||
drops.master.copy.base=${drops.dir}
|
||||
|
||||
jaxws_src.bundle.name=jdk7-jaxws2_2_4-b03-2011_05_27.zip
|
||||
jaxws_src.bundle.md5.checksum=2f5b829ade70f67fe272d0b322e3e702
|
||||
jaxws_src.bundle.name=jdk8-jaxws2_2_4-b01-2011_07_22.zip
|
||||
jaxws_src.bundle.md5.checksum=f64bedd3c512e6b1ca265fda2feb0905
|
||||
jaxws_src.master.bundle.dir=${drops.master.copy.base}
|
||||
jaxws_src.master.bundle.url.base=http://download.java.net/glassfish/components/jax-ws/openjdk/jdk7
|
||||
jaxws_src.master.bundle.url.base=http://download.java.net/glassfish/components/jax-ws/openjdk/jdk8
|
||||
|
||||
jaf_src.bundle.name=jdk7-jaf-2010_08_19.zip
|
||||
jaf_src.bundle.name=jdk8-jaf-2011_07_22.zip
|
||||
jaf_src.bundle.md5.checksum=18d15dfd71117daadb332af003d08212
|
||||
jaf_src.master.bundle.dir=${drops.master.copy.base}
|
||||
jaf_src.master.bundle.url.base=https://java.net/downloads/jax-ws/JDK7
|
||||
jaf_src.master.bundle.url.base=http://download.java.net/glassfish/components/jax-ws/openjdk/jdk8
|
||||
|
||||
#jaxws_tests.bundle.name=jdk7-jaxws-tests-2009_08_28.zip
|
||||
#jaxws_tests.master.bundle.dir=${drops.master.copy.base}
|
||||
|
@ -134,3 +134,4 @@ f1ec21b8142168ff40f3278d2f6b5fe4bd5f3b26 jdk8-b09
|
||||
4788745572ef2bde34924ef34e7e4d55ba07e979 jdk8-b10
|
||||
7ab0d613cd1a271a9763ffb894dc1f0a5b95a7e4 jdk8-b11
|
||||
09fd2067f715e4505c44b01c301258a4e8f8964e jdk8-b12
|
||||
4cb2e8679b27432854690cb688ea06d3b2d8e008 jdk8-b13
|
||||
|
@ -232,6 +232,7 @@ FILES_src = \
|
||||
sun/nio/cs/UTF_16BE.java \
|
||||
sun/nio/cs/UTF_16LE.java \
|
||||
sun/nio/cs/UTF_8.java \
|
||||
sun/nio/cs/CESU_8.java \
|
||||
sun/nio/cs/Unicode.java \
|
||||
sun/nio/cs/UnicodeDecoder.java \
|
||||
sun/nio/cs/UnicodeEncoder.java \
|
||||
|
@ -28,6 +28,7 @@ PACKAGE = sun.net
|
||||
PRODUCT = sun
|
||||
SUBDIRS_MAKEFLAGS += JAVAC_MAX_WARNINGS=true
|
||||
SUBDIRS_MAKEFLAGS += JAVAC_WARNINGS_FATAL=true
|
||||
SUBDIRS_MAKEFLAGS += JAVAC_LINT_OPTIONS=-Xlint:all,-deprecation,-path
|
||||
include $(BUILDDIR)/common/Defs.gmk
|
||||
|
||||
SUBDIRS = others spi
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 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
|
||||
@ -179,6 +179,12 @@ class HttpsURLConnection extends HttpURLConnection
|
||||
throw new IllegalArgumentException(
|
||||
"no SSLSocketFactory specified");
|
||||
}
|
||||
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkSetFactory();
|
||||
}
|
||||
|
||||
sslSocketFactory = sf;
|
||||
}
|
||||
|
||||
|
@ -250,6 +250,8 @@ public class IdResolver {
|
||||
int index=s==null ? elementIndex : names.indexOf(n.getNamespaceURI());
|
||||
index=(index<0) ? namesLength : index;
|
||||
String name=n.getLocalName();
|
||||
if (name == null)
|
||||
name = n.getName();
|
||||
if (name.length()>2)
|
||||
continue;
|
||||
String value=n.getNodeValue();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 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
|
||||
@ -25,6 +25,7 @@
|
||||
package java.awt;
|
||||
|
||||
import java.awt.event.KeyEvent;
|
||||
import sun.awt.AppContext;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
@ -66,9 +67,6 @@ import java.lang.reflect.Field;
|
||||
public class AWTKeyStroke implements Serializable {
|
||||
static final long serialVersionUID = -6430539691155161871L;
|
||||
|
||||
private static Map cache;
|
||||
private static AWTKeyStroke cacheKey;
|
||||
private static Constructor ctor = getCtor(AWTKeyStroke.class);
|
||||
private static Map modifierKeywords;
|
||||
/**
|
||||
* Associates VK_XXX (as a String) with code (as Integer). This is
|
||||
@ -77,6 +75,25 @@ public class AWTKeyStroke implements Serializable {
|
||||
*/
|
||||
private static VKCollection vks;
|
||||
|
||||
//A key for the collection of AWTKeyStrokes within AppContext.
|
||||
private static Object APP_CONTEXT_CACHE_KEY = new Object();
|
||||
//A key withing the cache
|
||||
private static AWTKeyStroke APP_CONTEXT_KEYSTROKE_KEY = new AWTKeyStroke();
|
||||
|
||||
/*
|
||||
* Reads keystroke class from AppContext and if null, puts there the
|
||||
* AWTKeyStroke class.
|
||||
* Must be called under locked AWTKeyStro
|
||||
*/
|
||||
private static Class getAWTKeyStrokeClass() {
|
||||
Class clazz = (Class)AppContext.getAppContext().get(AWTKeyStroke.class);
|
||||
if (clazz == null) {
|
||||
clazz = AWTKeyStroke.class;
|
||||
AppContext.getAppContext().put(AWTKeyStroke.class, AWTKeyStroke.class);
|
||||
}
|
||||
return clazz;
|
||||
}
|
||||
|
||||
private char keyChar = KeyEvent.CHAR_UNDEFINED;
|
||||
private int keyCode = KeyEvent.VK_UNDEFINED;
|
||||
private int modifiers;
|
||||
@ -164,9 +181,12 @@ public class AWTKeyStroke implements Serializable {
|
||||
if (subclass == null) {
|
||||
throw new IllegalArgumentException("subclass cannot be null");
|
||||
}
|
||||
if (AWTKeyStroke.ctor.getDeclaringClass().equals(subclass)) {
|
||||
// Already registered
|
||||
return;
|
||||
synchronized (AWTKeyStroke.class) {
|
||||
Class keyStrokeClass = (Class)AppContext.getAppContext().get(AWTKeyStroke.class);
|
||||
if (keyStrokeClass != null && keyStrokeClass.equals(subclass)){
|
||||
// Already registered
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!AWTKeyStroke.class.isAssignableFrom(subclass)) {
|
||||
throw new ClassCastException("subclass is not derived from AWTKeyStroke");
|
||||
@ -197,9 +217,9 @@ public class AWTKeyStroke implements Serializable {
|
||||
}
|
||||
|
||||
synchronized (AWTKeyStroke.class) {
|
||||
AWTKeyStroke.ctor = ctor;
|
||||
cache = null;
|
||||
cacheKey = null;
|
||||
AppContext.getAppContext().put(AWTKeyStroke.class, subclass);
|
||||
AppContext.getAppContext().remove(APP_CONTEXT_CACHE_KEY);
|
||||
AppContext.getAppContext().remove(APP_CONTEXT_KEYSTROKE_KEY);
|
||||
}
|
||||
}
|
||||
|
||||
@ -229,13 +249,19 @@ public class AWTKeyStroke implements Serializable {
|
||||
private static synchronized AWTKeyStroke getCachedStroke
|
||||
(char keyChar, int keyCode, int modifiers, boolean onKeyRelease)
|
||||
{
|
||||
Map cache = (Map)AppContext.getAppContext().get(APP_CONTEXT_CACHE_KEY);
|
||||
AWTKeyStroke cacheKey = (AWTKeyStroke)AppContext.getAppContext().get(APP_CONTEXT_KEYSTROKE_KEY);
|
||||
|
||||
if (cache == null) {
|
||||
cache = new HashMap();
|
||||
AppContext.getAppContext().put(APP_CONTEXT_CACHE_KEY, cache);
|
||||
}
|
||||
|
||||
if (cacheKey == null) {
|
||||
try {
|
||||
cacheKey = (AWTKeyStroke)ctor.newInstance((Object[]) null);
|
||||
Class clazz = getAWTKeyStrokeClass();
|
||||
cacheKey = (AWTKeyStroke)getCtor(clazz).newInstance((Object[]) null);
|
||||
AppContext.getAppContext().put(APP_CONTEXT_KEYSTROKE_KEY, cacheKey);
|
||||
} catch (InstantiationException e) {
|
||||
assert(false);
|
||||
} catch (IllegalAccessException e) {
|
||||
@ -253,9 +279,8 @@ public class AWTKeyStroke implements Serializable {
|
||||
if (stroke == null) {
|
||||
stroke = cacheKey;
|
||||
cache.put(stroke, stroke);
|
||||
cacheKey = null;
|
||||
AppContext.getAppContext().remove(APP_CONTEXT_KEYSTROKE_KEY);
|
||||
}
|
||||
|
||||
return stroke;
|
||||
}
|
||||
|
||||
|
@ -44,10 +44,9 @@ package java.io;
|
||||
*/
|
||||
public abstract class InputStream implements Closeable {
|
||||
|
||||
// SKIP_BUFFER_SIZE is used to determine the size of skipBuffer
|
||||
private static final int SKIP_BUFFER_SIZE = 2048;
|
||||
// skipBuffer is initialized in skip(long), if needed.
|
||||
private static byte[] skipBuffer;
|
||||
// MAX_SKIP_BUFFER_SIZE is used to determine the maximum buffer size to
|
||||
// use when skipping.
|
||||
private static final int MAX_SKIP_BUFFER_SIZE = 2048;
|
||||
|
||||
/**
|
||||
* Reads the next byte of data from the input stream. The value byte is
|
||||
@ -212,18 +211,15 @@ public abstract class InputStream implements Closeable {
|
||||
|
||||
long remaining = n;
|
||||
int nr;
|
||||
if (skipBuffer == null)
|
||||
skipBuffer = new byte[SKIP_BUFFER_SIZE];
|
||||
|
||||
byte[] localSkipBuffer = skipBuffer;
|
||||
|
||||
if (n <= 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining);
|
||||
byte[] skipBuffer = new byte[size];
|
||||
while (remaining > 0) {
|
||||
nr = read(localSkipBuffer, 0,
|
||||
(int) Math.min(SKIP_BUFFER_SIZE, remaining));
|
||||
nr = read(skipBuffer, 0, (int)Math.min(size, remaining));
|
||||
if (nr < 0) {
|
||||
break;
|
||||
}
|
||||
|
@ -27,7 +27,6 @@ package java.lang.ref;
|
||||
|
||||
import sun.misc.Cleaner;
|
||||
|
||||
|
||||
/**
|
||||
* Abstract base class for reference objects. This class defines the
|
||||
* operations common to all reference objects. Because reference objects are
|
||||
@ -69,7 +68,7 @@ public abstract class Reference<T> {
|
||||
* null.
|
||||
*
|
||||
* Pending: queue = ReferenceQueue with which instance is registered;
|
||||
* next = Following instance in queue, or this if at end of list.
|
||||
* next = this
|
||||
*
|
||||
* Enqueued: queue = ReferenceQueue.ENQUEUED; next = Following instance
|
||||
* in queue, or this if at end of list.
|
||||
@ -81,17 +80,28 @@ public abstract class Reference<T> {
|
||||
* the next field is null then the instance is active; if it is non-null,
|
||||
* then the collector should treat the instance normally.
|
||||
*
|
||||
* To ensure that concurrent collector can discover active Reference
|
||||
* To ensure that a concurrent collector can discover active Reference
|
||||
* objects without interfering with application threads that may apply
|
||||
* the enqueue() method to those objects, collectors should link
|
||||
* discovered objects through the discovered field.
|
||||
* discovered objects through the discovered field. The discovered
|
||||
* field is also used for linking Reference objects in the pending list.
|
||||
*/
|
||||
|
||||
private T referent; /* Treated specially by GC */
|
||||
|
||||
ReferenceQueue<? super T> queue;
|
||||
|
||||
/* When active: NULL
|
||||
* pending: this
|
||||
* Enqueued: next reference in queue (or this if last)
|
||||
* Inactive: this
|
||||
*/
|
||||
Reference next;
|
||||
|
||||
/* When active: next element in a discovered reference list maintained by GC (or this if last)
|
||||
* pending: next element in the pending list (or null if last)
|
||||
* otherwise: NULL
|
||||
*/
|
||||
transient private Reference<T> discovered; /* used by VM */
|
||||
|
||||
|
||||
@ -106,7 +116,8 @@ public abstract class Reference<T> {
|
||||
|
||||
/* List of References waiting to be enqueued. The collector adds
|
||||
* References to this list, while the Reference-handler thread removes
|
||||
* them. This list is protected by the above lock object.
|
||||
* them. This list is protected by the above lock object. The
|
||||
* list uses the discovered field to link its elements.
|
||||
*/
|
||||
private static Reference pending = null;
|
||||
|
||||
@ -120,14 +131,12 @@ public abstract class Reference<T> {
|
||||
|
||||
public void run() {
|
||||
for (;;) {
|
||||
|
||||
Reference r;
|
||||
synchronized (lock) {
|
||||
if (pending != null) {
|
||||
r = pending;
|
||||
Reference rn = r.next;
|
||||
pending = (rn == r) ? null : rn;
|
||||
r.next = r;
|
||||
pending = r.discovered;
|
||||
r.discovered = null;
|
||||
} else {
|
||||
try {
|
||||
lock.wait();
|
||||
@ -201,10 +210,8 @@ public abstract class Reference<T> {
|
||||
* been enqueued
|
||||
*/
|
||||
public boolean isEnqueued() {
|
||||
/* In terms of the internal states, this predicate actually tests
|
||||
whether the instance is either Pending or Enqueued */
|
||||
synchronized (this) {
|
||||
return (this.queue != ReferenceQueue.NULL) && (this.next != null);
|
||||
return (this.next != null && this.queue == ReferenceQueue.ENQUEUED);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -876,10 +876,12 @@ class InetAddress implements java.io.Serializable {
|
||||
nameService = java.security.AccessController.doPrivileged(
|
||||
new java.security.PrivilegedExceptionAction<NameService>() {
|
||||
public NameService run() {
|
||||
Iterator itr = Service.providers(NameServiceDescriptor.class);
|
||||
// sun.misc.Service.providers returns a raw Iterator
|
||||
@SuppressWarnings("unchecked")
|
||||
Iterator<NameServiceDescriptor> itr =
|
||||
Service.providers(NameServiceDescriptor.class);
|
||||
while (itr.hasNext()) {
|
||||
NameServiceDescriptor nsd
|
||||
= (NameServiceDescriptor)itr.next();
|
||||
NameServiceDescriptor nsd = itr.next();
|
||||
if (providerName.
|
||||
equalsIgnoreCase(nsd.getType()+","
|
||||
+nsd.getProviderName())) {
|
||||
|
@ -267,10 +267,9 @@ class ServerSocket implements java.io.Closeable {
|
||||
AccessController.doPrivileged(
|
||||
new PrivilegedExceptionAction<Void>() {
|
||||
public Void run() throws NoSuchMethodException {
|
||||
Class[] cl = new Class[2];
|
||||
cl[0] = SocketAddress.class;
|
||||
cl[1] = Integer.TYPE;
|
||||
impl.getClass().getDeclaredMethod("connect", cl);
|
||||
impl.getClass().getDeclaredMethod("connect",
|
||||
SocketAddress.class,
|
||||
int.class);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
@ -435,7 +435,7 @@ public abstract class Charset
|
||||
AccessController.doPrivileged(new PrivilegedAction<Object>() {
|
||||
public Object run() {
|
||||
try {
|
||||
Class epc
|
||||
Class<?> epc
|
||||
= Class.forName("sun.nio.cs.ext.ExtendedCharsets");
|
||||
extendedProvider = (CharsetProvider)epc.newInstance();
|
||||
} catch (ClassNotFoundException x) {
|
||||
|
@ -363,6 +363,17 @@ public final class Files {
|
||||
|
||||
// -- Directories --
|
||||
|
||||
private static class AcceptAllFilter
|
||||
implements DirectoryStream.Filter<Path>
|
||||
{
|
||||
private AcceptAllFilter() { }
|
||||
|
||||
@Override
|
||||
public boolean accept(Path entry) { return true; }
|
||||
|
||||
static final AcceptAllFilter FILTER = new AcceptAllFilter();
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens a directory, returning a {@link DirectoryStream} to iterate over
|
||||
* all entries in the directory. The elements returned by the directory
|
||||
@ -397,12 +408,7 @@ public final class Files {
|
||||
public static DirectoryStream<Path> newDirectoryStream(Path dir)
|
||||
throws IOException
|
||||
{
|
||||
return provider(dir).newDirectoryStream(dir, new DirectoryStream.Filter<Path>() {
|
||||
@Override
|
||||
public boolean accept(Path entry) {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
return provider(dir).newDirectoryStream(dir, AcceptAllFilter.FILTER);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -814,7 +814,7 @@ public final class Security {
|
||||
public Void run() {
|
||||
try {
|
||||
/* Get the class via the bootstrap class loader. */
|
||||
Class cl = Class.forName(
|
||||
Class<?> cl = Class.forName(
|
||||
"java.lang.SecurityManager", false, null);
|
||||
Field f = null;
|
||||
boolean accessible = false;
|
||||
|
@ -443,7 +443,7 @@ public abstract class BreakIterator implements Cloneable
|
||||
|
||||
/**
|
||||
* Returns a new <code>BreakIterator</code> instance
|
||||
* for <a href="#word">word breaks</a>
|
||||
* for <a href="BreakIterator.html#word">word breaks</a>
|
||||
* for the {@linkplain Locale#getDefault() default locale}.
|
||||
* @return A break iterator for word breaks
|
||||
*/
|
||||
@ -454,7 +454,7 @@ public abstract class BreakIterator implements Cloneable
|
||||
|
||||
/**
|
||||
* Returns a new <code>BreakIterator</code> instance
|
||||
* for <a href="#word">word breaks</a>
|
||||
* for <a href="BreakIterator.html#word">word breaks</a>
|
||||
* for the given locale.
|
||||
* @param locale the desired locale
|
||||
* @return A break iterator for word breaks
|
||||
@ -470,7 +470,7 @@ public abstract class BreakIterator implements Cloneable
|
||||
|
||||
/**
|
||||
* Returns a new <code>BreakIterator</code> instance
|
||||
* for <a href="#line">line breaks</a>
|
||||
* for <a href="BreakIterator.html#line">line breaks</a>
|
||||
* for the {@linkplain Locale#getDefault() default locale}.
|
||||
* @return A break iterator for line breaks
|
||||
*/
|
||||
@ -481,7 +481,7 @@ public abstract class BreakIterator implements Cloneable
|
||||
|
||||
/**
|
||||
* Returns a new <code>BreakIterator</code> instance
|
||||
* for <a href="#line">line breaks</a>
|
||||
* for <a href="BreakIterator.html#line">line breaks</a>
|
||||
* for the given locale.
|
||||
* @param locale the desired locale
|
||||
* @return A break iterator for line breaks
|
||||
@ -497,7 +497,7 @@ public abstract class BreakIterator implements Cloneable
|
||||
|
||||
/**
|
||||
* Returns a new <code>BreakIterator</code> instance
|
||||
* for <a href="#character">character breaks</a>
|
||||
* for <a href="BreakIterator.html#character">character breaks</a>
|
||||
* for the {@linkplain Locale#getDefault() default locale}.
|
||||
* @return A break iterator for character breaks
|
||||
*/
|
||||
@ -508,7 +508,7 @@ public abstract class BreakIterator implements Cloneable
|
||||
|
||||
/**
|
||||
* Returns a new <code>BreakIterator</code> instance
|
||||
* for <a href="#character">character breaks</a>
|
||||
* for <a href="BreakIterator.html#character">character breaks</a>
|
||||
* for the given locale.
|
||||
* @param locale the desired locale
|
||||
* @return A break iterator for character breaks
|
||||
@ -524,7 +524,7 @@ public abstract class BreakIterator implements Cloneable
|
||||
|
||||
/**
|
||||
* Returns a new <code>BreakIterator</code> instance
|
||||
* for <a href="#sentence">sentence breaks</a>
|
||||
* for <a href="BreakIterator.html#sentence">sentence breaks</a>
|
||||
* for the {@linkplain Locale#getDefault() default locale}.
|
||||
* @return A break iterator for sentence breaks
|
||||
*/
|
||||
@ -535,7 +535,7 @@ public abstract class BreakIterator implements Cloneable
|
||||
|
||||
/**
|
||||
* Returns a new <code>BreakIterator</code> instance
|
||||
* for <a href="#sentence">sentence breaks</a>
|
||||
* for <a href="BreakIterator.html#sentence">sentence breaks</a>
|
||||
* for the given locale.
|
||||
* @param locale the desired locale
|
||||
* @return A break iterator for sentence breaks
|
||||
|
@ -3201,6 +3201,102 @@ public class Collections {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the empty sorted set (immutable). This set is serializable.
|
||||
*
|
||||
* <p>This example illustrates the type-safe way to obtain an empty sorted
|
||||
* set:
|
||||
* <pre>
|
||||
* SortedSet<String> s = Collections.emptySortedSet();
|
||||
* </pre>
|
||||
* Implementation note: Implementations of this method need not
|
||||
* create a separate <tt>SortedSet</tt> object for each call.
|
||||
*
|
||||
* @since 1.8
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static final <E> SortedSet<E> emptySortedSet() {
|
||||
return (SortedSet<E>) new EmptySortedSet<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* @serial include
|
||||
*/
|
||||
private static class EmptySortedSet<E>
|
||||
extends AbstractSet<E>
|
||||
implements SortedSet<E>, Serializable
|
||||
{
|
||||
private static final long serialVersionUID = 6316515401502265487L;
|
||||
public Iterator<E> iterator() { return emptyIterator(); }
|
||||
public int size() {return 0;}
|
||||
public boolean isEmpty() {return true;}
|
||||
public boolean contains(Object obj) {return false;}
|
||||
public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
|
||||
public Object[] toArray() { return new Object[0]; }
|
||||
|
||||
public <E> E[] toArray(E[] a) {
|
||||
if (a.length > 0)
|
||||
a[0] = null;
|
||||
return a;
|
||||
}
|
||||
|
||||
// Preserves singleton property
|
||||
private Object readResolve() {
|
||||
return new EmptySortedSet<>();
|
||||
}
|
||||
|
||||
public Comparator comparator() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public SortedSet<E> subSet(Object fromElement, Object toElement) {
|
||||
Objects.requireNonNull(fromElement);
|
||||
Objects.requireNonNull(toElement);
|
||||
|
||||
if (!(fromElement instanceof Comparable) ||
|
||||
!(toElement instanceof Comparable))
|
||||
{
|
||||
throw new ClassCastException();
|
||||
}
|
||||
|
||||
if ((((Comparable)fromElement).compareTo(toElement) >= 0) ||
|
||||
(((Comparable)toElement).compareTo(fromElement) < 0))
|
||||
{
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
return emptySortedSet();
|
||||
}
|
||||
|
||||
public SortedSet<E> headSet(Object toElement) {
|
||||
Objects.requireNonNull(toElement);
|
||||
|
||||
if (!(toElement instanceof Comparable)) {
|
||||
throw new ClassCastException();
|
||||
}
|
||||
|
||||
return emptySortedSet();
|
||||
}
|
||||
|
||||
public SortedSet<E> tailSet(Object fromElement) {
|
||||
Objects.requireNonNull(fromElement);
|
||||
|
||||
if (!(fromElement instanceof Comparable)) {
|
||||
throw new ClassCastException();
|
||||
}
|
||||
|
||||
return emptySortedSet();
|
||||
}
|
||||
|
||||
public E first() {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
|
||||
public E last() {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The empty list (immutable). This list is serializable.
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 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
|
||||
@ -347,6 +347,9 @@ class HttpsURLConnection extends HttpURLConnection
|
||||
* @param sf the SSL socket factory
|
||||
* @throws IllegalArgumentException if the <code>SSLSocketFactory</code>
|
||||
* parameter is null.
|
||||
* @throws SecurityException if a security manager exists and its
|
||||
* <code>checkSetFactory</code> method does not allow
|
||||
* a socket factory to be specified.
|
||||
* @see #getSSLSocketFactory()
|
||||
*/
|
||||
public void setSSLSocketFactory(SSLSocketFactory sf) {
|
||||
@ -355,6 +358,10 @@ class HttpsURLConnection extends HttpURLConnection
|
||||
"no SSLSocketFactory specified");
|
||||
}
|
||||
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkSetFactory();
|
||||
}
|
||||
sslSocketFactory = sf;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 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
|
||||
@ -538,7 +538,7 @@ public abstract class SSLEngine {
|
||||
* If this <code>SSLEngine</code> has not yet started its initial
|
||||
* handshake, this method will automatically start the handshake.
|
||||
* <P>
|
||||
* This method will attempt to produce one SSL/TLS packet, and will
|
||||
* This method will attempt to produce SSL/TLS records, and will
|
||||
* consume as much source data as possible, but will never consume
|
||||
* more than the sum of the bytes remaining in each buffer. Each
|
||||
* <code>ByteBuffer</code>'s position is updated to reflect the
|
||||
|
@ -1828,6 +1828,8 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
|
||||
* table. While the {@code autoCreateRowSorter} property remains
|
||||
* {@code true}, every time the model is changed, a new {@code
|
||||
* TableRowSorter} is created and set as the table's row sorter.
|
||||
* The default value for the {@code autoCreateRowSorter}
|
||||
* property is {@code false}.
|
||||
*
|
||||
* @param autoCreateRowSorter whether or not a {@code RowSorter}
|
||||
* should be automatically created
|
||||
|
@ -1838,7 +1838,9 @@ public class JTree extends JComponent implements Scrollable, Accessible
|
||||
* nodes, or <code>null</code> if nothing is currently selected
|
||||
*/
|
||||
public TreePath[] getSelectionPaths() {
|
||||
return getSelectionModel().getSelectionPaths();
|
||||
TreePath[] selectionPaths = getSelectionModel().getSelectionPaths();
|
||||
|
||||
return (selectionPaths != null && selectionPaths.length > 0) ? selectionPaths : null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1326,7 +1326,7 @@ public class DefaultCaret extends Rectangle implements Caret, FocusListener, Mou
|
||||
if ( ! SwingUtilities2.canCurrentEventAccessSystemClipboard() ) {
|
||||
return;
|
||||
}
|
||||
if (this.dot != this.mark && component != null) {
|
||||
if (this.dot != this.mark && component != null && component.hasFocus()) {
|
||||
Clipboard clip = getSystemSelection();
|
||||
if (clip != null) {
|
||||
String selectedText;
|
||||
|
@ -1181,7 +1181,12 @@ public class HTMLDocument extends DefaultStyledDocument {
|
||||
public void insertAfterStart(Element elem, String htmlText) throws
|
||||
BadLocationException, IOException {
|
||||
verifyParser();
|
||||
if (elem != null && elem.isLeaf()) {
|
||||
|
||||
if (elem == null || htmlText == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (elem.isLeaf()) {
|
||||
throw new IllegalArgumentException
|
||||
("Can not insert HTML after start of a leaf");
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1995, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1995, 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
|
||||
@ -185,7 +185,7 @@ public class OffScreenImageSource implements ImageProducer {
|
||||
theConsumer.setDimensions(image.getWidth(), image.getHeight());
|
||||
theConsumer.setProperties(properties);
|
||||
sendPixels();
|
||||
theConsumer.imageComplete(ImageConsumer.SINGLEFRAMEDONE);
|
||||
theConsumer.imageComplete(ImageConsumer.STATICIMAGEDONE);
|
||||
} catch (NullPointerException e) {
|
||||
if (theConsumer != null) {
|
||||
theConsumer.imageComplete(ImageConsumer.IMAGEERROR);
|
||||
|
@ -41,13 +41,14 @@ public class ResourceManager {
|
||||
|
||||
/* default maximum number of udp sockets per VM
|
||||
* when a security manager is enabled.
|
||||
* The default is 1024 which is high enough to be useful
|
||||
* The default is 25 which is high enough to be useful
|
||||
* but low enough to be well below the maximum number
|
||||
* of port numbers actually available on all OSes for
|
||||
* such sockets (5000 on some versions of windows)
|
||||
* of port numbers actually available on all OSes
|
||||
* when multiplied by the maximum feasible number of VM processes
|
||||
* that could practically be spawned.
|
||||
*/
|
||||
|
||||
private static final int DEFAULT_MAX_SOCKETS = 1024;
|
||||
private static final int DEFAULT_MAX_SOCKETS = 25;
|
||||
private static final int maxSockets;
|
||||
private static final AtomicInteger numSockets;
|
||||
|
||||
|
@ -363,10 +363,10 @@ class Util {
|
||||
try {
|
||||
Class<?> cl = Class.forName("java.nio.DirectByteBuffer");
|
||||
Constructor<?> ctor = cl.getDeclaredConstructor(
|
||||
new Class[] { int.class,
|
||||
long.class,
|
||||
FileDescriptor.class,
|
||||
Runnable.class });
|
||||
new Class<?>[] { int.class,
|
||||
long.class,
|
||||
FileDescriptor.class,
|
||||
Runnable.class });
|
||||
ctor.setAccessible(true);
|
||||
directByteBufferConstructor = ctor;
|
||||
} catch (ClassNotFoundException |
|
||||
@ -408,10 +408,10 @@ class Util {
|
||||
try {
|
||||
Class<?> cl = Class.forName("java.nio.DirectByteBufferR");
|
||||
Constructor<?> ctor = cl.getDeclaredConstructor(
|
||||
new Class[] { int.class,
|
||||
long.class,
|
||||
FileDescriptor.class,
|
||||
Runnable.class });
|
||||
new Class<?>[] { int.class,
|
||||
long.class,
|
||||
FileDescriptor.class,
|
||||
Runnable.class });
|
||||
ctor.setAccessible(true);
|
||||
directByteBufferRConstructor = ctor;
|
||||
} catch (ClassNotFoundException |
|
||||
|
604
jdk/src/share/classes/sun/nio/cs/CESU_8.java
Normal file
604
jdk/src/share/classes/sun/nio/cs/CESU_8.java
Normal file
@ -0,0 +1,604 @@
|
||||
/*
|
||||
* Copyright (c) 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.nio.cs;
|
||||
|
||||
import java.nio.Buffer;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.CharBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.CharsetDecoder;
|
||||
import java.nio.charset.CharsetEncoder;
|
||||
import java.nio.charset.CoderResult;
|
||||
import java.nio.charset.CodingErrorAction;
|
||||
|
||||
/* Legal CESU-8 Byte Sequences
|
||||
*
|
||||
* # Code Points Bits Bit/Byte pattern
|
||||
* 1 7 0xxxxxxx
|
||||
* U+0000..U+007F 00..7F
|
||||
*
|
||||
* 2 11 110xxxxx 10xxxxxx
|
||||
* U+0080..U+07FF C2..DF 80..BF
|
||||
*
|
||||
* 3 16 1110xxxx 10xxxxxx 10xxxxxx
|
||||
* U+0800..U+0FFF E0 A0..BF 80..BF
|
||||
* U+1000..U+FFFF E1..EF 80..BF 80..BF
|
||||
*
|
||||
*/
|
||||
|
||||
class CESU_8 extends Unicode
|
||||
{
|
||||
public CESU_8() {
|
||||
super("CESU-8", StandardCharsets.aliases_CESU_8);
|
||||
}
|
||||
|
||||
public String historicalName() {
|
||||
return "CESU8";
|
||||
}
|
||||
|
||||
public CharsetDecoder newDecoder() {
|
||||
return new Decoder(this);
|
||||
}
|
||||
|
||||
public CharsetEncoder newEncoder() {
|
||||
return new Encoder(this);
|
||||
}
|
||||
|
||||
private static final void updatePositions(Buffer src, int sp,
|
||||
Buffer dst, int dp) {
|
||||
src.position(sp - src.arrayOffset());
|
||||
dst.position(dp - dst.arrayOffset());
|
||||
}
|
||||
|
||||
private static class Decoder extends CharsetDecoder
|
||||
implements ArrayDecoder {
|
||||
private Decoder(Charset cs) {
|
||||
super(cs, 1.0f, 1.0f);
|
||||
}
|
||||
|
||||
private static boolean isNotContinuation(int b) {
|
||||
return (b & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
// [E0] [A0..BF] [80..BF]
|
||||
// [E1..EF] [80..BF] [80..BF]
|
||||
private static boolean isMalformed3(int b1, int b2, int b3) {
|
||||
return (b1 == (byte)0xe0 && (b2 & 0xe0) == 0x80) ||
|
||||
(b2 & 0xc0) != 0x80 || (b3 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
// only used when there is only one byte left in src buffer
|
||||
private static boolean isMalformed3_2(int b1, int b2) {
|
||||
return (b1 == (byte)0xe0 && (b2 & 0xe0) == 0x80) ||
|
||||
(b2 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
|
||||
// [F0] [90..BF] [80..BF] [80..BF]
|
||||
// [F1..F3] [80..BF] [80..BF] [80..BF]
|
||||
// [F4] [80..8F] [80..BF] [80..BF]
|
||||
// only check 80-be range here, the [0xf0,0x80...] and [0xf4,0x90-...]
|
||||
// will be checked by Character.isSupplementaryCodePoint(uc)
|
||||
private static boolean isMalformed4(int b2, int b3, int b4) {
|
||||
return (b2 & 0xc0) != 0x80 || (b3 & 0xc0) != 0x80 ||
|
||||
(b4 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
// only used when there is less than 4 bytes left in src buffer
|
||||
private static boolean isMalformed4_2(int b1, int b2) {
|
||||
return (b1 == 0xf0 && b2 == 0x90) ||
|
||||
(b2 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
private static boolean isMalformed4_3(int b3) {
|
||||
return (b3 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
private static CoderResult malformedN(ByteBuffer src, int nb) {
|
||||
switch (nb) {
|
||||
case 1:
|
||||
case 2: // always 1
|
||||
return CoderResult.malformedForLength(1);
|
||||
case 3:
|
||||
int b1 = src.get();
|
||||
int b2 = src.get(); // no need to lookup b3
|
||||
return CoderResult.malformedForLength(
|
||||
((b1 == (byte)0xe0 && (b2 & 0xe0) == 0x80) ||
|
||||
isNotContinuation(b2)) ? 1 : 2);
|
||||
case 4: // we don't care the speed here
|
||||
b1 = src.get() & 0xff;
|
||||
b2 = src.get() & 0xff;
|
||||
if (b1 > 0xf4 ||
|
||||
(b1 == 0xf0 && (b2 < 0x90 || b2 > 0xbf)) ||
|
||||
(b1 == 0xf4 && (b2 & 0xf0) != 0x80) ||
|
||||
isNotContinuation(b2))
|
||||
return CoderResult.malformedForLength(1);
|
||||
if (isNotContinuation(src.get()))
|
||||
return CoderResult.malformedForLength(2);
|
||||
return CoderResult.malformedForLength(3);
|
||||
default:
|
||||
assert false;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static CoderResult malformed(ByteBuffer src, int sp,
|
||||
CharBuffer dst, int dp,
|
||||
int nb)
|
||||
{
|
||||
src.position(sp - src.arrayOffset());
|
||||
CoderResult cr = malformedN(src, nb);
|
||||
updatePositions(src, sp, dst, dp);
|
||||
return cr;
|
||||
}
|
||||
|
||||
|
||||
private static CoderResult malformed(ByteBuffer src,
|
||||
int mark, int nb)
|
||||
{
|
||||
src.position(mark);
|
||||
CoderResult cr = malformedN(src, nb);
|
||||
src.position(mark);
|
||||
return cr;
|
||||
}
|
||||
|
||||
private static CoderResult malformedForLength(ByteBuffer src,
|
||||
int sp,
|
||||
CharBuffer dst,
|
||||
int dp,
|
||||
int malformedNB)
|
||||
{
|
||||
updatePositions(src, sp, dst, dp);
|
||||
return CoderResult.malformedForLength(malformedNB);
|
||||
}
|
||||
|
||||
private static CoderResult malformedForLength(ByteBuffer src,
|
||||
int mark,
|
||||
int malformedNB)
|
||||
{
|
||||
src.position(mark);
|
||||
return CoderResult.malformedForLength(malformedNB);
|
||||
}
|
||||
|
||||
|
||||
private static CoderResult xflow(Buffer src, int sp, int sl,
|
||||
Buffer dst, int dp, int nb) {
|
||||
updatePositions(src, sp, dst, dp);
|
||||
return (nb == 0 || sl - sp < nb)
|
||||
? CoderResult.UNDERFLOW : CoderResult.OVERFLOW;
|
||||
}
|
||||
|
||||
private static CoderResult xflow(Buffer src, int mark, int nb) {
|
||||
src.position(mark);
|
||||
return (nb == 0 || src.remaining() < nb)
|
||||
? CoderResult.UNDERFLOW : CoderResult.OVERFLOW;
|
||||
}
|
||||
|
||||
private CoderResult decodeArrayLoop(ByteBuffer src,
|
||||
CharBuffer dst)
|
||||
{
|
||||
// This method is optimized for ASCII input.
|
||||
byte[] sa = src.array();
|
||||
int sp = src.arrayOffset() + src.position();
|
||||
int sl = src.arrayOffset() + src.limit();
|
||||
|
||||
char[] da = dst.array();
|
||||
int dp = dst.arrayOffset() + dst.position();
|
||||
int dl = dst.arrayOffset() + dst.limit();
|
||||
int dlASCII = dp + Math.min(sl - sp, dl - dp);
|
||||
|
||||
// ASCII only loop
|
||||
while (dp < dlASCII && sa[sp] >= 0)
|
||||
da[dp++] = (char) sa[sp++];
|
||||
while (sp < sl) {
|
||||
int b1 = sa[sp];
|
||||
if (b1 >= 0) {
|
||||
// 1 byte, 7 bits: 0xxxxxxx
|
||||
if (dp >= dl)
|
||||
return xflow(src, sp, sl, dst, dp, 1);
|
||||
da[dp++] = (char) b1;
|
||||
sp++;
|
||||
} else if ((b1 >> 5) == -2 && (b1 & 0x1e) != 0) {
|
||||
// 2 bytes, 11 bits: 110xxxxx 10xxxxxx
|
||||
if (sl - sp < 2 || dp >= dl)
|
||||
return xflow(src, sp, sl, dst, dp, 2);
|
||||
int b2 = sa[sp + 1];
|
||||
if (isNotContinuation(b2))
|
||||
return malformedForLength(src, sp, dst, dp, 1);
|
||||
da[dp++] = (char) (((b1 << 6) ^ b2)
|
||||
^
|
||||
(((byte) 0xC0 << 6) ^
|
||||
((byte) 0x80 << 0)));
|
||||
sp += 2;
|
||||
} else if ((b1 >> 4) == -2) {
|
||||
// 3 bytes, 16 bits: 1110xxxx 10xxxxxx 10xxxxxx
|
||||
int srcRemaining = sl - sp;
|
||||
if (srcRemaining < 3 || dp >= dl) {
|
||||
if (srcRemaining > 1 && isMalformed3_2(b1, sa[sp + 1]))
|
||||
return malformedForLength(src, sp, dst, dp, 1);
|
||||
return xflow(src, sp, sl, dst, dp, 3);
|
||||
}
|
||||
int b2 = sa[sp + 1];
|
||||
int b3 = sa[sp + 2];
|
||||
if (isMalformed3(b1, b2, b3))
|
||||
return malformed(src, sp, dst, dp, 3);
|
||||
da[dp++] = (char)
|
||||
((b1 << 12) ^
|
||||
(b2 << 6) ^
|
||||
(b3 ^
|
||||
(((byte) 0xE0 << 12) ^
|
||||
((byte) 0x80 << 6) ^
|
||||
((byte) 0x80 << 0))));
|
||||
sp += 3;
|
||||
} else {
|
||||
return malformed(src, sp, dst, dp, 1);
|
||||
}
|
||||
}
|
||||
return xflow(src, sp, sl, dst, dp, 0);
|
||||
}
|
||||
|
||||
private CoderResult decodeBufferLoop(ByteBuffer src,
|
||||
CharBuffer dst)
|
||||
{
|
||||
int mark = src.position();
|
||||
int limit = src.limit();
|
||||
while (mark < limit) {
|
||||
int b1 = src.get();
|
||||
if (b1 >= 0) {
|
||||
// 1 byte, 7 bits: 0xxxxxxx
|
||||
if (dst.remaining() < 1)
|
||||
return xflow(src, mark, 1); // overflow
|
||||
dst.put((char) b1);
|
||||
mark++;
|
||||
} else if ((b1 >> 5) == -2 && (b1 & 0x1e) != 0) {
|
||||
// 2 bytes, 11 bits: 110xxxxx 10xxxxxx
|
||||
if (limit - mark < 2|| dst.remaining() < 1)
|
||||
return xflow(src, mark, 2);
|
||||
int b2 = src.get();
|
||||
if (isNotContinuation(b2))
|
||||
return malformedForLength(src, mark, 1);
|
||||
dst.put((char) (((b1 << 6) ^ b2)
|
||||
^
|
||||
(((byte) 0xC0 << 6) ^
|
||||
((byte) 0x80 << 0))));
|
||||
mark += 2;
|
||||
} else if ((b1 >> 4) == -2) {
|
||||
// 3 bytes, 16 bits: 1110xxxx 10xxxxxx 10xxxxxx
|
||||
int srcRemaining = limit - mark;
|
||||
if (srcRemaining < 3 || dst.remaining() < 1) {
|
||||
if (srcRemaining > 1 && isMalformed3_2(b1, src.get()))
|
||||
return malformedForLength(src, mark, 1);
|
||||
return xflow(src, mark, 3);
|
||||
}
|
||||
int b2 = src.get();
|
||||
int b3 = src.get();
|
||||
if (isMalformed3(b1, b2, b3))
|
||||
return malformed(src, mark, 3);
|
||||
dst.put((char)
|
||||
((b1 << 12) ^
|
||||
(b2 << 6) ^
|
||||
(b3 ^
|
||||
(((byte) 0xE0 << 12) ^
|
||||
((byte) 0x80 << 6) ^
|
||||
((byte) 0x80 << 0)))));
|
||||
mark += 3;
|
||||
} else {
|
||||
return malformed(src, mark, 1);
|
||||
}
|
||||
}
|
||||
return xflow(src, mark, 0);
|
||||
}
|
||||
|
||||
protected CoderResult decodeLoop(ByteBuffer src,
|
||||
CharBuffer dst)
|
||||
{
|
||||
if (src.hasArray() && dst.hasArray())
|
||||
return decodeArrayLoop(src, dst);
|
||||
else
|
||||
return decodeBufferLoop(src, dst);
|
||||
}
|
||||
|
||||
private static ByteBuffer getByteBuffer(ByteBuffer bb, byte[] ba, int sp)
|
||||
{
|
||||
if (bb == null)
|
||||
bb = ByteBuffer.wrap(ba);
|
||||
bb.position(sp);
|
||||
return bb;
|
||||
}
|
||||
|
||||
// returns -1 if there is/are malformed byte(s) and the
|
||||
// "action" for malformed input is not REPLACE.
|
||||
public int decode(byte[] sa, int sp, int len, char[] da) {
|
||||
final int sl = sp + len;
|
||||
int dp = 0;
|
||||
int dlASCII = Math.min(len, da.length);
|
||||
ByteBuffer bb = null; // only necessary if malformed
|
||||
|
||||
// ASCII only optimized loop
|
||||
while (dp < dlASCII && sa[sp] >= 0)
|
||||
da[dp++] = (char) sa[sp++];
|
||||
|
||||
while (sp < sl) {
|
||||
int b1 = sa[sp++];
|
||||
if (b1 >= 0) {
|
||||
// 1 byte, 7 bits: 0xxxxxxx
|
||||
da[dp++] = (char) b1;
|
||||
} else if ((b1 >> 5) == -2 && (b1 & 0x1e) != 0) {
|
||||
// 2 bytes, 11 bits: 110xxxxx 10xxxxxx
|
||||
if (sp < sl) {
|
||||
int b2 = sa[sp++];
|
||||
if (isNotContinuation(b2)) {
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
da[dp++] = replacement().charAt(0);
|
||||
sp--; // malformedN(bb, 2) always returns 1
|
||||
} else {
|
||||
da[dp++] = (char) (((b1 << 6) ^ b2)^
|
||||
(((byte) 0xC0 << 6) ^
|
||||
((byte) 0x80 << 0)));
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
da[dp++] = replacement().charAt(0);
|
||||
return dp;
|
||||
} else if ((b1 >> 4) == -2) {
|
||||
// 3 bytes, 16 bits: 1110xxxx 10xxxxxx 10xxxxxx
|
||||
if (sp + 1 < sl) {
|
||||
int b2 = sa[sp++];
|
||||
int b3 = sa[sp++];
|
||||
if (isMalformed3(b1, b2, b3)) {
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
da[dp++] = replacement().charAt(0);
|
||||
sp -=3;
|
||||
bb = getByteBuffer(bb, sa, sp);
|
||||
sp += malformedN(bb, 3).length();
|
||||
} else {
|
||||
da[dp++] = (char)((b1 << 12) ^
|
||||
(b2 << 6) ^
|
||||
(b3 ^
|
||||
(((byte) 0xE0 << 12) ^
|
||||
((byte) 0x80 << 6) ^
|
||||
((byte) 0x80 << 0))));
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
if (sp < sl && isMalformed3_2(b1, sa[sp])) {
|
||||
da[dp++] = replacement().charAt(0);
|
||||
continue;
|
||||
|
||||
}
|
||||
da[dp++] = replacement().charAt(0);
|
||||
return dp;
|
||||
} else {
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
da[dp++] = replacement().charAt(0);
|
||||
}
|
||||
}
|
||||
return dp;
|
||||
}
|
||||
}
|
||||
|
||||
private static class Encoder extends CharsetEncoder
|
||||
implements ArrayEncoder {
|
||||
|
||||
private Encoder(Charset cs) {
|
||||
super(cs, 1.1f, 3.0f);
|
||||
}
|
||||
|
||||
public boolean canEncode(char c) {
|
||||
return !Character.isSurrogate(c);
|
||||
}
|
||||
|
||||
public boolean isLegalReplacement(byte[] repl) {
|
||||
return ((repl.length == 1 && repl[0] >= 0) ||
|
||||
super.isLegalReplacement(repl));
|
||||
}
|
||||
|
||||
private static CoderResult overflow(CharBuffer src, int sp,
|
||||
ByteBuffer dst, int dp) {
|
||||
updatePositions(src, sp, dst, dp);
|
||||
return CoderResult.OVERFLOW;
|
||||
}
|
||||
|
||||
private static CoderResult overflow(CharBuffer src, int mark) {
|
||||
src.position(mark);
|
||||
return CoderResult.OVERFLOW;
|
||||
}
|
||||
|
||||
private static void to3Bytes(byte[] da, int dp, char c) {
|
||||
da[dp] = (byte)(0xe0 | ((c >> 12)));
|
||||
da[dp + 1] = (byte)(0x80 | ((c >> 6) & 0x3f));
|
||||
da[dp + 2] = (byte)(0x80 | (c & 0x3f));
|
||||
}
|
||||
|
||||
private static void to3Bytes(ByteBuffer dst, char c) {
|
||||
dst.put((byte)(0xe0 | ((c >> 12))));
|
||||
dst.put((byte)(0x80 | ((c >> 6) & 0x3f)));
|
||||
dst.put((byte)(0x80 | (c & 0x3f)));
|
||||
}
|
||||
|
||||
private Surrogate.Parser sgp;
|
||||
private char[] c2;
|
||||
private CoderResult encodeArrayLoop(CharBuffer src,
|
||||
ByteBuffer dst)
|
||||
{
|
||||
char[] sa = src.array();
|
||||
int sp = src.arrayOffset() + src.position();
|
||||
int sl = src.arrayOffset() + src.limit();
|
||||
|
||||
byte[] da = dst.array();
|
||||
int dp = dst.arrayOffset() + dst.position();
|
||||
int dl = dst.arrayOffset() + dst.limit();
|
||||
int dlASCII = dp + Math.min(sl - sp, dl - dp);
|
||||
|
||||
// ASCII only loop
|
||||
while (dp < dlASCII && sa[sp] < '\u0080')
|
||||
da[dp++] = (byte) sa[sp++];
|
||||
while (sp < sl) {
|
||||
char c = sa[sp];
|
||||
if (c < 0x80) {
|
||||
// Have at most seven bits
|
||||
if (dp >= dl)
|
||||
return overflow(src, sp, dst, dp);
|
||||
da[dp++] = (byte)c;
|
||||
} else if (c < 0x800) {
|
||||
// 2 bytes, 11 bits
|
||||
if (dl - dp < 2)
|
||||
return overflow(src, sp, dst, dp);
|
||||
da[dp++] = (byte)(0xc0 | (c >> 6));
|
||||
da[dp++] = (byte)(0x80 | (c & 0x3f));
|
||||
} else if (Character.isSurrogate(c)) {
|
||||
// Have a surrogate pair
|
||||
if (sgp == null)
|
||||
sgp = new Surrogate.Parser();
|
||||
int uc = sgp.parse(c, sa, sp, sl);
|
||||
if (uc < 0) {
|
||||
updatePositions(src, sp, dst, dp);
|
||||
return sgp.error();
|
||||
}
|
||||
if (dl - dp < 6)
|
||||
return overflow(src, sp, dst, dp);
|
||||
to3Bytes(da, dp, Character.highSurrogate(uc));
|
||||
dp += 3;
|
||||
to3Bytes(da, dp, Character.lowSurrogate(uc));
|
||||
dp += 3;
|
||||
sp++; // 2 chars
|
||||
} else {
|
||||
// 3 bytes, 16 bits
|
||||
if (dl - dp < 3)
|
||||
return overflow(src, sp, dst, dp);
|
||||
to3Bytes(da, dp, c);
|
||||
dp += 3;
|
||||
}
|
||||
sp++;
|
||||
}
|
||||
updatePositions(src, sp, dst, dp);
|
||||
return CoderResult.UNDERFLOW;
|
||||
}
|
||||
|
||||
private CoderResult encodeBufferLoop(CharBuffer src,
|
||||
ByteBuffer dst)
|
||||
{
|
||||
int mark = src.position();
|
||||
while (src.hasRemaining()) {
|
||||
char c = src.get();
|
||||
if (c < 0x80) {
|
||||
// Have at most seven bits
|
||||
if (!dst.hasRemaining())
|
||||
return overflow(src, mark);
|
||||
dst.put((byte)c);
|
||||
} else if (c < 0x800) {
|
||||
// 2 bytes, 11 bits
|
||||
if (dst.remaining() < 2)
|
||||
return overflow(src, mark);
|
||||
dst.put((byte)(0xc0 | (c >> 6)));
|
||||
dst.put((byte)(0x80 | (c & 0x3f)));
|
||||
} else if (Character.isSurrogate(c)) {
|
||||
// Have a surrogate pair
|
||||
if (sgp == null)
|
||||
sgp = new Surrogate.Parser();
|
||||
int uc = sgp.parse(c, src);
|
||||
if (uc < 0) {
|
||||
src.position(mark);
|
||||
return sgp.error();
|
||||
}
|
||||
if (dst.remaining() < 6)
|
||||
return overflow(src, mark);
|
||||
to3Bytes(dst, Character.highSurrogate(uc));
|
||||
to3Bytes(dst, Character.lowSurrogate(uc));
|
||||
mark++; // 2 chars
|
||||
} else {
|
||||
// 3 bytes, 16 bits
|
||||
if (dst.remaining() < 3)
|
||||
return overflow(src, mark);
|
||||
to3Bytes(dst, c);
|
||||
}
|
||||
mark++;
|
||||
}
|
||||
src.position(mark);
|
||||
return CoderResult.UNDERFLOW;
|
||||
}
|
||||
|
||||
protected final CoderResult encodeLoop(CharBuffer src,
|
||||
ByteBuffer dst)
|
||||
{
|
||||
if (src.hasArray() && dst.hasArray())
|
||||
return encodeArrayLoop(src, dst);
|
||||
else
|
||||
return encodeBufferLoop(src, dst);
|
||||
}
|
||||
|
||||
// returns -1 if there is malformed char(s) and the
|
||||
// "action" for malformed input is not REPLACE.
|
||||
public int encode(char[] sa, int sp, int len, byte[] da) {
|
||||
int sl = sp + len;
|
||||
int dp = 0;
|
||||
int dlASCII = dp + Math.min(len, da.length);
|
||||
|
||||
// ASCII only optimized loop
|
||||
while (dp < dlASCII && sa[sp] < '\u0080')
|
||||
da[dp++] = (byte) sa[sp++];
|
||||
|
||||
while (sp < sl) {
|
||||
char c = sa[sp++];
|
||||
if (c < 0x80) {
|
||||
// Have at most seven bits
|
||||
da[dp++] = (byte)c;
|
||||
} else if (c < 0x800) {
|
||||
// 2 bytes, 11 bits
|
||||
da[dp++] = (byte)(0xc0 | (c >> 6));
|
||||
da[dp++] = (byte)(0x80 | (c & 0x3f));
|
||||
} else if (Character.isSurrogate(c)) {
|
||||
if (sgp == null)
|
||||
sgp = new Surrogate.Parser();
|
||||
int uc = sgp.parse(c, sa, sp - 1, sl);
|
||||
if (uc < 0) {
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
da[dp++] = replacement()[0];
|
||||
} else {
|
||||
to3Bytes(da, dp, Character.highSurrogate(uc));
|
||||
dp += 3;
|
||||
to3Bytes(da, dp, Character.lowSurrogate(uc));
|
||||
dp += 3;
|
||||
sp++; // 2 chars
|
||||
}
|
||||
} else {
|
||||
// 3 bytes, 16 bits
|
||||
to3Bytes(da, dp, c);
|
||||
dp += 3;
|
||||
}
|
||||
}
|
||||
return dp;
|
||||
}
|
||||
}
|
||||
}
|
@ -72,8 +72,8 @@ class UTF_8 extends Unicode
|
||||
return new Encoder(this);
|
||||
}
|
||||
|
||||
static final void updatePositions(Buffer src, int sp,
|
||||
Buffer dst, int dp) {
|
||||
private static final void updatePositions(Buffer src, int sp,
|
||||
Buffer dst, int dp) {
|
||||
src.position(sp - src.arrayOffset());
|
||||
dst.position(dp - dst.arrayOffset());
|
||||
}
|
||||
@ -88,11 +88,6 @@ class UTF_8 extends Unicode
|
||||
return (b & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
// [C2..DF] [80..BF]
|
||||
private static boolean isMalformed2(int b1, int b2) {
|
||||
return (b1 & 0x1e) == 0x0 || (b2 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
// [E0] [A0..BF] [80..BF]
|
||||
// [E1..EF] [80..BF] [80..BF]
|
||||
private static boolean isMalformed3(int b1, int b2, int b3) {
|
||||
@ -100,6 +95,12 @@ class UTF_8 extends Unicode
|
||||
(b2 & 0xc0) != 0x80 || (b3 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
// only used when there is only one byte left in src buffer
|
||||
private static boolean isMalformed3_2(int b1, int b2) {
|
||||
return (b1 == (byte)0xe0 && (b2 & 0xe0) == 0x80) ||
|
||||
(b2 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
// [F0] [90..BF] [80..BF] [80..BF]
|
||||
// [F1..F3] [80..BF] [80..BF] [80..BF]
|
||||
// [F4] [80..8F] [80..BF] [80..BF]
|
||||
@ -110,6 +111,16 @@ class UTF_8 extends Unicode
|
||||
(b4 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
// only used when there is less than 4 bytes left in src buffer
|
||||
private static boolean isMalformed4_2(int b1, int b2) {
|
||||
return (b1 == 0xf0 && b2 == 0x90) ||
|
||||
(b2 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
private static boolean isMalformed4_3(int b3) {
|
||||
return (b3 & 0xc0) != 0x80;
|
||||
}
|
||||
|
||||
private static CoderResult lookupN(ByteBuffer src, int n)
|
||||
{
|
||||
for (int i = 1; i < n; i++) {
|
||||
@ -122,28 +133,14 @@ class UTF_8 extends Unicode
|
||||
private static CoderResult malformedN(ByteBuffer src, int nb) {
|
||||
switch (nb) {
|
||||
case 1:
|
||||
int b1 = src.get();
|
||||
if ((b1 >> 2) == -2) {
|
||||
// 5 bytes 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
||||
if (src.remaining() < 4)
|
||||
return CoderResult.UNDERFLOW;
|
||||
return lookupN(src, 5);
|
||||
}
|
||||
if ((b1 >> 1) == -2) {
|
||||
// 6 bytes 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
||||
if (src.remaining() < 5)
|
||||
return CoderResult.UNDERFLOW;
|
||||
return lookupN(src, 6);
|
||||
}
|
||||
return CoderResult.malformedForLength(1);
|
||||
case 2: // always 1
|
||||
return CoderResult.malformedForLength(1);
|
||||
case 3:
|
||||
b1 = src.get();
|
||||
int b1 = src.get();
|
||||
int b2 = src.get(); // no need to lookup b3
|
||||
return CoderResult.malformedForLength(
|
||||
((b1 == (byte)0xe0 && (b2 & 0xe0) == 0x80) ||
|
||||
isNotContinuation(b2))?1:2);
|
||||
isNotContinuation(b2)) ? 1 : 2);
|
||||
case 4: // we don't care the speed here
|
||||
b1 = src.get() & 0xff;
|
||||
b2 = src.get() & 0xff;
|
||||
@ -171,6 +168,7 @@ class UTF_8 extends Unicode
|
||||
return cr;
|
||||
}
|
||||
|
||||
|
||||
private static CoderResult malformed(ByteBuffer src,
|
||||
int mark, int nb)
|
||||
{
|
||||
@ -180,18 +178,36 @@ class UTF_8 extends Unicode
|
||||
return cr;
|
||||
}
|
||||
|
||||
private static CoderResult malformedForLength(ByteBuffer src,
|
||||
int sp,
|
||||
CharBuffer dst,
|
||||
int dp,
|
||||
int malformedNB)
|
||||
{
|
||||
updatePositions(src, sp, dst, dp);
|
||||
return CoderResult.malformedForLength(malformedNB);
|
||||
}
|
||||
|
||||
private static CoderResult malformedForLength(ByteBuffer src,
|
||||
int mark,
|
||||
int malformedNB)
|
||||
{
|
||||
src.position(mark);
|
||||
return CoderResult.malformedForLength(malformedNB);
|
||||
}
|
||||
|
||||
|
||||
private static CoderResult xflow(Buffer src, int sp, int sl,
|
||||
Buffer dst, int dp, int nb) {
|
||||
updatePositions(src, sp, dst, dp);
|
||||
return (nb == 0 || sl - sp < nb)
|
||||
?CoderResult.UNDERFLOW:CoderResult.OVERFLOW;
|
||||
? CoderResult.UNDERFLOW : CoderResult.OVERFLOW;
|
||||
}
|
||||
|
||||
private static CoderResult xflow(Buffer src, int mark, int nb) {
|
||||
CoderResult cr = (nb == 0 || src.remaining() < (nb - 1))
|
||||
?CoderResult.UNDERFLOW:CoderResult.OVERFLOW;
|
||||
src.position(mark);
|
||||
return cr;
|
||||
return (nb == 0 || src.remaining() < nb)
|
||||
? CoderResult.UNDERFLOW : CoderResult.OVERFLOW;
|
||||
}
|
||||
|
||||
private CoderResult decodeArrayLoop(ByteBuffer src,
|
||||
@ -210,7 +226,6 @@ class UTF_8 extends Unicode
|
||||
// ASCII only loop
|
||||
while (dp < dlASCII && sa[sp] >= 0)
|
||||
da[dp++] = (char) sa[sp++];
|
||||
|
||||
while (sp < sl) {
|
||||
int b1 = sa[sp];
|
||||
if (b1 >= 0) {
|
||||
@ -219,13 +234,20 @@ class UTF_8 extends Unicode
|
||||
return xflow(src, sp, sl, dst, dp, 1);
|
||||
da[dp++] = (char) b1;
|
||||
sp++;
|
||||
} else if ((b1 >> 5) == -2) {
|
||||
} else if ((b1 >> 5) == -2 && (b1 & 0x1e) != 0) {
|
||||
// 2 bytes, 11 bits: 110xxxxx 10xxxxxx
|
||||
// [C2..DF] [80..BF]
|
||||
if (sl - sp < 2 || dp >= dl)
|
||||
return xflow(src, sp, sl, dst, dp, 2);
|
||||
int b2 = sa[sp + 1];
|
||||
if (isMalformed2(b1, b2))
|
||||
return malformed(src, sp, dst, dp, 2);
|
||||
// Now we check the first byte of 2-byte sequence as
|
||||
// if ((b1 >> 5) == -2 && (b1 & 0x1e) != 0)
|
||||
// no longer need to check b1 against c1 & c0 for
|
||||
// malformed as we did in previous version
|
||||
// (b1 & 0x1e) == 0x0 || (b2 & 0xc0) != 0x80;
|
||||
// only need to check the second byte b2.
|
||||
if (isNotContinuation(b2))
|
||||
return malformedForLength(src, sp, dst, dp, 1);
|
||||
da[dp++] = (char) (((b1 << 6) ^ b2)
|
||||
^
|
||||
(((byte) 0xC0 << 6) ^
|
||||
@ -233,24 +255,37 @@ class UTF_8 extends Unicode
|
||||
sp += 2;
|
||||
} else if ((b1 >> 4) == -2) {
|
||||
// 3 bytes, 16 bits: 1110xxxx 10xxxxxx 10xxxxxx
|
||||
if (sl - sp < 3 || dp >= dl)
|
||||
int srcRemaining = sl - sp;
|
||||
if (srcRemaining < 3 || dp >= dl) {
|
||||
if (srcRemaining > 1 && isMalformed3_2(b1, sa[sp + 1]))
|
||||
return malformedForLength(src, sp, dst, dp, 1);
|
||||
return xflow(src, sp, sl, dst, dp, 3);
|
||||
}
|
||||
int b2 = sa[sp + 1];
|
||||
int b3 = sa[sp + 2];
|
||||
if (isMalformed3(b1, b2, b3))
|
||||
return malformed(src, sp, dst, dp, 3);
|
||||
da[dp++] = (char)
|
||||
char c = (char)
|
||||
((b1 << 12) ^
|
||||
(b2 << 6) ^
|
||||
(b3 ^
|
||||
(((byte) 0xE0 << 12) ^
|
||||
((byte) 0x80 << 6) ^
|
||||
((byte) 0x80 << 0))));
|
||||
if (Character.isSurrogate(c))
|
||||
return malformedForLength(src, sp, dst, dp, 3);
|
||||
da[dp++] = c;
|
||||
sp += 3;
|
||||
} else if ((b1 >> 3) == -2) {
|
||||
// 4 bytes, 21 bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
||||
if (sl - sp < 4 || dl - dp < 2)
|
||||
int srcRemaining = sl - sp;
|
||||
if (srcRemaining < 4 || dl - dp < 2) {
|
||||
if (srcRemaining > 1 && isMalformed4_2(b1, sa[sp + 1]))
|
||||
return malformedForLength(src, sp, dst, dp, 1);
|
||||
if (srcRemaining > 2 && isMalformed4_3(sa[sp + 2]))
|
||||
return malformedForLength(src, sp, dst, dp, 2);
|
||||
return xflow(src, sp, sl, dst, dp, 4);
|
||||
}
|
||||
int b2 = sa[sp + 1];
|
||||
int b3 = sa[sp + 2];
|
||||
int b4 = sa[sp + 3];
|
||||
@ -289,38 +324,51 @@ class UTF_8 extends Unicode
|
||||
return xflow(src, mark, 1); // overflow
|
||||
dst.put((char) b1);
|
||||
mark++;
|
||||
} else if ((b1 >> 5) == -2) {
|
||||
} else if ((b1 >> 5) == -2 && (b1 & 0x1e) != 0) {
|
||||
// 2 bytes, 11 bits: 110xxxxx 10xxxxxx
|
||||
if (limit - mark < 2|| dst.remaining() < 1)
|
||||
return xflow(src, mark, 2);
|
||||
int b2 = src.get();
|
||||
if (isMalformed2(b1, b2))
|
||||
return malformed(src, mark, 2);
|
||||
dst.put((char) (((b1 << 6) ^ b2)
|
||||
if (isNotContinuation(b2))
|
||||
return malformedForLength(src, mark, 1);
|
||||
dst.put((char) (((b1 << 6) ^ b2)
|
||||
^
|
||||
(((byte) 0xC0 << 6) ^
|
||||
((byte) 0x80 << 0))));
|
||||
mark += 2;
|
||||
} else if ((b1 >> 4) == -2) {
|
||||
// 3 bytes, 16 bits: 1110xxxx 10xxxxxx 10xxxxxx
|
||||
if (limit - mark < 3 || dst.remaining() < 1)
|
||||
int srcRemaining = limit - mark;
|
||||
if (srcRemaining < 3 || dst.remaining() < 1) {
|
||||
if (srcRemaining > 1 && isMalformed3_2(b1, src.get()))
|
||||
return malformedForLength(src, mark, 1);
|
||||
return xflow(src, mark, 3);
|
||||
}
|
||||
int b2 = src.get();
|
||||
int b3 = src.get();
|
||||
if (isMalformed3(b1, b2, b3))
|
||||
return malformed(src, mark, 3);
|
||||
dst.put((char)
|
||||
((b1 << 12) ^
|
||||
(b2 << 6) ^
|
||||
(b3 ^
|
||||
(((byte) 0xE0 << 12) ^
|
||||
((byte) 0x80 << 6) ^
|
||||
((byte) 0x80 << 0)))));
|
||||
char c = (char)
|
||||
((b1 << 12) ^
|
||||
(b2 << 6) ^
|
||||
(b3 ^
|
||||
(((byte) 0xE0 << 12) ^
|
||||
((byte) 0x80 << 6) ^
|
||||
((byte) 0x80 << 0))));
|
||||
if (Character.isSurrogate(c))
|
||||
return malformedForLength(src, mark, 3);
|
||||
dst.put(c);
|
||||
mark += 3;
|
||||
} else if ((b1 >> 3) == -2) {
|
||||
// 4 bytes, 21 bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
||||
if (limit - mark < 4 || dst.remaining() < 2)
|
||||
int srcRemaining = limit - mark;
|
||||
if (srcRemaining < 4 || dst.remaining() < 2) {
|
||||
if (srcRemaining > 1 && isMalformed4_2(b1, src.get()))
|
||||
return malformedForLength(src, mark, 1);
|
||||
if (srcRemaining > 2 && isMalformed4_3(src.get()))
|
||||
return malformedForLength(src, mark, 2);
|
||||
return xflow(src, mark, 4);
|
||||
}
|
||||
int b2 = src.get();
|
||||
int b3 = src.get();
|
||||
int b4 = src.get();
|
||||
@ -364,7 +412,7 @@ class UTF_8 extends Unicode
|
||||
return bb;
|
||||
}
|
||||
|
||||
// returns -1 if there is malformed byte(s) and the
|
||||
// returns -1 if there is/are malformed byte(s) and the
|
||||
// "action" for malformed input is not REPLACE.
|
||||
public int decode(byte[] sa, int sp, int len, char[] da) {
|
||||
final int sl = sp + len;
|
||||
@ -381,11 +429,11 @@ class UTF_8 extends Unicode
|
||||
if (b1 >= 0) {
|
||||
// 1 byte, 7 bits: 0xxxxxxx
|
||||
da[dp++] = (char) b1;
|
||||
} else if ((b1 >> 5) == -2) {
|
||||
} else if ((b1 >> 5) == -2 && (b1 & 0x1e) != 0) {
|
||||
// 2 bytes, 11 bits: 110xxxxx 10xxxxxx
|
||||
if (sp < sl) {
|
||||
int b2 = sa[sp++];
|
||||
if (isMalformed2(b1, b2)) {
|
||||
if (isNotContinuation(b2)) {
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
da[dp++] = replacement().charAt(0);
|
||||
@ -410,21 +458,33 @@ class UTF_8 extends Unicode
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
da[dp++] = replacement().charAt(0);
|
||||
sp -=3;
|
||||
sp -= 3;
|
||||
bb = getByteBuffer(bb, sa, sp);
|
||||
sp += malformedN(bb, 3).length();
|
||||
} else {
|
||||
da[dp++] = (char)((b1 << 12) ^
|
||||
char c = (char)((b1 << 12) ^
|
||||
(b2 << 6) ^
|
||||
(b3 ^
|
||||
(((byte) 0xE0 << 12) ^
|
||||
((byte) 0x80 << 6) ^
|
||||
((byte) 0x80 << 0))));
|
||||
if (Character.isSurrogate(c)) {
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
da[dp++] = replacement().charAt(0);
|
||||
} else {
|
||||
da[dp++] = c;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
if (sp < sl && isMalformed3_2(b1, sa[sp])) {
|
||||
da[dp++] = replacement().charAt(0);
|
||||
continue;
|
||||
|
||||
}
|
||||
da[dp++] = replacement().charAt(0);
|
||||
return dp;
|
||||
} else if ((b1 >> 3) == -2) {
|
||||
@ -458,28 +518,29 @@ class UTF_8 extends Unicode
|
||||
}
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
|
||||
if (sp < sl && isMalformed4_2(b1, sa[sp])) {
|
||||
da[dp++] = replacement().charAt(0);
|
||||
continue;
|
||||
}
|
||||
sp++;
|
||||
if (sp < sl && isMalformed4_3(sa[sp])) {
|
||||
da[dp++] = replacement().charAt(0);
|
||||
continue;
|
||||
}
|
||||
da[dp++] = replacement().charAt(0);
|
||||
return dp;
|
||||
} else {
|
||||
if (malformedInputAction() != CodingErrorAction.REPLACE)
|
||||
return -1;
|
||||
da[dp++] = replacement().charAt(0);
|
||||
sp--;
|
||||
bb = getByteBuffer(bb, sa, sp);
|
||||
CoderResult cr = malformedN(bb, 1);
|
||||
if (!cr.isError()) {
|
||||
// leading byte for 5 or 6-byte, but don't have enough
|
||||
// bytes in buffer to check. Consumed rest as malformed.
|
||||
return dp;
|
||||
}
|
||||
sp += cr.length();
|
||||
}
|
||||
}
|
||||
return dp;
|
||||
}
|
||||
}
|
||||
|
||||
private static class Encoder extends CharsetEncoder
|
||||
private static final class Encoder extends CharsetEncoder
|
||||
implements ArrayEncoder {
|
||||
|
||||
private Encoder(Charset cs) {
|
||||
|
@ -63,6 +63,10 @@ charset UTF-8 UTF_8
|
||||
alias UTF8 # JDK historical
|
||||
alias unicode-1-1-utf-8
|
||||
|
||||
charset CESU-8 CESU_8
|
||||
alias CESU8
|
||||
alias csCESU-8
|
||||
|
||||
charset UTF-16 UTF_16
|
||||
alias UTF_16 # JDK historical
|
||||
alias utf16
|
||||
|
@ -68,14 +68,18 @@ import javax.print.attribute.standard.Sides;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.CharConversionException;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.IOException;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
@ -673,15 +677,38 @@ public class PSPrinterJob extends RasterPrinterJob {
|
||||
private class PrinterSpooler implements java.security.PrivilegedAction {
|
||||
PrinterException pex;
|
||||
|
||||
private void handleProcessFailure(final Process failedProcess,
|
||||
final String[] execCmd, final int result) throws IOException {
|
||||
try (StringWriter sw = new StringWriter();
|
||||
PrintWriter pw = new PrintWriter(sw)) {
|
||||
pw.append("error=").append(Integer.toString(result));
|
||||
pw.append(" running:");
|
||||
for (String arg: execCmd) {
|
||||
pw.append(" '").append(arg).append("'");
|
||||
}
|
||||
try (InputStream is = failedProcess.getErrorStream();
|
||||
InputStreamReader isr = new InputStreamReader(is);
|
||||
BufferedReader br = new BufferedReader(isr)) {
|
||||
while (br.ready()) {
|
||||
pw.println();
|
||||
pw.append("\t\t").append(br.readLine());
|
||||
}
|
||||
} finally {
|
||||
pw.flush();
|
||||
throw new IOException(sw.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Object run() {
|
||||
if (spoolFile == null || !spoolFile.exists()) {
|
||||
pex = new PrinterException("No spool file");
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
/**
|
||||
* Spool to the printer.
|
||||
*/
|
||||
if (spoolFile == null || !spoolFile.exists()) {
|
||||
pex = new PrinterException("No spool file");
|
||||
return null;
|
||||
}
|
||||
String fileName = spoolFile.getAbsolutePath();
|
||||
String execCmd[] = printExecCmd(mDestination, mOptions,
|
||||
mNoJobSheet, getJobNameInt(),
|
||||
@ -689,12 +716,16 @@ public class PSPrinterJob extends RasterPrinterJob {
|
||||
|
||||
Process process = Runtime.getRuntime().exec(execCmd);
|
||||
process.waitFor();
|
||||
spoolFile.delete();
|
||||
|
||||
final int result = process.exitValue();
|
||||
if (0 != result) {
|
||||
handleProcessFailure(process, execCmd, result);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
pex = new PrinterIOException(ex);
|
||||
} catch (InterruptedException ie) {
|
||||
pex = new PrinterException(ie.toString());
|
||||
} finally {
|
||||
spoolFile.delete();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -38,13 +38,23 @@ import java.rmi.server.ServerNotActiveException;
|
||||
import java.rmi.registry.Registry;
|
||||
import java.rmi.server.RMIClientSocketFactory;
|
||||
import java.rmi.server.RMIServerSocketFactory;
|
||||
import java.security.AccessControlContext;
|
||||
import java.security.AccessController;
|
||||
import java.security.CodeSource;
|
||||
import java.security.Policy;
|
||||
import java.security.PrivilegedActionException;
|
||||
import java.security.PrivilegedExceptionAction;
|
||||
import java.security.PermissionCollection;
|
||||
import java.security.Permissions;
|
||||
import java.security.ProtectionDomain;
|
||||
import java.text.MessageFormat;
|
||||
import sun.rmi.server.LoaderHandler;
|
||||
import sun.rmi.server.UnicastServerRef;
|
||||
import sun.rmi.server.UnicastServerRef2;
|
||||
import sun.rmi.transport.LiveRef;
|
||||
import sun.rmi.transport.ObjectTable;
|
||||
import sun.rmi.transport.Target;
|
||||
import sun.security.action.GetPropertyAction;
|
||||
|
||||
/**
|
||||
* A "registry" exists on every node that allows RMI connections to
|
||||
@ -325,6 +335,19 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
|
||||
URL[] urls = sun.misc.URLClassPath.pathToURLs(envcp);
|
||||
ClassLoader cl = new URLClassLoader(urls);
|
||||
|
||||
String codebaseProperty = null;
|
||||
String prop = java.security.AccessController.doPrivileged(
|
||||
new GetPropertyAction("java.rmi.server.codebase"));
|
||||
if (prop != null && prop.trim().length() > 0) {
|
||||
codebaseProperty = prop;
|
||||
}
|
||||
URL[] codebaseURLs = null;
|
||||
if (codebaseProperty != null) {
|
||||
codebaseURLs = sun.misc.URLClassPath.pathToURLs(codebaseProperty);
|
||||
} else {
|
||||
codebaseURLs = new URL[0];
|
||||
}
|
||||
|
||||
/*
|
||||
* Fix bugid 4242317: Classes defined by this class loader should
|
||||
* be annotated with the value of the "java.rmi.server.codebase"
|
||||
@ -334,11 +357,19 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
|
||||
|
||||
Thread.currentThread().setContextClassLoader(cl);
|
||||
|
||||
int regPort = Registry.REGISTRY_PORT;
|
||||
if (args.length >= 1) {
|
||||
regPort = Integer.parseInt(args[0]);
|
||||
final int regPort = (args.length >= 1) ? Integer.parseInt(args[0])
|
||||
: Registry.REGISTRY_PORT;
|
||||
try {
|
||||
registry = AccessController.doPrivileged(
|
||||
new PrivilegedExceptionAction<RegistryImpl>() {
|
||||
public RegistryImpl run() throws RemoteException {
|
||||
return new RegistryImpl(regPort);
|
||||
}
|
||||
}, getAccessControlContext(codebaseURLs));
|
||||
} catch (PrivilegedActionException ex) {
|
||||
throw (RemoteException) ex.getException();
|
||||
}
|
||||
registry = new RegistryImpl(regPort);
|
||||
|
||||
// prevent registry from exiting
|
||||
while (true) {
|
||||
try {
|
||||
@ -358,4 +389,48 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
|
||||
}
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates an AccessControlContext from several URLs.
|
||||
* The approach used here is taken from the similar method
|
||||
* getAccessControlContext() in the sun.applet.AppletPanel class.
|
||||
*/
|
||||
private static AccessControlContext getAccessControlContext(URL[] urls) {
|
||||
// begin with permissions granted to all code in current policy
|
||||
PermissionCollection perms = AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction<PermissionCollection>() {
|
||||
public PermissionCollection run() {
|
||||
CodeSource codesource = new CodeSource(null,
|
||||
(java.security.cert.Certificate[]) null);
|
||||
Policy p = java.security.Policy.getPolicy();
|
||||
if (p != null) {
|
||||
return p.getPermissions(codesource);
|
||||
} else {
|
||||
return new Permissions();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
* Anyone can connect to the registry and the registry can connect
|
||||
* to and possibly download stubs from anywhere. Downloaded stubs and
|
||||
* related classes themselves are more tightly limited by RMI.
|
||||
*/
|
||||
perms.add(new SocketPermission("*", "connect,accept"));
|
||||
|
||||
perms.add(new RuntimePermission("accessClassInPackage.sun.*"));
|
||||
|
||||
// add permissions required to load from codebase URL path
|
||||
LoaderHandler.addPermissionsForURLs(urls, perms, false);
|
||||
|
||||
/*
|
||||
* Create an AccessControlContext that consists of a single
|
||||
* protection domain with only the permissions calculated above.
|
||||
*/
|
||||
ProtectionDomain pd = new ProtectionDomain(
|
||||
new CodeSource((urls.length > 0 ? urls[0] : null),
|
||||
(java.security.cert.Certificate[]) null),
|
||||
perms);
|
||||
return new AccessControlContext(new ProtectionDomain[] { pd });
|
||||
}
|
||||
}
|
||||
|
@ -1031,9 +1031,9 @@ public final class LoaderHandler {
|
||||
* loader. A given permission is only added to the collection if
|
||||
* it is not already implied by the collection.
|
||||
*/
|
||||
private static void addPermissionsForURLs(URL[] urls,
|
||||
PermissionCollection perms,
|
||||
boolean forLoader)
|
||||
public static void addPermissionsForURLs(URL[] urls,
|
||||
PermissionCollection perms,
|
||||
boolean forLoader)
|
||||
{
|
||||
for (int i = 0; i < urls.length; i++) {
|
||||
URL url = urls[i];
|
||||
|
@ -390,6 +390,12 @@ public class UnicastServerRef extends UnicastRef
|
||||
ObjectInput in;
|
||||
try {
|
||||
in = call.getInputStream();
|
||||
try {
|
||||
Class<?> clazz = Class.forName("sun.rmi.transport.DGCImpl_Skel");
|
||||
if (clazz.isAssignableFrom(skel.getClass())) {
|
||||
((MarshalInputStream)in).useCodebaseOnly();
|
||||
}
|
||||
} catch (ClassNotFoundException ignore) { }
|
||||
hash = in.readLong();
|
||||
} catch (Exception readEx) {
|
||||
throw new UnmarshalException("error unmarshalling call header",
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 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
|
||||
@ -69,12 +69,38 @@ class AppOutputStream extends OutputStream {
|
||||
// check if the Socket is invalid (error or closed)
|
||||
c.checkWrite();
|
||||
|
||||
/*
|
||||
* By default, we counter chosen plaintext issues on CBC mode
|
||||
* ciphersuites in SSLv3/TLS1.0 by sending one byte of application
|
||||
* data in the first record of every payload, and the rest in
|
||||
* subsequent record(s). Note that the issues have been solved in
|
||||
* TLS 1.1 or later.
|
||||
*
|
||||
* It is not necessary to split the very first application record of
|
||||
* a freshly negotiated TLS session, as there is no previous
|
||||
* application data to guess. To improve compatibility, we will not
|
||||
* split such records.
|
||||
*
|
||||
* This avoids issues in the outbound direction. For a full fix,
|
||||
* the peer must have similar protections.
|
||||
*/
|
||||
boolean isFirstRecordOfThePayload = true;
|
||||
|
||||
// Always flush at the end of each application level record.
|
||||
// This lets application synchronize read and write streams
|
||||
// however they like; if we buffered here, they couldn't.
|
||||
try {
|
||||
do {
|
||||
int howmuch = Math.min(len, r.availableDataBytes());
|
||||
int howmuch;
|
||||
if (isFirstRecordOfThePayload && c.needToSplitPayload()) {
|
||||
howmuch = Math.min(0x01, r.availableDataBytes());
|
||||
} else {
|
||||
howmuch = Math.min(len, r.availableDataBytes());
|
||||
}
|
||||
|
||||
if (isFirstRecordOfThePayload && howmuch != 0) {
|
||||
isFirstRecordOfThePayload = false;
|
||||
}
|
||||
|
||||
// NOTE: *must* call c.writeRecord() even for howmuch == 0
|
||||
if (howmuch > 0) {
|
||||
|
@ -112,6 +112,11 @@ final class CipherBox {
|
||||
*/
|
||||
private SecureRandom random;
|
||||
|
||||
/**
|
||||
* Is the cipher of CBC mode?
|
||||
*/
|
||||
private final boolean isCBCMode;
|
||||
|
||||
/**
|
||||
* Fixed masks of various block size, as the initial decryption IVs
|
||||
* for TLS 1.1 or later.
|
||||
@ -128,6 +133,7 @@ final class CipherBox {
|
||||
private CipherBox() {
|
||||
this.protocolVersion = ProtocolVersion.DEFAULT;
|
||||
this.cipher = null;
|
||||
this.isCBCMode = false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -148,6 +154,7 @@ final class CipherBox {
|
||||
random = JsseJce.getSecureRandom();
|
||||
}
|
||||
this.random = random;
|
||||
this.isCBCMode = bulkCipher.isCBCMode;
|
||||
|
||||
/*
|
||||
* RFC 4346 recommends two algorithms used to generated the
|
||||
@ -694,4 +701,12 @@ final class CipherBox {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Does the cipher use CBC mode?
|
||||
*
|
||||
* @return true if the cipher use CBC mode, false otherwise.
|
||||
*/
|
||||
boolean isCBCMode() {
|
||||
return isCBCMode;
|
||||
}
|
||||
}
|
||||
|
@ -420,10 +420,16 @@ final class CipherSuite implements Comparable<CipherSuite> {
|
||||
// exportable under 512/40 bit rules
|
||||
final boolean exportable;
|
||||
|
||||
// Is the cipher algorithm of Cipher Block Chaining (CBC) mode?
|
||||
final boolean isCBCMode;
|
||||
|
||||
BulkCipher(String transformation, int keySize,
|
||||
int expandedKeySize, int ivSize, boolean allowed) {
|
||||
this.transformation = transformation;
|
||||
this.algorithm = transformation.split("/")[0];
|
||||
String[] splits = transformation.split("/");
|
||||
this.algorithm = splits[0];
|
||||
this.isCBCMode =
|
||||
splits.length <= 1 ? false : "CBC".equalsIgnoreCase(splits[1]);
|
||||
this.description = this.algorithm + "/" + (keySize << 3);
|
||||
this.keySize = keySize;
|
||||
this.ivSize = ivSize;
|
||||
@ -436,7 +442,10 @@ final class CipherSuite implements Comparable<CipherSuite> {
|
||||
BulkCipher(String transformation, int keySize,
|
||||
int ivSize, boolean allowed) {
|
||||
this.transformation = transformation;
|
||||
this.algorithm = transformation.split("/")[0];
|
||||
String[] splits = transformation.split("/");
|
||||
this.algorithm = splits[0];
|
||||
this.isCBCMode =
|
||||
splits.length <= 1 ? false : "CBC".equalsIgnoreCase(splits[1]);
|
||||
this.description = this.algorithm + "/" + (keySize << 3);
|
||||
this.keySize = keySize;
|
||||
this.ivSize = ivSize;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 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
|
||||
@ -46,6 +46,7 @@ import sun.misc.HexDumpEncoder;
|
||||
*/
|
||||
final class EngineOutputRecord extends OutputRecord {
|
||||
|
||||
private SSLEngineImpl engine;
|
||||
private EngineWriter writer;
|
||||
|
||||
private boolean finishedMsg = false;
|
||||
@ -62,6 +63,7 @@ final class EngineOutputRecord extends OutputRecord {
|
||||
*/
|
||||
EngineOutputRecord(byte type, SSLEngineImpl engine) {
|
||||
super(type, recordSize(type));
|
||||
this.engine = engine;
|
||||
writer = engine.writer;
|
||||
}
|
||||
|
||||
@ -227,11 +229,50 @@ final class EngineOutputRecord extends OutputRecord {
|
||||
* implementations are fragile and don't like to see empty
|
||||
* records, so this increases robustness.
|
||||
*/
|
||||
int length = Math.min(ea.getAppRemaining(), maxDataSize);
|
||||
if (length == 0) {
|
||||
if (ea.getAppRemaining() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* By default, we counter chosen plaintext issues on CBC mode
|
||||
* ciphersuites in SSLv3/TLS1.0 by sending one byte of application
|
||||
* data in the first record of every payload, and the rest in
|
||||
* subsequent record(s). Note that the issues have been solved in
|
||||
* TLS 1.1 or later.
|
||||
*
|
||||
* It is not necessary to split the very first application record of
|
||||
* a freshly negotiated TLS session, as there is no previous
|
||||
* application data to guess. To improve compatibility, we will not
|
||||
* split such records.
|
||||
*
|
||||
* Because of the compatibility, we'd better produce no more than
|
||||
* SSLSession.getPacketBufferSize() net data for each wrap. As we
|
||||
* need a one-byte record at first, the 2nd record size should be
|
||||
* equal to or less than Record.maxDataSizeMinusOneByteRecord.
|
||||
*
|
||||
* This avoids issues in the outbound direction. For a full fix,
|
||||
* the peer must have similar protections.
|
||||
*/
|
||||
int length;
|
||||
if (engine.needToSplitPayload(writeCipher, protocolVersion)) {
|
||||
write(ea, writeMAC, writeCipher, 0x01);
|
||||
ea.resetLim(); // reset application data buffer limit
|
||||
length = Math.min(ea.getAppRemaining(),
|
||||
maxDataSizeMinusOneByteRecord);
|
||||
} else {
|
||||
length = Math.min(ea.getAppRemaining(), maxDataSize);
|
||||
}
|
||||
|
||||
// Don't bother to really write empty records.
|
||||
if (length > 0) {
|
||||
write(ea, writeMAC, writeCipher, length);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void write(EngineArgs ea, MAC writeMAC, CipherBox writeCipher,
|
||||
int length) throws IOException {
|
||||
/*
|
||||
* Copy out existing buffer values.
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 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
|
||||
@ -172,10 +172,10 @@ final class MAC {
|
||||
* when there are only 2^8 sequence numbers left.
|
||||
*/
|
||||
return (block != null && mac != null &&
|
||||
block[0] == 0xFF && block[1] == 0xFF &&
|
||||
block[2] == 0xFF && block[3] == 0xFF &&
|
||||
block[4] == 0xFF && block[5] == 0xFF &&
|
||||
block[6] == 0xFF);
|
||||
block[0] == (byte)0xFF && block[1] == (byte)0xFF &&
|
||||
block[2] == (byte)0xFF && block[3] == (byte)0xFF &&
|
||||
block[4] == (byte)0xFF && block[5] == (byte)0xFF &&
|
||||
block[6] == (byte)0xFF);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -192,7 +192,7 @@ final class MAC {
|
||||
* only 2^48 sequence numbers left.
|
||||
*/
|
||||
return (block != null && mac != null &&
|
||||
block[0] == 0xFF && block[1] == 0xFF);
|
||||
block[0] == (byte)0xFF && block[1] == (byte)0xFF);
|
||||
}
|
||||
|
||||
// increment the sequence number in the block array
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 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
|
||||
@ -67,6 +67,23 @@ interface Record {
|
||||
+ maxPadding // padding
|
||||
+ trailerSize; // MAC
|
||||
|
||||
static final boolean enableCBCProtection =
|
||||
Debug.getBooleanProperty("jsse.enableCBCProtection", true);
|
||||
|
||||
/*
|
||||
* For CBC protection in SSL3/TLS1, we break some plaintext into two
|
||||
* packets. Max application data size for the second packet.
|
||||
*/
|
||||
static final int maxDataSizeMinusOneByteRecord =
|
||||
maxDataSize // max data size
|
||||
- ( // max one byte record size
|
||||
headerSize // header
|
||||
+ maxIVLength // iv
|
||||
+ 1 // one byte data
|
||||
+ maxPadding // padding
|
||||
+ trailerSize // MAC
|
||||
);
|
||||
|
||||
/*
|
||||
* The maximum large record size.
|
||||
*
|
||||
|
@ -308,6 +308,11 @@ final public class SSLEngineImpl extends SSLEngine {
|
||||
private Object unwrapLock;
|
||||
Object writeLock;
|
||||
|
||||
/*
|
||||
* Is it the first application record to write?
|
||||
*/
|
||||
private boolean isFirstAppOutputRecord = true;
|
||||
|
||||
/*
|
||||
* Class and subclass dynamic debugging support
|
||||
*/
|
||||
@ -612,6 +617,9 @@ final public class SSLEngineImpl extends SSLEngine {
|
||||
|
||||
// See comment above.
|
||||
oldCipher.dispose();
|
||||
|
||||
// reset the flag of the first application record
|
||||
isFirstAppOutputRecord = true;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1286,9 +1294,35 @@ final public class SSLEngineImpl extends SSLEngine {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* turn off the flag of the first application record if we really
|
||||
* consumed at least byte.
|
||||
*/
|
||||
if (isFirstAppOutputRecord && ea.deltaApp() > 0) {
|
||||
isFirstAppOutputRecord = false;
|
||||
}
|
||||
|
||||
return hsStatus;
|
||||
}
|
||||
|
||||
/*
|
||||
* Need to split the payload except the following cases:
|
||||
*
|
||||
* 1. protocol version is TLS 1.1 or later;
|
||||
* 2. bulk cipher does not use CBC mode, including null bulk cipher suites.
|
||||
* 3. the payload is the first application record of a freshly
|
||||
* negotiated TLS session.
|
||||
* 4. the CBC protection is disabled;
|
||||
*
|
||||
* More details, please refer to
|
||||
* EngineOutputRecord.write(EngineArgs, MAC, CipherBox).
|
||||
*/
|
||||
boolean needToSplitPayload(CipherBox cipher, ProtocolVersion protocol) {
|
||||
return (protocol.v <= ProtocolVersion.TLS10.v) &&
|
||||
cipher.isCBCMode() && !isFirstAppOutputRecord &&
|
||||
Record.enableCBCProtection;
|
||||
}
|
||||
|
||||
/*
|
||||
* Non-application OutputRecords go through here.
|
||||
*/
|
||||
|
@ -369,6 +369,11 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl {
|
||||
/* Class and subclass dynamic debugging support */
|
||||
private static final Debug debug = Debug.getInstance("ssl");
|
||||
|
||||
/*
|
||||
* Is it the first application record to write?
|
||||
*/
|
||||
private boolean isFirstAppOutputRecord = true;
|
||||
|
||||
//
|
||||
// CONSTRUCTORS AND INITIALIZATION CODE
|
||||
//
|
||||
@ -802,8 +807,35 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl {
|
||||
if (connectionState < cs_ERROR) {
|
||||
checkSequenceNumber(writeMAC, r.contentType());
|
||||
}
|
||||
|
||||
// turn off the flag of the first application record
|
||||
if (isFirstAppOutputRecord &&
|
||||
r.contentType() == Record.ct_application_data) {
|
||||
isFirstAppOutputRecord = false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Need to split the payload except the following cases:
|
||||
*
|
||||
* 1. protocol version is TLS 1.1 or later;
|
||||
* 2. bulk cipher does not use CBC mode, including null bulk cipher suites.
|
||||
* 3. the payload is the first application record of a freshly
|
||||
* negotiated TLS session.
|
||||
* 4. the CBC protection is disabled;
|
||||
*
|
||||
* More details, please refer to AppOutputStream.write(byte[], int, int).
|
||||
*/
|
||||
boolean needToSplitPayload() {
|
||||
writeLock.lock();
|
||||
try {
|
||||
return (protocolVersion.v <= ProtocolVersion.TLS10.v) &&
|
||||
writeCipher.isCBCMode() && !isFirstAppOutputRecord &&
|
||||
Record.enableCBCProtection;
|
||||
} finally {
|
||||
writeLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Read an application data record. Alerts and handshake
|
||||
@ -2030,6 +2062,9 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl {
|
||||
|
||||
// See comment above.
|
||||
oldCipher.dispose();
|
||||
|
||||
// reset the flag of the first application record
|
||||
isFirstAppOutputRecord = true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -524,56 +524,67 @@ public class SwingUtilities2 {
|
||||
}
|
||||
|
||||
// If we get here we're not printing
|
||||
AATextInfo info = drawTextAntialiased(c);
|
||||
if (info != null && (g instanceof Graphics2D)) {
|
||||
if (g instanceof Graphics2D) {
|
||||
AATextInfo info = drawTextAntialiased(c);
|
||||
Graphics2D g2 = (Graphics2D)g;
|
||||
|
||||
Object oldContrast = null;
|
||||
Object oldAAValue = g2.getRenderingHint(KEY_TEXT_ANTIALIASING);
|
||||
if (info.aaHint != oldAAValue) {
|
||||
g2.setRenderingHint(KEY_TEXT_ANTIALIASING, info.aaHint);
|
||||
} else {
|
||||
oldAAValue = null;
|
||||
}
|
||||
if (info.lcdContrastHint != null) {
|
||||
oldContrast = g2.getRenderingHint(KEY_TEXT_LCD_CONTRAST);
|
||||
if (info.lcdContrastHint.equals(oldContrast)) {
|
||||
oldContrast = null;
|
||||
} else {
|
||||
g2.setRenderingHint(KEY_TEXT_LCD_CONTRAST,
|
||||
info.lcdContrastHint);
|
||||
}
|
||||
}
|
||||
|
||||
boolean needsTextLayout = ((c != null) &&
|
||||
(c.getClientProperty(TextAttribute.NUMERIC_SHAPING) != null));
|
||||
|
||||
if (needsTextLayout) {
|
||||
synchronized(charsBufferLock) {
|
||||
int length = syncCharsBuffer(text);
|
||||
needsTextLayout = isComplexLayout(charsBuffer, 0, length);
|
||||
}
|
||||
}
|
||||
if (needsTextLayout) {
|
||||
|
||||
if (info != null) {
|
||||
Object oldContrast = null;
|
||||
Object oldAAValue = g2.getRenderingHint(KEY_TEXT_ANTIALIASING);
|
||||
if (info.aaHint != oldAAValue) {
|
||||
g2.setRenderingHint(KEY_TEXT_ANTIALIASING, info.aaHint);
|
||||
} else {
|
||||
oldAAValue = null;
|
||||
}
|
||||
if (info.lcdContrastHint != null) {
|
||||
oldContrast = g2.getRenderingHint(KEY_TEXT_LCD_CONTRAST);
|
||||
if (info.lcdContrastHint.equals(oldContrast)) {
|
||||
oldContrast = null;
|
||||
} else {
|
||||
g2.setRenderingHint(KEY_TEXT_LCD_CONTRAST,
|
||||
info.lcdContrastHint);
|
||||
}
|
||||
}
|
||||
|
||||
if (needsTextLayout) {
|
||||
TextLayout layout = createTextLayout(c, text, g2.getFont(),
|
||||
g2.getFontRenderContext());
|
||||
layout.draw(g2, x, y);
|
||||
} else {
|
||||
g.drawString(text, x, y);
|
||||
}
|
||||
|
||||
if (oldAAValue != null) {
|
||||
g2.setRenderingHint(KEY_TEXT_ANTIALIASING, oldAAValue);
|
||||
}
|
||||
if (oldContrast != null) {
|
||||
g2.setRenderingHint(KEY_TEXT_LCD_CONTRAST, oldContrast);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (needsTextLayout){
|
||||
TextLayout layout = createTextLayout(c, text, g2.getFont(),
|
||||
g2.getFontRenderContext());
|
||||
layout.draw(g2, x, y);
|
||||
} else {
|
||||
g.drawString(text, x, y);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (oldAAValue != null) {
|
||||
g2.setRenderingHint(KEY_TEXT_ANTIALIASING, oldAAValue);
|
||||
}
|
||||
if (oldContrast != null) {
|
||||
g2.setRenderingHint(KEY_TEXT_LCD_CONTRAST, oldContrast);
|
||||
}
|
||||
}
|
||||
else {
|
||||
g.drawString(text, x, y);
|
||||
}
|
||||
g.drawString(text, x, y);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Draws the string at the specified location underlining the specified
|
||||
* character.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 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
|
||||
@ -76,7 +76,7 @@ public class XMLUtils {
|
||||
} catch (SAXException saxe) {
|
||||
throw new InvalidPropertiesFormatException(saxe);
|
||||
}
|
||||
Element propertiesElement = (Element)doc.getChildNodes().item(1);
|
||||
Element propertiesElement = doc.getDocumentElement();
|
||||
String xmlVersion = propertiesElement.getAttribute("version");
|
||||
if (xmlVersion.compareTo(EXTERNAL_XML_VERSION) > 0)
|
||||
throw new InvalidPropertiesFormatException(
|
||||
|
@ -1,14 +1,10 @@
|
||||
|
||||
To run the Ruler demo:
|
||||
|
||||
java -jar Ruler.jar
|
||||
java -jar TransparentRuler.jar
|
||||
|
||||
These instructions assume that this installation's version of the java
|
||||
command is in your path. If it isn't, then you should either
|
||||
specify the complete path to the java command or update your
|
||||
PATH environment variable as described in the installation
|
||||
instructions for the Java(TM) SE Development Kit.
|
||||
|
||||
KNOWN ISSUES:
|
||||
Context menu is clipped with the window shape. The issues are:
|
||||
CR 7027486 JPopupMenu doesn't take window shape into account
|
||||
|
@ -1424,7 +1424,8 @@ typedef struct {
|
||||
*/
|
||||
unsigned int thread_park_blocker : 1;
|
||||
unsigned int post_vm_init_hook_enabled : 1;
|
||||
unsigned int : 30;
|
||||
unsigned int pending_list_uses_discovered_field : 1;
|
||||
unsigned int : 29;
|
||||
unsigned int : 32;
|
||||
unsigned int : 32;
|
||||
} jdk_version_info;
|
||||
|
@ -1112,11 +1112,14 @@ void unpacker::read_Utf8_values(entry* cpMap, int len) {
|
||||
uint size3 = suffix * 3;
|
||||
if (suffix == 0) continue; // done with empty string
|
||||
chars.malloc(size3);
|
||||
CHECK;
|
||||
byte* chp = chars.ptr;
|
||||
band saved_band = cp_Utf8_big_chars;
|
||||
cp_Utf8_big_chars.readData(suffix);
|
||||
CHECK;
|
||||
for (int j = 0; j < suffix; j++) {
|
||||
unsigned short ch = cp_Utf8_big_chars.getInt();
|
||||
CHECK;
|
||||
chp = store_Utf8_char(chp, ch);
|
||||
}
|
||||
chars.realloc(chp - chars.ptr);
|
||||
@ -1134,10 +1137,12 @@ void unpacker::read_Utf8_values(entry* cpMap, int len) {
|
||||
CHECK;
|
||||
int prevlen = 0; // previous string length (in chars)
|
||||
tmallocs.add(bigbuf.ptr); // free after this block
|
||||
CHECK;
|
||||
cp_Utf8_prefix.rewind();
|
||||
for (i = 0; i < len; i++) {
|
||||
bytes& chars = allsuffixes[i];
|
||||
int prefix = (i < PREFIX_SKIP_2)? 0: cp_Utf8_prefix.getInt();
|
||||
CHECK;
|
||||
int suffix = (int)chars.len;
|
||||
byte* fillp;
|
||||
// by induction, the buffer is already filled with the prefix
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 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
|
||||
@ -52,7 +52,7 @@ void* must_malloc(size_t size) {
|
||||
if (msize >= 0 && msize < sizeof(int))
|
||||
msize = sizeof(int); // see 0xbaadf00d below
|
||||
#endif
|
||||
void* ptr = (msize > PSIZE_MAX) ? null : malloc(msize);
|
||||
void* ptr = (msize > PSIZE_MAX || msize <= 0) ? null : malloc(msize);
|
||||
if (ptr != null) {
|
||||
memset(ptr, 0, size);
|
||||
} else {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 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
|
||||
@ -33,7 +33,7 @@ void mtrace(char c, void* ptr, size_t size);
|
||||
#endif
|
||||
|
||||
// overflow management
|
||||
#define OVERFLOW ((size_t)-1)
|
||||
#define OVERFLOW ((uint)-1)
|
||||
#define PSIZE_MAX (OVERFLOW/2) /* normal size limit */
|
||||
|
||||
inline size_t scale_size(size_t size, size_t scale) {
|
||||
|
@ -101,5 +101,5 @@ JDK_GetVersionInfo0(jdk_version_info* info, size_t info_size) {
|
||||
// Advertise presence of sun.misc.PostVMInitHook:
|
||||
// future optimization: detect if this is enabled.
|
||||
info->post_vm_init_hook_enabled = 1;
|
||||
|
||||
info->pending_list_uses_discovered_field = 1;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 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
|
||||
@ -284,7 +284,7 @@ Java_sun_java2d_loops_TransformHelper_Transform
|
||||
TransformHelperFunc *pHelperFunc;
|
||||
TransformInterpFunc *pInterpFunc;
|
||||
jdouble xorig, yorig;
|
||||
jint numedges;
|
||||
jlong numedges;
|
||||
jint *pEdges;
|
||||
jint edgebuf[2 + MAXEDGES * 2];
|
||||
union {
|
||||
@ -379,19 +379,44 @@ Java_sun_java2d_loops_TransformHelper_Transform
|
||||
}
|
||||
Region_IntersectBounds(&clipInfo, &dstInfo.bounds);
|
||||
|
||||
numedges = (dstInfo.bounds.y2 - dstInfo.bounds.y1);
|
||||
if (numedges > MAXEDGES) {
|
||||
pEdges = malloc((2 + 2 * numedges) * sizeof (*pEdges));
|
||||
if (pEdges == NULL) {
|
||||
SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);
|
||||
SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
|
||||
/* edgeArray should already contain zeros for min/maxy */
|
||||
return;
|
||||
}
|
||||
numedges = (((jlong) dstInfo.bounds.y2) - ((jlong) dstInfo.bounds.y1));
|
||||
if (numedges <= 0) {
|
||||
pEdges = NULL;
|
||||
} else if (!JNU_IsNull(env, edgeArray)) {
|
||||
/*
|
||||
* Ideally Java should allocate an array large enough, but if
|
||||
* we ever have a miscommunication about the number of edge
|
||||
* lines, or if the Java array calculation should overflow to
|
||||
* a positive number and succeed in allocating an array that
|
||||
* is too small, we need to verify that it can still hold the
|
||||
* number of integers that we plan to store to be safe.
|
||||
*/
|
||||
jsize edgesize = (*env)->GetArrayLength(env, edgeArray);
|
||||
/* (edgesize/2 - 1) should avoid any overflow or underflow. */
|
||||
pEdges = (((edgesize / 2) - 1) >= numedges)
|
||||
? (*env)->GetPrimitiveArrayCritical(env, edgeArray, NULL)
|
||||
: NULL;
|
||||
} else if (numedges > MAXEDGES) {
|
||||
/* numedges variable (jlong) can be at most ((1<<32)-1) */
|
||||
/* memsize can overflow a jint, but not a jlong */
|
||||
jlong memsize = ((numedges * 2) + 2) * sizeof(*pEdges);
|
||||
pEdges = (memsize == ((size_t) memsize))
|
||||
? malloc((size_t) memsize)
|
||||
: NULL;
|
||||
} else {
|
||||
pEdges = edgebuf;
|
||||
}
|
||||
|
||||
if (pEdges == NULL) {
|
||||
if (numedges > 0) {
|
||||
JNU_ThrowInternalError(env, "Unable to allocate edge list");
|
||||
}
|
||||
SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);
|
||||
SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
|
||||
/* edgeArray should already contain zeros for min/maxy */
|
||||
return;
|
||||
}
|
||||
|
||||
Transform_GetInfo(env, itxform, &itxInfo);
|
||||
|
||||
if (!Region_IsEmpty(&clipInfo)) {
|
||||
@ -500,14 +525,14 @@ Java_sun_java2d_loops_TransformHelper_Transform
|
||||
} else {
|
||||
pEdges[0] = pEdges[1] = 0;
|
||||
}
|
||||
SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);
|
||||
SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
|
||||
|
||||
if (!JNU_IsNull(env, edgeArray)) {
|
||||
(*env)->SetIntArrayRegion(env, edgeArray, 0, 2+numedges*2, pEdges);
|
||||
}
|
||||
if (pEdges != edgebuf) {
|
||||
(*env)->ReleasePrimitiveArrayCritical(env, edgeArray, pEdges, 0);
|
||||
} else if (pEdges != edgebuf) {
|
||||
free(pEdges);
|
||||
}
|
||||
SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);
|
||||
SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -466,12 +466,16 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
|
||||
if (true) {
|
||||
switch(e.getID()) {
|
||||
case PaintEvent.UPDATE:
|
||||
log.finer("XCP coalescePaintEvent : UPDATE : add : x = " +
|
||||
if (log.isLoggable(PlatformLogger.FINER)) {
|
||||
log.finer("XCP coalescePaintEvent : UPDATE : add : x = " +
|
||||
r.x + ", y = " + r.y + ", width = " + r.width + ",height = " + r.height);
|
||||
}
|
||||
return;
|
||||
case PaintEvent.PAINT:
|
||||
log.finer("XCP coalescePaintEvent : PAINT : add : x = " +
|
||||
if (log.isLoggable(PlatformLogger.FINER)) {
|
||||
log.finer("XCP coalescePaintEvent : PAINT : add : x = " +
|
||||
r.x + ", y = " + r.y + ", width = " + r.width + ",height = " + r.height);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1248,7 +1252,9 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
|
||||
* ButtonPress, ButtonRelease, KeyPress, KeyRelease, EnterNotify, LeaveNotify, MotionNotify
|
||||
*/
|
||||
protected boolean isEventDisabled(XEvent e) {
|
||||
enableLog.finest("Component is {1}, checking for disabled event {0}", e, (isEnabled()?"enabled":"disable"));
|
||||
if (enableLog.isLoggable(PlatformLogger.FINEST)) {
|
||||
enableLog.finest("Component is {1}, checking for disabled event {0}", e, (isEnabled()?"enabled":"disable"));
|
||||
}
|
||||
if (!isEnabled()) {
|
||||
switch (e.get_type()) {
|
||||
case XConstants.ButtonPress:
|
||||
@ -1258,7 +1264,9 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
|
||||
case XConstants.EnterNotify:
|
||||
case XConstants.LeaveNotify:
|
||||
case XConstants.MotionNotify:
|
||||
enableLog.finer("Event {0} is disable", e);
|
||||
if (enableLog.isLoggable(PlatformLogger.FINER)) {
|
||||
enableLog.finer("Event {0} is disable", e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -678,7 +678,7 @@ public class WrapperGenerator {
|
||||
public void writeToString(StructType stp, PrintWriter pw) {
|
||||
int type;
|
||||
pw.println("\n\n\tString getName() {\n\t\treturn \"" + stp.getName()+ "\"; \n\t}");
|
||||
pw.println("\n\n\tString getFieldsAsString() {\n\t\tString ret=\"\";\n");
|
||||
pw.println("\n\n\tString getFieldsAsString() {\n\t\tStringBuilder ret = new StringBuilder(" + stp.getNumFields() * 40 + ");\n");
|
||||
|
||||
for (Enumeration e = stp.getMembers() ; e.hasMoreElements() ;) {
|
||||
AtomicType tp = (AtomicType) e.nextElement();
|
||||
@ -688,24 +688,24 @@ public class WrapperGenerator {
|
||||
if ((name != null) && (name.length() > 0))
|
||||
{
|
||||
if (type == AtomicType.TYPE_ATOM) {
|
||||
pw.println("\t\tret += \"\"+\"" + name + " = \" + XAtom.get(get_" + name + "()) +\", \";");
|
||||
pw.println("\t\tret.append(\"" + name + " = \" ).append( XAtom.get(get_" + name + "()) ).append(\", \");");
|
||||
} else if (name.equals("type")) {
|
||||
pw.println("\t\tret += \"\"+\"type = \" + XlibWrapper.eventToString[get_type()] +\", \";");
|
||||
pw.println("\t\tret.append(\"type = \").append( XlibWrapper.eventToString[get_type()] ).append(\", \");");
|
||||
} else if (name.equals("window")){
|
||||
pw.println("\t\tret += \"\"+\"window = \" + getWindow(get_window()) + \", \";");
|
||||
pw.println("\t\tret.append(\"window = \" ).append( getWindow(get_window()) ).append(\", \");");
|
||||
} else if (type == AtomicType.TYPE_ARRAY) {
|
||||
pw.print("\t\tret += \"{\"");
|
||||
pw.print("\t\tret.append(\"{\")");
|
||||
for (int i = 0; i < tp.getArrayLength(); i++) {
|
||||
pw.print(" + get_" + name + "(" + i + ") + \" \"");
|
||||
pw.print("\n\t\t.append( get_" + name + "(" + i + ") ).append(\" \")");
|
||||
}
|
||||
pw.println(" + \"}\";");
|
||||
pw.println(".append( \"}\");");
|
||||
} else {
|
||||
pw.println("\t\tret += \"\"+\"" + name +" = \" + get_"+ name+"() +\", \";");
|
||||
pw.println("\t\tret.append(\"" + name +" = \").append( get_"+ name+"() ).append(\", \");");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
pw.println("\t\treturn ret;\n\t}\n\n");
|
||||
pw.println("\t\treturn ret.toString();\n\t}\n\n");
|
||||
}
|
||||
|
||||
public void writeStubs(StructType stp, PrintWriter pw) {
|
||||
|
@ -38,7 +38,9 @@ import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.Reader;
|
||||
import java.io.StringWriter;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Vector;
|
||||
|
||||
@ -955,23 +957,49 @@ public class UnixPrintJob implements CancelablePrintJob {
|
||||
private class PrinterSpooler implements java.security.PrivilegedAction {
|
||||
PrintException pex;
|
||||
|
||||
private void handleProcessFailure(final Process failedProcess,
|
||||
final String[] execCmd, final int result) throws IOException {
|
||||
try (StringWriter sw = new StringWriter();
|
||||
PrintWriter pw = new PrintWriter(sw)) {
|
||||
pw.append("error=").append(Integer.toString(result));
|
||||
pw.append(" running:");
|
||||
for (String arg: execCmd) {
|
||||
pw.append(" '").append(arg).append("'");
|
||||
}
|
||||
try (InputStream is = failedProcess.getErrorStream();
|
||||
InputStreamReader isr = new InputStreamReader(is);
|
||||
BufferedReader br = new BufferedReader(isr)) {
|
||||
while (br.ready()) {
|
||||
pw.println();
|
||||
pw.append("\t\t").append(br.readLine());
|
||||
}
|
||||
} finally {
|
||||
pw.flush();
|
||||
throw new IOException(sw.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Object run() {
|
||||
if (spoolFile == null || !spoolFile.exists()) {
|
||||
pex = new PrintException("No spool file");
|
||||
notifyEvent(PrintJobEvent.JOB_FAILED);
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
/**
|
||||
* Spool to the printer.
|
||||
*/
|
||||
if (spoolFile == null || !spoolFile.exists()) {
|
||||
pex = new PrintException("No spool file");
|
||||
notifyEvent(PrintJobEvent.JOB_FAILED);
|
||||
return null;
|
||||
}
|
||||
String fileName = spoolFile.getAbsolutePath();
|
||||
String execCmd[] = printExecCmd(mDestination, mOptions,
|
||||
mNoJobSheet, jobName, copies, fileName);
|
||||
|
||||
Process process = Runtime.getRuntime().exec(execCmd);
|
||||
process.waitFor();
|
||||
spoolFile.delete();
|
||||
final int result = process.exitValue();
|
||||
if (0 != result) {
|
||||
handleProcessFailure(process, execCmd, result);
|
||||
}
|
||||
notifyEvent(PrintJobEvent.DATA_TRANSFER_COMPLETE);
|
||||
} catch (IOException ex) {
|
||||
notifyEvent(PrintJobEvent.JOB_FAILED);
|
||||
@ -981,6 +1009,7 @@ public class UnixPrintJob implements CancelablePrintJob {
|
||||
notifyEvent(PrintJobEvent.JOB_FAILED);
|
||||
pex = new PrintException(ie);
|
||||
} finally {
|
||||
spoolFile.delete();
|
||||
notifyEvent(PrintJobEvent.NO_MORE_EVENTS);
|
||||
}
|
||||
return null;
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include <X11/Xutil.h>
|
||||
#include <X11/extensions/shape.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
#include <inttypes.h>
|
||||
|
@ -60,10 +60,11 @@ final class ProcessImpl extends Process {
|
||||
throws IOException
|
||||
{
|
||||
if (append) {
|
||||
String path = f.getPath();
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null)
|
||||
sm.checkWrite(f.getPath());
|
||||
long handle = openForAtomicAppend(f.getPath());
|
||||
sm.checkWrite(path);
|
||||
long handle = openForAtomicAppend(path);
|
||||
final FileDescriptor fd = new FileDescriptor();
|
||||
fdAccess.setHandle(fd, handle);
|
||||
return AccessController.doPrivileged(
|
||||
|
@ -124,26 +124,27 @@ class WindowsDirectoryStream
|
||||
private boolean atEof;
|
||||
private String first;
|
||||
private Path nextEntry;
|
||||
private String prefix;
|
||||
|
||||
WindowsDirectoryIterator(String first) {
|
||||
atEof = false;
|
||||
this.first = first;
|
||||
if (dir.needsSlashWhenResolving()) {
|
||||
prefix = dir.toString() + "\\";
|
||||
} else {
|
||||
prefix = dir.toString();
|
||||
}
|
||||
}
|
||||
|
||||
// links to self and parent directories are ignored
|
||||
private boolean isSelfOrParent(String name) {
|
||||
return name.equals(".") || name.equals("..");
|
||||
}
|
||||
|
||||
// applies filter and also ignores "." and ".."
|
||||
private Path acceptEntry(String s, BasicFileAttributes attrs) {
|
||||
if (s.equals(".") || s.equals(".."))
|
||||
return null;
|
||||
if (dir.needsSlashWhenResolving()) {
|
||||
StringBuilder sb = new StringBuilder(dir.toString());
|
||||
sb.append('\\');
|
||||
sb.append(s);
|
||||
s = sb.toString();
|
||||
} else {
|
||||
s = dir + s;
|
||||
}
|
||||
Path entry = WindowsPath
|
||||
.createFromNormalizedPath(dir.getFileSystem(), s, attrs);
|
||||
.createFromNormalizedPath(dir.getFileSystem(), prefix + s, attrs);
|
||||
try {
|
||||
if (filter.accept(entry))
|
||||
return entry;
|
||||
@ -157,7 +158,7 @@ class WindowsDirectoryStream
|
||||
private Path readNextEntry() {
|
||||
// handle first element returned by search
|
||||
if (first != null) {
|
||||
nextEntry = acceptEntry(first, null);
|
||||
nextEntry = isSelfOrParent(first) ? null : acceptEntry(first, null);
|
||||
first = null;
|
||||
if (nextEntry != null)
|
||||
return nextEntry;
|
||||
@ -184,6 +185,10 @@ class WindowsDirectoryStream
|
||||
return null;
|
||||
}
|
||||
|
||||
// ignore link to self and parent directories
|
||||
if (isSelfOrParent(name))
|
||||
continue;
|
||||
|
||||
// grab the attributes from the WIN32_FIND_DATA structure
|
||||
// (needs to be done while holding closeLock because close
|
||||
// will release the buffer)
|
||||
|
@ -120,12 +120,18 @@ class WindowsPathParser {
|
||||
off = next;
|
||||
} else {
|
||||
if (isLetter(c0) && c1 == ':') {
|
||||
root = input.substring(0, 2);
|
||||
if (len > 2 && isSlash(input.charAt(2))) {
|
||||
char c2;
|
||||
if (len > 2 && isSlash(c2 = input.charAt(2))) {
|
||||
// avoid concatenation when root is "D:\"
|
||||
if (c2 == '\\') {
|
||||
root = input.substring(0, 3);
|
||||
} else {
|
||||
root = input.substring(0, 2) + '\\';
|
||||
}
|
||||
off = 3;
|
||||
root += "\\";
|
||||
type = WindowsPathType.ABSOLUTE;
|
||||
} else {
|
||||
root = input.substring(0, 2);
|
||||
off = 2;
|
||||
type = WindowsPathType.DRIVE_RELATIVE;
|
||||
}
|
||||
|
@ -355,7 +355,7 @@ void AwtWindow::RepositionSecurityWarning(JNIEnv *env)
|
||||
RECT rect;
|
||||
CalculateWarningWindowBounds(env, &rect);
|
||||
|
||||
::SetWindowPos(warningWindow, IsAlwaysOnTop() ? HWND_TOPMOST : GetHWnd(),
|
||||
::SetWindowPos(warningWindow, IsAlwaysOnTop() ? HWND_TOPMOST : HWND_NOTOPMOST,
|
||||
rect.left, rect.top,
|
||||
rect.right - rect.left, rect.bottom - rect.top,
|
||||
SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE |
|
||||
@ -835,7 +835,7 @@ void AwtWindow::StartSecurityAnimation(AnimationKind kind)
|
||||
|
||||
if (securityAnimationKind == akShow) {
|
||||
::SetWindowPos(warningWindow,
|
||||
IsAlwaysOnTop() ? HWND_TOPMOST : GetHWnd(),
|
||||
IsAlwaysOnTop() ? HWND_TOPMOST : HWND_NOTOPMOST,
|
||||
0, 0, 0, 0,
|
||||
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE |
|
||||
SWP_SHOWWINDOW | SWP_NOOWNERZORDER);
|
||||
|
@ -490,9 +490,6 @@ sun/security/pkcs11/ec/TestECDSA.java solaris-i586
|
||||
#sun/security/pkcs11/ec/TestKeyFactory.java solaris-i586
|
||||
sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java solaris-i586
|
||||
|
||||
# Directly references PKCS11 class
|
||||
sun/security/pkcs11/Provider/Absolute.java windows-x64
|
||||
|
||||
# Fails on Fedora 9/Ubuntu 10.04 64bit, PKCS11Exception: CKR_DEVICE_ERROR
|
||||
sun/security/pkcs11/KeyAgreement/TestDH.java generic-all
|
||||
|
||||
|
79
jdk/test/java/lang/ref/ReferenceEnqueue.java
Normal file
79
jdk/test/java/lang/ref/ReferenceEnqueue.java
Normal file
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (c) 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.
|
||||
*
|
||||
* 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 4268317
|
||||
* @summary Test if Reference.enqueue() works properly with GC
|
||||
*/
|
||||
|
||||
import java.lang.ref.*;
|
||||
|
||||
public class ReferenceEnqueue {
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
for (int i=0; i < 5; i++)
|
||||
new WeakRef().run();
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
static class WeakRef {
|
||||
final ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
|
||||
final Reference<Object> ref;
|
||||
final int iterations = 1000;
|
||||
|
||||
WeakRef() {
|
||||
this.ref = new WeakReference<Object>(new Object(), queue);
|
||||
}
|
||||
|
||||
void run() throws InterruptedException {
|
||||
System.gc();
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
System.gc();
|
||||
if (ref.isEnqueued()) {
|
||||
break;
|
||||
}
|
||||
|
||||
Thread.sleep(100);
|
||||
}
|
||||
|
||||
if (ref.isEnqueued() == false) {
|
||||
// GC have not enqueued refWeak for the timeout period
|
||||
System.out.println("Reference not enqueued yet");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ref.enqueue() == true) {
|
||||
// enqueue() should return false since
|
||||
// ref is already enqueued by the GC
|
||||
throw new RuntimeException("Error: enqueue() returned true;"
|
||||
+ " expected false");
|
||||
}
|
||||
|
||||
if (queue.poll() == null) {
|
||||
// poll() should return ref enqueued by the GC
|
||||
throw new RuntimeException("Error: poll() returned null;"
|
||||
+ " expected ref object");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
201
jdk/test/java/lang/ref/ReferenceEnqueuePending.java
Normal file
201
jdk/test/java/lang/ref/ReferenceEnqueuePending.java
Normal file
@ -0,0 +1,201 @@
|
||||
/* Copyright (c) 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.
|
||||
*
|
||||
* 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 4243978
|
||||
* @summary Test if Reference.enqueue() works properly with pending references
|
||||
*/
|
||||
import java.lang.ref.*;
|
||||
|
||||
public class ReferenceEnqueuePending {
|
||||
static class NumberedWeakReference extends WeakReference<Integer> {
|
||||
// Add an integer to identify the weak reference object.
|
||||
int number;
|
||||
|
||||
NumberedWeakReference(Integer referent, ReferenceQueue<Integer> q, int i) {
|
||||
super(referent, q);
|
||||
number = i;
|
||||
}
|
||||
}
|
||||
|
||||
final static boolean debug = System.getProperty("test.debug") != null;
|
||||
final static int iterations = 1000;
|
||||
final static int gc_trigger = 99;
|
||||
static int[] a = new int[2 * iterations];
|
||||
// Keep all weak references alive with the following array.
|
||||
static NumberedWeakReference[] b = new NumberedWeakReference[iterations];
|
||||
|
||||
public static void main(String[] argv) throws Exception {
|
||||
if (debug) {
|
||||
System.out.println("Starting the test.");
|
||||
}
|
||||
// Raise thread priority to match the referenceHandler
|
||||
// priority, so that they can race also on a uniprocessor.
|
||||
raisePriority();
|
||||
|
||||
ReferenceQueue<Integer> refQueue = new ReferenceQueue<>();
|
||||
|
||||
// Our objective is to let the mutator enqueue
|
||||
// a Reference object that may already be in the
|
||||
// pending state because of having been identified
|
||||
// as weakly reachable at a previous garbage collection.
|
||||
// To this end, we create many Reference objects, each with a
|
||||
// a unique integer object as its referant.
|
||||
// We let the referents become eligible for collection,
|
||||
// while racing with the garbage collector which may
|
||||
// have pended some of these Reference objects.
|
||||
// Finally we check that all of the Reference objects
|
||||
// end up on the their queue. The test was originally
|
||||
// submitted to show that such races could break the
|
||||
// pending list and/or the reference queue, because of sharing
|
||||
// the same link ("next") for maintaining both lists, thus
|
||||
// losing some of the Reference objects on either queue.
|
||||
|
||||
Integer obj = new Integer(0);
|
||||
NumberedWeakReference weaky = new NumberedWeakReference(obj, refQueue, 0);
|
||||
for (int i = 1; i < iterations; i++) {
|
||||
// Create a new object, dropping the onlY strong reference to
|
||||
// the previous Integer object.
|
||||
obj = new Integer(i);
|
||||
// Trigger gc each gc_trigger iterations.
|
||||
if ((i % gc_trigger) == 0) {
|
||||
forceGc(0);
|
||||
}
|
||||
// Enqueue every other weaky.
|
||||
if ((i % 2) == 0) {
|
||||
weaky.enqueue();
|
||||
}
|
||||
// Remember the Reference objects, for testing later.
|
||||
b[i - 1] = weaky;
|
||||
// Get a new weaky for the Integer object just
|
||||
// created, which may be explicitly enqueued in
|
||||
// our next trip around the loop.
|
||||
weaky = new NumberedWeakReference(obj, refQueue, i);
|
||||
}
|
||||
|
||||
// Do a final collection to discover and process all
|
||||
// Reference objects created above, allowing enough time
|
||||
// for the ReferenceHandler thread to queue the References.
|
||||
forceGc(100);
|
||||
forceGc(100);
|
||||
|
||||
// Verify that all WeakReference objects ended up queued.
|
||||
checkResult(refQueue, obj, iterations-1);
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
|
||||
private static void checkResult(ReferenceQueue<Integer> queue,
|
||||
Integer obj,
|
||||
int expected) {
|
||||
if (debug) {
|
||||
System.out.println("Reading the queue");
|
||||
}
|
||||
|
||||
// Empty the queue and record numbers into a[];
|
||||
NumberedWeakReference weakRead = (NumberedWeakReference) queue.poll();
|
||||
int length = 0;
|
||||
while (weakRead != null) {
|
||||
a[length++] = weakRead.number;
|
||||
weakRead = (NumberedWeakReference) queue.poll();
|
||||
}
|
||||
if (debug) {
|
||||
System.out.println("Reference Queue had " + length + " elements");
|
||||
}
|
||||
// Use the last Reference object of those created above, so as to keep it "alive".
|
||||
System.out.println("I must write " + obj + " to prevent compiler optimizations.");
|
||||
|
||||
|
||||
// verify the queued references: all but the last Reference object
|
||||
// should have been in the queue.
|
||||
if (debug) {
|
||||
System.out.println("Start of final check");
|
||||
}
|
||||
|
||||
// Sort the first "length" elements in array "a[]".
|
||||
sort(length);
|
||||
|
||||
boolean fail = (length != expected);
|
||||
for (int i = 0; i < length; i++) {
|
||||
if (a[i] != i) {
|
||||
if (debug) {
|
||||
System.out.println("a[" + i + "] is not " + i + " but " + a[i]);
|
||||
}
|
||||
fail = true;
|
||||
}
|
||||
}
|
||||
if (fail) {
|
||||
printMissingElements(length, expected);
|
||||
throw new RuntimeException("TEST FAILED: only " + length
|
||||
+ " reference objects have been queued out of "
|
||||
+ expected);
|
||||
}
|
||||
}
|
||||
|
||||
private static void printMissingElements(int length, int expected) {
|
||||
System.out.println("The following numbers were not found in the reference queue: ");
|
||||
int missing = 0;
|
||||
int element = 0;
|
||||
for (int i = 0; i < length; i++) {
|
||||
while ((a[i] != element) & (element < expected)) {
|
||||
System.out.print(element + " ");
|
||||
if (missing % 20 == 19) {
|
||||
System.out.println(" ");
|
||||
}
|
||||
missing++;
|
||||
element++;
|
||||
}
|
||||
element++;
|
||||
}
|
||||
System.out.print("\n");
|
||||
}
|
||||
|
||||
private static void forceGc(long millis) throws InterruptedException {
|
||||
Runtime.getRuntime().gc();
|
||||
Thread.sleep(millis);
|
||||
}
|
||||
|
||||
// Bubble sort the first "length" elements in array "a".
|
||||
private static void sort(int length) {
|
||||
int hold;
|
||||
if (debug) {
|
||||
System.out.println("Sorting. Length=" + length);
|
||||
}
|
||||
for (int pass = 1; pass < length; pass++) { // passes over the array
|
||||
for (int i = 0; i < length - pass; i++) { // a single pass
|
||||
if (a[i] > a[i + 1]) { // then swap
|
||||
hold = a[i];
|
||||
a[i] = a[i + 1];
|
||||
a[i + 1] = hold;
|
||||
}
|
||||
} // End of i loop
|
||||
} // End of pass loop
|
||||
}
|
||||
|
||||
// Raise thread priority so as to increase the
|
||||
// probability of the mutator succeeding in enqueueing
|
||||
// an object that is still in the pending state.
|
||||
// This is (probably) only required for a uniprocessor.
|
||||
static void raisePriority() {
|
||||
Thread tr = Thread.currentThread();
|
||||
tr.setPriority(Thread.MAX_PRIORITY);
|
||||
}
|
||||
} // End of class ReferenceEnqueuePending
|
@ -23,7 +23,7 @@
|
||||
|
||||
/* @test
|
||||
* @summary Check that error cases are replaced correctly in String/ISR/OSW
|
||||
* @bug 4457851
|
||||
* @bug 4457851 7096080
|
||||
*
|
||||
* @build Errors Util
|
||||
* @run main Errors
|
||||
@ -193,11 +193,9 @@ public class Errors {
|
||||
t.test("\uFFFF", new byte[] { (byte)0xEF, (byte)0xBF, (byte)0xBF });
|
||||
t.test(new byte[] { X, (byte)0x7f, Y }, "x\u007Fy");
|
||||
t.test(new byte[] { X, (byte)0x80, Y }, "x\uFFFDy");
|
||||
t.test(new byte[] { (byte)0xf0, (byte)0xf0 }, "\uFFFD");
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
test_US_ASCII(new TestString("US-ASCII"));
|
||||
test_US_ASCII(new TestStream("US-ASCII"));
|
||||
|
||||
|
351
jdk/test/java/util/Collections/EmptySortedSet.java
Normal file
351
jdk/test/java/util/Collections/EmptySortedSet.java
Normal file
@ -0,0 +1,351 @@
|
||||
/*
|
||||
* Copyright (c) 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.
|
||||
*
|
||||
* 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 4533691
|
||||
* @summary Unit test for Collections.emptySortedSet
|
||||
*/
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.math.BigInteger;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
public class EmptySortedSet {
|
||||
static int status = 0;
|
||||
private static final String FAILED = " failed. ";
|
||||
private static final String PERIOD = ".";
|
||||
private final String thisClassName = this.getClass().getName();
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
new EmptySortedSet();
|
||||
}
|
||||
|
||||
public EmptySortedSet() throws Exception {
|
||||
run();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if the {@link Object} passed in is an empty
|
||||
* {@link SortedSet}.
|
||||
*
|
||||
* @param obj the object to test
|
||||
* @return {@code true} if the {@link Object} is an empty {@link SortedSet}
|
||||
* otherwise {@code false}.
|
||||
*/
|
||||
private boolean isEmptySortedSet(Object obj) {
|
||||
boolean isEmptySortedSet = false;
|
||||
|
||||
// We determine if the object is an empty sorted set by testing if it's
|
||||
// an instance of SortedSet, and if so, if it's empty. Currently the
|
||||
// testing doesn't include checks of the other methods.
|
||||
if (obj instanceof SortedSet) {
|
||||
SortedSet ss = (SortedSet) obj;
|
||||
|
||||
if ((ss.isEmpty()) && (ss.size() == 0)) {
|
||||
isEmptySortedSet = true;
|
||||
}
|
||||
}
|
||||
|
||||
return isEmptySortedSet;
|
||||
}
|
||||
|
||||
private void run() throws Exception {
|
||||
Method[] methods = this.getClass().getDeclaredMethods();
|
||||
|
||||
for (int i = 0; i < methods.length; i++) {
|
||||
Method method = methods[i];
|
||||
String methodName = method.getName();
|
||||
|
||||
if (methodName.startsWith("test")) {
|
||||
try {
|
||||
Object obj = method.invoke(this, new Object[0]);
|
||||
} catch(Exception e) {
|
||||
throw new Exception(this.getClass().getName() + "." +
|
||||
methodName + " test failed, test exception "
|
||||
+ "follows\n" + e.getCause());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void throwException(String methodName, String reason)
|
||||
throws Exception
|
||||
{
|
||||
StringBuilder sb = new StringBuilder(thisClassName);
|
||||
sb.append(PERIOD);
|
||||
sb.append(methodName);
|
||||
sb.append(FAILED);
|
||||
sb.append(reason);
|
||||
throw new Exception(sb.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private void test00() throws Exception {
|
||||
//throwException("test00", "This test has not been implemented yet.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the comparator is {@code null}.
|
||||
*/
|
||||
private void testComparatorIsNull() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
Comparator comparator = sortedSet.comparator();
|
||||
|
||||
if (comparator != null) {
|
||||
throwException("testComparatorIsNull", "Comparator is not null.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the contains method returns {@code false}.
|
||||
*/
|
||||
private void testContains() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
|
||||
if (sortedSet.contains(new Object())) {
|
||||
throwException("testContains", "Should not contain any elements.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the containsAll method returns {@code false}.
|
||||
*/
|
||||
private void testContainsAll() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
TreeSet treeSet = new TreeSet();
|
||||
treeSet.add("1");
|
||||
treeSet.add("2");
|
||||
treeSet.add("3");
|
||||
|
||||
if (sortedSet.containsAll(treeSet)) {
|
||||
throwException("testContainsAll",
|
||||
"Should not contain any elements.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the iterator is empty.
|
||||
*/
|
||||
private void testEmptyIterator() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
Iterator emptyIterator = sortedSet.iterator();
|
||||
|
||||
if ((emptyIterator != null) && (emptyIterator.hasNext())) {
|
||||
throwException("testEmptyIterator", "The iterator is not empty.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the set is empty.
|
||||
*/
|
||||
private void testIsEmpty() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
|
||||
if ((sortedSet != null) && (!sortedSet.isEmpty())) {
|
||||
throwException("testSizeIsZero", "The set is not empty.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the first() method throws NoSuchElementException
|
||||
*/
|
||||
private void testFirst() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
|
||||
try {
|
||||
sortedSet.first();
|
||||
throwException("testFirst",
|
||||
"NoSuchElemenException was not thrown.");
|
||||
} catch(NoSuchElementException nsee) {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the headSet() method.
|
||||
*/
|
||||
private void testHeadSet() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
SortedSet ss;
|
||||
|
||||
try {
|
||||
ss = sortedSet.headSet(null);
|
||||
throwException("testHeadSet",
|
||||
"Must throw NullPointerException for null element");
|
||||
} catch(NullPointerException npe) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
try {
|
||||
ss = sortedSet.headSet(new Object());
|
||||
throwException("testHeadSet",
|
||||
"Must throw ClassCastException for non-Comparable element");
|
||||
} catch(ClassCastException cce) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
ss = sortedSet.headSet("1");
|
||||
|
||||
if ((ss == null) || !isEmptySortedSet(ss)) {
|
||||
throwException("testHeadSet",
|
||||
"Returned value is null or not an EmptySortedSet.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the last() method throws NoSuchElementException
|
||||
*/
|
||||
private void testLast() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
|
||||
try {
|
||||
sortedSet.last();
|
||||
throwException("testLast",
|
||||
"NoSuchElemenException was not thrown.");
|
||||
} catch(NoSuchElementException nsee) {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the size is 0.
|
||||
*/
|
||||
private void testSizeIsZero() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
int size = sortedSet.size();
|
||||
|
||||
if (size > 0) {
|
||||
throwException("testSizeIsZero",
|
||||
"The size of the set is greater then 0.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the subSet() method.
|
||||
*/
|
||||
private void testSubSet() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
SortedSet ss = sortedSet.headSet("1");
|
||||
|
||||
try {
|
||||
ss = sortedSet.subSet(null, BigInteger.TEN);
|
||||
ss = sortedSet.subSet(BigInteger.ZERO, null);
|
||||
ss = sortedSet.subSet(null, null);
|
||||
throwException("testSubSet",
|
||||
"Must throw NullPointerException for null element");
|
||||
} catch(NullPointerException npe) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
try {
|
||||
Object obj1 = new Object();
|
||||
Object obj2 = new Object();
|
||||
ss = sortedSet.subSet(obj1, BigInteger.TEN);
|
||||
ss = sortedSet.subSet(BigInteger.ZERO, obj2);
|
||||
ss = sortedSet.subSet(obj1, obj2);
|
||||
throwException("testSubSet",
|
||||
"Must throw ClassCastException for parameter which is "
|
||||
+ "not Comparable.");
|
||||
} catch(ClassCastException cce) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
try {
|
||||
ss = sortedSet.subSet(BigInteger.ZERO, BigInteger.ZERO);
|
||||
ss = sortedSet.subSet(BigInteger.TEN, BigInteger.ZERO);
|
||||
throwException("testSubSet",
|
||||
"Must throw IllegalArgumentException when fromElement is "
|
||||
+ "not less then then toElement.");
|
||||
} catch(IllegalArgumentException iae) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
ss = sortedSet.subSet(BigInteger.ZERO, BigInteger.TEN);
|
||||
|
||||
if (!isEmptySortedSet(ss)) {
|
||||
throw new Exception("Returned value is not empty sorted set.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the tailSet() method.
|
||||
*/
|
||||
private void testTailSet() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
SortedSet ss;
|
||||
|
||||
try {
|
||||
ss = sortedSet.tailSet(null);
|
||||
throwException("testTailSet",
|
||||
"Must throw NullPointerException for null element");
|
||||
} catch(NullPointerException npe) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
try {
|
||||
SortedSet ss2 = sortedSet.tailSet(new Object());
|
||||
throwException("testTailSet",
|
||||
"Must throw ClassCastException for non-Comparable element");
|
||||
} catch(ClassCastException cce) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
ss = sortedSet.tailSet("1");
|
||||
|
||||
if ((ss == null) || !isEmptySortedSet(ss)) {
|
||||
throwException("testTailSet",
|
||||
"Returned value is null or not an EmptySortedSet.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the array has a size of 0.
|
||||
*/
|
||||
private void testToArray() throws Exception {
|
||||
SortedSet sortedSet = Collections.emptySortedSet();
|
||||
Object[] emptySortedSetArray = sortedSet.toArray();
|
||||
|
||||
if ((emptySortedSetArray == null) || (emptySortedSetArray.length > 0)) {
|
||||
throwException("testToArray",
|
||||
"Returned null array or array with length > 0.");
|
||||
}
|
||||
|
||||
String[] strings = new String[2];
|
||||
strings[0] = "1";
|
||||
strings[1] = "2";
|
||||
emptySortedSetArray = sortedSet.toArray(strings);
|
||||
|
||||
if ((emptySortedSetArray == null) || (emptySortedSetArray[0] != null)) {
|
||||
throwException("testToArray",
|
||||
"Returned null array or array with length > 0.");
|
||||
}
|
||||
}
|
||||
}
|
111
jdk/test/javax/swing/JEditorPane/4492274/bug4492274.java
Normal file
111
jdk/test/javax/swing/JEditorPane/4492274/bug4492274.java
Normal file
@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 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.
|
||||
*
|
||||
* 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 4492274
|
||||
* @summary Tests if JEditorPane.getPage() correctly returns anchor reference.
|
||||
* @author Denis Sharypov
|
||||
*/
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.text.html.HTMLEditorKit;
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
|
||||
public class bug4492274 {
|
||||
|
||||
private static URL page;
|
||||
|
||||
private static JEditorPane jep;
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
createAndShowGUI();
|
||||
}
|
||||
});
|
||||
|
||||
toolkit.realSync();
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
page = new URL(page, "#linkname");
|
||||
jep.setPage(page);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
toolkit.realSync();
|
||||
|
||||
if (getPageAnchor() == null) {
|
||||
throw new RuntimeException("JEditorPane.getPage() returns null anchor reference");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static String getPageAnchor() throws Exception {
|
||||
final String[] result = new String[1];
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
result[0] = jep.getPage().getRef();
|
||||
}
|
||||
});
|
||||
|
||||
return result[0];
|
||||
}
|
||||
|
||||
private static void createAndShowGUI() {
|
||||
try {
|
||||
File file = new File(System.getProperty("test.src", "."), "test.html");
|
||||
page = file.toURI().toURL();
|
||||
|
||||
JFrame f = new JFrame();
|
||||
|
||||
jep = new JEditorPane();
|
||||
jep.setEditorKit(new HTMLEditorKit());
|
||||
jep.setEditable(false);
|
||||
jep.setPage(page);
|
||||
|
||||
JScrollPane sp = new JScrollPane(jep);
|
||||
|
||||
f.getContentPane().add(sp);
|
||||
f.setSize(500, 500);
|
||||
f.setVisible(true);
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
7
jdk/test/javax/swing/JEditorPane/4492274/test.html
Normal file
7
jdk/test/javax/swing/JEditorPane/4492274/test.html
Normal file
@ -0,0 +1,7 @@
|
||||
<html>
|
||||
<body>
|
||||
<a name="top">top</a>
|
||||
<img src=a.jpg width=500 height=1000>
|
||||
<a name="linkname">bottom</a>
|
||||
</body>
|
||||
</html>
|
172
jdk/test/javax/swing/JSlider/6348946/bug6348946.java
Normal file
172
jdk/test/javax/swing/JSlider/6348946/bug6348946.java
Normal file
@ -0,0 +1,172 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 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.
|
||||
*
|
||||
* 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 6348946
|
||||
* @summary Tests that JSlider's thumb moves in the right direction
|
||||
* when it is used as a JTable cell editor.
|
||||
* @author Mikhail Lapshin
|
||||
*/
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.InputEvent;
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.*;
|
||||
import javax.swing.table.*;
|
||||
|
||||
public class bug6348946 {
|
||||
|
||||
private static JFrame frame;
|
||||
|
||||
private static JPanel panel;
|
||||
|
||||
private static volatile boolean passed = false;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
String lf = "javax.swing.plaf.metal.MetalLookAndFeel";
|
||||
UIManager.setLookAndFeel(lf);
|
||||
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
|
||||
|
||||
try {
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
setupUI();
|
||||
}
|
||||
});
|
||||
toolkit.realSync();
|
||||
clickOnSlider();
|
||||
toolkit.realSync();
|
||||
checkResult();
|
||||
} finally {
|
||||
stopEDT();
|
||||
}
|
||||
}
|
||||
|
||||
private static void setupUI() {
|
||||
frame = new JFrame();
|
||||
|
||||
panel = new JPanel();
|
||||
panel.setLayout(new BorderLayout());
|
||||
panel.add(new ParameterTable(), BorderLayout.CENTER);
|
||||
frame.getContentPane().add(panel);
|
||||
|
||||
frame.pack();
|
||||
frame.setLocationRelativeTo(null);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
private static void clickOnSlider() throws Exception {
|
||||
Robot robot = new Robot();
|
||||
robot.setAutoDelay(10);
|
||||
|
||||
Rectangle rect = getPanelRectangle();
|
||||
|
||||
double clickX = rect.getX() + rect.getWidth() / 4;
|
||||
double clickY = rect.getY() + rect.getHeight() / 2;
|
||||
robot.mouseMove((int) clickX, (int) clickY);
|
||||
|
||||
robot.mousePress(InputEvent.BUTTON1_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_MASK);
|
||||
}
|
||||
|
||||
private static void checkResult(){
|
||||
if (passed) {
|
||||
System.out.println("Test passed");
|
||||
} else {
|
||||
throw new RuntimeException("The thumb moved " +
|
||||
"to the right instead of the left!");
|
||||
}
|
||||
}
|
||||
|
||||
private static void stopEDT() {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
frame.dispose();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static class ParameterTable extends JTable {
|
||||
public ParameterTable() {
|
||||
super(new Object[][]{{5}}, new String[]{"Value"});
|
||||
getColumnModel().getColumn(0).setCellRenderer(new Renderer());
|
||||
getColumnModel().getColumn(0).setCellEditor(new Editor());
|
||||
}
|
||||
}
|
||||
|
||||
private static class Renderer implements TableCellRenderer {
|
||||
private JSlider slider = new JSlider(0, 10);
|
||||
|
||||
public Component getTableCellRendererComponent(JTable table,
|
||||
Object value,
|
||||
boolean isSelected,
|
||||
boolean hasFocus,
|
||||
int row, int col) {
|
||||
int val = (Integer) value;
|
||||
slider.setValue(val);
|
||||
return slider;
|
||||
}
|
||||
}
|
||||
|
||||
private static class Editor extends AbstractCellEditor implements TableCellEditor {
|
||||
private JSlider slider = new JSlider(0, 10);
|
||||
|
||||
public Component getTableCellEditorComponent(JTable table, Object value,
|
||||
boolean isSelected,
|
||||
int row, int col) {
|
||||
int val = (Integer) value;
|
||||
slider.setValue(val);
|
||||
return slider;
|
||||
}
|
||||
|
||||
public Editor() {
|
||||
slider.addChangeListener(new ChangeListener() {
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
if (!slider.getValueIsAdjusting()) {
|
||||
passed = slider.getValue() <= 5;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public Object getCellEditorValue() {
|
||||
return slider.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
private static Rectangle getPanelRectangle() throws Exception{
|
||||
final Rectangle[] result = new Rectangle[1];
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
result[0] = new Rectangle(panel.getLocationOnScreen(), panel.getSize());
|
||||
}
|
||||
});
|
||||
|
||||
return result[0];
|
||||
}
|
||||
}
|
134
jdk/test/javax/swing/JTextArea/7049024/bug7049024.java
Normal file
134
jdk/test/javax/swing/JTextArea/7049024/bug7049024.java
Normal file
@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Copyright (c) 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.
|
||||
*
|
||||
* 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) 2011 IBM Corporation
|
||||
*/
|
||||
|
||||
/* @test
|
||||
* @bug 7049024
|
||||
* @summary DnD fails with JTextArea and JTextField
|
||||
* @author Sean Chou
|
||||
*/
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.text.DefaultCaret;
|
||||
import java.awt.*;
|
||||
import java.awt.datatransfer.Clipboard;
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
|
||||
public class bug7049024 {
|
||||
public static Clipboard clipboard = null;
|
||||
|
||||
public static JTextField textField = null;
|
||||
|
||||
// This button is used to move focus away from textField.
|
||||
public static JButton button = null;
|
||||
|
||||
public static JFrame frame = null;
|
||||
|
||||
public static DefaultCaret caret = null;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
frame = new JFrame("Test");
|
||||
textField = new JTextField("test selection for textfield");
|
||||
button = new JButton("To compete the focus");
|
||||
|
||||
frame.setLayout(new FlowLayout());
|
||||
frame.getContentPane().add(textField);
|
||||
frame.getContentPane().add(button);
|
||||
|
||||
frame.pack();
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
});
|
||||
toolkit.realSync();
|
||||
|
||||
clipboard = textField.getToolkit().getSystemSelection();
|
||||
if (null == clipboard) {
|
||||
return;
|
||||
}
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
textField.requestFocusInWindow();
|
||||
}
|
||||
});
|
||||
toolkit.realSync();
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
caret = (DefaultCaret) textField.getCaret();
|
||||
caret.setDot(2);
|
||||
caret.moveDot(4);
|
||||
}
|
||||
});
|
||||
toolkit.realSync();
|
||||
|
||||
String oldSelection = (String) clipboard.getData(DataFlavor.stringFlavor);
|
||||
System.out.println("oldSelection is " + oldSelection);
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
button.requestFocusInWindow();
|
||||
}
|
||||
});
|
||||
toolkit.realSync(); // So JTextField loses the focus.
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
caret.setDot(4);
|
||||
caret.moveDot(6);
|
||||
}
|
||||
});
|
||||
toolkit.realSync();
|
||||
|
||||
String newSelection = (String) clipboard.getData(DataFlavor.stringFlavor);
|
||||
System.out.println("newSelection is " + newSelection);
|
||||
|
||||
boolean passed = newSelection.equals(oldSelection);
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
frame.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
if (!passed) {
|
||||
throw new RuntimeException("The test for bug 7049024 failed");
|
||||
}
|
||||
}
|
||||
}
|
143
jdk/test/javax/swing/ToolTipManager/Test6256140.java
Normal file
143
jdk/test/javax/swing/ToolTipManager/Test6256140.java
Normal file
@ -0,0 +1,143 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 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.
|
||||
*
|
||||
* 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 6256140
|
||||
* @summary Esc key doesn't restore old value in JFormattedtextField when ToolTip is set
|
||||
* @author Alexander Potochkin
|
||||
* @run main Test6256140
|
||||
*/
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.KeyEvent;
|
||||
|
||||
public class Test6256140 {
|
||||
|
||||
private static volatile JFormattedTextField ft;
|
||||
|
||||
private final static String initialText = "value";
|
||||
private final static JLabel toolTipLabel = new JLabel("tip");
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
Robot robot = new Robot();
|
||||
robot.setAutoDelay(10);
|
||||
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
public void run() {
|
||||
createAndShowGUI();
|
||||
}
|
||||
});
|
||||
toolkit.realSync();
|
||||
|
||||
Point point = ft.getLocationOnScreen();
|
||||
robot.mouseMove(point.x, point.y);
|
||||
robot.mouseMove(point.x + 3, point.y + 3);
|
||||
|
||||
robot.keyPress(KeyEvent.VK_A);
|
||||
robot.keyRelease(KeyEvent.VK_A);
|
||||
toolkit.realSync();
|
||||
|
||||
if (!isTooltipShowning()) {
|
||||
throw new RuntimeException("Tooltip is not shown");
|
||||
}
|
||||
|
||||
robot.keyPress(KeyEvent.VK_ESCAPE);
|
||||
robot.keyRelease(KeyEvent.VK_ESCAPE);
|
||||
toolkit.realSync();
|
||||
|
||||
if (isTooltipShowning()) {
|
||||
throw new RuntimeException("Tooltip must be hidden now");
|
||||
}
|
||||
|
||||
if (isTextEqual()) {
|
||||
throw new RuntimeException("FormattedTextField must *not* cancel the updated value this time");
|
||||
}
|
||||
|
||||
robot.keyPress(KeyEvent.VK_ESCAPE);
|
||||
robot.keyRelease(KeyEvent.VK_ESCAPE);
|
||||
toolkit.realSync();
|
||||
|
||||
if (!isTextEqual()) {
|
||||
throw new RuntimeException("FormattedTextField must cancel the updated value");
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isTooltipShowning() throws Exception {
|
||||
final boolean[] result = new boolean[1];
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
result[0] = toolTipLabel.isShowing();
|
||||
}
|
||||
});
|
||||
|
||||
return result[0];
|
||||
}
|
||||
|
||||
private static boolean isTextEqual() throws Exception {
|
||||
final boolean[] result = new boolean[1];
|
||||
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
result[0] = initialText.equals(ft.getText());
|
||||
}
|
||||
});
|
||||
|
||||
return result[0];
|
||||
}
|
||||
|
||||
private static void createAndShowGUI() {
|
||||
ToolTipManager.sharedInstance().setDismissDelay(Integer.MAX_VALUE);
|
||||
ToolTipManager.sharedInstance().setInitialDelay(0);
|
||||
|
||||
final JFrame frame = new JFrame();
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
frame.setLayout(new FlowLayout());
|
||||
|
||||
ft = new JFormattedTextField() {
|
||||
|
||||
public JToolTip createToolTip() {
|
||||
JToolTip toolTip = super.createToolTip();
|
||||
toolTip.setLayout(new BorderLayout());
|
||||
toolTip.add(toolTipLabel);
|
||||
return toolTip;
|
||||
}
|
||||
};
|
||||
ft.setToolTipText(" ");
|
||||
ft.setValue(initialText);
|
||||
frame.add(ft);
|
||||
|
||||
frame.pack();
|
||||
frame.setLocationRelativeTo(null);
|
||||
frame.setVisible(true);
|
||||
ft.requestFocus();
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 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
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4635230 6283345 6303830 6824440 6867348
|
||||
* @bug 4635230 6283345 6303830 6824440 6867348 7094155
|
||||
* @summary Basic unit tests for generating XML Signatures with JSR 105
|
||||
* @compile -XDignore.symbol.file KeySelectors.java SignatureValidator.java
|
||||
* X509KeySelector.java GenerationTests.java
|
||||
@ -134,6 +134,7 @@ public class GenerationTests {
|
||||
test_create_signature_enveloping_sha512_rsa_sha384();
|
||||
test_create_signature_enveloping_sha512_rsa_sha512();
|
||||
test_create_signature_reference_dependency();
|
||||
test_create_signature_with_attr_in_no_namespace();
|
||||
}
|
||||
|
||||
private static void setup() throws Exception {
|
||||
@ -443,6 +444,52 @@ public class GenerationTests {
|
||||
|
||||
sig.sign(dsc);
|
||||
|
||||
// dumpDocument(doc, new PrintWriter(System.out));
|
||||
|
||||
DOMValidateContext dvc = new DOMValidateContext
|
||||
(kvks, doc.getDocumentElement());
|
||||
XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
|
||||
|
||||
if (sig.equals(sig2) == false) {
|
||||
throw new Exception
|
||||
("Unmarshalled signature is not equal to generated signature");
|
||||
}
|
||||
if (sig2.validate(dvc) == false) {
|
||||
throw new Exception("Validation of generated signature failed");
|
||||
}
|
||||
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
static void test_create_signature_with_attr_in_no_namespace()
|
||||
throws Exception
|
||||
{
|
||||
System.out.println
|
||||
("* Generating signature-with-attr-in-no-namespace.xml");
|
||||
|
||||
// create references
|
||||
List<Reference> refs = Collections.singletonList
|
||||
(fac.newReference("#unknown", sha1));
|
||||
|
||||
// create SignedInfo
|
||||
SignedInfo si = fac.newSignedInfo(withoutComments, rsaSha1, refs);
|
||||
|
||||
// create object-1
|
||||
Document doc = db.newDocument();
|
||||
Element nc = doc.createElementNS(null, "NonCommentandus");
|
||||
// add attribute with no namespace
|
||||
nc.setAttribute("Id", "unknown");
|
||||
XMLObject obj = fac.newXMLObject(Collections.singletonList
|
||||
(new DOMStructure(nc)), "object-1", null, null);
|
||||
|
||||
// create XMLSignature
|
||||
XMLSignature sig = fac.newXMLSignature(si, rsa,
|
||||
Collections.singletonList(obj),
|
||||
"signature", null);
|
||||
DOMSignContext dsc = new DOMSignContext(getPrivateKey("RSA"), doc);
|
||||
|
||||
sig.sign(dsc);
|
||||
|
||||
// dumpDocument(doc, new PrintWriter(System.out));
|
||||
|
||||
DOMValidateContext dvc = new DOMValidateContext
|
||||
|
@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
/* @test
|
||||
@bug 6636323 6636319 7040220
|
||||
@bug 6636323 6636319 7040220 7096080
|
||||
@summary Test if StringCoding and NIO result have the same de/encoding result
|
||||
* @run main/othervm/timeout=2000 TestStringCoding
|
||||
*/
|
||||
@ -111,7 +111,8 @@ public class TestStringCoding {
|
||||
//encode unmappable surrogates
|
||||
if (enc instanceof sun.nio.cs.ArrayEncoder &&
|
||||
cs.contains(Charset.forName("ASCII"))) {
|
||||
if (cs.name().equals("UTF-8")) // utf8 handles surrogates
|
||||
if (cs.name().equals("UTF-8") || // utf8 handles surrogates
|
||||
cs.name().equals("CESU-8")) // utf8 handles surrogates
|
||||
return;
|
||||
enc.replaceWith(new byte[] { (byte)'A'});
|
||||
sun.nio.cs.ArrayEncoder cae = (sun.nio.cs.ArrayEncoder)enc;
|
||||
@ -136,7 +137,6 @@ public class TestStringCoding {
|
||||
cs.name())))
|
||||
throw new RuntimeException("encode3(surrogates) failed -> "
|
||||
+ cs.name());
|
||||
|
||||
ba = new byte[str.length() - 1];
|
||||
n = cae.encode(str.toCharArray(), 0, str.length(), ba);
|
||||
if (n != 7 || !"abABABc".equals(new String(ba, 0, n,
|
||||
|
@ -33,14 +33,16 @@ import java.nio.charset.*;
|
||||
|
||||
public class TestStringCodingUTF8 {
|
||||
public static void main(String[] args) throws Throwable {
|
||||
test();
|
||||
test("UTF-8");
|
||||
test("CESU-8");
|
||||
// security manager on
|
||||
System.setSecurityManager(new PermissiveSecurityManger());
|
||||
test();
|
||||
test("UTF-8");
|
||||
test("CESU-8");
|
||||
}
|
||||
|
||||
static void test() throws Throwable {
|
||||
Charset cs = Charset.forName("UTF-8");
|
||||
static void test(String csn) throws Throwable {
|
||||
Charset cs = Charset.forName(csn);
|
||||
char[] bmp = new char[0x10000];
|
||||
for (int i = 0; i < 0x10000; i++) {
|
||||
bmp[i] = (char)i;
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 4486841 7040220
|
||||
* @bug 4486841 7040220 7096080
|
||||
* @summary Test UTF-8 charset
|
||||
*/
|
||||
|
||||
@ -156,15 +156,22 @@ public class TestUTF8 {
|
||||
return 3;
|
||||
}
|
||||
|
||||
static int to4ByteUTF8(int uc, byte[] bb, int pos) {
|
||||
bb[pos++] = (byte)(0xf0 | ((uc >> 18)));
|
||||
bb[pos++] = (byte)(0x80 | ((uc >> 12) & 0x3f));
|
||||
bb[pos++] = (byte)(0x80 | ((uc >> 6) & 0x3f));
|
||||
bb[pos++] = (byte)(0x80 | (uc & 0x3f));
|
||||
return 4;
|
||||
}
|
||||
|
||||
static void checkRoundtrip(String csn) throws Exception {
|
||||
System.out.printf(" Check roundtrip <%s>...", csn);
|
||||
char[] cc = getUTFChars();
|
||||
byte[] bb = encode(cc, csn, false);
|
||||
char[] ccO = decode(bb, csn, false);
|
||||
|
||||
if (!Arrays.equals(cc, ccO)) {
|
||||
if (!Arrays.equals(cc, ccO))
|
||||
System.out.printf(" non-direct failed");
|
||||
}
|
||||
bb = encode(cc, csn, true);
|
||||
ccO = decode(bb, csn, true);
|
||||
if (!Arrays.equals(cc, ccO)) {
|
||||
@ -180,6 +187,40 @@ public class TestUTF8 {
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
static void check4ByteSurrs(String csn) throws Exception {
|
||||
System.out.printf(" Check 4-byte Surrogates <%s>...%n", csn);
|
||||
byte[] bb = new byte[(0x110000 - 0x10000) * 4];
|
||||
char[] cc = new char[(0x110000 - 0x10000) * 2];
|
||||
int bpos = 0;
|
||||
int cpos = 0;
|
||||
for (int i = 0x10000; i < 0x110000; i++) {
|
||||
Character.toChars(i, cc, cpos);
|
||||
bpos += to4ByteUTF8(i, bb, bpos);
|
||||
cpos += 2;
|
||||
}
|
||||
checkSurrs(csn, bb, cc);
|
||||
}
|
||||
|
||||
|
||||
static void checkSurrs(String csn, byte[] bb, char[] cc)
|
||||
throws Exception
|
||||
{
|
||||
char[] ccO = decode(bb, csn, false);
|
||||
if (!Arrays.equals(cc, ccO)) {
|
||||
System.out.printf(" decoding failed%n");
|
||||
}
|
||||
ccO = decode(bb, csn, true);
|
||||
if (!Arrays.equals(cc, ccO)) {
|
||||
System.out.printf(" decoding(direct) failed%n");
|
||||
}
|
||||
if (!Arrays.equals(cc, new String(bb, csn).toCharArray())) {
|
||||
System.out.printf(" String.toCharArray() failed");
|
||||
}
|
||||
if (!Arrays.equals(bb, new String(cc).getBytes(csn))) {
|
||||
System.out.printf(" String.getBytes() failed");
|
||||
}
|
||||
}
|
||||
|
||||
static void check6ByteSurrs(String csn) throws Exception {
|
||||
System.out.printf(" Check 6-byte Surrogates <%s>...%n", csn);
|
||||
byte[] bb = new byte[(0x110000 - 0x10000) * 6];
|
||||
@ -192,23 +233,10 @@ public class TestUTF8 {
|
||||
bpos += to3ByteUTF8(cc[cpos + 1], bb, bpos);
|
||||
cpos += 2;
|
||||
}
|
||||
|
||||
char[] ccO = decode(bb, csn, false);
|
||||
if (!Arrays.equals(cc, ccO)) {
|
||||
System.out.printf(" decoding failed%n");
|
||||
}
|
||||
ccO = decode(bb, csn, true);
|
||||
if (!Arrays.equals(cc, ccO)) {
|
||||
System.out.printf(" decoding(direct) failed%n");
|
||||
}
|
||||
// new String(bb, csn).getBytes(csn) will not return
|
||||
// the 6 bytes surrogates as in bb, so only test
|
||||
// toCharArray() here.
|
||||
if (!Arrays.equals(cc, new String(bb, csn).toCharArray())) {
|
||||
System.out.printf(" String.toCharArray() failed");
|
||||
}
|
||||
checkSurrs(csn, bb, cc);
|
||||
}
|
||||
|
||||
|
||||
static void compare(String csn1, String csn2) throws Exception {
|
||||
System.out.printf(" Diff <%s> <%s>...%n", csn1, csn2);
|
||||
char[] cc = getUTFChars();
|
||||
@ -266,6 +294,10 @@ public class TestUTF8 {
|
||||
{1, (byte)0xFF, (byte)0xFF, (byte)0xFF }, // all ones
|
||||
{1, (byte)0xE0, (byte)0xC0, (byte)0x80 }, // invalid second byte
|
||||
{1, (byte)0xE0, (byte)0x80, (byte)0xC0 }, // invalid first byte
|
||||
{1, (byte)0xE0, (byte)0x41,}, // invalid second byte & 2 bytes
|
||||
{3, (byte)0xED, (byte)0xAE, (byte)0x80 }, // 3 bytes surrogate
|
||||
{3, (byte)0xED, (byte)0xB0, (byte)0x80 }, // 3 bytes surrogate
|
||||
|
||||
|
||||
// Four-byte sequences
|
||||
{1, (byte)0xF0, (byte)0x80, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded
|
||||
@ -276,8 +308,13 @@ public class TestUTF8 {
|
||||
{1, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF }, // all ones
|
||||
{1, (byte)0xF0, (byte)0x80, (byte)0x80, (byte)0x80}, // invalid second byte
|
||||
{1, (byte)0xF0, (byte)0xC0, (byte)0x80, (byte)0x80 }, // invalid second byte
|
||||
{1, (byte)0xF0, (byte)41 }, // invalid second byte
|
||||
// & only 2 bytes
|
||||
|
||||
{2, (byte)0xF0, (byte)0x90, (byte)0xC0, (byte)0x80 }, // invalid third byte
|
||||
{3, (byte)0xF0, (byte)0x90, (byte)0x80, (byte)0xC0 }, // invalid third byte
|
||||
{3, (byte)0xF0, (byte)0x90, (byte)0x80, (byte)0xC0 }, // invalid forth byte
|
||||
{2, (byte)0xF0, (byte)0x90, (byte)0x41 }, // invalid third byte
|
||||
// & 3 bytes input
|
||||
|
||||
{1, (byte)0xF1, (byte)0xC0, (byte)0x80, (byte)0x80 }, // invalid second byte
|
||||
{2, (byte)0xF1, (byte)0x80, (byte)0xC0, (byte)0x80 }, // invalid third byte
|
||||
@ -287,30 +324,113 @@ public class TestUTF8 {
|
||||
{1, (byte)0xF5, (byte)0x80, (byte)0x80, (byte)0xC0 }, // out-range 4-byte
|
||||
|
||||
// Five-byte sequences
|
||||
{5, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80}, // invalid first byte
|
||||
{5, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded
|
||||
{5, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x81, (byte)0xBF }, // U+007F zero-padded
|
||||
{5, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xBF }, // U+07FF zero-padded
|
||||
{5, (byte)0xF8, (byte)0x80, (byte)0x8F, (byte)0xBF, (byte)0xBF }, // U+FFFF zero-padded
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80}, // invalid first byte
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x81, (byte)0xBF }, // U+007F zero-padded
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xBF }, // U+07FF zero-padded
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x8F, (byte)0xBF, (byte)0xBF }, // U+FFFF zero-padded
|
||||
|
||||
{1, (byte)0xF8, (byte)0xC0, (byte)0x80, (byte)0x80, (byte)0x80},
|
||||
{2, (byte)0xF8, (byte)0x80, (byte)0xC0, (byte)0x80, (byte)0x80 },
|
||||
{3, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0xC1, (byte)0xBF },
|
||||
{4, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xC0 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0xC0, (byte)0x80, (byte)0x80 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0xC1, (byte)0xBF },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xC0 },
|
||||
|
||||
// Six-byte sequences
|
||||
{6, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded
|
||||
{6, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x81, (byte)0xBF }, // U+007F zero-padded
|
||||
{6, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xBF }, // U+07FF zero-padded
|
||||
{6, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x8F, (byte)0xBF, (byte)0xBF }, // U+FFFF zero-padded
|
||||
{1, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded
|
||||
{1, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x81, (byte)0xBF }, // U+007F zero-padded
|
||||
{1, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xBF }, // U+07FF zero-padded
|
||||
{1, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x8F, (byte)0xBF, (byte)0xBF }, // U+FFFF zero-padded
|
||||
{1, (byte)0xF8, (byte)0xC0, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80 },
|
||||
{2, (byte)0xF8, (byte)0x80, (byte)0xC0, (byte)0x80, (byte)0x80, (byte)0x80 },
|
||||
{3, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0xC1, (byte)0xBF, (byte)0x80 },
|
||||
{4, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xC0, (byte)0x80 },
|
||||
{5, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0x80, (byte)0xC0 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0xC0, (byte)0x80, (byte)0x80, (byte)0x80 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0xC1, (byte)0xBF, (byte)0x80 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xC0, (byte)0x80 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0x80, (byte)0xC0 },
|
||||
};
|
||||
|
||||
static void checkMalformed(String csn) throws Exception {
|
||||
// The first byte is the length of malformed bytes
|
||||
static byte[][] malformed_cesu8 = {
|
||||
// One-byte sequences:
|
||||
{1, (byte)0xFF },
|
||||
{1, (byte)0xC0 },
|
||||
{1, (byte)0x80 },
|
||||
|
||||
{1, (byte)0xFF, (byte)0xFF}, // all ones
|
||||
{1, (byte)0xA0, (byte)0x80}, // 101x first byte first nibble
|
||||
|
||||
// Two-byte sequences:
|
||||
{1, (byte)0xC0, (byte)0x80}, // invalid first byte
|
||||
{1, (byte)0xC1, (byte)0xBF}, // invalid first byte
|
||||
{1, (byte)0xC2, (byte)0x00}, // invalid second byte
|
||||
{1, (byte)0xC2, (byte)0xC0}, // invalid second byte
|
||||
{1, (byte)0xD0, (byte)0x00}, // invalid second byte
|
||||
{1, (byte)0xD0, (byte)0xC0}, // invalid second byte
|
||||
{1, (byte)0xDF, (byte)0x00}, // invalid second byte
|
||||
{1, (byte)0xDF, (byte)0xC0}, // invalid second byte
|
||||
|
||||
// Three-byte sequences
|
||||
{1, (byte)0xE0, (byte)0x80, (byte)0x80}, // 111x first byte first nibble
|
||||
{1, (byte)0xE0, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded
|
||||
{1, (byte)0xE0, (byte)0x81, (byte)0xBF }, // U+007F zero-padded
|
||||
{1, (byte)0xE0, (byte)0x9F, (byte)0xBF }, // U+07FF zero-padded
|
||||
|
||||
{1, (byte)0xE0, (byte)0xC0, (byte)0xBF }, // invalid second byte
|
||||
{2, (byte)0xE0, (byte)0xA0, (byte)0x7F }, // invalid third byte
|
||||
{2, (byte)0xE0, (byte)0xA0, (byte)0xC0 }, // invalid third byte
|
||||
{1, (byte)0xFF, (byte)0xFF, (byte)0xFF }, // all ones
|
||||
{1, (byte)0xE0, (byte)0xC0, (byte)0x80 }, // invalid second byte
|
||||
{1, (byte)0xE0, (byte)0x80, (byte)0xC0 }, // invalid first byte
|
||||
{1, (byte)0xE0, (byte)0x41,}, // invalid second byte & 2 bytes
|
||||
|
||||
// CESU-8 does not have 4, 5, 6 bytes sequenc
|
||||
// Four-byte sequences
|
||||
{1, (byte)0xF0, (byte)0x80, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded
|
||||
{1, (byte)0xF0, (byte)0x80, (byte)0x81, (byte)0xBF }, // U+007F zero-padded
|
||||
{1, (byte)0xF0, (byte)0x80, (byte)0x9F, (byte)0xBF }, // U+007F zero-padded
|
||||
{1, (byte)0xF0, (byte)0x8F, (byte)0xBF, (byte)0xBF }, // U+07FF zero-padded
|
||||
|
||||
{1, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF }, // all ones
|
||||
{1, (byte)0xF0, (byte)0x80, (byte)0x80, (byte)0x80}, // invalid second byte
|
||||
{1, (byte)0xF0, (byte)0xC0, (byte)0x80, (byte)0x80 }, // invalid second byte
|
||||
{1, (byte)0xF0, (byte)41 }, // invalid second byte
|
||||
// & only 2 bytes
|
||||
{1, (byte)0xF0, (byte)0x90, (byte)0xC0, (byte)0x80 }, // invalid third byte
|
||||
{1, (byte)0xF0, (byte)0x90, (byte)0x80, (byte)0xC0 }, // invalid forth byte
|
||||
{1, (byte)0xF0, (byte)0x90, (byte)0x41 }, // invalid third byte
|
||||
// & 3 bytes input
|
||||
|
||||
{1, (byte)0xF1, (byte)0xC0, (byte)0x80, (byte)0x80 }, // invalid second byte
|
||||
{1, (byte)0xF1, (byte)0x80, (byte)0xC0, (byte)0x80 }, // invalid third byte
|
||||
{1, (byte)0xF1, (byte)0x80, (byte)0x80, (byte)0xC0 }, // invalid forth byte
|
||||
{1, (byte)0xF4, (byte)0x90, (byte)0x80, (byte)0xC0 }, // out-range 4-byte
|
||||
{1, (byte)0xF4, (byte)0xC0, (byte)0x80, (byte)0xC0 }, // out-range 4-byte
|
||||
{1, (byte)0xF5, (byte)0x80, (byte)0x80, (byte)0xC0 }, // out-range 4-byte
|
||||
|
||||
// Five-byte sequences
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80}, // invalid first byte
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x81, (byte)0xBF }, // U+007F zero-padded
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xBF }, // U+07FF zero-padded
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x8F, (byte)0xBF, (byte)0xBF }, // U+FFFF zero-padded
|
||||
|
||||
{1, (byte)0xF8, (byte)0xC0, (byte)0x80, (byte)0x80, (byte)0x80},
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0xC0, (byte)0x80, (byte)0x80 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0xC1, (byte)0xBF },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xC0 },
|
||||
|
||||
// Six-byte sequences
|
||||
{1, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded
|
||||
{1, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x81, (byte)0xBF }, // U+007F zero-padded
|
||||
{1, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xBF }, // U+07FF zero-padded
|
||||
{1, (byte)0xFC, (byte)0x80, (byte)0x80, (byte)0x8F, (byte)0xBF, (byte)0xBF }, // U+FFFF zero-padded
|
||||
{1, (byte)0xF8, (byte)0xC0, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0xC0, (byte)0x80, (byte)0x80, (byte)0x80 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0xC1, (byte)0xBF, (byte)0x80 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0xC0, (byte)0x80 },
|
||||
{1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x9F, (byte)0x80, (byte)0xC0 },
|
||||
};
|
||||
|
||||
|
||||
static void checkMalformed(String csn, byte[][] malformed) throws Exception {
|
||||
boolean failed = false;
|
||||
System.out.printf(" Check malformed <%s>...%n", csn);
|
||||
Charset cs = Charset.forName(csn);
|
||||
@ -430,9 +550,12 @@ public class TestUTF8 {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
checkRoundtrip("UTF-8");
|
||||
check6ByteSurrs("UTF-8");
|
||||
//compare("UTF-8", "UTF-8-OLD");
|
||||
checkMalformed("UTF-8");
|
||||
check4ByteSurrs("UTF-8");
|
||||
checkMalformed("UTF-8", malformed);
|
||||
checkUnderOverflow("UTF-8");
|
||||
|
||||
checkRoundtrip("CESU-8");
|
||||
check6ByteSurrs("CESU-8");
|
||||
checkMalformed("CESU-8", malformed_cesu8);
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,6 @@
|
||||
*/
|
||||
import java.security.*;
|
||||
import java.lang.reflect.*;
|
||||
import sun.security.pkcs11.*;
|
||||
|
||||
public class Absolute {
|
||||
|
||||
|
@ -394,52 +394,47 @@ public class CipherTest {
|
||||
|
||||
public static void main(PeerFactory peerFactory, KeyStore keyStore,
|
||||
String[] args) throws Exception {
|
||||
SSLContext reservedSSLContext = SSLContext.getDefault();
|
||||
try {
|
||||
long time = System.currentTimeMillis();
|
||||
String relPath;
|
||||
if ((args != null) && (args.length > 0) && args[0].equals("sh")) {
|
||||
relPath = pathToStoresSH;
|
||||
} else {
|
||||
relPath = pathToStores;
|
||||
}
|
||||
PATH = new File(System.getProperty("test.src", "."), relPath);
|
||||
CipherTest.peerFactory = peerFactory;
|
||||
System.out.print(
|
||||
"Initializing test '" + peerFactory.getName() + "'...");
|
||||
// secureRandom = new SecureRandom();
|
||||
// secureRandom.nextInt();
|
||||
// trustStore = readKeyStore(trustStoreFile);
|
||||
CipherTest.keyStore = keyStore;
|
||||
// keyStore = readKeyStore(keyStoreFile);
|
||||
KeyManagerFactory keyFactory =
|
||||
KeyManagerFactory.getInstance(
|
||||
KeyManagerFactory.getDefaultAlgorithm());
|
||||
keyFactory.init(keyStore, "test12".toCharArray());
|
||||
keyManager = (X509ExtendedKeyManager)keyFactory.getKeyManagers()[0];
|
||||
|
||||
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
||||
tmf.init(keyStore);
|
||||
trustManager = (X509TrustManager)tmf.getTrustManagers()[0];
|
||||
|
||||
// trustManager = new AlwaysTrustManager();
|
||||
SSLContext context = SSLContext.getInstance("TLS");
|
||||
context.init(new KeyManager[] {keyManager},
|
||||
new TrustManager[] {trustManager}, null);
|
||||
SSLContext.setDefault(context);
|
||||
|
||||
CipherTest cipherTest = new CipherTest(peerFactory);
|
||||
Thread serverThread = new Thread(peerFactory.newServer(cipherTest),
|
||||
"Server");
|
||||
serverThread.setDaemon(true);
|
||||
serverThread.start();
|
||||
System.out.println("Done");
|
||||
cipherTest.run();
|
||||
time = System.currentTimeMillis() - time;
|
||||
System.out.println("Done. (" + time + " ms)");
|
||||
} finally {
|
||||
SSLContext.setDefault(reservedSSLContext);
|
||||
long time = System.currentTimeMillis();
|
||||
String relPath;
|
||||
if ((args != null) && (args.length > 0) && args[0].equals("sh")) {
|
||||
relPath = pathToStoresSH;
|
||||
} else {
|
||||
relPath = pathToStores;
|
||||
}
|
||||
PATH = new File(System.getProperty("test.src", "."), relPath);
|
||||
CipherTest.peerFactory = peerFactory;
|
||||
System.out.print(
|
||||
"Initializing test '" + peerFactory.getName() + "'...");
|
||||
// secureRandom = new SecureRandom();
|
||||
// secureRandom.nextInt();
|
||||
// trustStore = readKeyStore(trustStoreFile);
|
||||
CipherTest.keyStore = keyStore;
|
||||
// keyStore = readKeyStore(keyStoreFile);
|
||||
KeyManagerFactory keyFactory =
|
||||
KeyManagerFactory.getInstance(
|
||||
KeyManagerFactory.getDefaultAlgorithm());
|
||||
keyFactory.init(keyStore, "test12".toCharArray());
|
||||
keyManager = (X509ExtendedKeyManager)keyFactory.getKeyManagers()[0];
|
||||
|
||||
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
||||
tmf.init(keyStore);
|
||||
trustManager = (X509TrustManager)tmf.getTrustManagers()[0];
|
||||
|
||||
// trustManager = new AlwaysTrustManager();
|
||||
SSLContext context = SSLContext.getInstance("TLS");
|
||||
context.init(new KeyManager[] {keyManager},
|
||||
new TrustManager[] {trustManager}, null);
|
||||
SSLContext.setDefault(context);
|
||||
|
||||
CipherTest cipherTest = new CipherTest(peerFactory);
|
||||
Thread serverThread = new Thread(peerFactory.newServer(cipherTest),
|
||||
"Server");
|
||||
serverThread.setDaemon(true);
|
||||
serverThread.start();
|
||||
System.out.println("Done");
|
||||
cipherTest.run();
|
||||
time = System.currentTimeMillis() - time;
|
||||
System.out.println("Done. (" + time + " ms)");
|
||||
}
|
||||
|
||||
static abstract class PeerFactory {
|
||||
|
@ -26,9 +26,9 @@
|
||||
* @bug 6313675 6323647
|
||||
* @summary Verify that all ciphersuites work in FIPS mode
|
||||
* @library ..
|
||||
* @run main/othervm ClientJSSEServerJSSE
|
||||
* @ignore JSSE supported cipher suites are changed with CR 6916074,
|
||||
* need to update this test case in JDK 7 soon
|
||||
* @run main/othervm ClientJSSEServerJSSE
|
||||
* @author Andreas Sterbenz
|
||||
*/
|
||||
|
||||
|
@ -1,10 +1,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @build TestThread Traffic Handler ServerHandler ServerThread ClientThread
|
||||
* @run main/othervm/timeout=140 main
|
||||
*
|
||||
* SunJSSE does not support dynamic system properties, no way to re-use
|
||||
* system properties in samevm/agentvm mode.
|
||||
* @run main/othervm/timeout=140 -Djsse.enableCBCProtection=false main
|
||||
* @summary Make sure that different configurations of SSL sockets work
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 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
|
||||
@ -29,6 +29,8 @@
|
||||
* This is a simple hack to test a bunch of conditions and check
|
||||
* their return codes.
|
||||
*
|
||||
* @run main/othervm -Djsse.enableCBCProtection=false CheckStatus
|
||||
*
|
||||
* @author Brad Wetmore
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 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
|
||||
@ -30,6 +30,8 @@
|
||||
* This is to test larger buffer arrays, and make sure the maximum
|
||||
* is being passed.
|
||||
*
|
||||
* @run main/othervm -Djsse.enableCBCProtection=false LargeBufs
|
||||
*
|
||||
* @author Brad R. Wetmore
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 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
|
||||
@ -27,10 +27,7 @@
|
||||
* @bug 6388456
|
||||
* @summary Need adjustable TLS max record size for interoperability
|
||||
* with non-compliant
|
||||
* @run main/othervm LargePacket
|
||||
*
|
||||
* SunJSSE does not support dynamic system properties, no way to re-use
|
||||
* system properties in samevm/agentvm mode.
|
||||
* @run main/othervm -Djsse.enableCBCProtection=false LargePacket
|
||||
*
|
||||
* @author Xuelei Fan
|
||||
*/
|
||||
|
@ -0,0 +1,479 @@
|
||||
/*
|
||||
* Copyright (c) 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.
|
||||
*
|
||||
* 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 7105780
|
||||
* @summary Add SSLSocket client/SSLEngine server to templates directory.
|
||||
*
|
||||
* SunJSSE does not support dynamic system properties, no way to re-use
|
||||
* system properties in samevm/agentvm mode.
|
||||
*
|
||||
* @run main/othervm SSLSocketSSLEngineTemplate
|
||||
*/
|
||||
|
||||
/**
|
||||
* A SSLSocket/SSLEngine interop test case. This is not the way to
|
||||
* code SSLEngine-based servers, but works for what we need to do here,
|
||||
* which is to make sure that SSLEngine/SSLSockets can talk to each other.
|
||||
* SSLEngines can use direct or indirect buffers, and different code
|
||||
* is used to get at the buffer contents internally, so we test that here.
|
||||
*
|
||||
* The test creates one SSLSocket (client) and one SSLEngine (server).
|
||||
* The SSLSocket talks to a raw ServerSocket, and the server code
|
||||
* does the translation between byte [] and ByteBuffers that the SSLEngine
|
||||
* can use. The "transport" layer consists of a Socket Input/OutputStream
|
||||
* and two byte buffers for the SSLEngines: think of them
|
||||
* as directly connected pipes.
|
||||
*
|
||||
* Again, this is a *very* simple example: real code will be much more
|
||||
* involved. For example, different threading and I/O models could be
|
||||
* used, transport mechanisms could close unexpectedly, and so on.
|
||||
*
|
||||
* When this application runs, notice that several messages
|
||||
* (wrap/unwrap) pass before any application data is consumed or
|
||||
* produced. (For more information, please see the SSL/TLS
|
||||
* specifications.) There may several steps for a successful handshake,
|
||||
* so it's typical to see the following series of operations:
|
||||
*
|
||||
* client server message
|
||||
* ====== ====== =======
|
||||
* write() ... ClientHello
|
||||
* ... unwrap() ClientHello
|
||||
* ... wrap() ServerHello/Certificate
|
||||
* read() ... ServerHello/Certificate
|
||||
* write() ... ClientKeyExchange
|
||||
* write() ... ChangeCipherSpec
|
||||
* write() ... Finished
|
||||
* ... unwrap() ClientKeyExchange
|
||||
* ... unwrap() ChangeCipherSpec
|
||||
* ... unwrap() Finished
|
||||
* ... wrap() ChangeCipherSpec
|
||||
* ... wrap() Finished
|
||||
* read() ... ChangeCipherSpec
|
||||
* read() ... Finished
|
||||
*/
|
||||
import javax.net.ssl.*;
|
||||
import javax.net.ssl.SSLEngineResult.*;
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.security.*;
|
||||
import java.nio.*;
|
||||
|
||||
public class SSLSocketSSLEngineTemplate {
|
||||
|
||||
/*
|
||||
* Enables logging of the SSL/TLS operations.
|
||||
*/
|
||||
private static boolean logging = true;
|
||||
|
||||
/*
|
||||
* Enables the JSSE system debugging system property:
|
||||
*
|
||||
* -Djavax.net.debug=all
|
||||
*
|
||||
* This gives a lot of low-level information about operations underway,
|
||||
* including specific handshake messages, and might be best examined
|
||||
* after gaining some familiarity with this application.
|
||||
*/
|
||||
private static boolean debug = false;
|
||||
private SSLContext sslc;
|
||||
private SSLEngine serverEngine; // server-side SSLEngine
|
||||
private SSLSocket sslSocket; // client-side socket
|
||||
private ServerSocket serverSocket; // server-side Socket, generates the...
|
||||
private Socket socket; // server-side socket that will read
|
||||
|
||||
private final byte[] serverMsg =
|
||||
"Hi there Client, I'm a Server.".getBytes();
|
||||
private final byte[] clientMsg =
|
||||
"Hello Server, I'm a Client! Pleased to meet you!".getBytes();
|
||||
|
||||
private ByteBuffer serverOut; // write side of serverEngine
|
||||
private ByteBuffer serverIn; // read side of serverEngine
|
||||
|
||||
private volatile Exception clientException;
|
||||
private volatile Exception serverException;
|
||||
|
||||
/*
|
||||
* For data transport, this example uses local ByteBuffers.
|
||||
*/
|
||||
private ByteBuffer cTOs; // "reliable" transport client->server
|
||||
private ByteBuffer sTOc; // "reliable" transport server->client
|
||||
|
||||
/*
|
||||
* The following is to set up the keystores/trust material.
|
||||
*/
|
||||
private static final String pathToStores = "../etc/";
|
||||
private static final String keyStoreFile = "keystore";
|
||||
private static final String trustStoreFile = "truststore";
|
||||
private static final String passwd = "passphrase";
|
||||
private static String keyFilename =
|
||||
System.getProperty("test.src", ".") + "/" + pathToStores
|
||||
+ "/" + keyStoreFile;
|
||||
private static String trustFilename =
|
||||
System.getProperty("test.src", ".") + "/" + pathToStores
|
||||
+ "/" + trustStoreFile;
|
||||
|
||||
/*
|
||||
* Main entry point for this test.
|
||||
*/
|
||||
public static void main(String args[]) throws Exception {
|
||||
if (debug) {
|
||||
System.setProperty("javax.net.debug", "all");
|
||||
}
|
||||
|
||||
String [] protocols = new String [] {
|
||||
"SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2" };
|
||||
|
||||
for (String protocol : protocols) {
|
||||
log("Testing " + protocol);
|
||||
/*
|
||||
* Run the tests with direct and indirect buffers.
|
||||
*/
|
||||
SSLSocketSSLEngineTemplate test =
|
||||
new SSLSocketSSLEngineTemplate(protocol);
|
||||
test.runTest(true);
|
||||
test.runTest(false);
|
||||
}
|
||||
|
||||
System.out.println("Test Passed.");
|
||||
}
|
||||
|
||||
/*
|
||||
* Create an initialized SSLContext to use for these tests.
|
||||
*/
|
||||
public SSLSocketSSLEngineTemplate(String protocol) throws Exception {
|
||||
|
||||
KeyStore ks = KeyStore.getInstance("JKS");
|
||||
KeyStore ts = KeyStore.getInstance("JKS");
|
||||
|
||||
char[] passphrase = "passphrase".toCharArray();
|
||||
|
||||
ks.load(new FileInputStream(keyFilename), passphrase);
|
||||
ts.load(new FileInputStream(trustFilename), passphrase);
|
||||
|
||||
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
|
||||
kmf.init(ks, passphrase);
|
||||
|
||||
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
|
||||
tmf.init(ts);
|
||||
|
||||
SSLContext sslCtx = SSLContext.getInstance(protocol);
|
||||
|
||||
sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
|
||||
|
||||
sslc = sslCtx;
|
||||
}
|
||||
|
||||
/*
|
||||
* Run the test.
|
||||
*
|
||||
* Sit in a tight loop, with the server engine calling wrap/unwrap
|
||||
* regardless of whether data is available or not. We do this until
|
||||
* we get the application data. Then we shutdown and go to the next one.
|
||||
*
|
||||
* The main loop handles all of the I/O phases of the SSLEngine's
|
||||
* lifetime:
|
||||
*
|
||||
* initial handshaking
|
||||
* application data transfer
|
||||
* engine closing
|
||||
*
|
||||
* One could easily separate these phases into separate
|
||||
* sections of code.
|
||||
*/
|
||||
private void runTest(boolean direct) throws Exception {
|
||||
boolean serverClose = direct;
|
||||
|
||||
serverSocket = new ServerSocket(0);
|
||||
int port = serverSocket.getLocalPort();
|
||||
Thread thread = createClientThread(port, serverClose);
|
||||
|
||||
socket = serverSocket.accept();
|
||||
socket.setSoTimeout(500);
|
||||
serverSocket.close();
|
||||
|
||||
createSSLEngine();
|
||||
createBuffers(direct);
|
||||
|
||||
try {
|
||||
boolean closed = false;
|
||||
|
||||
InputStream is = socket.getInputStream();
|
||||
OutputStream os = socket.getOutputStream();
|
||||
|
||||
SSLEngineResult serverResult; // results from last operation
|
||||
|
||||
/*
|
||||
* Examining the SSLEngineResults could be much more involved,
|
||||
* and may alter the overall flow of the application.
|
||||
*
|
||||
* For example, if we received a BUFFER_OVERFLOW when trying
|
||||
* to write to the output pipe, we could reallocate a larger
|
||||
* pipe, but instead we wait for the peer to drain it.
|
||||
*/
|
||||
byte[] inbound = new byte[8192];
|
||||
byte[] outbound = new byte[8192];
|
||||
|
||||
while (!isEngineClosed(serverEngine)) {
|
||||
int len = 0;
|
||||
|
||||
// Inbound data
|
||||
log("================");
|
||||
|
||||
// Read from the Client side.
|
||||
try {
|
||||
len = is.read(inbound);
|
||||
if (len == -1) {
|
||||
throw new Exception("Unexpected EOF");
|
||||
}
|
||||
cTOs.put(inbound, 0, len);
|
||||
} catch (SocketTimeoutException ste) {
|
||||
// swallow. Nothing yet, probably waiting on us.
|
||||
}
|
||||
|
||||
cTOs.flip();
|
||||
|
||||
serverResult = serverEngine.unwrap(cTOs, serverIn);
|
||||
log("server unwrap: ", serverResult);
|
||||
runDelegatedTasks(serverResult, serverEngine);
|
||||
cTOs.compact();
|
||||
|
||||
// Outbound data
|
||||
log("----");
|
||||
|
||||
serverResult = serverEngine.wrap(serverOut, sTOc);
|
||||
log("server wrap: ", serverResult);
|
||||
runDelegatedTasks(serverResult, serverEngine);
|
||||
|
||||
sTOc.flip();
|
||||
|
||||
if ((len = sTOc.remaining()) != 0) {
|
||||
sTOc.get(outbound, 0, len);
|
||||
os.write(outbound, 0, len);
|
||||
// Give the other side a chance to process
|
||||
}
|
||||
|
||||
sTOc.compact();
|
||||
|
||||
if (!closed && (serverOut.remaining() == 0)) {
|
||||
closed = true;
|
||||
|
||||
/*
|
||||
* We'll alternate initiatating the shutdown.
|
||||
* When the server initiates, it will take one more
|
||||
* loop, but tests the orderly shutdown.
|
||||
*/
|
||||
if (serverClose) {
|
||||
serverEngine.closeOutbound();
|
||||
}
|
||||
serverIn.flip();
|
||||
|
||||
/*
|
||||
* A sanity check to ensure we got what was sent.
|
||||
*/
|
||||
if (serverIn.remaining() != clientMsg.length) {
|
||||
throw new Exception("Client: Data length error");
|
||||
}
|
||||
|
||||
for (int i = 0; i < clientMsg.length; i++) {
|
||||
if (clientMsg[i] != serverIn.get()) {
|
||||
throw new Exception("Client: Data content error");
|
||||
}
|
||||
}
|
||||
serverIn.compact();
|
||||
}
|
||||
}
|
||||
return;
|
||||
} catch (Exception e) {
|
||||
serverException = e;
|
||||
} finally {
|
||||
socket.close();
|
||||
|
||||
// Wait for the client to join up with us.
|
||||
thread.join();
|
||||
if (serverException != null) {
|
||||
throw serverException;
|
||||
}
|
||||
if (clientException != null) {
|
||||
throw clientException;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a client thread which does simple SSLSocket operations.
|
||||
* We'll write and read one data packet.
|
||||
*/
|
||||
private Thread createClientThread(final int port,
|
||||
final boolean serverClose) throws Exception {
|
||||
|
||||
Thread t = new Thread("ClientThread") {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Thread.sleep(1000); // Give server time to finish setup.
|
||||
|
||||
sslSocket = (SSLSocket) sslc.getSocketFactory().
|
||||
createSocket("localhost", port);
|
||||
OutputStream os = sslSocket.getOutputStream();
|
||||
InputStream is = sslSocket.getInputStream();
|
||||
|
||||
// write(byte[]) goes in one shot.
|
||||
os.write(clientMsg);
|
||||
|
||||
byte[] inbound = new byte[2048];
|
||||
int pos = 0;
|
||||
|
||||
int len;
|
||||
done:
|
||||
while ((len = is.read(inbound, pos, 2048 - pos)) != -1) {
|
||||
pos += len;
|
||||
// Let the client do the closing.
|
||||
if ((pos == serverMsg.length) && !serverClose) {
|
||||
sslSocket.close();
|
||||
break done;
|
||||
}
|
||||
}
|
||||
|
||||
if (pos != serverMsg.length) {
|
||||
throw new Exception("Client: Data length error");
|
||||
}
|
||||
|
||||
for (int i = 0; i < serverMsg.length; i++) {
|
||||
if (inbound[i] != serverMsg[i]) {
|
||||
throw new Exception("Client: Data content error");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
clientException = e;
|
||||
}
|
||||
}
|
||||
};
|
||||
t.start();
|
||||
return t;
|
||||
}
|
||||
|
||||
/*
|
||||
* Using the SSLContext created during object creation,
|
||||
* create/configure the SSLEngines we'll use for this test.
|
||||
*/
|
||||
private void createSSLEngine() throws Exception {
|
||||
/*
|
||||
* Configure the serverEngine to act as a server in the SSL/TLS
|
||||
* handshake.
|
||||
*/
|
||||
serverEngine = sslc.createSSLEngine();
|
||||
serverEngine.setUseClientMode(false);
|
||||
serverEngine.getNeedClientAuth();
|
||||
}
|
||||
|
||||
/*
|
||||
* Create and size the buffers appropriately.
|
||||
*/
|
||||
private void createBuffers(boolean direct) {
|
||||
|
||||
SSLSession session = serverEngine.getSession();
|
||||
int appBufferMax = session.getApplicationBufferSize();
|
||||
int netBufferMax = session.getPacketBufferSize();
|
||||
|
||||
/*
|
||||
* We'll make the input buffers a bit bigger than the max needed
|
||||
* size, so that unwrap()s following a successful data transfer
|
||||
* won't generate BUFFER_OVERFLOWS.
|
||||
*
|
||||
* We'll use a mix of direct and indirect ByteBuffers for
|
||||
* tutorial purposes only. In reality, only use direct
|
||||
* ByteBuffers when they give a clear performance enhancement.
|
||||
*/
|
||||
if (direct) {
|
||||
serverIn = ByteBuffer.allocateDirect(appBufferMax + 50);
|
||||
cTOs = ByteBuffer.allocateDirect(netBufferMax);
|
||||
sTOc = ByteBuffer.allocateDirect(netBufferMax);
|
||||
} else {
|
||||
serverIn = ByteBuffer.allocate(appBufferMax + 50);
|
||||
cTOs = ByteBuffer.allocate(netBufferMax);
|
||||
sTOc = ByteBuffer.allocate(netBufferMax);
|
||||
}
|
||||
|
||||
serverOut = ByteBuffer.wrap(serverMsg);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the result indicates that we have outstanding tasks to do,
|
||||
* go ahead and run them in this thread.
|
||||
*/
|
||||
private static void runDelegatedTasks(SSLEngineResult result,
|
||||
SSLEngine engine) throws Exception {
|
||||
|
||||
if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
|
||||
Runnable runnable;
|
||||
while ((runnable = engine.getDelegatedTask()) != null) {
|
||||
log("\trunning delegated task...");
|
||||
runnable.run();
|
||||
}
|
||||
HandshakeStatus hsStatus = engine.getHandshakeStatus();
|
||||
if (hsStatus == HandshakeStatus.NEED_TASK) {
|
||||
throw new Exception(
|
||||
"handshake shouldn't need additional tasks");
|
||||
}
|
||||
log("\tnew HandshakeStatus: " + hsStatus);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isEngineClosed(SSLEngine engine) {
|
||||
return (engine.isOutboundDone() && engine.isInboundDone());
|
||||
}
|
||||
|
||||
/*
|
||||
* Logging code
|
||||
*/
|
||||
private static boolean resultOnce = true;
|
||||
|
||||
private static void log(String str, SSLEngineResult result) {
|
||||
if (!logging) {
|
||||
return;
|
||||
}
|
||||
if (resultOnce) {
|
||||
resultOnce = false;
|
||||
System.out.println("The format of the SSLEngineResult is: \n"
|
||||
+ "\t\"getStatus() / getHandshakeStatus()\" +\n"
|
||||
+ "\t\"bytesConsumed() / bytesProduced()\"\n");
|
||||
}
|
||||
HandshakeStatus hsStatus = result.getHandshakeStatus();
|
||||
log(str
|
||||
+ result.getStatus() + "/" + hsStatus + ", "
|
||||
+ result.bytesConsumed() + "/" + result.bytesProduced()
|
||||
+ " bytes");
|
||||
if (hsStatus == HandshakeStatus.FINISHED) {
|
||||
log("\t...ready for application data");
|
||||
}
|
||||
}
|
||||
|
||||
private static void log(String str) {
|
||||
if (logging) {
|
||||
System.out.println(str);
|
||||
}
|
||||
}
|
||||
}
|
@ -44,7 +44,19 @@ set +e
|
||||
|
||||
failed=0
|
||||
|
||||
if [ $isWindows = false ]; then
|
||||
runSA=true
|
||||
|
||||
if [ $isLinux = true ]; then
|
||||
# Some Linux systems disable non-child ptrace (see 7050524)
|
||||
ptrace_scope=`/sbin/sysctl -n kernel.yama.ptrace_scope`
|
||||
if [ $? = 0 ]; then
|
||||
if [ $ptrace_scope = 1 ]; then
|
||||
runSA=false
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $runSA = true ]; then
|
||||
# -sysprops option
|
||||
${JINFO} -J-XX:+UsePerfData -sysprops $appJavaPid
|
||||
if [ $? != 0 ]; then failed=1; fi
|
||||
|
@ -22,7 +22,7 @@
|
||||
#
|
||||
|
||||
# @test
|
||||
# @bug 4990825
|
||||
# @bug 4990825 7092186
|
||||
# @run shell/timeout=90 jstatdExternalRegistry.sh
|
||||
# @summary Test functionality of 'jstatd -p<port>&' with an external RMI registry
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user