This commit is contained in:
Lana Steuck 2013-08-13 18:34:06 -07:00
commit b93ce53426
319 changed files with 31194 additions and 7312 deletions

View File

@ -223,3 +223,4 @@ ea73f01b9053e7165e7ba80f242bafecbc6af712 jdk8-b96
2d3875b0d18b3ad1c2bebf385a697e309e4005a4 jdk8-b99 2d3875b0d18b3ad1c2bebf385a697e309e4005a4 jdk8-b99
3d34036aae4ea90b2ca59712d5a69db3221f0875 jdk8-b100 3d34036aae4ea90b2ca59712d5a69db3221f0875 jdk8-b100
edb01c460d4cab21ff0ff13512df7b746efaa0e7 jdk8-b101 edb01c460d4cab21ff0ff13512df7b746efaa0e7 jdk8-b101
bbe43d712fe08e650808d774861b256ccb34e500 jdk8-b102

View File

@ -223,3 +223,4 @@ a1c1e8bf71f354f3aec0214cf13d6668811e021d jdk8-b97
59dc9da813794c924a0383c2a6241af94defdfed jdk8-b99 59dc9da813794c924a0383c2a6241af94defdfed jdk8-b99
d2dcb110e9dbaf9903c05b211df800e78e4b394e jdk8-b100 d2dcb110e9dbaf9903c05b211df800e78e4b394e jdk8-b100
9f74a220677dc265a724515d8e2617548cef62f1 jdk8-b101 9f74a220677dc265a724515d8e2617548cef62f1 jdk8-b101
5eb3c1dc348f72a7f84f7d9d07834e8bbe09a799 jdk8-b102

View File

@ -223,3 +223,4 @@ c8286839d0df04aba819ec4bef12b86babccf30e jdk8-b90
3f67804ab61303782df57e54989ef5e0e4629beb jdk8-b99 3f67804ab61303782df57e54989ef5e0e4629beb jdk8-b99
8d492f1dfd1b131a4c7886ee6b59528609f7e4fe jdk8-b100 8d492f1dfd1b131a4c7886ee6b59528609f7e4fe jdk8-b100
a013024b07475782f1fa8e196e950b34b4077663 jdk8-b101 a013024b07475782f1fa8e196e950b34b4077663 jdk8-b101
528c7e76eaeee022817ee085668459bc97cf5665 jdk8-b102

View File

@ -1,528 +0,0 @@
/*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.encoding;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.nio.ByteBuffer;
import org.omg.CORBA.TypeCode;
import org.omg.CORBA.Principal;
import org.omg.CORBA.Any;
import com.sun.org.omg.SendingContext.CodeBase;
import com.sun.corba.se.pept.protocol.MessageMediator;
import com.sun.corba.se.spi.logging.CORBALogDomains;
import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
import com.sun.corba.se.impl.logging.ORBUtilSystemException;
import com.sun.corba.se.impl.encoding.CodeSetConversion;
import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry;
/**
* This is delegates to the real implementation.
*
* NOTE:
*
* Before using the stream for valuetype unmarshaling, one must call
* performORBVersionSpecificInit().
*/
public abstract class CDRInputStream
extends org.omg.CORBA_2_3.portable.InputStream
implements com.sun.corba.se.impl.encoding.MarshalInputStream,
org.omg.CORBA.DataInputStream, org.omg.CORBA.portable.ValueInputStream
{
protected CorbaMessageMediator messageMediator;
private CDRInputStreamBase impl;
// We can move this out somewhere later. For now, it serves its purpose
// to create a concrete CDR delegate based on the GIOP version.
private static class InputStreamFactory {
public static CDRInputStreamBase newInputStream(ORB orb, GIOPVersion version)
{
switch(version.intValue()) {
case GIOPVersion.VERSION_1_0:
return new CDRInputStream_1_0();
case GIOPVersion.VERSION_1_1:
return new CDRInputStream_1_1();
case GIOPVersion.VERSION_1_2:
return new CDRInputStream_1_2();
default:
ORBUtilSystemException wrapper = ORBUtilSystemException.get( orb,
CORBALogDomains.RPC_ENCODING ) ;
throw wrapper.unsupportedGiopVersion( version ) ;
}
}
}
// Required for the case when a ClientResponseImpl is
// created with a SystemException due to a dead server/closed
// connection with no warning. Note that the stream will
// not be initialized in this case.
//
// Probably also required by ServerRequestImpl.
//
// REVISIT.
public CDRInputStream() {
}
public CDRInputStream(CDRInputStream is) {
impl = is.impl.dup();
impl.setParent(this);
}
public CDRInputStream(org.omg.CORBA.ORB orb,
ByteBuffer byteBuffer,
int size,
boolean littleEndian,
GIOPVersion version,
BufferManagerRead bufMgr)
{
impl = InputStreamFactory.newInputStream( (ORB)orb, version);
impl.init(orb, byteBuffer, size, littleEndian, bufMgr);
impl.setParent(this);
}
// org.omg.CORBA.portable.InputStream
public final boolean read_boolean() {
return impl.read_boolean();
}
public final char read_char() {
return impl.read_char();
}
public final char read_wchar() {
return impl.read_wchar();
}
public final byte read_octet() {
return impl.read_octet();
}
public final short read_short() {
return impl.read_short();
}
public final short read_ushort() {
return impl.read_ushort();
}
public final int read_long() {
return impl.read_long();
}
public final int read_ulong() {
return impl.read_ulong();
}
public final long read_longlong() {
return impl.read_longlong();
}
public final long read_ulonglong() {
return impl.read_ulonglong();
}
public final float read_float() {
return impl.read_float();
}
public final double read_double() {
return impl.read_double();
}
public final String read_string() {
return impl.read_string();
}
public final String read_wstring() {
return impl.read_wstring();
}
public final void read_boolean_array(boolean[] value, int offset, int length) {
impl.read_boolean_array(value, offset, length);
}
public final void read_char_array(char[] value, int offset, int length) {
impl.read_char_array(value, offset, length);
}
public final void read_wchar_array(char[] value, int offset, int length) {
impl.read_wchar_array(value, offset, length);
}
public final void read_octet_array(byte[] value, int offset, int length) {
impl.read_octet_array(value, offset, length);
}
public final void read_short_array(short[] value, int offset, int length) {
impl.read_short_array(value, offset, length);
}
public final void read_ushort_array(short[] value, int offset, int length) {
impl.read_ushort_array(value, offset, length);
}
public final void read_long_array(int[] value, int offset, int length) {
impl.read_long_array(value, offset, length);
}
public final void read_ulong_array(int[] value, int offset, int length) {
impl.read_ulong_array(value, offset, length);
}
public final void read_longlong_array(long[] value, int offset, int length) {
impl.read_longlong_array(value, offset, length);
}
public final void read_ulonglong_array(long[] value, int offset, int length) {
impl.read_ulonglong_array(value, offset, length);
}
public final void read_float_array(float[] value, int offset, int length) {
impl.read_float_array(value, offset, length);
}
public final void read_double_array(double[] value, int offset, int length) {
impl.read_double_array(value, offset, length);
}
public final org.omg.CORBA.Object read_Object() {
return impl.read_Object();
}
public final TypeCode read_TypeCode() {
return impl.read_TypeCode();
}
public final Any read_any() {
return impl.read_any();
}
public final Principal read_Principal() {
return impl.read_Principal();
}
public final int read() throws java.io.IOException {
return impl.read();
}
public final java.math.BigDecimal read_fixed() {
return impl.read_fixed();
}
public final org.omg.CORBA.Context read_Context() {
return impl.read_Context();
}
public final org.omg.CORBA.Object read_Object(java.lang.Class clz) {
return impl.read_Object(clz);
}
public final org.omg.CORBA.ORB orb() {
return impl.orb();
}
// org.omg.CORBA_2_3.portable.InputStream
public final java.io.Serializable read_value() {
return impl.read_value();
}
public final java.io.Serializable read_value(java.lang.Class clz) {
return impl.read_value(clz);
}
public final java.io.Serializable read_value(org.omg.CORBA.portable.BoxedValueHelper factory) {
return impl.read_value(factory);
}
public final java.io.Serializable read_value(java.lang.String rep_id) {
return impl.read_value(rep_id);
}
public final java.io.Serializable read_value(java.io.Serializable value) {
return impl.read_value(value);
}
public final java.lang.Object read_abstract_interface() {
return impl.read_abstract_interface();
}
public final java.lang.Object read_abstract_interface(java.lang.Class clz) {
return impl.read_abstract_interface(clz);
}
// com.sun.corba.se.impl.encoding.MarshalInputStream
public final void consumeEndian() {
impl.consumeEndian();
}
public final int getPosition() {
return impl.getPosition();
}
// org.omg.CORBA.DataInputStream
public final java.lang.Object read_Abstract () {
return impl.read_Abstract();
}
public final java.io.Serializable read_Value () {
return impl.read_Value();
}
public final void read_any_array (org.omg.CORBA.AnySeqHolder seq, int offset, int length) {
impl.read_any_array(seq, offset, length);
}
public final void read_boolean_array (org.omg.CORBA.BooleanSeqHolder seq, int offset, int length) {
impl.read_boolean_array(seq, offset, length);
}
public final void read_char_array (org.omg.CORBA.CharSeqHolder seq, int offset, int length) {
impl.read_char_array(seq, offset, length);
}
public final void read_wchar_array (org.omg.CORBA.WCharSeqHolder seq, int offset, int length) {
impl.read_wchar_array(seq, offset, length);
}
public final void read_octet_array (org.omg.CORBA.OctetSeqHolder seq, int offset, int length) {
impl.read_octet_array(seq, offset, length);
}
public final void read_short_array (org.omg.CORBA.ShortSeqHolder seq, int offset, int length) {
impl.read_short_array(seq, offset, length);
}
public final void read_ushort_array (org.omg.CORBA.UShortSeqHolder seq, int offset, int length) {
impl.read_ushort_array(seq, offset, length);
}
public final void read_long_array (org.omg.CORBA.LongSeqHolder seq, int offset, int length) {
impl.read_long_array(seq, offset, length);
}
public final void read_ulong_array (org.omg.CORBA.ULongSeqHolder seq, int offset, int length) {
impl.read_ulong_array(seq, offset, length);
}
public final void read_ulonglong_array (org.omg.CORBA.ULongLongSeqHolder seq, int offset, int length) {
impl.read_ulonglong_array(seq, offset, length);
}
public final void read_longlong_array (org.omg.CORBA.LongLongSeqHolder seq, int offset, int length) {
impl.read_longlong_array(seq, offset, length);
}
public final void read_float_array (org.omg.CORBA.FloatSeqHolder seq, int offset, int length) {
impl.read_float_array(seq, offset, length);
}
public final void read_double_array (org.omg.CORBA.DoubleSeqHolder seq, int offset, int length) {
impl.read_double_array(seq, offset, length);
}
// org.omg.CORBA.portable.ValueBase
public final String[] _truncatable_ids() {
return impl._truncatable_ids();
}
// java.io.InputStream
public final int read(byte b[]) throws IOException {
return impl.read(b);
}
public final int read(byte b[], int off, int len) throws IOException {
return impl.read(b, off, len);
}
public final long skip(long n) throws IOException {
return impl.skip(n);
}
public final int available() throws IOException {
return impl.available();
}
public final void close() throws IOException {
impl.close();
}
public final void mark(int readlimit) {
impl.mark(readlimit);
}
public final void reset() {
impl.reset();
}
public final boolean markSupported() {
return impl.markSupported();
}
public abstract CDRInputStream dup();
// Needed by TCUtility
public final java.math.BigDecimal read_fixed(short digits, short scale) {
return impl.read_fixed(digits, scale);
}
public final boolean isLittleEndian() {
return impl.isLittleEndian();
}
protected final ByteBuffer getByteBuffer() {
return impl.getByteBuffer();
}
protected final void setByteBuffer(ByteBuffer byteBuffer) {
impl.setByteBuffer(byteBuffer);
}
protected final void setByteBufferWithInfo(ByteBufferWithInfo bbwi) {
impl.setByteBufferWithInfo(bbwi);
}
public final int getBufferLength() {
return impl.getBufferLength();
}
protected final void setBufferLength(int value) {
impl.setBufferLength(value);
}
protected final int getIndex() {
return impl.getIndex();
}
protected final void setIndex(int value) {
impl.setIndex(value);
}
public final void orb(org.omg.CORBA.ORB orb) {
impl.orb(orb);
}
public final GIOPVersion getGIOPVersion() {
return impl.getGIOPVersion();
}
public final BufferManagerRead getBufferManager() {
return impl.getBufferManager();
}
// This should be overridden by any stream (ex: IIOPInputStream)
// which wants to read values. Thus, TypeCodeInputStream doesn't
// have to do this.
public CodeBase getCodeBase() {
return null;
}
// Use Latin-1 for GIOP 1.0 or when code set negotiation was not
// performed.
protected CodeSetConversion.BTCConverter createCharBTCConverter() {
return CodeSetConversion.impl().getBTCConverter(OSFCodeSetRegistry.ISO_8859_1,
impl.isLittleEndian());
}
// Subclasses must decide what to do here. It's inconvenient to
// make the class and this method abstract because of dup().
protected abstract CodeSetConversion.BTCConverter createWCharBTCConverter();
// Prints the current buffer in a human readable form
void printBuffer() {
impl.printBuffer();
}
/**
* Aligns the current position on the given octet boundary
* if there are enough bytes available to do so. Otherwise,
* it just returns. This is used for some (but not all)
* GIOP 1.2 message headers.
*/
public void alignOnBoundary(int octetBoundary) {
impl.alignOnBoundary(octetBoundary);
}
// Needed by request and reply messages for GIOP versions >= 1.2 only.
public void setHeaderPadding(boolean headerPadding) {
impl.setHeaderPadding(headerPadding);
}
/**
* This must be called after determining the proper ORB version,
* and setting it on the stream's ORB instance. It can be called
* after reading the service contexts, since that is the only place
* we can get the ORB version info.
*
* Trying to unmarshal things requiring repository IDs before calling
* this will result in NullPtrExceptions.
*/
public void performORBVersionSpecificInit() {
// In the case of SystemExceptions, a stream is created
// with its default constructor (and thus no impl is set).
if (impl != null)
impl.performORBVersionSpecificInit();
}
/**
* Resets any internal references to code set converters.
* This is useful for forcing the CDR stream to reacquire
* converters (probably from its subclasses) when state
* has changed.
*/
public void resetCodeSetConverters() {
impl.resetCodeSetConverters();
}
public void setMessageMediator(MessageMediator messageMediator)
{
this.messageMediator = (CorbaMessageMediator) messageMediator;
}
public MessageMediator getMessageMediator()
{
return messageMediator;
}
// ValueInputStream -----------------------------
public void start_value() {
impl.start_value();
}
public void end_value() {
impl.end_value();
}
}

View File

@ -1,435 +0,0 @@
/*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.encoding;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.nio.ByteBuffer;
import org.omg.CORBA.TypeCode;
import org.omg.CORBA.Principal;
import org.omg.CORBA.Any;
import com.sun.corba.se.pept.protocol.MessageMediator;
import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.logging.CORBALogDomains;
import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
import com.sun.corba.se.impl.encoding.CodeSetConversion;
import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry;
import com.sun.corba.se.impl.orbutil.ORBConstants;
import com.sun.corba.se.impl.logging.ORBUtilSystemException;
/**
* This is delegates to the real implementation.
*/
public abstract class CDROutputStream
extends org.omg.CORBA_2_3.portable.OutputStream
implements com.sun.corba.se.impl.encoding.MarshalOutputStream,
org.omg.CORBA.DataOutputStream, org.omg.CORBA.portable.ValueOutputStream
{
/*
private CDROutputStreamBase impl;
protected ORB orb ;
protected ORBUtilSystemException wrapper ;
protected CorbaMessageMediator corbaMessageMediator;
// We can move this out somewhere later. For now, it serves its purpose
// to create a concrete CDR delegate based on the GIOP version.
private static class OutputStreamFactory {
public static CDROutputStreamBase newOutputStream(ORB orb, GIOPVersion version)
{
switch(version.intValue()) {
case GIOPVersion.VERSION_1_0:
return new CDROutputStream_1_0();
case GIOPVersion.VERSION_1_1:
return new CDROutputStream_1_1();
case GIOPVersion.VERSION_1_2:
return new CDROutputStream_1_2();
default:
ORBUtilSystemException wrapper = ORBUtilSystemException.get( orb,
CORBALogDomains.RPC_ENCODING ) ;
// REVISIT - what is appropriate? INTERNAL exceptions
// are really hard to track later.
throw wrapper.unsupportedGiopVersion( version ) ;
}
}
}
// REVISIT - These two constructors should be re-factored to better hide
// the fact that someone extending this class 'can' construct a CDROutputStream
// that does not use pooled ByteBuffers. Right now, only EncapsOutputStream
// does _not_ use pooled ByteBuffers, see EncapsOutputStream.
// NOTE: When a stream is constructed for non-channel-backed sockets
// it notifies the constructor not to use pooled (i.e, direct)
// ByteBuffers.
public CDROutputStream(ORB orb,
GIOPVersion version,
boolean littleEndian,
BufferManagerWrite bufferManager,
byte streamFormatVersion,
boolean usePooledByteBuffers)
{
impl = OutputStreamFactory.newOutputStream(orb, version);
impl.init(orb, littleEndian, bufferManager, streamFormatVersion, usePooledByteBuffers);
impl.setParent(this);
this.orb = orb ;
this.wrapper = ORBUtilSystemException.get( orb,
CORBALogDomains.RPC_ENCODING ) ;
}
public CDROutputStream(ORB orb,
GIOPVersion version,
boolean littleEndian,
BufferManagerWrite bufferManager,
byte streamFormatVersion)
{
this(orb, version, littleEndian, bufferManager, streamFormatVersion, true);
}
*/
private ByteArrayOutputStream bos ;
private ObjectOutputStream oos ;
public JavaOutputStream()
{
bos = new ByteArrayOutputStream() ;
oos = new ObjectOutputStream( bos ) ;
}
// Provided by IIOPOutputStream and EncapsOutputStream
public org.omg.CORBA.portable.InputStream create_input_stream()
{
ObjectInputStream ois = new ByteArrayInputStream( bos.toByteArray() ) ;
return new JavaInputStream( ois ) ;
}
public final void write_boolean(boolean value) {
impl.write_boolean(value);
}
public final void write_char(char value) {
impl.write_char(value);
}
public final void write_wchar(char value) {
impl.write_wchar(value);
}
public final void write_octet(byte value) {
impl.write_octet(value);
}
public final void write_short(short value) {
impl.write_short(value);
}
public final void write_ushort(short value) {
impl.write_ushort(value);
}
public final void write_long(int value) {
impl.write_long(value);
}
public final void write_ulong(int value) {
impl.write_ulong(value);
}
public final void write_longlong(long value) {
impl.write_longlong(value);
}
public final void write_ulonglong(long value) {
impl.write_ulonglong(value);
}
public final void write_float(float value) {
impl.write_float(value);
}
public final void write_double(double value) {
impl.write_double(value);
}
public final void write_string(String value) {
impl.write_string(value);
}
public final void write_wstring(String value) {
impl.write_wstring(value);
}
public final void write_boolean_array(boolean[] value, int offset, int length) {
impl.write_boolean_array(value, offset, length);
}
public final void write_char_array(char[] value, int offset, int length) {
impl.write_char_array(value, offset, length);
}
public final void write_wchar_array(char[] value, int offset, int length) {
impl.write_wchar_array(value, offset, length);
}
public final void write_octet_array(byte[] value, int offset, int length) {
impl.write_octet_array(value, offset, length);
}
public final void write_short_array(short[] value, int offset, int length) {
impl.write_short_array(value, offset, length);
}
public final void write_ushort_array(short[] value, int offset, int length){
impl.write_ushort_array(value, offset, length);
}
public final void write_long_array(int[] value, int offset, int length) {
impl.write_long_array(value, offset, length);
}
public final void write_ulong_array(int[] value, int offset, int length) {
impl.write_ulong_array(value, offset, length);
}
public final void write_longlong_array(long[] value, int offset, int length) {
impl.write_longlong_array(value, offset, length);
}
public final void write_ulonglong_array(long[] value, int offset,int length) {
impl.write_ulonglong_array(value, offset, length);
}
public final void write_float_array(float[] value, int offset, int length) {
impl.write_float_array(value, offset, length);
}
public final void write_double_array(double[] value, int offset, int length) {
impl.write_double_array(value, offset, length);
}
public final void write_Object(org.omg.CORBA.Object value) {
impl.write_Object(value);
}
public final void write_TypeCode(TypeCode value) {
impl.write_TypeCode(value);
}
public final void write_any(Any value) {
impl.write_any(value);
}
public final void write_Principal(Principal value) {
impl.write_Principal(value);
}
public final void write(int b) throws java.io.IOException {
impl.write(b);
}
public final void write_fixed(java.math.BigDecimal value) {
impl.write_fixed(value);
}
public final void write_Context(org.omg.CORBA.Context ctx,
org.omg.CORBA.ContextList contexts) {
impl.write_Context(ctx, contexts);
}
public final org.omg.CORBA.ORB orb() {
return impl.orb();
}
// org.omg.CORBA_2_3.portable.OutputStream
public final void write_value(java.io.Serializable value) {
impl.write_value(value);
}
public final void write_value(java.io.Serializable value, java.lang.Class clz) {
impl.write_value(value, clz);
}
public final void write_value(java.io.Serializable value, String repository_id) {
impl.write_value(value, repository_id);
}
public final void write_value(java.io.Serializable value,
org.omg.CORBA.portable.BoxedValueHelper factory) {
impl.write_value(value, factory);
}
public final void write_abstract_interface(java.lang.Object obj) {
impl.write_abstract_interface(obj);
}
// java.io.OutputStream
public final void write(byte b[]) throws IOException {
impl.write(b);
}
public final void write(byte b[], int off, int len) throws IOException {
impl.write(b, off, len);
}
public final void flush() throws IOException {
impl.flush();
}
public final void close() throws IOException {
impl.close();
}
// com.sun.corba.se.impl.encoding.MarshalOutputStream
public final void start_block() {
impl.start_block();
}
public final void end_block() {
impl.end_block();
}
public final void putEndian() {
impl.putEndian();
}
public void writeTo(java.io.OutputStream s)
throws IOException
{
impl.writeTo(s);
}
public final byte[] toByteArray() {
return impl.toByteArray();
}
// org.omg.CORBA.DataOutputStream
public final void write_Abstract (java.lang.Object value) {
impl.write_Abstract(value);
}
public final void write_Value (java.io.Serializable value) {
impl.write_Value(value);
}
public final void write_any_array(org.omg.CORBA.Any[] seq, int offset, int length) {
impl.write_any_array(seq, offset, length);
}
public void setMessageMediator(MessageMediator messageMediator)
{
this.corbaMessageMediator = (CorbaMessageMediator) messageMediator;
}
public MessageMediator getMessageMediator()
{
return corbaMessageMediator;
}
// org.omg.CORBA.portable.ValueBase
public final String[] _truncatable_ids() {
return impl._truncatable_ids();
}
// Other
protected final int getSize() {
return impl.getSize();
}
protected final int getIndex() {
return impl.getIndex();
}
protected int getRealIndex(int index) {
// Used in indirections. Overridden by TypeCodeOutputStream.
return index;
}
protected final void setIndex(int value) {
impl.setIndex(value);
}
protected final ByteBuffer getByteBuffer() {
return impl.getByteBuffer();
}
protected final void setByteBuffer(ByteBuffer byteBuffer) {
impl.setByteBuffer(byteBuffer);
}
public final boolean isLittleEndian() {
return impl.isLittleEndian();
}
// XREVISIT - return to final if possible
// REVISIT - was protected - need access from msgtypes test.
public ByteBufferWithInfo getByteBufferWithInfo() {
return impl.getByteBufferWithInfo();
}
protected void setByteBufferWithInfo(ByteBufferWithInfo bbwi) {
impl.setByteBufferWithInfo(bbwi);
}
// REVISIT: was protected - but need to access from xgiop.
public final BufferManagerWrite getBufferManager() {
return impl.getBufferManager();
}
public final void write_fixed(java.math.BigDecimal bigDecimal, short digits, short scale) {
impl.write_fixed(bigDecimal, digits, scale);
}
public final void writeOctetSequenceTo(org.omg.CORBA.portable.OutputStream s) {
impl.writeOctetSequenceTo(s);
}
public final GIOPVersion getGIOPVersion() {
return impl.getGIOPVersion();
}
public final void writeIndirection(int tag, int posIndirectedTo) {
impl.writeIndirection(tag, posIndirectedTo);
}
// Use Latin-1 for GIOP 1.0 or when code set negotiation was not
// performed.
protected CodeSetConversion.CTBConverter createCharCTBConverter() {
return CodeSetConversion.impl().getCTBConverter(OSFCodeSetRegistry.ISO_8859_1);
}
// Subclasses must decide what to do here. It's inconvenient to
// make the class and this method abstract because of dup().
protected abstract CodeSetConversion.CTBConverter createWCharCTBConverter();
protected final void freeInternalCaches() {
impl.freeInternalCaches();
}
void printBuffer() {
impl.printBuffer();
}
public void alignOnBoundary(int octetBoundary) {
impl.alignOnBoundary(octetBoundary);
}
// Needed by request and reply messages for GIOP versions >= 1.2 only.
public void setHeaderPadding(boolean headerPadding) {
impl.setHeaderPadding(headerPadding);
}
// ValueOutputStream -----------------------------
public void start_value(String rep_id) {
impl.start_value(rep_id);
}
public void end_value() {
impl.end_value();
}
}

View File

@ -1,164 +0,0 @@
/*
* Copyright (c) 2000, 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.interceptors;
import com.sun.corba.se.impl.corba.AnyImpl;
import org.omg.PortableInterceptor.Current;
import org.omg.PortableInterceptor.InvalidSlot;
import com.sun.corba.se.impl.util.MinorCodes;
import com.sun.corba.se.impl.core.ORB;
/**
* ThreadCurrentStack is the container of PICurrent instances for each thread
*/
public class ThreadCurrentStack
{
// PICurrentPool is the container for reusable PICurrents
private class PICurrentPool {
// Contains a list of reusable PICurrents
private java.util.ArrayList pool;
// High water mark for the pool
// If the pool size reaches this limit then putPICurrent will
// not put PICurrent to the pool.
private static final int HIGH_WATER_MARK = 5;
// currentIndex points to the last PICurrent in the list
private int currentIndex;
PICurrentPool( ) {
pool = new java.util.ArrayList( HIGH_WATER_MARK );
currentIndex = 0;
}
/**
* Puts PICurrent to the re-usable pool.
*/
void putPICurrent( PICurrent current ) {
// If there are enough PICurrents in the pool, then don't add
// this current to the pool.
if( currentIndex >= HIGH_WATER_MARK ) {
return;
}
pool.add(currentIndex , current);
currentIndex++;
}
/**
* Gets PICurrent from the re-usable pool.
*/
PICurrent getPICurrent( ) {
// If there are no entries in the pool then return null
if( currentIndex == 0 ) {
return null;
}
// Works like a stack, Gets the last one added first
currentIndex--;
return (PICurrent) pool.get(currentIndex);
}
}
// Contains all the active PICurrents for each thread.
// The ArrayList is made to behave like a stack.
private java.util.ArrayList currentContainer;
// Keeps track of number of PICurrents in the stack.
private int currentIndex;
// For Every Thread there will be a pool of re-usable ThreadCurrent's
// stored in PICurrentPool
private PICurrentPool currentPool;
// The orb associated with this ThreadCurrentStack
private ORB piOrb;
/**
* Constructs the stack and and PICurrentPool
*/
ThreadCurrentStack( ORB piOrb, PICurrent current ) {
this.piOrb = piOrb;
currentIndex = 0;
currentContainer = new java.util.ArrayList( );
currentPool = new PICurrentPool( );
currentContainer.add( currentIndex, current );
currentIndex++;
}
/**
* pushPICurrent goes through the following steps
* 1: Checks to see if there is any PICurrent in PICurrentPool
* If present then use that instance to push into the ThreadCurrentStack
*
* 2:If there is no PICurrent in the pool, then creates a new one and pushes
* that into the ThreadCurrentStack
*/
void pushPICurrent( ) {
PICurrent current = currentPool.getPICurrent( );
if( current == null ) {
// get an existing PICurrent to get the slotSize
PICurrent currentTemp = peekPICurrent();
current = new PICurrent( piOrb, currentTemp.getSlotSize( ));
}
currentContainer.add( currentIndex, current );
currentIndex++;
}
/**
* popPICurrent does the following
* 1: pops the top PICurrent in the ThreadCurrentStack
*
* 2: resets the slots in the PICurrent which resets the slotvalues to
* null if there are any previous sets.
*
* 3: pushes the reset PICurrent into the PICurrentPool to reuse
*/
void popPICurrent( ) {
// Do not pop the PICurrent, If there is only one.
// This should not happen, But an extra check for safety.
if( currentIndex <= 1 ) {
throw new org.omg.CORBA.INTERNAL(
"Cannot pop the only PICurrent in the stack",
MinorCodes.CANT_POP_ONLY_CURRENT_2,
CompletionStatus.COMPLETED_NO );
}
currentIndex--;
PICurrent current = (PICurrent)currentContainer.get( currentIndex );
current.resetSlots( );
currentPool.putPICurrent( current );
}
/**
* peekPICurrent gets the top PICurrent in the ThreadCurrentStack without
* popping.
*/
PICurrent peekPICurrent( ) {
return (PICurrent) currentContainer.get( currentIndex - 1);
}
}

View File

@ -1,145 +0,0 @@
/*
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.orbutil ;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/** This class provides just a main method. Its purpose is to allow -D arguments to
* set up the system properties when starting programs with tools like OptimizeIt that
* make this difficult or impossible.
*
* Invocation: {java launcher of some kind} DefineClass -Dxxx=yyy -Dxxx=yyy ... {class name} arg0, arg1, ...
* Result: updates system properties with -D args, then uses reflection to invoke {class name}.main with the args
*/
class DefineWrapper {
public static void main( String[] args )
{
int numberDefines = args.length ;
String className = null ;
for (int ctr=0; ctr<args.length; ctr++ ) {
String arg = args[ctr] ;
if ((arg.charAt(0) == '-') && (arg.charAt(1) == 'D')) {
int eqIndex = arg.indexOf( '=' ) ;
if (eqIndex < 0)
throw new Exception( arg + " is not a valid property assignment" ) ;
final String key = arg.subString( 2, eqIndex ) ;
final String value = arg.subStrung( eqIndex + 1 ) ;
AccessController.doPrivileged( new PrivilegedAction() {
public Object run() {
System.setProperty( key, value ) ;
return null ;
}
} ) ;
} else {
numberDefines = ctr ;
className = arg ;
break ;
}
}
if (numberDefines < args.length) {
Class cls = getMainClass( className ) ;
Method mainMethod = getMainMethod( cls ) ;
String[] newArgs = new String[ args.length - numberDefines ] ;
for (int ctr = numberDefines+1; ctr<args.length; ctr++ ) {
newArgs[ ctr-numberDefines-1 ] = args[ ctr ] ;
}
// build args to the main and call it
Object params [] = new Object [1];
params[0] = newArgs;
mainMethod.invoke(null, params);
} else {
throw new Exception( "No class name given" ) ;
}
}
private static Class getMainClass( String name )
{
// determine the class loader to be used for loading the class
// since ServerMain is going to be in JDK and we need to have this
// class to load application classes, this is required here.
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if (cl == null)
cl = ClassLoader.getSystemClassLoader();
try {
// determine the main class, try loading with current class loader
cls = Class.forName( className ) ;
} catch (ClassNotFoundException ex) {
// eat the exception and try to load using SystemClassLoader
cls = Class.forName( className, true, cl);
}
}
private static Method getMainMethod( Class serverClass )
{
Class argTypes[] = new Class[] { String[].class } ;
Method method = null ;
try {
method = serverClass.getDeclaredMethod( "main", argTypes ) ;
} catch (Exception exc) {
throw new Exception( "Could not get main() method: " + exc ) ;
}
if (!isPublicStaticVoid( method ))
throw new Exception( "Main method is not public static void" ) ;
return method ;
}
private static boolean isPublicStaticVoid( Method method )
{
// check modifiers: public static
int modifiers = method.getModifiers ();
if (!Modifier.isPublic (modifiers) || !Modifier.isStatic (modifiers)) {
logError( method.getName() + " is not public static" ) ;
return false ;
}
// check return type and exceptions
if (method.getExceptionTypes ().length != 0) {
logError( method.getName() + " declares exceptions" ) ;
return false ;
}
if (!method.getReturnType().equals (Void.TYPE)) {
logError( method.getName() + " does not have a void return type" ) ;
return false ;
}
return true ;
}
}

View File

@ -1,909 +0,0 @@
/*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.presentation.rmi ;
import java.lang.reflect.Method;
import java.math.BigInteger;
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.HashMap;
import java.util.StringTokenizer;
import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator ;
import com.sun.corba.se.impl.presentation.rmi.IDLType ;
import com.sun.corba.se.impl.presentation.rmi.IDLTypeException ;
import com.sun.corba.se.impl.presentation.rmi.IDLTypesUtil ;
import com.sun.corba.se.impl.orbutil.ObjectUtility ;
/**
* Bidirectional translator between RMI-IIOP interface methods and
* and IDL Names.
*/
public class IDLNameTranslatorImpl implements IDLNameTranslator {
// From CORBA Spec, Table 6 Keywords.
// Note that since all IDL identifiers are case
// insensitive, java identifier comparisons to these
// will be case insensitive also.
private static String[] IDL_KEYWORDS = {
"abstract", "any", "attribute", "boolean", "case", "char",
"const", "context", "custom", "default", "double", "enum",
"exception", "factory", "FALSE", "fixed", "float", "in", "inout",
"interface", "long", "module", "native", "Object", "octet",
"oneway", "out", "private", "public", "raises", "readonly", "sequence",
"short", "string", "struct", "supports", "switch", "TRUE", "truncatable",
"typedef", "unsigned", "union", "ValueBase", "valuetype", "void",
"wchar", "wstring"
};
private static char[] HEX_DIGITS = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'
};
private static final String UNDERSCORE = "_";
// used to mangle java inner class names
private static final String INNER_CLASS_SEPARATOR =
UNDERSCORE + UNDERSCORE;
// used to form IDL array type names
private static final String[] BASE_IDL_ARRAY_MODULE_TYPE=
new String[] { "org", "omg", "boxedRMI" } ;
private static final String BASE_IDL_ARRAY_ELEMENT_TYPE = "seq";
// used to mangling java identifiers that have a leading underscore
private static final String LEADING_UNDERSCORE_CHAR = "J";
private static final String ID_CONTAINER_CLASH_CHAR = UNDERSCORE;
// separator used between types in a mangled overloaded method name
private static final String OVERLOADED_TYPE_SEPARATOR =
UNDERSCORE + UNDERSCORE;
// string appended to attribute if it clashes with a method name
private static final String ATTRIBUTE_METHOD_CLASH_MANGLE_CHARS =
UNDERSCORE + UNDERSCORE;
private static Set idlKeywords_;
static {
idlKeywords_ = new HashSet();
for(int i = 0; i < IDL_KEYWORDS.length; i++) {
String next = (String) IDL_KEYWORDS[i];
// Convert keyword to all caps to ease equality
// check.
String keywordAllCaps = next.toUpperCase();
idlKeywords_.add(keywordAllCaps);
}
}
//
// Instance state
//
// Remote interface for name translation.
private Class[] interf_;
// Maps used to hold name translations. These do not need to be
// synchronized since the translation is never modified after
// initialization.
private Map methodToIDLNameMap_;
private Map IDLNameToMethodMap_;
private Method[] methods_;
/**
* Return an IDLNameTranslator for the given interface.
*
* @throws IllegalStateException if given class is not a valid
* RMI/IIOP Remote Interface
*/
public static IDLNameTranslator get( Class interf )
{
return new IDLNameTranslatorImpl(new Class[] { interf } );
}
/**
* Return an IDLNameTranslator for the given interfacex.
*
* @throws IllegalStateException if given classes are not valid
* RMI/IIOP Remote Interfaces
*/
public static IDLNameTranslator get( Class[] interfaces )
{
return new IDLNameTranslatorImpl(interfaces );
}
public static String getExceptionId( Class cls )
{
// Requirements for this method:
// 1. cls must be an exception but not a RemoteException.
// 2. If cls has an IDL keyword name, an underscore is prepended (1.3.2.2).
// 3. If cls jas a leading underscore, J is prepended (1.3.2.3).
// 4. If cls has an illegal IDL ident char, it is mapped to UXXXX where
// XXXX is the unicode value in hex of the char (1.3.2.4).
// 5. double underscore for inner class (1.3.2.5).
// 6. The ID is "IDL:" + name with / separators + ":1.0".
IDLType itype = classToIDLType( cls ) ;
return itype.getExceptionName() ;
}
public Class[] getInterfaces()
{
return interf_;
}
public Method[] getMethods()
{
return methods_ ;
}
public Method getMethod( String idlName )
{
return (Method) IDLNameToMethodMap_.get(idlName);
}
public String getIDLName( Method method )
{
return (String) methodToIDLNameMap_.get(method);
}
/**
* Initialize an IDLNameTranslator for the given interface.
*
* @throws IllegalStateException if given class is not a valid
* RMI/IIOP Remote Interface
*/
private IDLNameTranslatorImpl(Class[] interfaces)
{
try {
IDLTypesUtil idlTypesUtil = new IDLTypesUtil();
for (int ctr=0; ctr<interfaces.length; ctr++)
idlTypesUtil.validateRemoteInterface(interfaces[ctr]);
interf_ = interfaces;
buildNameTranslation();
} catch( IDLTypeException ite) {
String msg = ite.getMessage();
IllegalStateException ise = new IllegalStateException(msg);
ise.initCause(ite);
throw ise;
}
}
private void buildNameTranslation()
{
// holds method info, keyed by method
Map allMethodInfo = new HashMap() ;
for (int ctr=0; ctr<interf_.length; ctr++) {
Class interf = interf_[ctr] ;
IDLTypesUtil idlTypesUtil = new IDLTypesUtil();
Method[] methods = interf.getMethods();
// Take an initial pass through all the methods and create some
// information that will be used to track the IDL name
// transformation.
for(int i = 0; i < methods.length; i++) {
Method nextMethod = methods[i];
IDLMethodInfo methodInfo = new IDLMethodInfo();
methodInfo.method = nextMethod;
methodInfo.propertyType =
idlTypesUtil.propertyAccessorMethodType(
nextMethod, interf ) ;
if (methodInfo.propertyType != null) {
String attributeName = idlTypesUtil.
getAttributeNameForProperty(nextMethod.getName());
methodInfo.originalName = attributeName;
methodInfo.mangledName = attributeName;
} else {
methodInfo.originalName = nextMethod.getName();
methodInfo.mangledName = nextMethod.getName();
}
allMethodInfo.put(nextMethod, methodInfo);
}
}
// Check for having both is<NAME> and get<NAME> methods.
//
// Perform case sensitivity test first. This applies to all
// method names AND attributes. Compare each method name and
// attribute to all other method names and attributes. If names
// differ only in case, apply mangling as defined in section 1.3.2.7
// of Java2IDL spec. Note that we compare using the original names.
//
for(Iterator outerIter=allMethodInfo.values().iterator();
outerIter.hasNext();) {
IDLMethodInfo outer = (IDLMethodInfo) outerIter.next();
for(Iterator innerIter = allMethodInfo.values().iterator();
innerIter.hasNext();) {
IDLMethodInfo inner = (IDLMethodInfo) innerIter.next();
if( (outer != inner) &&
(!outer.originalName.equals(inner.originalName)) &&
outer.originalName.equalsIgnoreCase(inner.originalName) ) {
outer.mangledName =
mangleCaseSensitiveCollision(outer.originalName);
break;
}
}
}
for(Iterator iter = allMethodInfo.values().iterator();
iter.hasNext();) {
IDLMethodInfo next = (IDLMethodcurrentInfo) iter.next();
next.mangledName =
mangleIdentifier(next.mangledName,
next.propertyType != null);
}
//
// Now check for overloaded method names and apply 1.3.2.6.
//
for(Iterator outerIter=allMethodInfo.values().iterator();
outerIter.hasNext();) {
IDLMethodInfo outer = (IDLMethodInfo) outerIter.next();
if (outer.propertyType != null) {
continue;
}
for(Iterator innerIter = allMethodInfo.values().iterator();
innerIter.hasNext();) {
IDLMethodInfo inner = (IDLMethodInfo) innerIter.next();
if( (outer != inner) &&
(inner.propertyType == null) &&
outer.originalName.equals(inner.originalName) ) {
outer.mangledName = mangleOverloadedMethod
(outer.mangledName, outer.method);
break;
}
}
}
//
// Now mangle any properties that clash with method names.
//
for(Iterator outerIter=allMethodInfo.values().iterator();
outerIter.hasNext();) {
IDLMethodInfo outer = (IDLMethodInfo) outerIter.next();
if(outer.propertyType == null) {
continue;
}
for(Iterator innerIter = allMethodInfo.values().iterator();
innerIter.hasNext();) {
IDLMethodInfo inner = (IDLMethodInfo) innerIter.next();
if( (outer != inner) &&
(inner.propertyType == null) &&
outer.mangledName.equals(inner.mangledName) ) {
outer.mangledName = outer.mangledName +
ATTRIBUTE_METHOD_CLASH_MANGLE_CHARS;
break;
}
}
}
//
// Ensure that no mapped method names clash with mapped name
// of container(1.3.2.9). This is a case insensitive comparison.
//
for (int ctr=0; ctr<interf_.length; ctr++ ) {
Class interf = interf_[ctr] ;
String mappedContainerName = getMappedContainerName(interf);
for(Iterator iter = allMethodInfo.values().iterator();
iter.hasNext();) {
IDLMethodInfo next = (IDLMethodInfo) iter.next();
if( (next.propertyType == null) &&
identifierClashesWithContainer(mappedContainerName,
next.mangledName)) {
next.mangledName = mangleContainerClash(next.mangledName);
}
}
}
//
// Populate name translation maps.
//
methodToIDLNameMap_ = new HashMap();
IDLNameToMethodMap_ = new HashMap();
methods_ = (Method[])allMethodInfo.keySet().toArray(
new Method[0] ) ;
for(Iterator iter = allMethodInfo.values().iterator();
iter.hasNext();) {
IDLMethodInfo next = (IDLMethodInfo) iter.next();
String idlName = next.mangledName;
if (next.propertyType != null) {
idlName = javaPropertyPrefixToIDL( next.propertyType ) +
next.mangledName ;
}
methodToIDLNameMap_.put(next.method, idlName);
// Final check to see if there are any clashes after all the
// manglings have been applied. If so, this is treated as an
// invalid interface. Currently, we do a CASE-SENSITIVE
// comparison since that matches the rmic behavior.
// @@@ Shouldn't this be a case-insensitive check?
// If there is a collision between is<TYPE> and get<TYPE>,
// map only is<TYPE> to an attribute, and leave the
// get<TYPE> method alone.
if( IDLNameToMethodMap_.containsKey(idlName) ) {
// @@@ I18N
Method clash = (Method) IDLNameToMethodMap_.get(idlName);
MethodInfo clashMethodInfo =
(MethodInfo)allMethodInfo.get( clash ) ;
if (clashMethodInfo.isBooleanProperty() &&
next.isReadProperty()) {
// fix idlName
} else if (clashMethodInfo.isReadProperty() &&
next.isBooleanProperty()) {
// Remove entry under idlName
// put entry into table under correct name
} else {
throw new IllegalStateException("Error : methods " +
clash + " and " + next.method +
" both result in IDL name '" + idlName + "'");
}
}
IDLNameToMethodMap_.put(idlName, next.method);
}
return;
}
/**
* Perform all necessary stand-alone identifier mangling operations
* on a java identifier that is being transformed into an IDL name.
* That is, mangling operations that don't require looking at anything
* else but the identifier itself. This covers sections 1.3.2.2, 1.3.2.3,
* and 1.3.2.4 of the Java2IDL spec. Method overloading and
* case-sensitivity checks are handled elsewhere.
*/
private static String mangleIdentifier(String identifier) {
return mangleIdentifier(identifier, false);
}
private static String mangleIdentifier(String identifier, boolean attribute) {
String mangledName = identifier;
//
// Apply leading underscore test (1.3.2.3)
// This should be done before IDL Keyword clash test, since clashing
// IDL keywords are mangled by adding a leading underscore.
//
if( hasLeadingUnderscore(mangledName) ) {
mangledName = mangleLeadingUnderscore(mangledName);
}
//
// Apply IDL keyword clash test (1.3.2.2).
// This is not needed for attributes since when the full property
// name is composed it cannot clash with an IDL keyword.
// (Also, rmic doesn't do it.)
//
if( !attribute && isIDLKeyword(mangledName) ) {
mangledName = mangleIDLKeywordClash(mangledName);
}
//
// Replace illegal IDL identifier characters (1.3.2.4)
// for all method names and attributes.
//
if( !isIDLIdentifier(mangledName) ) {
mangledName = mangleUnicodeChars(mangledName);
}
return mangledName;
}
/**
* Checks whether a java identifier clashes with an
* IDL keyword. Note that this is a case-insensitive
* comparison.
*
* Used to implement section 1.3.2.2 of Java2IDL spec.
*/
private static boolean isIDLKeyword(String identifier) {
String identifierAllCaps = identifier.toUpperCase();
return idlKeywords_.contains(identifierAllCaps);
}
private static String mangleIDLKeywordClash(String identifier) {
return UNDERSCORE + identifier;
}
private static String mangleLeadingUnderscore(String identifier) {
return LEADING_UNDERSCORE_CHAR + identifier;
}
/**
* Checks whether a java identifier starts with an underscore.
* Used to implement section 1.3.2.3 of Java2IDL spec.
*/
private static boolean hasLeadingUnderscore(String identifier) {
return identifier.startsWith(UNDERSCORE);
}
/**
* Implements Section 1.3.2.4 of Java2IDL Mapping.
* All non-IDL identifier characters must be replaced
* with their Unicode representation.
*/
static String mangleUnicodeChars(String identifier) {
StringBuffer mangledIdentifier = new StringBuffer();
for(int i = 0; i < identifier.length(); i++) {
char nextChar = identifier.charAt(i);
if( isIDLIdentifierChar(nextChar) ) {
mangledIdentifier.append(nextChar);
} else {
String unicode = charToUnicodeRepresentation(nextChar);
mangledIdentifier.append(unicode);
}
}
return mangledIdentifier.toString();
}
/**
* Implements mangling portion of Section 1.3.2.7 of Java2IDL spec.
* This method only deals with the actual mangling. Decision about
* whether case-sensitive collision mangling is required is made
* elsewhere.
*
*
* "...a mangled name is generated consisting of the original name
* followed by an underscore separated list of decimal indices
* into the string, where the indices identify all the upper case
* characters in the original string. Indices are zero based."
*
*/
String mangleCaseSensitiveCollision(String identifier) {
StringBuffer mangledIdentifier = new StringBuffer(identifier);
// There is always at least one trailing underscore, whether or
// not the identifier has uppercase letters.
mangledIdentifier.append(UNDERSCORE);
boolean needUnderscore = false;
for(int i = 0; i < identifier.length(); i++) {
char next = identifier.charAt(i);
if( Character.isUpperCase(next) ) {
// This bit of logic is needed to ensure that we have
// an underscore separated list of indices but no
// trailing underscores. Basically, after we have at least
// one uppercase letter, we always put an undercore before
// printing the next one.
if( needUnderscore ) {
mangledIdentifier.append(UNDERSCORE);
}
mangledIdentifier.append(i);
needUnderscore = true;
}
}
return mangledIdentifier.toString();
}
private static String mangleContainerClash(String identifier) {
return identifier + ID_CONTAINER_CLASH_CHAR;
}
/**
* Implements Section 1.3.2.9 of Java2IDL Mapping. Container in this
* context means the name of the java Class(excluding package) in which
* the identifier is defined. Comparison is case-insensitive.
*/
private static boolean identifierClashesWithContainer
(String mappedContainerName, String identifier) {
return identifier.equalsIgnoreCase(mappedContainerName);
}
/**
* Returns Unicode mangling as defined in Section 1.3.2.4 of
* Java2IDL spec.
*
* "For Java identifiers that contain illegal OMG IDL identifier
* characters such as '$' or Unicode characters outside of ISO Latin 1,
* any such illegal characters are replaced by "U" followed by the
* 4 hexadecimal characters(in upper case) representing the Unicode
* value. So, the Java name a$b is mapped to aU0024b and
* x\u03bCy is mapped to xU03BCy."
*/
public static String charToUnicodeRepresentation(char c) {
int orig = (int) c;
StringBuffer hexString = new StringBuffer();
int value = orig;
while( value > 0 ) {
int div = value / 16;
int mod = value % 16;
hexString.insert(0, HEX_DIGITS[mod]);
value = div;
}
int numZerosToAdd = 4 - hexString.length();
for(int i = 0; i < numZerosToAdd; i++) {
hexString.insert(0, "0");
}
hexString.insert(0, "U");
return hexString.toString();
}
private static boolean isIDLIdentifier(String identifier) {
boolean isIdentifier = true;
for(int i = 0; i < identifier.length(); i++) {
char nextChar = identifier.charAt(i);
// 1st char must be alphbetic.
isIdentifier = (i == 0) ?
isIDLAlphabeticChar(nextChar) :
isIDLIdentifierChar(nextChar);
if( !isIdentifier ) {
break;
}
}
return isIdentifier;
}
private static boolean isIDLIdentifierChar(char c) {
return (isIDLAlphabeticChar(c) ||
isIDLDecimalDigit(c) ||
isUnderscore(c));
}
/**
* True if character is one of 114 Alphabetic characters as
* specified in Table 2 of Chapter 3 in CORBA spec.
*/
private static boolean isIDLAlphabeticChar(char c) {
// NOTE that we can't use the java.lang.Character
// isUpperCase, isLowerCase, etc. methods since they
// include many characters other than the Alphabetic list in
// the CORBA spec. Instead, we test for inclusion in the
// Unicode value ranges for the corresponding legal characters.
boolean alphaChar =
(
// A - Z
((c >= 0x0041) && (c <= 0x005A))
||
// a - z
((c >= 0x0061) && (c <= 0x007A))
||
// other letter uppercase, other letter lowercase, which is
// the entire upper half of C1 Controls except X and /
((c >= 0x00C0) && (c <= 0x00FF)
&& (c != 0x00D7) && (c != 0x00F7)));
return alphaChar;
}
/**
* True if character is one of 10 Decimal Digits
* specified in Table 3 of Chapter 3 in CORBA spec.
*/
private static boolean isIDLDecimalDigit(char c) {
return ( (c >= 0x0030) && (c <= 0x0039) );
}
private static boolean isUnderscore(char c) {
return ( c == 0x005F );
}
/**
* Mangle an overloaded method name as defined in Section 1.3.2.6 of
* Java2IDL spec. Current value of method name is passed in as argument.
* We can't start from original method name since the name might have
* been partially mangled as a result of the other rules.
*/
private static String mangleOverloadedMethod(String mangledName, Method m) {
IDLTypesUtil idlTypesUtil = new IDLTypesUtil();
// Start by appending the separator string
String newMangledName = mangledName + OVERLOADED_TYPE_SEPARATOR;
Class[] parameterTypes = m.getParameterTypes();
for(int i = 0; i < parameterTypes.length; i++) {
Class nextParamType = parameterTypes[i];
if( i > 0 ) {
newMangledName = newMangledName + OVERLOADED_TYPE_SEPARATOR;
}
IDLType idlType = classToIDLType(nextParamType);
String moduleName = idlType.getModuleName();
String memberName = idlType.getMemberName();
String typeName = (moduleName.length() > 0) ?
moduleName + UNDERSCORE + memberName : memberName;
if( !idlTypesUtil.isPrimitive(nextParamType) &&
(idlTypesUtil.getSpecialCaseIDLTypeMapping(nextParamType)
== null) &&
isIDLKeyword(typeName) ) {
typeName = mangleIDLKeywordClash(typeName);
}
typeName = mangleUnicodeChars(typeName);
newMangledName = newMangledName + typeName;
}
return newMangledName;
}
private static IDLType classToIDLType(Class c) {
IDLType idlType = null;
IDLTypesUtil idlTypesUtil = new IDLTypesUtil();
if( idlTypesUtil.isPrimitive(c) ) {
idlType = idlTypesUtil.getPrimitiveIDLTypeMapping(c);
} else if( c.isArray() ) {
// Calculate array depth, as well as base element type.
Class componentType = c.getComponentType();
int numArrayDimensions = 1;
while(componentType.isArray()) {
componentType = componentType.getComponentType();
numArrayDimensions++;
}
IDLType componentIdlType = classToIDLType(componentType);
String[] modules = BASE_IDL_ARRAY_MODULE_TYPE;
if( componentIdlType.hasModule() ) {
modules = (String[])ObjectUtility.concatenateArrays( modules,
componentIdlType.getModules() ) ;
}
String memberName = BASE_IDL_ARRAY_ELEMENT_TYPE +
numArrayDimensions + UNDERSCORE +
componentIdlType.getMemberName();
idlType = new IDLType(c, modules, memberName);
} else {
idlType = idlTypesUtil.getSpecialCaseIDLTypeMapping(c);
if (idlType == null) {
// Section 1.3.2.5 of Java2IDL spec defines mangling rules for
// inner classes.
String memberName = getUnmappedContainerName(c);
// replace inner class separator with double underscore
memberName = memberName.replaceAll("\\$",
INNER_CLASS_SEPARATOR);
if( hasLeadingUnderscore(memberName) ) {
memberName = mangleLeadingUnderscore(memberName);
}
// Get raw package name. If there is a package, it
// will still have the "." separators and none of the
// mangling rules will have been applied.
String packageName = getPackageName(c);
if (packageName == null) {
idlType = new IDLType( c, memberName ) ;
} else {
// If this is a generated IDL Entity Type we need to
// prepend org_omg_boxedIDL per sections 1.3.5 and 1.3.9
if (idlTypesUtil.isEntity(c)) {
packageName = "org.omg.boxedIDL." + packageName ;
}
// Section 1.3.2.1 and 1.3.2.6 of Java2IDL spec defines
// rules for mapping java packages to IDL modules and for
// mangling module name portion of type name. NOTE that
// of the individual identifier mangling rules,
// only the leading underscore test is done here.
// The other two(IDL Keyword, Illegal Unicode chars) are
// done in mangleOverloadedMethodName.
StringTokenizer tokenizer =
new StringTokenizer(packageName, ".");
String[] modules = new String[ tokenizer.countTokens() ] ;
int index = 0 ;
while (tokenizer.hasMoreElements()) {
String next = tokenizer.nextToken();
String nextMangled = hasLeadingUnderscore(next) ?
mangleLeadingUnderscore(next) : next;
modules[index++] = nextMangled ;
}
idlType = new IDLType(c, modules, memberName);
}
}
}
return idlType;
}
/**
* Return Class' package name or null if there is no package.
*/
private static String getPackageName(Class c) {
Package thePackage = c.getPackage();
String packageName = null;
// Try to get package name by introspection. Some classloaders might
// not provide this information, so check for null.
if( thePackage != null ) {
packageName = thePackage.getName();
} else {
// brute force method
String fullyQualifiedClassName = c.getName();
int lastDot = fullyQualifiedClassName.indexOf('.');
packageName = (lastDot == -1) ? null :
fullyQualifiedClassName.substring(0, lastDot);
}
return packageName;
}
private static String getMappedContainerName(Class c) {
String unmappedName = getUnmappedContainerName(c);
return mangleIdentifier(unmappedName);
}
/**
* Return portion of class name excluding package name.
*/
private static String getUnmappedContainerName(Class c) {
String memberName = null;
String packageName = getPackageName(c);
String fullyQualifiedClassName = c.getName();
if( packageName != null ) {
int packageLength = packageName.length();
memberName = fullyQualifiedClassName.substring(packageLength + 1);
} else {
memberName = fullyQualifiedClassName;
}
return memberName;
}
/**
* Internal helper class for tracking information related to each
* interface method while we're building the name translation table.
*/
private static class IDLMethodInfo
{
public Method method;
public String propertyType;
// If this is a property, originalName holds the original
// attribute name. Otherwise, it holds the original method name.
public String originalName;
// If this is a property, mangledName holds the mangled attribute
// name. Otherwise, it holds the mangled method name.
public String mangledName;
}
public String toString() {
StringBuffer contents = new StringBuffer();
contents.append("IDLNameTranslator[" );
for( int ctr=0; ctr<interf_.length; ctr++) {
if (ctr != 0)
contents.append( " " ) ;
contents.append( interf_[ctr].getName() ) ;
}
contents.append("]\n");
for(Iterator iter = methodToIDLNameMap_.keySet().iterator();
iter.hasNext();) {
Method method = (Method) iter.next();
String idlName = (String) methodToIDLNameMap_.get(method);
contents.append(idlName + ":" + method + "\n");
}
return contents.toString();
}
public static void main(String[] args) {
Class remoteInterface = java.rmi.Remote.class;
if( args.length > 0 ) {
String className = args[0];
try {
remoteInterface = Class.forName(className);
} catch(Exception e) {
e.printStackTrace();
System.exit(-1);
}
}
System.out.println("Building name translation for " + remoteInterface);
try {
IDLNameTranslator nameTranslator =
IDLNameTranslatorImpl.get(remoteInterface);
System.out.println(nameTranslator);
} catch(IllegalStateException ise) {
ise.printStackTrace();
}
}
}

View File

@ -1,544 +0,0 @@
/*
* Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.presentation.rmi ;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
/**
* Utility class for testing RMI/IDL Types as defined in
* Section 1.2 of The Java Language to IDL Mapping. Note that
* these are static checks only. Runtime checks, such as those
* described in Section 1.2.3, #3, are not covered.
*/
public class IDLTypesUtil {
public static final String JAVA_GET_PROPERTY_PREFIX = "get";
public static final String JAVA_SET_PROPERTY_PREFIX = "set";
public static final String JAVA_IS_PROPERTY_PREFIX = "is";
public static final int VALID_TYPE = 0;
public static final int INVALID_TYPE = 1;
/**
* Validate a class to ensure it conforms to the rules for a
* Java RMI/IIOP interface.
*
* @throws IDLTypeException if not a valid RMI/IIOP interface.
*/
public void validateRemoteInterface(Class c) throws IDLTypeException
{
if( c == null ) {
throw new IllegalArgumentException();
}
if( !c.isInterface() ) {
String msg = "Class " + c + " must be a java interface.";
throw new IDLTypeException(msg);
}
if( !java.rmi.Remote.class.isAssignableFrom(c) ) {
String msg = "Class " + c + " must extend java.rmi.Remote, " +
"either directly or indirectly.";
throw new IDLTypeException(msg);
}
// Get all methods, including super-interface methods.
Method[] methods = c.getMethods();
for(int i = 0; i < methods.length; i++) {
Method next = methods[i];
validateExceptions(next);
}
// Removed because of bug 4989053
// validateDirectInterfaces(c);
validateConstants(c);
return;
}
public boolean isRemoteInterface(Class c)
{
boolean remoteInterface = true;
try {
validateRemoteInterface(c);
} catch(IDLTypeException ite) {
remoteInterface = false;
}
return remoteInterface;
}
/**
* Section 1.2.2 Primitive Types
*/
public boolean isPrimitive(Class c)
{
if( c == null ) {
throw new IllegalArgumentException();
}
return c.isPrimitive();
}
/**
* Section 1.2.4
*/
public boolean isValue(Class c)
{
if( c == null ) {
throw new IllegalArgumentException();
}
return
(!c.isInterface() &&
java.io.Serializable.class.isAssignableFrom(c) &&
!java.rmi.Remote.class.isAssignableFrom(c));
}
/**
* Section 1.2.5
*/
public boolean isArray(Class c)
{
boolean arrayType = false;
if( c == null ) {
throw new IllegalArgumentException();
}
if( c.isArray() ) {
Class componentType = c.getComponentType();
arrayType =
(isPrimitive(componentType) || isRemoteInterface(componentType) ||
isEntity(componentType) || isException(componentType) ||
isValue(componentType) || isObjectReference(componentType) );
}
return arrayType;
}
/**
* Section 1.2.6
*/
public boolean isException(Class c)
{
if( c == null ) {
throw new IllegalArgumentException();
}
// Must be a checked exception, not including RemoteException or
// its subclasses.
return isCheckedException(c) && !isRemoteException(c) && isValue(c);
}
public boolean isRemoteException(Class c)
{
if( c == null ) {
throw new IllegalArgumentException();
}
return java.rmi.RemoteException.class.isAssignableFrom(c) ;
}
public boolean isCheckedException(Class c)
{
if( c == null ) {
throw new IllegalArgumentException();
}
return Throwable.class.isAssignableFrom(c) &&
!RuntimeException.class.isAssignableFrom(c) &&
!Error.class.isAssignableFrom(c) ;
}
/**
* Section 1.2.7
*/
public boolean isObjectReference(Class c)
{
if( c == null ) {
throw new IllegalArgumentException();
}
return (c.isInterface() &&
org.omg.CORBA.Object.class.isAssignableFrom(c));
}
/**
* Section 1.2.8
*/
public boolean isEntity(Class c)
{
if( c == null ) {
throw new IllegalArgumentException();
}
Class superClass = c.getSuperclass();
return (!c.isInterface() &&
(superClass != null) &&
(org.omg.CORBA.portable.IDLEntity.class.isAssignableFrom(c)));
}
public String javaPropertyPrefixToIDL( String javaPrefix )
{
return "_" + javaPrefix + "_" ;
}
/**
* Return the property type if given method is legal property accessor as defined in
* Section 1.3.4.3 of Java2IDL spec. Result is one of: JAVA_GET_PROPERTY_PREFIX,
* JAVA_SET_PROPERTY_PREFIX, JAVA_IS_PROPERTY_PREFIX.
*/
public String propertyAccessorMethodType(Method m, Class c) {
String methodName = m.getName();
Class returnType = m.getReturnType();
Class[] parameters = m.getParameterTypes();
Class[] exceptionTypes = m.getExceptionTypes();
String propertyType = null;
if( methodName.startsWith(JAVA_GET_PROPERTY_PREFIX) ) {
if((parameters.length == 0) && (returnType != Void.TYPE) &&
!hasCorrespondingReadProperty(m, c, JAVA_IS_PROPERTY_PREFIX) {
propertyType = JAVA_GET_PROPERTY_PREFIX;
}
} else if( methodName.startsWith(JAVA_SET_PROPERTY_PREFIX) ) {
if((returnType == Void.TYPE) && (parameters.length == 1)) {
if (hasCorrespondingReadProperty(m, c, JAVA_GET_PROPERTY_PREFIX) ||
hasCorrespondingReadProperty(m, c, JAVA_IS_PROPERTY_PREFIX)) {
propertyType = JAVA_SET_PROPERTY_PREFIX;
}
}
} else if( methodName.startsWith(JAVA_IS_PROPERTY_PREFIX) ) {
if((parameters.length == 0) && (returnType == Boolean.TYPE)) {
propertyType = JAVA_IS_PROPERTY_PREFIX;
}
}
// Some final checks that apply to all properties.
if( propertyType != null ) {
if(!validPropertyExceptions(m) ||
(methodName.length() <= propertyType.length())) {
propertyType = null;
}
}
return propertyType ;
}
private boolean hasCorrespondingReadProperty
(Method writeProperty, Class c, String readPropertyPrefix) {
String writePropertyMethodName = writeProperty.getName();
Class[] writePropertyParameters = writeProperty.getParameterTypes();
boolean foundReadProperty = false;
try {
// Look for a valid corresponding Read property
String readPropertyMethodName =
writePropertyMethodName.replaceFirst
(JAVA_SET_PROPERTY_PREFIX, readPropertyPrefix);
Method readPropertyMethod = c.getMethod(readPropertyMethodName,
new Class[] {});
foundReadProperty =
((propertyAccessorMethodType(readPropertyMethod, c) != null) &&
(readPropertyMethod.getReturnType() ==
writePropertyParameters[0]));
} catch(Exception e) {
// ignore. this means we didn't find a corresponding get property.
}
return foundReadProperty;
}
public String getAttributeNameForProperty(String propertyName) {
String attributeName = null;
String prefix = null;
if( propertyName.startsWith(JAVA_GET_PROPERTY_PREFIX) ) {
prefix = JAVA_GET_PROPERTY_PREFIX;
} else if( propertyName.startsWith(JAVA_SET_PROPERTY_PREFIX) ) {
prefix = JAVA_SET_PROPERTY_PREFIX;
} else if( propertyName.startsWith(JAVA_IS_PROPERTY_PREFIX) ) {
prefix = JAVA_IS_PROPERTY_PREFIX;
}
if( (prefix != null) && (prefix.length() < propertyName.length()) ) {
String remainder = propertyName.substring(prefix.length());
if( (remainder.length() >= 2) &&
Character.isUpperCase(remainder.charAt(0)) &&
Character.isUpperCase(remainder.charAt(1)) ) {
// don't set the first letter to lower-case if the
// first two are upper-case
attributeName = remainder;
} else {
attributeName = Character.toLowerCase(remainder.charAt(0)) +
remainder.substring(1);
}
}
return attributeName;
}
/**
* Return IDL Type name for primitive types as defined in
* Section 1.3.3 of Java2IDL spec or null if not a primitive type.
*/
public IDLType getPrimitiveIDLTypeMapping(Class c) {
if( c == null ) {
throw new IllegalArgumentException();
}
if( c.isPrimitive() ) {
if( c == Void.TYPE ) {
return new IDLType( c, "void" ) ;
} else if( c == Boolean.TYPE ) {
return new IDLType( c, "boolean" ) ;
} else if( c == Character.TYPE ) {
return new IDLType( c, "wchar" ) ;
} else if( c == Byte.TYPE ) {
return new IDLType( c, "octet" ) ;
} else if( c == Short.TYPE ) {
return new IDLType( c, "short" ) ;
} else if( c == Integer.TYPE ) {
return new IDLType( c, "long" ) ;
} else if( c == Long.TYPE ) {
return new IDLType( c, "long_long" ) ;
} else if( c == Float.TYPE ) {
return new IDLType( c, "float" ) ;
} else if( c == Double.TYPE ) {
return new IDLType( c, "double" ) ;
}
}
return null;
}
/**
* Return IDL Type name for special case type mappings as defined in
* Table 1-1 of Java2IDL spec or null if given class is not a special
* type.
*/
public IDLType getSpecialCaseIDLTypeMapping(Class c) {
if( c == null ) {
throw new IllegalArgumentException();
}
if( c == java.lang.Object.class ) {
return new IDLType( c, new String[] { "java", "lang" },
"Object" ) ;
} else if( c == java.lang.String.class ) {
return new IDLType( c, new String[] { "CORBA" },
"WStringValue" ) ;
} else if( c == java.lang.Class.class ) {
return new IDLType( c, new String[] { "javax", "rmi", "CORBA" },
"ClassDesc" ) ;
} else if( c == java.io.Serializable.class ) {
return new IDLType( c, new String[] { "java", "io" },
"Serializable" ) ;
} else if( c == java.io.Externalizable.class ) {
return new IDLType( c, new String[] { "java", "io" },
"Externalizable" ) ;
} else if( c == java.rmi.Remote.class ) {
return new IDLType( c, new String[] { "java", "rmi" },
"Remote" ) ;
} else if( c == org.omg.CORBA.Object.class ) {
return new IDLType( c, "Object" ) ;
} else {
return null;
}
}
/**
* Implements 1.2.3 #2 and #4
*/
private void validateExceptions(Method method) throws IDLTypeException {
Class[] exceptions = method.getExceptionTypes();
boolean declaresRemoteExceptionOrSuperClass = false;
// Section 1.2.3, #2
for(int eIndex = 0; eIndex < exceptions.length; eIndex++) {
Class exception = exceptions[eIndex];
if( isRemoteExceptionOrSuperClass(exception) ) {
declaresRemoteExceptionOrSuperClass = true;
break;
}
}
if( !declaresRemoteExceptionOrSuperClass ) {
String msg = "Method '" + method + "' must throw at least one " +
"exception of type java.rmi.RemoteException or one of its " +
"super-classes";
throw new IDLTypeException(msg);
}
// Section 1.2.3, #4
// See also bug 4972402
// For all exceptions E in exceptions,
// (isCheckedException(E) => (isValue(E) || RemoteException.isAssignableFrom( E ) )
for(int eIndex = 0; eIndex < exceptions.length; eIndex++) {
Class exception = exceptions[eIndex];
if (isCheckedException(exception) && !isValue(exception) &&
!isRemoteException(exception))
{
String msg = "Exception '" + exception + "' on method '" +
method + "' is not a allowed RMI/IIOP exception type";
throw new IDLTypeException(msg);
}
}
return;
}
/**
* Returns true if the method's throw clause conforms to the exception
* restrictions for properties as defined in Section 1.3.4.3 of
* Java2IDL spec. This means that for all exceptions E declared on the
* method, E isChecked => RemoteException.isAssignableFrom( E ).
*/
private boolean validPropertyExceptions(Method method)
{
Class[] exceptions = method.getExceptionTypes();
for(int eIndex = 0; eIndex < exceptions.length; eIndex++) {
Class exception = exceptions[eIndex];
if (isCheckedException(exception) && !isRemoteException(exception))
return false ;
}
return true;
}
/**
* Implements Section 1.2.3, #2.
*/
private boolean isRemoteExceptionOrSuperClass(Class c) {
return
((c == java.rmi.RemoteException.class) ||
(c == java.io.IOException.class) ||
(c == java.lang.Exception.class) ||
(c == java.lang.Throwable.class));
}
/**
* Implements Section 1.2.3, #5.
*/
private void validateDirectInterfaces(Class c) throws IDLTypeException {
Class[] directInterfaces = c.getInterfaces();
if( directInterfaces.length < 2 ) {
return;
}
Set allMethodNames = new HashSet();
Set currentMethodNames = new HashSet();
for(int i = 0; i < directInterfaces.length; i++) {
Class next = directInterfaces[i];
Method[] methods = next.getMethods();
// Comparison is based on method names only. First collect
// all methods from current interface, eliminating duplicate
// names.
currentMethodNames.clear();
for(int m = 0; m < methods.length; m++) {
currentMethodNames.add(methods[m].getName());
}
// Now check each method against list of all unique method
// names processed so far.
for(Iterator iter=currentMethodNames.iterator(); iter.hasNext();) {
String methodName = (String) iter.next();
if( allMethodNames.contains(methodName) ) {
String msg = "Class " + c + " inherits method " +
methodName + " from multiple direct interfaces.";
throw new IDLTypeException(msg);
} else {
allMethodNames.add(methodName);
}
}
}
return;
}
/**
* Implements 1.2.3 #6
*/
private void validateConstants(final Class c)
throws IDLTypeException {
Field[] fields = null;
try {
fields = (Field[])
java.security.AccessController.doPrivileged
(new java.security.PrivilegedExceptionAction() {
public java.lang.Object run() throws Exception {
return c.getFields();
}
});
} catch(java.security.PrivilegedActionException pae) {
IDLTypeException ite = new IDLTypeException();
ite.initCause(pae);
throw ite;
}
for(int i = 0; i < fields.length; i++) {
Field next = fields[i];
Class fieldType = next.getType();
if( (fieldType != java.lang.String.class) &&
!isPrimitive(fieldType) ) {
String msg = "Constant field '" + next.getName() +
"' in class '" + next.getDeclaringClass().getName() +
"' has invalid type' " + next.getType() + "'. Constants" +
" in RMI/IIOP interfaces can only have primitive" +
" types and java.lang.String types.";
throw new IDLTypeException(msg);
}
}
return;
}
}

View File

@ -1,138 +0,0 @@
/*
* Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.iiop;
import com.sun.corba.se.impl.protocol.Request;
import com.sun.corba.se.impl.core.ClientRequest;
import com.sun.corba.se.impl.core.ServiceContext;
import com.sun.corba.se.impl.core.ServiceContexts;
import com.sun.corba.se.impl.core.ClientResponse;
import com.sun.corba.se.impl.core.ServerRequest;
import com.sun.corba.se.impl.core.ServerResponse;
import com.sun.corba.se.impl.corba.IOR;
import com.sun.corba.se.impl.corba.GIOPVersion;
import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
import com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage;
import com.sun.corba.se.impl.orbutil.ORBConstants;
import com.sun.corba.se.impl.core.ORBVersion;
import com.sun.corba.se.impl.core.ORB;
import com.sun.corba.se.impl.orbutil.ORBUtility;
import com.sun.corba.se.impl.ior.ObjectKeyFactory ;
import com.sun.corba.se.impl.ior.ObjectKey ;
import com.sun.corba.se.impl.ior.ObjectKeyTemplate ;
import com.sun.corba.se.impl.ior.IIOPProfile;
public class LocalClientRequestImpl extends IIOPOutputStream
implements ClientRequest
{
public LocalClientRequestImpl( GIOPVersion gv,
ORB orb, IOR ior, short addrDisposition,
String operationName, boolean oneway, ServiceContexts svc,
int requestId, byte streamFormatVersion)
{
super(gv,
orb,
null,
BufferManagerFactory.newBufferManagerWrite(BufferManagerFactory.GROW),
streamFormatVersion);
this.isOneway = oneway;
boolean responseExpected = !isOneway;
IIOPProfile iop = ior.getProfile();
ObjectKey okey = iop.getObjectKey();
ObjectKeyTemplate oktemp = okey.getTemplate() ;
ORBVersion version = oktemp.getORBVersion() ;
orb.setORBVersion( version ) ;
this.request = MessageBase.createRequest(orb, gv, requestId,
responseExpected, ior, addrDisposition, operationName, svc, null);
setMessage(request);
request.write(this);
// mark beginning of msg body for possible later use
bodyBegin = getSize();
}
public int getRequestId() {
return request.getRequestId();
}
public boolean isOneWay() {
return isOneway;
}
public ServiceContexts getServiceContexts() {
return request.getServiceContexts();
}
public String getOperationName() {
return request.getOperation();
}
public ObjectKey getObjectKey() {
return request.getObjectKey();
}
public ServerRequest getServerRequest()
{
// Set the size of the marshalled data in the message header.
getMessage().setSize( getByteBuffer(), getSize() ) ;
// Construct a new ServerRequest out of the buffer in this ClientRequest
LocalServerRequestImpl serverRequest = new LocalServerRequestImpl(
(ORB)orb(), toByteArray(), request ) ;
// Skip over all of the GIOP header information. This positions
// the offset in the buffer so that the skeleton can correctly read
// the marshalled arguments.
serverRequest.setIndex( bodyBegin ) ;
return serverRequest ;
}
public ClientResponse invoke()
{
ORB myORB = (ORB)orb() ;
ServerResponse serverResponse = myORB.process( getServerRequest() ) ;
LocalServerResponseImpl lsr = (LocalServerResponseImpl)serverResponse ;
return lsr.getClientResponse() ;
}
/**
* Check to see if the request is local.
*/
public boolean isLocal(){
return true;
}
private RequestMessage request;
private int bodyBegin;
private boolean isOneway;
}

View File

@ -1,162 +0,0 @@
/*
* Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.iiop;
import java.io.IOException;
import org.omg.CORBA.SystemException;
import org.omg.CORBA.CompletionStatus;
import com.sun.corba.se.impl.core.Response;
import com.sun.corba.se.impl.core.ClientResponse;
import com.sun.corba.se.impl.corba.IOR;
import com.sun.corba.se.impl.core.ORB;
import com.sun.corba.se.impl.core.ServiceContext;
import com.sun.corba.se.impl.core.ServiceContexts;
import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage;
import com.sun.corba.se.impl.orbutil.MinorCodes;
class LocalClientResponseImpl extends IIOPInputStream implements ClientResponse
{
LocalClientResponseImpl(ORB orb, byte[] buf, ReplyMessage header)
{
super(orb, buf, header.getSize(), header.isLittleEndian(), header, null);
this.reply = header;
// NOTE (Ram J) (06/02/2000) if we set result.setIndex(bodyBegin)
// in LocalServerResponse.getClientResponse(), then we do not need
// to read the headers (done below) anymore.
// This will be an optimisation which is can be done to speed up the
// local invocation by avoiding reading the headers in the local cases.
// BUGFIX(Ram Jeyaraman) This has been moved from
// LocalServerResponse.getClientResponse()
// Skip over all of the GIOP header information. This positions
// the offset in the buffer so that the skeleton can correctly read
// the marshalled arguments.
this.setIndex(Message.GIOPMessageHeaderLength);
// BUGFIX(Ram Jeyaraman) For local invocations, the reply mesg fields
// needs to be set, by reading the response buffer contents
// to correctly set the exception type and other info.
this.reply.read(this);
}
LocalClientResponseImpl(SystemException ex)
{
this.systemException = ex;
}
public boolean isSystemException() {
if ( reply != null )
return reply.getReplyStatus() == ReplyMessage.SYSTEM_EXCEPTION;
else
return (systemException != null);
}
public boolean isUserException() {
if ( reply != null )
return reply.getReplyStatus() == ReplyMessage.USER_EXCEPTION;
else
return false;
}
public boolean isLocationForward() {
if ( reply != null ) {
return ( (reply.getReplyStatus() == ReplyMessage.LOCATION_FORWARD) ||
(reply.getReplyStatus() == ReplyMessage.LOCATION_FORWARD_PERM) );
//return reply.getReplyStatus() == ReplyMessage.LOCATION_FORWARD;
} else {
return false;
}
}
public boolean isDifferentAddrDispositionRequested() {
if (reply != null) {
return reply.getReplyStatus() == ReplyMessage.NEEDS_ADDRESSING_MODE;
}
return false;
}
public short getAddrDisposition() {
if (reply != null) {
return reply.getAddrDisposition();
}
throw new org.omg.CORBA.INTERNAL(
"Null reply in getAddrDisposition",
MinorCodes.NULL_REPLY_IN_GET_ADDR_DISPOSITION,
CompletionStatus.COMPLETED_MAYBE);
}
public IOR getForwardedIOR() {
if ( reply != null )
return reply.getIOR();
else
return null;
}
public int getRequestId() {
if ( reply != null )
return reply.getRequestId();
else
throw new org.omg.CORBA.INTERNAL("Error in getRequestId");
}
public ServiceContexts getServiceContexts() {
if ( reply != null )
return reply.getServiceContexts();
else
return null;
}
public SystemException getSystemException() {
if ( reply != null )
return reply.getSystemException();
else
return systemException;
}
public java.lang.String peekUserExceptionId() {
mark(Integer.MAX_VALUE);
String result = read_string();
reset();
return result;
}
/**
* Check to see if the response is local.
*/
public boolean isLocal(){
return true;
}
private ReplyMessage reply;
private SystemException systemException;
}

View File

@ -1,208 +0,0 @@
/*
* Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.iiop;
import org.omg.CORBA.SystemException;
import com.sun.corba.se.impl.core.ServerRequest;
import com.sun.corba.se.impl.core.ServiceContext;
import com.sun.corba.se.impl.core.DuplicateServiceContext;
import com.sun.corba.se.impl.core.UEInfoServiceContext;
import com.sun.corba.se.impl.core.ServiceContexts;
import com.sun.corba.se.impl.core.ServerResponse;
import com.sun.corba.se.impl.corba.IOR;
import com.sun.corba.se.impl.core.ORB;
import com.sun.corba.se.impl.orbutil.ORBUtility; //d11638
import org.omg.CORBA.portable.UnknownException;
import org.omg.CORBA.UNKNOWN;
import org.omg.CORBA.CompletionStatus;
import com.sun.corba.se.impl.ior.ObjectKey;
import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage;
import com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage;
class LocalServerRequestImpl extends IIOPInputStream implements ServerRequest {
org.omg.CORBA.portable.OutputStream replyStream;
org.omg.CORBA.portable.OutputStream exceptionReplyStream;
LocalServerRequestImpl(ORB orb, byte[] buf, RequestMessage header)
{
super(orb, buf, header.getSize(), header.isLittleEndian(), header, null );
this.request = header;
}
public int getRequestId() {
return request.getRequestId();
}
public boolean isOneWay() {
return !request.isResponseExpected();
}
public ServiceContexts getServiceContexts() {
return request.getServiceContexts();
}
public String getOperationName() {
return request.getOperation();
}
public ObjectKey getObjectKey() {
return request.getObjectKey();
}
public ServerResponse createResponse(ServiceContexts svc)
{
return new LocalServerResponseImpl(this, svc);
}
public org.omg.CORBA.portable.OutputStream createReply() {
if (replyStream == null) {
replyStream = (org.omg.CORBA.portable.OutputStream)
createResponse(null);
}
return replyStream;
}
public org.omg.CORBA.portable.OutputStream createExceptionReply() {
if (exceptionReplyStream == null) {
exceptionReplyStream = (org.omg.CORBA.portable.OutputStream)
createUserExceptionResponse(null);
}
return exceptionReplyStream;
}
public ServerResponse createUserExceptionResponse(
ServiceContexts svc)
{
return new LocalServerResponseImpl(this, svc, true);
}
public ServerResponse createUnknownExceptionResponse(
UnknownException ex) {
ServiceContexts contexts = null;
SystemException sys = new UNKNOWN( 0,
CompletionStatus.COMPLETED_MAYBE);
try {
contexts = new ServiceContexts( (ORB)orb() );
UEInfoServiceContext uei = new UEInfoServiceContext(sys);
contexts.put(uei) ;
} catch (DuplicateServiceContext d) {
// can't happen
}
return createSystemExceptionResponse(sys,contexts);
}
public ServerResponse createSystemExceptionResponse(
SystemException ex, ServiceContexts svc) {
// Only do this if interceptors have been initialized on this request
// and have not completed their lifecycle (otherwise the info stack
// may be empty or have a different request's entry on top).
if (executePIInResponseConstructor()) {
// Inform Portable Interceptors of the SystemException. This is
// required to be done here because the ending interception point
// is called in the ServerResponseImpl constructor called below
// but we do not currently write the SystemException into the
// response until after the ending point is called.
ORB orb = (ORB)orb();
orb.getPIHandler().setServerPIInfo( ex );
}
if (orb() != null && ((ORB)orb()).subcontractDebugFlag && ex != null)
ORBUtility.dprint(this, "Sending SystemException:", ex);
LocalServerResponseImpl response =
new LocalServerResponseImpl(this, svc, false);
ORBUtility.writeSystemException(ex, response);
return response;
}
public ServerResponse createLocationForward(
IOR ior, ServiceContexts svc) {
ReplyMessage reply = MessageBase.createReply( (ORB)orb(),
request.getGIOPVersion(), request.getRequestId(),
ReplyMessage.LOCATION_FORWARD, svc, ior);
LocalServerResponseImpl response =
new LocalServerResponseImpl(this, reply, ior);
return response;
}
private RequestMessage request;
/**
* Check to see if the request is local.
*/
public boolean isLocal(){
return true;
}
private boolean _executeReturnServantInResponseConstructor = false;
public boolean executeReturnServantInResponseConstructor()
{
return _executeReturnServantInResponseConstructor;
}
public void setExecuteReturnServantInResponseConstructor(boolean b)
{
_executeReturnServantInResponseConstructor = b;
}
private boolean _executeRemoveThreadInfoInResponseConstructor = false;
public boolean executeRemoveThreadInfoInResponseConstructor()
{
return _executeRemoveThreadInfoInResponseConstructor;
}
public void setExecuteRemoveThreadInfoInResponseConstructor(boolean b)
{
_executeRemoveThreadInfoInResponseConstructor = b;
}
private boolean _executePIInResponseConstructor = false;
public boolean executePIInResponseConstructor() {
return _executePIInResponseConstructor;
}
public void setExecutePIInResponseConstructor( boolean b ) {
_executePIInResponseConstructor = b;
}
// We know that we're talking to the same ValueHandler, so
// use the maximum version it supports.
public byte getStreamFormatVersionForReply() {
return ORBUtility.getMaxStreamFormatVersion();
}
}

View File

@ -1,192 +0,0 @@
/*
* Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.iiop;
import org.omg.CORBA.SystemException;
import com.sun.corba.se.impl.core.ServerResponse;
import com.sun.corba.se.impl.core.ORB;
import com.sun.corba.se.impl.corba.IOR;
import com.sun.corba.se.impl.core.ServiceContext;
import com.sun.corba.se.impl.core.ServiceContexts;
import com.sun.corba.se.impl.core.ClientResponse;
import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage;
class LocalServerResponseImpl
extends IIOPOutputStream
implements ServerResponse
{
LocalServerResponseImpl(LocalServerRequestImpl request, ServiceContexts svc)
{
this(request,
MessageBase.createReply(
(ORB)request.orb(),
request.getGIOPVersion(),
request.getRequestId(), ReplyMessage.NO_EXCEPTION,
svc, null),
null);
}
LocalServerResponseImpl(LocalServerRequestImpl request, ServiceContexts svc,
boolean user)
{
this(request,
MessageBase.createReply(
(ORB)request.orb(),
request.getGIOPVersion(), request.getRequestId(),
user ? ReplyMessage.USER_EXCEPTION :
ReplyMessage.SYSTEM_EXCEPTION,
svc, null),
null);
}
LocalServerResponseImpl( LocalServerRequestImpl request, ReplyMessage reply,
IOR ior)
{
super(request.getGIOPVersion(),
(ORB)request.orb(),
null,
BufferManagerFactory.newBufferManagerWrite(BufferManagerFactory.GROW),
request.getStreamFormatVersionForReply());
setMessage(reply);
ORB orb = (ORB)request.orb();
ServerResponseImpl.runServantPostInvoke(orb, request);
if( request.executePIInResponseConstructor() ) {
// Invoke server request ending interception points (send_*):
// Note: this may end up with a SystemException or an internal
// Runtime ForwardRequest.
orb.getPIHandler().invokeServerPIEndingPoint( reply );
// Note this will be executed even if a ForwardRequest or
// SystemException is thrown by a Portable Interceptors ending
// point since we end up in this constructor again anyway.
orb.getPIHandler().cleanupServerPIRequest();
// See (Local)ServerRequestImpl.createSystemExceptionResponse
// for why this is necesary.
request.setExecutePIInResponseConstructor(false);
}
// Once you get here then the final reply is available (i.e.,
// postinvoke and interceptors have completed.
if (request.executeRemoveThreadInfoInResponseConstructor()) {
ServerResponseImpl.removeThreadInfo(orb, request);
}
reply.write(this);
if (reply.getIOR() != null)
reply.getIOR().write(this);
this.reply = reply;
this.ior = reply.getIOR();
}
public boolean isSystemException() {
if (reply != null)
return reply.getReplyStatus() == ReplyMessage.SYSTEM_EXCEPTION;
return false;
}
public boolean isUserException() {
if (reply != null)
return reply.getReplyStatus() == ReplyMessage.USER_EXCEPTION;
return false;
}
public boolean isLocationForward() {
if (ior != null)
return true;
return false;
}
public IOR getForwardedIOR() {
return ior;
}
public int getRequestId() {
if (reply != null)
return reply.getRequestId();
return -1;
}
public ServiceContexts getServiceContexts() {
if (reply != null)
return reply.getServiceContexts();
return null;
}
public SystemException getSystemException() {
if (reply != null)
return reply.getSystemException();
return null;
}
public ReplyMessage getReply()
{
return reply ;
}
public ClientResponse getClientResponse()
{
// set the size of the marshalled data in the message header
getMessage().setSize(getByteBuffer(), getSize());
// Construct a new ClientResponse out of the buffer in this ClientRequest
LocalClientResponseImpl result =
new LocalClientResponseImpl( (ORB)orb(), toByteArray(), reply);
// NOTE (Ram J) (06/02/2000) if we set result.setIndex(bodyBegin) here
// then the LocalClientResponse does not need to read the headers anymore.
// This will be an optimisation which is can be done to speed up the
// local invocation by avoiding reading the headers in the local cases.
// BUGFIX(Ram Jeyaraman) result.setOffset is now done in
// LocalClientResponseImpl constructor.
/*
// Skip over all of the GIOP header information. This positions
// the offset in the buffer so that the skeleton can correctly read
// the marshalled arguments.
result.setOffset( bodyBegin ) ;
*/
return result ;
}
/**
* Check to see if the response is local.
*/
public boolean isLocal(){
return true;
}
private ReplyMessage reply;
private IOR ior; // forwarded IOR
}

View File

@ -1,710 +0,0 @@
/*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.transport;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectableChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.SocketChannel;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Collections;
import java.util.Hashtable;
import java.util.HashMap;
import java.util.Map;
import org.omg.CORBA.COMM_FAILURE;
import org.omg.CORBA.CompletionStatus;
import org.omg.CORBA.DATA_CONVERSION;
import org.omg.CORBA.INTERNAL;
import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.OBJECT_NOT_EXIST;
import org.omg.CORBA.SystemException;
import com.sun.org.omg.SendingContext.CodeBase;
import com.sun.corba.se.pept.broker.Broker;
import com.sun.corba.se.pept.encoding.InputObject;
import com.sun.corba.se.pept.encoding.OutputObject;
import com.sun.corba.se.pept.protocol.MessageMediator;
import com.sun.corba.se.pept.transport.Acceptor;
import com.sun.corba.se.pept.transport.Connection;
import com.sun.corba.se.pept.transport.ConnectionCache;
import com.sun.corba.se.pept.transport.ContactInfo;
import com.sun.corba.se.pept.transport.EventHandler;
import com.sun.corba.se.pept.transport.InboundConnectionCache;
import com.sun.corba.se.pept.transport.OutboundConnectionCache;
import com.sun.corba.se.pept.transport.ResponseWaitingRoom;
import com.sun.corba.se.pept.transport.Selector;
import com.sun.corba.se.spi.ior.IOR;
import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
import com.sun.corba.se.spi.logging.CORBALogDomains;
import com.sun.corba.se.spi.orb.ORB ;
import com.sun.corba.se.spi.orbutil.threadpool.Work;
import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
import com.sun.corba.se.spi.transport.CorbaContactInfo;
import com.sun.corba.se.spi.transport.CorbaConnection;
import com.sun.corba.se.spi.transport.CorbaResponseWaitingRoom;
import com.sun.corba.se.impl.encoding.CachedCodeBase;
import com.sun.corba.se.impl.encoding.CDRInputStream_1_0;
import com.sun.corba.se.impl.encoding.CDROutputObject;
import com.sun.corba.se.impl.encoding.CDROutputStream_1_0;
import com.sun.corba.se.impl.encoding.CodeSetComponentInfo;
import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry;
import com.sun.corba.se.impl.logging.ORBUtilSystemException;
import com.sun.corba.se.impl.orbutil.ORBConstants;
import com.sun.corba.se.impl.orbutil.ORBUtility;
import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase;
import com.sun.corba.se.impl.transport.CorbaResponseWaitingRoomImpl;
/**
* @author Ken Cavanaugh
*/
public class BufferConnectionImpl
extends
EventHandlerBase
implements
CorbaConnection,
Work
{
//
// New transport.
//
protected long enqueueTime;
public SocketChannel getSocketChannel()
{
return null;
}
// REVISIT:
// protected for test: genericRPCMSGFramework.IIOPConnection constructor.
//
// From iiop.Connection.java
//
protected long timeStamp = 0;
protected boolean isServer = false;
// Start at some value other than zero since this is a magic
// value in some protocols.
protected int requestId = 5;
protected CorbaResponseWaitingRoom responseWaitingRoom;
protected int state;
protected java.lang.Object stateEvent = new java.lang.Object();
protected java.lang.Object writeEvent = new java.lang.Object();
protected boolean writeLocked;
protected int serverRequestCount = 0;
// Server request map: used on the server side of Connection
// Maps request ID to IIOPInputStream.
Map serverRequestMap = new HashMap() ;
// This is a flag associated per connection telling us if the
// initial set of sending contexts were sent to the receiver
// already...
protected boolean postInitialContexts = false;
// Remote reference to CodeBase server (supplies
// FullValueDescription, among other things)
protected IOR codeBaseServerIOR;
// CodeBase cache for this connection. This will cache remote operations,
// handle connecting, and ensure we don't do any remote operations until
// necessary.
protected CachedCodeBase cachedCodeBase = new CachedCodeBase(this);
protected ORBUtilSystemException wrapper ;
List buffers ;
public BufferConnectionImpl(ORB orb, byte[][] data )
{
this.orb = orb;
wrapper = ORBUtilSystemException.get( orb,
CORBALogDomains.RPC_TRANSPORT ) ;
buffers = new ArrayList() ;
}
////////////////////////////////////////////////////
//
// framework.transport.Connection
//
public boolean shouldRegisterReadEvent()
{
return false;
}
public boolean shouldRegisterServerReadEvent()
{
return false;
}
public boolean read()
{
return true ;
}
protected CorbaMessageMediator readBits()
{
return null ;
}
protected boolean dispatch(CorbaMessageMediator messageMediator)
{
}
public boolean shouldUseDirectByteBuffers()
{
return false ;
}
// Only called from readGIOPMessage with (12, 0, 12) as arguments
// size is size of buffer to create
// offset is offset from start of message in buffer
// length is length to read
public ByteBuffer read(int size, int offset, int length)
throws IOException
{
byte[] buf = new byte[size];
readFully( buf, offset, length);
ByteBuffer byteBuffer = ByteBuffer.wrap(buf);
byteBuffer.limit(size);
return byteBuffer;
}
// Only called as read( buf, 12, msgsize-12 ) in readGIOPMessage
// We can ignore the byteBuffer parameter
// offset is the starting position to place data in the result
// length is the length of the data to read
public ByteBuffer read(ByteBuffer byteBuffer, int offset, int length)
throws IOException
{
int size = offset + length;
byte[] buf = new byte[size];
readFully(buf, offset, length);
return ByteBuffer.wrap(buf);
}
// Read size bytes from buffer list and place the data
// starting at offset in buf.
public void readFully(byte[] buf, int offset, int size)
throws IOException
{
int remaining = size ;
int position = offset ;
while (remaining > 0) {
ByteBuffer buff = (ByteBuffer)buffers.get(0) ;
int dataSize = buff.remaining() ;
int xferSize = dataSize ;
if (dataSize >= remaining) :
xferSize = remaining ;
buffers.remove(0) ;
}
buff.get( buf, offset, xferSize ) ;
offset += xferSize ;
remaining -= xferSize ;
}
}
public void write(ByteBuffer byteBuffer)
throws IOException
{
buffers.add( byteBuffer ) ;
}
/**
* Note:it is possible for this to be called more than once
*/
public synchronized void close()
{
}
public Acceptor getAcceptor()
{
return null;
}
public ContactInfo getContactInfo()
{
return null;
}
public EventHandler getEventHandler()
{
return this;
}
public OutputObject createOutputObject(MessageMediator messageMediator)
{
// REVISIT - remove this method from Connection and all it subclasses.
throw new RuntimeException("*****SocketOrChannelConnectionImpl.createOutputObject - should not be called.");
}
// This is used by the GIOPOutputObject in order to
// throw the correct error when handling code sets.
// Can we determine if we are on the server side by
// other means? XREVISIT
public boolean isServer()
{
return isServer;
}
public boolean isBusy()
{
return false ;
}
public long getTimeStamp()
{
return timeStamp;
}
public void setTimeStamp(long time)
{
timeStamp = time;
}
public void setState(String stateString)
{
synchronized (stateEvent) {
if (stateString.equals("ESTABLISHED")) {
state = ESTABLISHED;
stateEvent.notifyAll();
} else {
// REVISIT: ASSERT
}
}
}
public void writeLock()
{
}
public void writeUnlock()
{
}
public void sendWithoutLock(OutputObject outputObject)
{
}
public void registerWaiter(MessageMediator messageMediator)
{
}
public void unregisterWaiter(MessageMediator messageMediator)
{
}
public InputObject waitForResponse(MessageMediator messageMediator)
{
return null ;
}
public void setConnectionCache(ConnectionCache connectionCache)
{
}
public ConnectionCache getConnectionCache()
{
return null;
}
////////////////////////////////////////////////////
//
// EventHandler methods
//
public SelectableChannel getChannel()
{
return null;
}
public int getInterestOps()
{
return null;
}
// public Acceptor getAcceptor() - already defined above.
public Connection getConnection()
{
return this;
}
////////////////////////////////////////////////////
//
// Work methods.
//
public String getName()
{
return this.toString();
}
public void doWork()
{
}
public void setEnqueueTime(long timeInMillis)
{
enqueueTime = timeInMillis;
}
public long getEnqueueTime()
{
return enqueueTime;
}
////////////////////////////////////////////////////
//
// spi.transport.CorbaConnection.
//
public ResponseWaitingRoom getResponseWaitingRoom()
{
return null ;
}
// REVISIT - inteface defines isServer but already defined in
// higher interface.
public void serverRequestMapPut(int requestId,
CorbaMessageMediator messageMediator)
{
serverRequestMap.put(new Integer(requestId), messageMediator);
}
public CorbaMessageMediator serverRequestMapGet(int requestId)
{
return (CorbaMessageMediator)
serverRequestMap.get(new Integer(requestId));
}
public void serverRequestMapRemove(int requestId)
{
serverRequestMap.remove(new Integer(requestId));
}
// REVISIT: this is also defined in:
// com.sun.corba.se.spi.legacy.connection.Connection
public java.net.Socket getSocket()
{
return null;
}
/** It is possible for a Close Connection to have been
** sent here, but we will not check for this. A "lazy"
** Exception will be thrown in the Worker thread after the
** incoming request has been processed even though the connection
** is closed before the request is processed. This is o.k because
** it is a boundary condition. To prevent it we would have to add
** more locks which would reduce performance in the normal case.
**/
public synchronized void serverRequestProcessingBegins()
{
serverRequestCount++;
}
public synchronized void serverRequestProcessingEnds()
{
serverRequestCount--;
}
//
//
//
public synchronized int getNextRequestId()
{
return requestId++;
}
// Negotiated code sets for char and wchar data
protected CodeSetComponentInfo.CodeSetContext codeSetContext = null;
public ORB getBroker()
{
return orb;
}
public CodeSetComponentInfo.CodeSetContext getCodeSetContext()
{
// Needs to be synchronized for the following case when the client
// doesn't send the code set context twice, and we have two threads
// in ServerRequestDispatcher processCodeSetContext.
//
// Thread A checks to see if there is a context, there is none, so
// it calls setCodeSetContext, getting the synch lock.
// Thread B checks to see if there is a context. If we didn't synch,
// it might decide to outlaw wchar/wstring.
if (codeSetContext == null) {
synchronized(this) {
return codeSetContext;
}
}
return codeSetContext;
}
public synchronized void setCodeSetContext(CodeSetComponentInfo.CodeSetContext csc) {
// Double check whether or not we need to do this
if (codeSetContext == null) {
if (OSFCodeSetRegistry.lookupEntry(csc.getCharCodeSet()) == null ||
OSFCodeSetRegistry.lookupEntry(csc.getWCharCodeSet()) == null) {
// If the client says it's negotiated a code set that
// isn't a fallback and we never said we support, then
// it has a bug.
throw wrapper.badCodesetsFromClient() ;
}
codeSetContext = csc;
}
}
//
// from iiop.IIOPConnection.java
//
// Map request ID to an InputObject.
// This is so the client thread can start unmarshaling
// the reply and remove it from the out_calls map while the
// ReaderThread can still obtain the input stream to give
// new fragments. Only the ReaderThread touches the clientReplyMap,
// so it doesn't incur synchronization overhead.
public MessageMediator clientRequestMapGet(int requestId)
{
return null ;
}
protected MessageMediator clientReply_1_1;
public void clientReply_1_1_Put(MessageMediator x)
{
clientReply_1_1 = x;
}
public MessageMediator clientReply_1_1_Get()
{
return clientReply_1_1;
}
public void clientReply_1_1_Remove()
{
clientReply_1_1 = null;
}
protected MessageMediator serverRequest_1_1;
public void serverRequest_1_1_Put(MessageMediator x)
{
serverRequest_1_1 = x;
}
public MessageMediator serverRequest_1_1_Get()
{
return serverRequest_1_1;
}
public void serverRequest_1_1_Remove()
{
serverRequest_1_1 = null;
}
protected String getStateString( int state )
{
synchronized ( stateEvent ){
switch (state) {
case OPENING : return "OPENING" ;
case ESTABLISHED : return "ESTABLISHED" ;
case CLOSE_SENT : return "CLOSE_SENT" ;
case CLOSE_RECVD : return "CLOSE_RECVD" ;
case ABORT : return "ABORT" ;
default : return "???" ;
}
}
}
public synchronized boolean isPostInitialContexts() {
return postInitialContexts;
}
// Can never be unset...
public synchronized void setPostInitialContexts(){
postInitialContexts = true;
}
/**
* Wake up the outstanding requests on the connection, and hand them
* COMM_FAILURE exception with a given minor code.
*
* Also, delete connection from connection table and
* stop the reader thread.
* Note that this should only ever be called by the Reader thread for
* this connection.
*
* @param minor_code The minor code for the COMM_FAILURE major code.
* @param die Kill the reader thread (this thread) before exiting.
*/
public void purgeCalls(SystemException systemException,
boolean die, boolean lockHeld)
{
}
/*************************************************************************
* The following methods are for dealing with Connection cleaning for
* better scalability of servers in high network load conditions.
**************************************************************************/
public void sendCloseConnection(GIOPVersion giopVersion)
throws IOException
{
Message msg = MessageBase.createCloseConnection(giopVersion);
sendHelper(giopVersion, msg);
}
public void sendMessageError(GIOPVersion giopVersion)
throws IOException
{
Message msg = MessageBase.createMessageError(giopVersion);
sendHelper(giopVersion, msg);
}
/**
* Send a CancelRequest message. This does not lock the connection, so the
* caller needs to ensure this method is called appropriately.
* @exception IOException - could be due to abortive connection closure.
*/
public void sendCancelRequest(GIOPVersion giopVersion, int requestId)
throws IOException
{
Message msg = MessageBase.createCancelRequest(giopVersion, requestId);
sendHelper(giopVersion, msg);
}
protected void sendHelper(GIOPVersion giopVersion, Message msg)
throws IOException
{
// REVISIT: See comments in CDROutputObject constructor.
CDROutputObject outputObject =
new CDROutputObject((ORB)orb, null, giopVersion, this, msg,
ORBConstants.STREAM_FORMAT_VERSION_1);
msg.write(outputObject);
outputObject.writeTo(this);
}
public void sendCancelRequestWithLock(GIOPVersion giopVersion,
int requestId)
throws IOException
{
writeLock();
try {
sendCancelRequest(giopVersion, requestId);
} finally {
writeUnlock();
}
}
// Begin Code Base methods ---------------------------------------
//
// Set this connection's code base IOR. The IOR comes from the
// SendingContext. This is an optional service context, but all
// JavaSoft ORBs send it.
//
// The set and get methods don't need to be synchronized since the
// first possible get would occur during reading a valuetype, and
// that would be after the set.
// Sets this connection's code base IOR. This is done after
// getting the IOR out of the SendingContext service context.
// Our ORBs always send this, but it's optional in CORBA.
public final void setCodeBaseIOR(IOR ior) {
codeBaseServerIOR = ior;
}
public final IOR getCodeBaseIOR() {
return codeBaseServerIOR;
}
// Get a CodeBase stub to use in unmarshaling. The CachedCodeBase
// won't connect to the remote codebase unless it's necessary.
public final CodeBase getCodeBase() {
return cachedCodeBase;
}
// End Code Base methods -----------------------------------------
// Can be overridden in subclass for different options.
protected void setSocketOptions(Socket socket)
{
}
public String toString()
{
synchronized ( stateEvent ){
return
"BufferConnectionImpl[" + " "
+ getStateString( state ) + " "
+ shouldUseSelectThreadToWait() + " "
+ shouldUseWorkerThreadForEvent()
+ "]" ;
}
}
// Must be public - used in encoding.
public void dprint(String msg)
{
ORBUtility.dprint("SocketOrChannelConnectionImpl", msg);
}
protected void dprint(String msg, Throwable t)
{
dprint(msg);
t.printStackTrace(System.out);
}
}
// End of file.

View File

@ -365,3 +365,5 @@ c9dd82da51ed34a28f7c6b3245163ee962e94572 hs25-b40
46487ba40ff225654d0c51787ed3839bafcbd9f3 hs25-b43 46487ba40ff225654d0c51787ed3839bafcbd9f3 hs25-b43
f6921c876db192bba389cec062855a66372da01c jdk8-b101 f6921c876db192bba389cec062855a66372da01c jdk8-b101
530fe88b3b2c710f42810b3580d86a0d83ad6c1c hs25-b44 530fe88b3b2c710f42810b3580d86a0d83ad6c1c hs25-b44
c4697c1c448416108743b59118b4a2498b339d0c jdk8-b102
7f55137d6aa81efc6eb0035813709f2cb6a26b8b hs25-b45

View File

@ -29,11 +29,10 @@ public interface JVMTIThreadState {
public static final int JVMTI_THREAD_STATE_ALIVE = 0x0001; public static final int JVMTI_THREAD_STATE_ALIVE = 0x0001;
public static final int JVMTI_THREAD_STATE_TERMINATED = 0x0002; public static final int JVMTI_THREAD_STATE_TERMINATED = 0x0002;
public static final int JVMTI_THREAD_STATE_RUNNABLE = 0x0004; public static final int JVMTI_THREAD_STATE_RUNNABLE = 0x0004;
public static final int JVMTI_THREAD_STATE_WAITING = 0x0008; public static final int JVMTI_THREAD_STATE_WAITING = 0x0080;
public static final int JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010; public static final int JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010;
public static final int JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020; public static final int JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020;
public static final int JVMTI_THREAD_STATE_SLEEPING = 0x0040; public static final int JVMTI_THREAD_STATE_SLEEPING = 0x0040;
public static final int JVMTI_THREAD_STATE_WAITING_FOR_NOTIFICATION = 0x0080;
public static final int JVMTI_THREAD_STATE_IN_OBJECT_WAIT = 0x0100; public static final int JVMTI_THREAD_STATE_IN_OBJECT_WAIT = 0x0100;
public static final int JVMTI_THREAD_STATE_PARKED = 0x0200; public static final int JVMTI_THREAD_STATE_PARKED = 0x0200;
public static final int JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400; public static final int JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400;

View File

@ -32,7 +32,7 @@ import sun.jvm.hotspot.types.*;
// to the sys_thread_t structure of the classic JVM implementation. // to the sys_thread_t structure of the classic JVM implementation.
public class OSThread extends VMObject { public class OSThread extends VMObject {
private static JIntField interruptedField; private static JIntField interruptedField;
private static JIntField threadIdField; private static Field threadIdField;
static { static {
VM.registerVMInitializedObserver(new Observer() { VM.registerVMInitializedObserver(new Observer() {
public void update(Observable o, Object data) { public void update(Observable o, Object data) {
@ -44,7 +44,7 @@ public class OSThread extends VMObject {
private static synchronized void initialize(TypeDataBase db) { private static synchronized void initialize(TypeDataBase db) {
Type type = db.lookupType("OSThread"); Type type = db.lookupType("OSThread");
interruptedField = type.getJIntField("_interrupted"); interruptedField = type.getJIntField("_interrupted");
threadIdField = type.getJIntField("_thread_id"); threadIdField = type.getField("_thread_id");
} }
public OSThread(Address addr) { public OSThread(Address addr) {
@ -56,7 +56,7 @@ public class OSThread extends VMObject {
} }
public int threadId() { public int threadId() {
return (int)threadIdField.getValue(addr); return threadIdField.getJInt(addr);
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -74,23 +74,24 @@ public class ClassDump extends Tool {
public void run() { public void run() {
// Ready to go with the database... // Ready to go with the database...
try { try {
// The name of the filter always comes from a System property. if (classFilter == null) {
// If we have a pkgList, pass it, otherwise let the filter read // If not already set, the name of the filter comes from a System property.
// its own System property for the list of classes. // If we have a pkgList, pass it, otherwise let the filter read
String filterClassName = System.getProperty("sun.jvm.hotspot.tools.jcore.filter", // its own System property for the list of classes.
"sun.jvm.hotspot.tools.jcore.PackageNameFilter"); String filterClassName = System.getProperty("sun.jvm.hotspot.tools.jcore.filter",
try { "sun.jvm.hotspot.tools.jcore.PackageNameFilter");
Class filterClass = Class.forName(filterClassName); try {
if (pkgList == null) { Class filterClass = Class.forName(filterClassName);
classFilter = (ClassFilter) filterClass.newInstance(); if (pkgList == null) {
} else { classFilter = (ClassFilter) filterClass.newInstance();
Constructor con = filterClass.getConstructor(String.class); } else {
classFilter = (ClassFilter) con.newInstance(pkgList); Constructor con = filterClass.getConstructor(String.class);
classFilter = (ClassFilter) con.newInstance(pkgList);
}
} catch(Exception exp) {
System.err.println("Warning: Can not create class filter!");
} }
} catch(Exception exp) {
System.err.println("Warning: Can not create class filter!");
} }
String outputDirectory = System.getProperty("sun.jvm.hotspot.tools.jcore.outputDir", "."); String outputDirectory = System.getProperty("sun.jvm.hotspot.tools.jcore.outputDir", ".");
setOutputDirectory(outputDirectory); setOutputDirectory(outputDirectory);

View File

@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013
HS_MAJOR_VER=25 HS_MAJOR_VER=25
HS_MINOR_VER=0 HS_MINOR_VER=0
HS_BUILD_NUMBER=44 HS_BUILD_NUMBER=45
JDK_MAJOR_VER=1 JDK_MAJOR_VER=1
JDK_MINOR_VER=8 JDK_MINOR_VER=8

View File

@ -2295,7 +2295,7 @@ void LIRGenerator::do_UnsafeGetObject(UnsafeGetObject* x) {
if (gen_type_check) { if (gen_type_check) {
// We have determined that offset == referent_offset && src != null. // We have determined that offset == referent_offset && src != null.
// if (src->_klass->_reference_type == REF_NONE) -> continue // if (src->_klass->_reference_type == REF_NONE) -> continue
__ move(new LIR_Address(src.result(), oopDesc::klass_offset_in_bytes(), UseCompressedKlassPointers ? T_OBJECT : T_ADDRESS), src_klass); __ move(new LIR_Address(src.result(), oopDesc::klass_offset_in_bytes(), T_ADDRESS), src_klass);
LIR_Address* reference_type_addr = new LIR_Address(src_klass, in_bytes(InstanceKlass::reference_type_offset()), T_BYTE); LIR_Address* reference_type_addr = new LIR_Address(src_klass, in_bytes(InstanceKlass::reference_type_offset()), T_BYTE);
LIR_Opr reference_type = new_register(T_INT); LIR_Opr reference_type = new_register(T_INT);
__ move(reference_type_addr, reference_type); __ move(reference_type_addr, reference_type);

View File

@ -878,7 +878,7 @@ objArrayOop ClassLoader::get_system_packages(TRAPS) {
instanceKlassHandle ClassLoader::load_classfile(Symbol* h_name, TRAPS) { instanceKlassHandle ClassLoader::load_classfile(Symbol* h_name, TRAPS) {
ResourceMark rm(THREAD); ResourceMark rm(THREAD);
EventMark m("loading class " INTPTR_FORMAT, (address)h_name); EventMark m("loading class %s", h_name->as_C_string());
ThreadProfilerMark tpm(ThreadProfilerMark::classLoaderRegion); ThreadProfilerMark tpm(ThreadProfilerMark::classLoaderRegion);
stringStream st; stringStream st;

View File

@ -60,6 +60,28 @@
#define DEFAULT_VENDOR_URL_BUG "http://bugreport.sun.com/bugreport/crash.jsp" #define DEFAULT_VENDOR_URL_BUG "http://bugreport.sun.com/bugreport/crash.jsp"
#define DEFAULT_JAVA_LAUNCHER "generic" #define DEFAULT_JAVA_LAUNCHER "generic"
// Disable options not supported in this release, with a warning if they
// were explicitly requested on the command-line
#define UNSUPPORTED_OPTION(opt, description) \
do { \
if (opt) { \
if (FLAG_IS_CMDLINE(opt)) { \
warning(description " is disabled in this release."); \
} \
FLAG_SET_DEFAULT(opt, false); \
} \
} while(0)
#define UNSUPPORTED_GC_OPTION(gc) \
do { \
if (gc) { \
if (FLAG_IS_CMDLINE(gc)) { \
warning(#gc " is not supported in this VM. Using Serial GC."); \
} \
FLAG_SET_DEFAULT(gc, false); \
} \
} while(0)
char** Arguments::_jvm_flags_array = NULL; char** Arguments::_jvm_flags_array = NULL;
int Arguments::_num_jvm_flags = 0; int Arguments::_num_jvm_flags = 0;
char** Arguments::_jvm_args_array = NULL; char** Arguments::_jvm_args_array = NULL;
@ -3128,14 +3150,17 @@ jint Arguments::finalize_vm_init_args(SysClassPath* scp_p, bool scp_assembly_req
FLAG_SET_DEFAULT(UseLargePages, false); FLAG_SET_DEFAULT(UseLargePages, false);
} }
// Tiered compilation is undefined with C1.
TieredCompilation = false;
#else #else
if (!FLAG_IS_DEFAULT(OptoLoopAlignment) && FLAG_IS_DEFAULT(MaxLoopPad)) { if (!FLAG_IS_DEFAULT(OptoLoopAlignment) && FLAG_IS_DEFAULT(MaxLoopPad)) {
FLAG_SET_DEFAULT(MaxLoopPad, OptoLoopAlignment-1); FLAG_SET_DEFAULT(MaxLoopPad, OptoLoopAlignment-1);
} }
#endif #endif
#ifndef TIERED
// Tiered compilation is undefined.
UNSUPPORTED_OPTION(TieredCompilation, "TieredCompilation");
#endif
// If we are running in a headless jre, force java.awt.headless property // If we are running in a headless jre, force java.awt.headless property
// to be true unless the property has already been set. // to be true unless the property has already been set.
// Also allow the OS environment variable JAVA_AWT_HEADLESS to set headless state. // Also allow the OS environment variable JAVA_AWT_HEADLESS to set headless state.
@ -3278,29 +3303,6 @@ void Arguments::set_shared_spaces_flags() {
} }
} }
// Disable options not supported in this release, with a warning if they
// were explicitly requested on the command-line
#define UNSUPPORTED_OPTION(opt, description) \
do { \
if (opt) { \
if (FLAG_IS_CMDLINE(opt)) { \
warning(description " is disabled in this release."); \
} \
FLAG_SET_DEFAULT(opt, false); \
} \
} while(0)
#define UNSUPPORTED_GC_OPTION(gc) \
do { \
if (gc) { \
if (FLAG_IS_CMDLINE(gc)) { \
warning(#gc " is not supported in this VM. Using Serial GC."); \
} \
FLAG_SET_DEFAULT(gc, false); \
} \
} while(0)
#if !INCLUDE_ALL_GCS #if !INCLUDE_ALL_GCS
static void force_serial_gc() { static void force_serial_gc() {
FLAG_SET_DEFAULT(UseSerialGC, true); FLAG_SET_DEFAULT(UseSerialGC, true);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -211,9 +211,9 @@ void GCNotifier::sendNotificationInternal(TRAPS) {
NotificationMark nm(request); NotificationMark nm(request);
Handle objGcInfo = createGcInfo(request->gcManager, request->gcStatInfo, THREAD); Handle objGcInfo = createGcInfo(request->gcManager, request->gcStatInfo, THREAD);
Handle objName = java_lang_String::create_from_platform_dependent_str(request->gcManager->name(), CHECK); Handle objName = java_lang_String::create_from_str(request->gcManager->name(), CHECK);
Handle objAction = java_lang_String::create_from_platform_dependent_str(request->gcAction, CHECK); Handle objAction = java_lang_String::create_from_str(request->gcAction, CHECK);
Handle objCause = java_lang_String::create_from_platform_dependent_str(request->gcCause, CHECK); Handle objCause = java_lang_String::create_from_str(request->gcCause, CHECK);
Klass* k = Management::sun_management_GarbageCollectorImpl_klass(CHECK); Klass* k = Management::sun_management_GarbageCollectorImpl_klass(CHECK);
instanceKlassHandle gc_mbean_klass(THREAD, k); instanceKlassHandle gc_mbean_klass(THREAD, k);

View File

@ -1831,13 +1831,13 @@ class ThreadTimesClosure: public ThreadClosure {
private: private:
objArrayHandle _names_strings; objArrayHandle _names_strings;
char **_names_chars; char **_names_chars;
typeArrayOop _times; typeArrayHandle _times;
int _names_len; int _names_len;
int _times_len; int _times_len;
int _count; int _count;
public: public:
ThreadTimesClosure(objArrayHandle names, typeArrayOop times); ThreadTimesClosure(objArrayHandle names, typeArrayHandle times);
~ThreadTimesClosure(); ~ThreadTimesClosure();
virtual void do_thread(Thread* thread); virtual void do_thread(Thread* thread);
void do_unlocked(); void do_unlocked();
@ -1845,9 +1845,9 @@ class ThreadTimesClosure: public ThreadClosure {
}; };
ThreadTimesClosure::ThreadTimesClosure(objArrayHandle names, ThreadTimesClosure::ThreadTimesClosure(objArrayHandle names,
typeArrayOop times) { typeArrayHandle times) {
assert(names() != NULL, "names was NULL"); assert(names() != NULL, "names was NULL");
assert(times != NULL, "times was NULL"); assert(times() != NULL, "times was NULL");
_names_strings = names; _names_strings = names;
_names_len = names->length(); _names_len = names->length();
_names_chars = NEW_C_HEAP_ARRAY(char*, _names_len, mtInternal); _names_chars = NEW_C_HEAP_ARRAY(char*, _names_len, mtInternal);
@ -1925,7 +1925,7 @@ JVM_ENTRY(jint, jmm_GetInternalThreadTimes(JNIEnv *env,
typeArrayOop ta = typeArrayOop(JNIHandles::resolve_non_null(times)); typeArrayOop ta = typeArrayOop(JNIHandles::resolve_non_null(times));
typeArrayHandle times_ah(THREAD, ta); typeArrayHandle times_ah(THREAD, ta);
ThreadTimesClosure ttc(names_ah, times_ah()); ThreadTimesClosure ttc(names_ah, times_ah);
{ {
MutexLockerEx ml(Threads_lock); MutexLockerEx ml(Threads_lock);
Threads::threads_do(&ttc); Threads::threads_do(&ttc);

View File

@ -125,13 +125,13 @@ void Exceptions::_throw_oop(Thread* thread, const char* file, int line, oop exce
} }
void Exceptions::_throw(Thread* thread, const char* file, int line, Handle h_exception, const char* message) { void Exceptions::_throw(Thread* thread, const char* file, int line, Handle h_exception, const char* message) {
ResourceMark rm;
assert(h_exception() != NULL, "exception should not be NULL"); assert(h_exception() != NULL, "exception should not be NULL");
// tracing (do this up front - so it works during boot strapping) // tracing (do this up front - so it works during boot strapping)
if (TraceExceptions) { if (TraceExceptions) {
ttyLocker ttyl; ttyLocker ttyl;
ResourceMark rm; tty->print_cr("Exception <%s%s%s> (" INTPTR_FORMAT ") \n"
tty->print_cr("Exception <%s>%s%s (" INTPTR_FORMAT " ) \n"
"thrown [%s, line %d]\nfor thread " INTPTR_FORMAT, "thrown [%s, line %d]\nfor thread " INTPTR_FORMAT,
h_exception->print_value_string(), h_exception->print_value_string(),
message ? ": " : "", message ? message : "", message ? ": " : "", message ? message : "",
@ -141,7 +141,9 @@ void Exceptions::_throw(Thread* thread, const char* file, int line, Handle h_exc
NOT_PRODUCT(Exceptions::debug_check_abort(h_exception, message)); NOT_PRODUCT(Exceptions::debug_check_abort(h_exception, message));
// Check for special boot-strapping/vm-thread handling // Check for special boot-strapping/vm-thread handling
if (special_exception(thread, file, line, h_exception)) return; if (special_exception(thread, file, line, h_exception)) {
return;
}
assert(h_exception->is_a(SystemDictionary::Throwable_klass()), "exception is not a subclass of java/lang/Throwable"); assert(h_exception->is_a(SystemDictionary::Throwable_klass()), "exception is not a subclass of java/lang/Throwable");
@ -149,7 +151,9 @@ void Exceptions::_throw(Thread* thread, const char* file, int line, Handle h_exc
thread->set_pending_exception(h_exception(), file, line); thread->set_pending_exception(h_exception(), file, line);
// vm log // vm log
Events::log_exception(thread, "Threw " INTPTR_FORMAT " at %s:%d", (address)h_exception(), file, line); Events::log_exception(thread, "Exception <%s%s%s> (" INTPTR_FORMAT ") thrown at [%s, line %d]",
h_exception->print_value_string(), message ? ": " : "", message ? message : "",
(address)h_exception(), file, line);
} }

View File

@ -395,7 +395,13 @@ bool GenericTaskQueue<E, F, N>::pop_local_slow(uint localBot, Age oldAge) {
template<class E, MEMFLAGS F, unsigned int N> template<class E, MEMFLAGS F, unsigned int N>
bool GenericTaskQueue<E, F, N>::pop_global(E& t) { bool GenericTaskQueue<E, F, N>::pop_global(E& t) {
Age oldAge = _age.get(); Age oldAge = _age.get();
uint localBot = _bottom; // Architectures with weak memory model require a barrier here
// to guarantee that bottom is not older than age,
// which is crucial for the correctness of the algorithm.
#if !(defined SPARC || defined IA32 || defined AMD64)
OrderAccess::fence();
#endif
uint localBot = OrderAccess::load_acquire((volatile juint*)&_bottom);
uint n_elems = size(localBot, oldAge.top()); uint n_elems = size(localBot, oldAge.top());
if (n_elems == 0) { if (n_elems == 0) {
return false; return false;
@ -644,7 +650,7 @@ public:
template<class E, MEMFLAGS F, unsigned int N> inline bool template<class E, MEMFLAGS F, unsigned int N> inline bool
GenericTaskQueue<E, F, N>::push(E t) { GenericTaskQueue<E, F, N>::push(E t) {
uint localBot = _bottom; uint localBot = _bottom;
assert((localBot >= 0) && (localBot < N), "_bottom out of range."); assert(localBot < N, "_bottom out of range.");
idx_t top = _age.top(); idx_t top = _age.top();
uint dirty_n_elems = dirty_size(localBot, top); uint dirty_n_elems = dirty_size(localBot, top);
assert(dirty_n_elems < N, "n_elems out of range."); assert(dirty_n_elems < N, "n_elems out of range.");

View File

@ -35,10 +35,6 @@ public class CheckUpperLimit {
ProcessBuilder pb; ProcessBuilder pb;
OutputAnalyzer out; OutputAnalyzer out;
pb = ProcessTools.createJavaProcessBuilder("-XX:ReservedCodeCacheSize=2048m", "-version");
out = new OutputAnalyzer(pb.start());
out.shouldHaveExitValue(0);
pb = ProcessTools.createJavaProcessBuilder("-XX:ReservedCodeCacheSize=2049m", "-version"); pb = ProcessTools.createJavaProcessBuilder("-XX:ReservedCodeCacheSize=2049m", "-version");
out = new OutputAnalyzer(pb.start()); out = new OutputAnalyzer(pb.start());
out.shouldContain("Invalid ReservedCodeCacheSize="); out.shouldContain("Invalid ReservedCodeCacheSize=");

View File

@ -0,0 +1,71 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8016474
* @summary The bug only happens with C1 and G1 using a different ObjectAlignmentInBytes than KlassAlignmentInBytes (which is 8)
* @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=32 GetUnsafeObjectG1PreBarrier
*/
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class GetUnsafeObjectG1PreBarrier {
private static final Unsafe unsafe;
private static final int N = 100_000;
static {
try {
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
unsafe = (Unsafe) theUnsafe.get(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
public Object a;
public static void main(String[] args) throws Throwable {
new GetUnsafeObjectG1PreBarrier();
}
public GetUnsafeObjectG1PreBarrier() throws Throwable {
doit();
}
private void doit() throws Throwable {
Field field = GetUnsafeObjectG1PreBarrier.class.getField("a");
long fieldOffset = unsafe.objectFieldOffset(field);
for (int i = 0; i < N; i++) {
readField(this, fieldOffset);
}
}
private void readField(Object o, long fieldOffset) {
unsafe.getObject(o, fieldOffset);
}
}

View File

@ -1,99 +0,0 @@
#
# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# @test Test8000968.sh
# @bug 8000968
# @summary NPG: UseCompressedKlassPointers asserts with ObjectAlignmentInBytes=32
# @run shell Test8000968.sh
#
if [ "${TESTJAVA}" = "" ]
then
PARENT=`dirname \`which java\``
TESTJAVA=`dirname ${PARENT}`
printf "TESTJAVA not set, selecting " ${TESTJAVA}
printf " If this is incorrect, try setting the variable manually.\n"
fi
# set platform-dependent variables
OS=`uname -s`
case "$OS" in
Windows_* )
FS="\\"
NULL=NUL
;;
* )
FS="/"
NULL=/dev/null
;;
esac
JAVA=${TESTJAVA}${FS}bin${FS}java
#
# See if platform has 64 bit java.
#
${JAVA} ${TESTVMOPTS} -d64 -version 2>&1 | grep -i "does not support" > ${NULL}
if [ "$?" != "1" ]
then
printf "Platform is 32 bit, does not support -XX:ObjectAlignmentInBytes= option.\n"
printf "Passed.\n"
exit 0
fi
#
# Test -XX:ObjectAlignmentInBytes with -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops.
#
${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=16 -version 2>&1 > ${NULL}
if [ "$?" != "0" ]
then
printf "FAILED: -XX:ObjectAlignmentInBytes=16 option did not work.\n"
exit 1
fi
${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=32 -version 2>&1 > ${NULL}
if [ "$?" != "0" ]
then
printf "FAILED: -XX:ObjectAlignmentInBytes=32 option did not work.\n"
exit 1
fi
${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=64 -version 2>&1 > ${NULL}
if [ "$?" != "0" ]
then
printf "FAILED: -XX:ObjectAlignmentInBytes=64 option did not work.\n"
exit 1
fi
${JAVA} ${TESTVMOPTS} -d64 -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=128 -version 2>&1 > ${NULL}
if [ "$?" != "0" ]
then
printf "FAILED: -XX:ObjectAlignmentInBytes=128 option did not work.\n"
exit 1
fi
printf "Passed.\n"
exit 0

View File

@ -0,0 +1,63 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8000968
* @key regression
* @summary NPG: UseCompressedKlassPointers asserts with ObjectAlignmentInBytes=32
* @library /testlibrary
*/
import com.oracle.java.testlibrary.*;
public class CompressedKlassPointerAndOops {
public static void main(String[] args) throws Exception {
if (!Platform.is64bit()) {
// Can't test this on 32 bit, just pass
System.out.println("Skipping test on 32bit");
return;
}
runWithAlignment(16);
runWithAlignment(32);
runWithAlignment(64);
runWithAlignment(128);
}
private static void runWithAlignment(int alignment) throws Exception {
ProcessBuilder pb;
OutputAnalyzer output;
pb = ProcessTools.createJavaProcessBuilder(
"-XX:+UseCompressedKlassPointers",
"-XX:+UseCompressedOops",
"-XX:ObjectAlignmentInBytes=" + alignment,
"-version");
output = new OutputAnalyzer(pb.start());
output.shouldHaveExitValue(0);
}
}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,8 +25,9 @@
/* /*
* @test * @test
* @bug 7196045 * @bug 7196045
* @bug 8014294
* @summary Possible JVM deadlock in ThreadTimesClosure when using HotspotInternal non-public API. * @summary Possible JVM deadlock in ThreadTimesClosure when using HotspotInternal non-public API.
* @run main/othervm -XX:+UsePerfData Test7196045 * @run main/othervm -XX:+UsePerfData -Xmx32m ThreadCpuTimesDeadlock
*/ */
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
@ -35,9 +36,10 @@ import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException; import javax.management.MalformedObjectNameException;
import javax.management.ObjectName; import javax.management.ObjectName;
public class Test7196045 { public class ThreadCpuTimesDeadlock {
public static long duration = 1000 * 60 * 2; public static byte[] dummy;
public static long duration = 10 * 1000;
private static final String HOTSPOT_INTERNAL = "sun.management:type=HotspotInternal"; private static final String HOTSPOT_INTERNAL = "sun.management:type=HotspotInternal";
public static void main(String[] args) { public static void main(String[] args) {
@ -57,6 +59,18 @@ public class Test7196045 {
throw new RuntimeException("Bad object name" + e1); throw new RuntimeException("Bad object name" + e1);
} }
// Thread that allocs memory to generate GC's
Thread allocThread = new Thread() {
public void run() {
while (true) {
dummy = new byte[4096];
}
}
};
allocThread.setDaemon(true);
allocThread.start();
long endTime = System.currentTimeMillis() + duration; long endTime = System.currentTimeMillis() + duration;
long i = 0; long i = 0;
while (true) { while (true) {

View File

@ -0,0 +1,124 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @summary Test the OutputAnalyzer reporting functionality,
* such as printing additional diagnostic info
* (exit code, stdout, stderr, command line, etc.)
* @library /testlibrary
*/
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.ProcessTools;
public class OutputAnalyzerReportingTest {
public static void main(String[] args) throws Exception {
// Create the output analyzer under test
String stdout = "aaaaaa";
String stderr = "bbbbbb";
OutputAnalyzer output = new OutputAnalyzer(stdout, stderr);
// Expected summary values should be the same for all cases,
// since the outputAnalyzer object is the same
String expectedExitValue = "-1";
String expectedSummary =
" stdout: [" + stdout + "];\n" +
" stderr: [" + stderr + "]\n" +
" exitValue = " + expectedExitValue + "\n";
DiagnosticSummaryTestRunner testRunner =
new DiagnosticSummaryTestRunner();
// should have exit value
testRunner.init(expectedSummary);
int unexpectedExitValue = 2;
try {
output.shouldHaveExitValue(unexpectedExitValue);
} catch (RuntimeException e) { }
testRunner.closeAndCheckResults();
// should not contain
testRunner.init(expectedSummary);
try {
output.shouldNotContain(stdout);
} catch (RuntimeException e) { }
testRunner.closeAndCheckResults();
// should contain
testRunner.init(expectedSummary);
try {
output.shouldContain("unexpected-stuff");
} catch (RuntimeException e) { }
testRunner.closeAndCheckResults();
// should not match
testRunner.init(expectedSummary);
try {
output.shouldNotMatch("[a]");
} catch (RuntimeException e) { }
testRunner.closeAndCheckResults();
// should match
testRunner.init(expectedSummary);
try {
output.shouldMatch("[qwerty]");
} catch (RuntimeException e) { }
testRunner.closeAndCheckResults();
}
private static class DiagnosticSummaryTestRunner {
private ByteArrayOutputStream byteStream =
new ByteArrayOutputStream(10000);
private String expectedSummary = "";
private PrintStream errStream;
public void init(String expectedSummary) {
this.expectedSummary = expectedSummary;
byteStream.reset();
errStream = new PrintStream(byteStream);
System.setErr(errStream);
}
public void closeAndCheckResults() {
// check results
errStream.close();
String stdErrStr = byteStream.toString();
if (!stdErrStr.contains(expectedSummary)) {
throw new RuntimeException("The output does not contain "
+ "the diagnostic message, or the message is incorrect");
}
}
}
}

View File

@ -76,7 +76,8 @@ public final class OutputAnalyzer {
*/ */
public void shouldContain(String expectedString) { public void shouldContain(String expectedString) {
if (!stdout.contains(expectedString) && !stderr.contains(expectedString)) { if (!stdout.contains(expectedString) && !stderr.contains(expectedString)) {
throw new RuntimeException("'" + expectedString + "' missing from stdout/stderr: [" + stdout + stderr + "]\n"); reportDiagnosticSummary();
throw new RuntimeException("'" + expectedString + "' missing from stdout/stderr \n");
} }
} }
@ -88,7 +89,8 @@ public final class OutputAnalyzer {
*/ */
public void stdoutShouldContain(String expectedString) { public void stdoutShouldContain(String expectedString) {
if (!stdout.contains(expectedString)) { if (!stdout.contains(expectedString)) {
throw new RuntimeException("'" + expectedString + "' missing from stdout: [" + stdout + "]\n"); reportDiagnosticSummary();
throw new RuntimeException("'" + expectedString + "' missing from stdout \n");
} }
} }
@ -100,7 +102,8 @@ public final class OutputAnalyzer {
*/ */
public void stderrShouldContain(String expectedString) { public void stderrShouldContain(String expectedString) {
if (!stderr.contains(expectedString)) { if (!stderr.contains(expectedString)) {
throw new RuntimeException("'" + expectedString + "' missing from stderr: [" + stderr + "]\n"); reportDiagnosticSummary();
throw new RuntimeException("'" + expectedString + "' missing from stderr \n");
} }
} }
@ -112,10 +115,12 @@ public final class OutputAnalyzer {
*/ */
public void shouldNotContain(String notExpectedString) { public void shouldNotContain(String notExpectedString) {
if (stdout.contains(notExpectedString)) { if (stdout.contains(notExpectedString)) {
throw new RuntimeException("'" + notExpectedString + "' found in stdout: [" + stdout + "]\n"); reportDiagnosticSummary();
throw new RuntimeException("'" + notExpectedString + "' found in stdout \n");
} }
if (stderr.contains(notExpectedString)) { if (stderr.contains(notExpectedString)) {
throw new RuntimeException("'" + notExpectedString + "' found in stderr: [" + stderr + "]\n"); reportDiagnosticSummary();
throw new RuntimeException("'" + notExpectedString + "' found in stderr \n");
} }
} }
@ -127,7 +132,8 @@ public final class OutputAnalyzer {
*/ */
public void stdoutShouldNotContain(String notExpectedString) { public void stdoutShouldNotContain(String notExpectedString) {
if (stdout.contains(notExpectedString)) { if (stdout.contains(notExpectedString)) {
throw new RuntimeException("'" + notExpectedString + "' found in stdout: [" + stdout + "]\n"); reportDiagnosticSummary();
throw new RuntimeException("'" + notExpectedString + "' found in stdout \n");
} }
} }
@ -139,7 +145,8 @@ public final class OutputAnalyzer {
*/ */
public void stderrShouldNotContain(String notExpectedString) { public void stderrShouldNotContain(String notExpectedString) {
if (stderr.contains(notExpectedString)) { if (stderr.contains(notExpectedString)) {
throw new RuntimeException("'" + notExpectedString + "' found in stderr: [" + stderr + "]\n"); reportDiagnosticSummary();
throw new RuntimeException("'" + notExpectedString + "' found in stderr \n");
} }
} }
@ -154,9 +161,9 @@ public final class OutputAnalyzer {
Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
if (!stdoutMatcher.find() && !stderrMatcher.find()) { if (!stdoutMatcher.find() && !stderrMatcher.find()) {
reportDiagnosticSummary();
throw new RuntimeException("'" + pattern throw new RuntimeException("'" + pattern
+ "' missing from stdout/stderr: [" + stdout + stderr + "' missing from stdout/stderr \n");
+ "]\n");
} }
} }
@ -170,8 +177,9 @@ public final class OutputAnalyzer {
public void stdoutShouldMatch(String pattern) { public void stdoutShouldMatch(String pattern) {
Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
if (!matcher.find()) { if (!matcher.find()) {
reportDiagnosticSummary();
throw new RuntimeException("'" + pattern throw new RuntimeException("'" + pattern
+ "' missing from stdout: [" + stdout + "]\n"); + "' missing from stdout \n");
} }
} }
@ -185,8 +193,9 @@ public final class OutputAnalyzer {
public void stderrShouldMatch(String pattern) { public void stderrShouldMatch(String pattern) {
Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
if (!matcher.find()) { if (!matcher.find()) {
reportDiagnosticSummary();
throw new RuntimeException("'" + pattern throw new RuntimeException("'" + pattern
+ "' missing from stderr: [" + stderr + "]\n"); + "' missing from stderr \n");
} }
} }
@ -200,13 +209,15 @@ public final class OutputAnalyzer {
public void shouldNotMatch(String pattern) { public void shouldNotMatch(String pattern) {
Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
if (matcher.find()) { if (matcher.find()) {
reportDiagnosticSummary();
throw new RuntimeException("'" + pattern throw new RuntimeException("'" + pattern
+ "' found in stdout: [" + stdout + "]\n"); + "' found in stdout \n");
} }
matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
if (matcher.find()) { if (matcher.find()) {
reportDiagnosticSummary();
throw new RuntimeException("'" + pattern throw new RuntimeException("'" + pattern
+ "' found in stderr: [" + stderr + "]\n"); + "' found in stderr \n");
} }
} }
@ -220,8 +231,9 @@ public final class OutputAnalyzer {
public void stdoutShouldNotMatch(String pattern) { public void stdoutShouldNotMatch(String pattern) {
Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
if (matcher.find()) { if (matcher.find()) {
reportDiagnosticSummary();
throw new RuntimeException("'" + pattern throw new RuntimeException("'" + pattern
+ "' found in stdout: [" + stdout + "]\n"); + "' found in stdout \n");
} }
} }
@ -235,23 +247,45 @@ public final class OutputAnalyzer {
public void stderrShouldNotMatch(String pattern) { public void stderrShouldNotMatch(String pattern) {
Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
if (matcher.find()) { if (matcher.find()) {
reportDiagnosticSummary();
throw new RuntimeException("'" + pattern throw new RuntimeException("'" + pattern
+ "' found in stderr: [" + stderr + "]\n"); + "' found in stderr \n");
} }
} }
/** /**
* Verifiy the exit value of the process * Verify the exit value of the process
* *
* @param expectedExitValue Expected exit value from process * @param expectedExitValue Expected exit value from process
* @throws RuntimeException If the exit value from the process did not match the expected value * @throws RuntimeException If the exit value from the process did not match the expected value
*/ */
public void shouldHaveExitValue(int expectedExitValue) { public void shouldHaveExitValue(int expectedExitValue) {
if (getExitValue() != expectedExitValue) { if (getExitValue() != expectedExitValue) {
throw new RuntimeException("Exit value " + getExitValue() + " , expected to get " + expectedExitValue); reportDiagnosticSummary();
throw new RuntimeException("Expected to get exit value of ["
+ expectedExitValue + "]\n");
} }
} }
/**
* Report summary that will help to diagnose the problem
* Currently includes:
* - standard input produced by the process under test
* - standard output
* - exit code
* Note: the command line is printed by the ProcessTools
*/
private void reportDiagnosticSummary() {
String msg =
" stdout: [" + stdout + "];\n" +
" stderr: [" + stderr + "]\n" +
" exitValue = " + getExitValue() + "\n";
System.err.println(msg);
}
/** /**
* Get the contents of the output buffer (stdout and stderr) * Get the contents of the output buffer (stdout and stderr)
* *

View File

@ -27,6 +27,7 @@ public class Platform {
private static final String osName = System.getProperty("os.name"); private static final String osName = System.getProperty("os.name");
private static final String dataModel = System.getProperty("sun.arch.data.model"); private static final String dataModel = System.getProperty("sun.arch.data.model");
private static final String vmVersion = System.getProperty("java.vm.version"); private static final String vmVersion = System.getProperty("java.vm.version");
private static final String osArch = System.getProperty("os.arch");
public static boolean is64bit() { public static boolean is64bit() {
return dataModel.equals("64"); return dataModel.equals("64");
@ -59,4 +60,14 @@ public class Platform {
public static String getVMVersion() { public static String getVMVersion() {
return vmVersion; return vmVersion;
} }
// Returns true for sparc and sparcv9.
public static boolean isSparc() {
return osArch.toLowerCase().startsWith("sparc");
}
public static String getOsArch() {
return osArch;
}
} }

View File

@ -31,6 +31,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import sun.management.VMManagement; import sun.management.VMManagement;
@ -106,6 +107,22 @@ public final class ProcessTools {
return pid; return pid;
} }
/**
* Get the string containing input arguments passed to the VM
*
* @return arguments
*/
public static String getVmInputArguments() {
RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
List<String> args = runtime.getInputArguments();
StringBuilder result = new StringBuilder();
for (String arg : args)
result.append(arg).append(' ');
return result.toString();
}
/** /**
* Get platform specific VM arguments (e.g. -d64 on 64bit Solaris) * Get platform specific VM arguments (e.g. -d64 on 64bit Solaris)
* *
@ -132,8 +149,13 @@ public final class ProcessTools {
Collections.addAll(args, getPlatformSpecificVMArgs()); Collections.addAll(args, getPlatformSpecificVMArgs());
Collections.addAll(args, command); Collections.addAll(args, command);
return new ProcessBuilder(args.toArray(new String[args.size()])); // Reporting
StringBuilder cmdLine = new StringBuilder();
for (String cmd : args)
cmdLine.append(cmd).append(' ');
System.out.println("Command line: [" + cmdLine.toString() + "]");
return new ProcessBuilder(args.toArray(new String[args.size()]));
} }
} }

View File

@ -223,3 +223,4 @@ b8c5f4b6f0fffb44618fc609a584953c4ed67c0b jdk8-b95
adf49c3ef83c160d53ece623049b2cdccaf78fc7 jdk8-b99 adf49c3ef83c160d53ece623049b2cdccaf78fc7 jdk8-b99
5d1974c1d7b9a86431bc253dc5a6a52d4586622e jdk8-b100 5d1974c1d7b9a86431bc253dc5a6a52d4586622e jdk8-b100
0a7432f898e579ea35e8c51e3edab37f949168e4 jdk8-b101 0a7432f898e579ea35e8c51e3edab37f949168e4 jdk8-b101
7cffafa606e9fb865e7b5e6a56e0a681ce5cf617 jdk8-b102

View File

@ -223,3 +223,4 @@ b1fb4612a2caea52b5661b87509e560fa044b194 jdk8-b98
8ef83d4b23c933935e28f59b282cea920b1b1f5f jdk8-b99 8ef83d4b23c933935e28f59b282cea920b1b1f5f jdk8-b99
4fd722afae5c02f00bbd44c3a34425ee474afb1c jdk8-b100 4fd722afae5c02f00bbd44c3a34425ee474afb1c jdk8-b100
60b623a361642a0f5aef5f06dad9e5f279b9d9a9 jdk8-b101 60b623a361642a0f5aef5f06dad9e5f279b9d9a9 jdk8-b101
988a5f2ac559dcab05698b8a8633aa453e012260 jdk8-b102

View File

@ -223,3 +223,4 @@ c4908732fef5235f1b98cafe0ce507771ef7892c jdk8-b98
6a099a36589bd933957272ba63e5263bede29971 jdk8-b99 6a099a36589bd933957272ba63e5263bede29971 jdk8-b99
5be9c5bfcfe9b2a40412b4fb364377d49de014eb jdk8-b100 5be9c5bfcfe9b2a40412b4fb364377d49de014eb jdk8-b100
6901612328239fbd471d20823113c1cf3fdaebee jdk8-b101 6901612328239fbd471d20823113c1cf3fdaebee jdk8-b101
8ed8e2b4b90e0ac9aa5b3efef51cd576a9db96a9 jdk8-b102

View File

@ -798,6 +798,16 @@ ifeq ($(OPENJDK_TARGET_OS),solaris)
LIBAWT_XAWT_CFLAGS += -DFUNCPROTO=15 LIBAWT_XAWT_CFLAGS += -DFUNCPROTO=15
endif endif
ifeq ($(OPENJDK_TARGET_OS),linux)
ifndef OPENJDK
include $(JDK_TOPDIR)/make/closed/xawt.gmk
endif
ifeq ($(DISABLE_XRENDER),true)
LIBAWT_XAWT_CFLAGS += -DDISABLE_XRENDER_BY_DEFAULT=true
endif
endif
ifeq ($(MILESTONE),internal) ifeq ($(MILESTONE),internal)
LIBAWT_XAWT_CFLAGS += -DINTERNAL_BUILD LIBAWT_XAWT_CFLAGS += -DINTERNAL_BUILD
endif endif

View File

@ -1856,7 +1856,10 @@ public class AquaTabbedPaneCopyFromBasicUI extends TabbedPaneUI implements Swing
// If we're not valid that means we will shortly be validated and // If we're not valid that means we will shortly be validated and
// painted, which means we don't have to do anything here. // painted, which means we don't have to do anything here.
if (!isRunsDirty && index >= 0 && index < tabPane.getTabCount()) { if (!isRunsDirty && index >= 0 && index < tabPane.getTabCount()) {
tabPane.repaint(getTabBounds(tabPane, index)); Rectangle rect = getTabBounds(tabPane, index);
if (rect != null) {
tabPane.repaint(rect);
}
} }
} }

View File

@ -701,6 +701,20 @@ public class AquaTabbedPaneUI extends AquaTabbedPaneCopyFromBasicUI {
return false; return false;
} }
/**
* Returns the bounds of the specified tab index. The bounds are
* with respect to the JTabbedPane's coordinate space. If the tab at this
* index is not currently visible in the UI, then returns null.
*/
@Override
public Rectangle getTabBounds(final JTabbedPane pane, final int i) {
if (visibleTabState.needsScrollTabs()
&& (visibleTabState.isBefore(i) || visibleTabState.isAfter(i))) {
return null;
}
return super.getTabBounds(pane, i);
}
/** /**
* Returns the tab index which intersects the specified point * Returns the tab index which intersects the specified point
* in the JTabbedPane's coordinate space. * in the JTabbedPane's coordinate space.

View File

@ -830,18 +830,19 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
// UTILITY METHODS // UTILITY METHODS
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
/* /**
* Find image to install into Title or into Application icon. * Find image to install into Title or into Application icon. First try
* First try icons installed for toplevel. If there is no icon * icons installed for toplevel. Null is returned, if there is no icon and
* use default Duke image. * default Duke image should be used.
* This method shouldn't return null.
*/ */
private CImage getImageForTarget() { private CImage getImageForTarget() {
List<Image> icons = target.getIconImages(); CImage icon = null;
if (icons == null || icons.size() == 0) { try {
return null; icon = CImage.getCreator().createFromImages(target.getIconImages());
} catch (Exception ignored) {
// Perhaps the icon passed into Java is broken. Skipping this icon.
} }
return CImage.getCreator().createFromImages(icons); return icon;
} }
/* /*

View File

@ -103,7 +103,6 @@ NSDictionary *realmConfigsForRealms(SCDynamicStoreRef store, NSArray *realms) {
CFTypeRef realmInfo = SCDynamicStoreCopyValue(store, (CFStringRef) [NSString stringWithFormat:@"Kerberos:%@", realm]); CFTypeRef realmInfo = SCDynamicStoreCopyValue(store, (CFStringRef) [NSString stringWithFormat:@"Kerberos:%@", realm]);
if (CFGetTypeID(realmInfo) != CFDictionaryGetTypeID()) { if (CFGetTypeID(realmInfo) != CFDictionaryGetTypeID()) {
NSLog(@"Unexpected CFType for realm Info: %lu", CFGetTypeID(realmInfo));
return nil; return nil;
} }
@ -140,7 +139,6 @@ JNF_COCOA_ENTER(env);
SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java"), _SCDynamicStoreCallBack, NULL); SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java"), _SCDynamicStoreCallBack, NULL);
if (store == NULL) { if (store == NULL) {
NSLog(@"Unable to load SCDynamicStore to install NotificationCallback");
return; return;
} }
@ -171,19 +169,11 @@ JNF_COCOA_ENTER(env);
SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java-kerberos"), NULL, NULL); SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR("java-kerberos"), NULL, NULL);
if (store == NULL) { if (store == NULL) {
NSLog(@"Unable to load SCDynamicStore");
return NULL;
}
// Create the store if it is NULL and set it.
if (store == NULL) {
NSLog(@"Invalid value for SCDynamicStore");
return NULL; return NULL;
} }
CFTypeRef realms = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALMS); CFTypeRef realms = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALMS);
if (realms == NULL || CFGetTypeID(realms) != CFArrayGetTypeID()) { if (realms == NULL || CFGetTypeID(realms) != CFArrayGetTypeID()) {
NSLog(@"Unable to load realm info from SCDynamicStore");
if (realms) CFRelease(realms); if (realms) CFRelease(realms);
CFRelease(store); CFRelease(store);
return NULL; return NULL;
@ -192,7 +182,6 @@ JNF_COCOA_ENTER(env);
CFTypeRef realmMappings = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALM_MAPPINGS); CFTypeRef realmMappings = SCDynamicStoreCopyValue(store, (CFStringRef) KERBEROS_DEFAULT_REALM_MAPPINGS);
if (realmMappings == NULL || CFGetTypeID(realmMappings) != CFArrayGetTypeID()) { if (realmMappings == NULL || CFGetTypeID(realmMappings) != CFArrayGetTypeID()) {
NSLog(@"Unable to load realm mapping info from SCDynamicStore");
if (realmMappings) CFRelease(realmMappings); if (realmMappings) CFRelease(realmMappings);
CFRelease(realms); CFRelease(realms);
CFRelease(store); CFRelease(store);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -47,6 +47,10 @@ import javax.security.auth.PrivateCredentialPermission;
import sun.security.util.PropertyExpander; import sun.security.util.PropertyExpander;
import sun.security.provider.PolicyParser.PrincipalEntry;
import sun.security.provider.PolicyParser.GrantEntry;
import sun.security.provider.PolicyParser.PermissionEntry;
/** /**
* This class represents a default implementation for * This class represents a default implementation for
* <code>javax.security.auth.Policy</code>. * <code>javax.security.auth.Policy</code>.
@ -469,7 +473,8 @@ public class PolicyFile extends javax.security.auth.Policy {
* @param policyFile the policy Reader object. * @param policyFile the policy Reader object.
*/ */
private void init(URL policy) { private void init(URL policy) {
PolicyParser pp = new PolicyParser(expandProperties); sun.security.provider.PolicyParser pp =
new sun.security.provider.PolicyParser(expandProperties);
try { try {
InputStreamReader isr InputStreamReader isr
= new InputStreamReader(getInputStream(policy)); = new InputStreamReader(getInputStream(policy));
@ -477,12 +482,12 @@ public class PolicyFile extends javax.security.auth.Policy {
isr.close(); isr.close();
KeyStore keyStore = initKeyStore(policy, pp.getKeyStoreUrl(), KeyStore keyStore = initKeyStore(policy, pp.getKeyStoreUrl(),
pp.getKeyStoreType()); pp.getKeyStoreType());
Enumeration<PolicyParser.GrantEntry> enum_ = pp.grantElements(); Enumeration<GrantEntry> enum_ = pp.grantElements();
while (enum_.hasMoreElements()) { while (enum_.hasMoreElements()) {
PolicyParser.GrantEntry ge = enum_.nextElement(); GrantEntry ge = enum_.nextElement();
addGrantEntry(ge, keyStore); addGrantEntry(ge, keyStore);
} }
} catch (PolicyParser.ParsingException pe) { } catch (sun.security.provider.PolicyParser.ParsingException pe) {
System.err.println(AUTH_POLICY + System.err.println(AUTH_POLICY +
rb.getString(".error.parsing.") + policy); rb.getString(".error.parsing.") + policy);
System.err.println(AUTH_POLICY + System.err.println(AUTH_POLICY +
@ -521,8 +526,8 @@ public class PolicyFile extends javax.security.auth.Policy {
* *
* @return null if signedBy alias is not recognized * @return null if signedBy alias is not recognized
*/ */
CodeSource getCodeSource(PolicyParser.GrantEntry ge, KeyStore keyStore) CodeSource getCodeSource(GrantEntry ge, KeyStore keyStore)
throws java.net.MalformedURLException throws java.net.MalformedURLException
{ {
Certificate[] certs = null; Certificate[] certs = null;
if (ge.signedBy != null) { if (ge.signedBy != null) {
@ -559,20 +564,18 @@ public class PolicyFile extends javax.security.auth.Policy {
/** /**
* Add one policy entry to the vector. * Add one policy entry to the vector.
*/ */
private void addGrantEntry(PolicyParser.GrantEntry ge, private void addGrantEntry(GrantEntry ge, KeyStore keyStore) {
KeyStore keyStore) {
if (debug != null) { if (debug != null) {
debug.println("Adding policy entry: "); debug.println("Adding policy entry: ");
debug.println(" signedBy " + ge.signedBy); debug.println(" signedBy " + ge.signedBy);
debug.println(" codeBase " + ge.codeBase); debug.println(" codeBase " + ge.codeBase);
if (ge.principals != null && ge.principals.size() > 0) { if (ge.principals != null && ge.principals.size() > 0) {
ListIterator<PolicyParser.PrincipalEntry> li = ListIterator<PrincipalEntry> li = ge.principals.listIterator();
ge.principals.listIterator();
while (li.hasNext()) { while (li.hasNext()) {
PolicyParser.PrincipalEntry pppe = li.next(); PrincipalEntry pppe = li.next();
debug.println(" " + pppe.principalClass + debug.println(" " + pppe.getPrincipalClass() +
" " + pppe.principalName); " " + pppe.getPrincipalName());
} }
} }
debug.println(); debug.println();
@ -584,10 +587,9 @@ public class PolicyFile extends javax.security.auth.Policy {
if (codesource == null) return; if (codesource == null) return;
PolicyEntry entry = new PolicyEntry(codesource); PolicyEntry entry = new PolicyEntry(codesource);
Enumeration<PolicyParser.PermissionEntry> enum_ = Enumeration<PermissionEntry> enum_ = ge.permissionElements();
ge.permissionElements();
while (enum_.hasMoreElements()) { while (enum_.hasMoreElements()) {
PolicyParser.PermissionEntry pe = enum_.nextElement(); PermissionEntry pe = enum_.nextElement();
try { try {
// XXX special case PrivateCredentialPermission-SELF // XXX special case PrivateCredentialPermission-SELF
Permission perm; Permission perm;
@ -998,11 +1000,11 @@ public class PolicyFile extends javax.security.auth.Policy {
return true; return true;
} }
ListIterator<PolicyParser.PrincipalEntry> pli = ListIterator<PrincipalEntry> pli =
scs.getPrincipals().listIterator(); scs.getPrincipals().listIterator();
while (pli.hasNext()) { while (pli.hasNext()) {
PolicyParser.PrincipalEntry principal = pli.next(); PrincipalEntry principal = pli.next();
// XXX // XXX
// if the Policy entry's Principal does not contain a // if the Policy entry's Principal does not contain a
@ -1050,30 +1052,29 @@ public class PolicyFile extends javax.security.auth.Policy {
* if (y == 1), it's the principal name. * if (y == 1), it's the principal name.
*/ */
private String[][] getPrincipalInfo private String[][] getPrincipalInfo
(PolicyParser.PrincipalEntry principal, (PrincipalEntry principal, final CodeSource accCs) {
final CodeSource accCs) {
// there are 3 possibilities: // there are 3 possibilities:
// 1) the entry's Principal class and name are not wildcarded // 1) the entry's Principal class and name are not wildcarded
// 2) the entry's Principal name is wildcarded only // 2) the entry's Principal name is wildcarded only
// 3) the entry's Principal class and name are wildcarded // 3) the entry's Principal class and name are wildcarded
if (!principal.principalClass.equals if (!principal.getPrincipalClass().equals
(PolicyParser.PrincipalEntry.WILDCARD_CLASS) && (PrincipalEntry.WILDCARD_CLASS) &&
!principal.principalName.equals !principal.getPrincipalName().equals
(PolicyParser.PrincipalEntry.WILDCARD_NAME)) { (PrincipalEntry.WILDCARD_NAME)) {
// build a PrivateCredentialPermission for the principal // build a PrivateCredentialPermission for the principal
// from the Policy entry // from the Policy entry
String[][] info = new String[1][2]; String[][] info = new String[1][2];
info[0][0] = principal.principalClass; info[0][0] = principal.getPrincipalClass();
info[0][1] = principal.principalName; info[0][1] = principal.getPrincipalName();
return info; return info;
} else if (!principal.principalClass.equals } else if (!principal.getPrincipalClass().equals
(PolicyParser.PrincipalEntry.WILDCARD_CLASS) && (PrincipalEntry.WILDCARD_CLASS) &&
principal.principalName.equals principal.getPrincipalName().equals
(PolicyParser.PrincipalEntry.WILDCARD_NAME)) { (PrincipalEntry.WILDCARD_NAME)) {
// build a PrivateCredentialPermission for all // build a PrivateCredentialPermission for all
// the Subject's principals that are instances of principalClass // the Subject's principals that are instances of principalClass
@ -1088,7 +1089,7 @@ public class PolicyFile extends javax.security.auth.Policy {
// If it doesn't, we should stop here with a ClassCastException. // If it doesn't, we should stop here with a ClassCastException.
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Class<? extends Principal> pClass = (Class<? extends Principal>) Class<? extends Principal> pClass = (Class<? extends Principal>)
Class.forName(principal.principalClass, false, Class.forName(principal.getPrincipalClass(), false,
ClassLoader.getSystemClassLoader()); ClassLoader.getSystemClassLoader());
principalSet = scs.getSubject().getPrincipals(pClass); principalSet = scs.getSubject().getPrincipals(pClass);
} catch (Exception e) { } catch (Exception e) {
@ -1387,6 +1388,7 @@ public class PolicyFile extends javax.security.auth.Policy {
} }
} }
@SuppressWarnings("deprecation")
class PolicyPermissions extends PermissionCollection { class PolicyPermissions extends PermissionCollection {
private static final long serialVersionUID = -1954188373270545523L; private static final long serialVersionUID = -1954188373270545523L;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -33,6 +33,7 @@ import java.security.cert.Certificate;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import javax.security.auth.Subject; import javax.security.auth.Subject;
import sun.security.provider.PolicyParser.PrincipalEntry;
/** /**
* <p> This <code>SubjectCodeSource</code> class contains * <p> This <code>SubjectCodeSource</code> class contains
@ -57,7 +58,7 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
}); });
private Subject subject; private Subject subject;
private LinkedList<PolicyParser.PrincipalEntry> principals; private LinkedList<PrincipalEntry> principals;
private static final Class[] PARAMS = { String.class }; private static final Class[] PARAMS = { String.class };
private static final sun.security.util.Debug debug = private static final sun.security.util.Debug debug =
sun.security.util.Debug.getInstance("auth", "\t[Auth Access]"); sun.security.util.Debug.getInstance("auth", "\t[Auth Access]");
@ -87,14 +88,14 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
* <code>SubjectCodeSource</code> <p> * <code>SubjectCodeSource</code> <p>
*/ */
SubjectCodeSource(Subject subject, SubjectCodeSource(Subject subject,
LinkedList<PolicyParser.PrincipalEntry> principals, LinkedList<PrincipalEntry> principals,
URL url, Certificate[] certs) { URL url, Certificate[] certs) {
super(url, certs); super(url, certs);
this.subject = subject; this.subject = subject;
this.principals = (principals == null ? this.principals = (principals == null ?
new LinkedList<PolicyParser.PrincipalEntry>() : new LinkedList<PrincipalEntry>() :
new LinkedList<PolicyParser.PrincipalEntry>(principals)); new LinkedList<PrincipalEntry>(principals));
sysClassLoader = java.security.AccessController.doPrivileged sysClassLoader = java.security.AccessController.doPrivileged
(new java.security.PrivilegedAction<ClassLoader>() { (new java.security.PrivilegedAction<ClassLoader>() {
public ClassLoader run() { public ClassLoader run() {
@ -114,7 +115,7 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
* <code>SubjectCodeSource</code> as a <code>LinkedList</code> * <code>SubjectCodeSource</code> as a <code>LinkedList</code>
* of <code>PolicyParser.PrincipalEntry</code> objects. * of <code>PolicyParser.PrincipalEntry</code> objects.
*/ */
LinkedList<PolicyParser.PrincipalEntry> getPrincipals() { LinkedList<PrincipalEntry> getPrincipals() {
return principals; return principals;
} }
@ -167,7 +168,7 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
*/ */
public boolean implies(CodeSource codesource) { public boolean implies(CodeSource codesource) {
LinkedList<PolicyParser.PrincipalEntry> subjectList = null; LinkedList<PrincipalEntry> subjectList = null;
if (codesource == null || if (codesource == null ||
!(codesource instanceof SubjectCodeSource) || !(codesource instanceof SubjectCodeSource) ||
@ -197,20 +198,19 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
return false; return false;
} }
ListIterator<PolicyParser.PrincipalEntry> li = ListIterator<PrincipalEntry> li = this.principals.listIterator(0);
this.principals.listIterator(0);
while (li.hasNext()) { while (li.hasNext()) {
PolicyParser.PrincipalEntry pppe = li.next(); PrincipalEntry pppe = li.next();
try { try {
// handle PrincipalComparators // handle PrincipalComparators
Class<?> principalComparator = Class.forName( Class<?> principalComparator = Class.forName(
pppe.principalClass, true, sysClassLoader); pppe.getPrincipalClass(), true, sysClassLoader);
Constructor<?> c = principalComparator.getConstructor(PARAMS); Constructor<?> c = principalComparator.getConstructor(PARAMS);
PrincipalComparator pc = PrincipalComparator pc =
(PrincipalComparator)c.newInstance (PrincipalComparator)c.newInstance
(new Object[] { pppe.principalName }); (new Object[] { pppe.getPrincipalName() });
if (!pc.implies(that.getSubject())) { if (!pc.implies(that.getSubject())) {
if (debug != null) if (debug != null)
@ -236,11 +236,10 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
Iterator<Principal> i = Iterator<Principal> i =
that.getSubject().getPrincipals().iterator(); that.getSubject().getPrincipals().iterator();
subjectList = new LinkedList<PolicyParser.PrincipalEntry>(); subjectList = new LinkedList<PrincipalEntry>();
while (i.hasNext()) { while (i.hasNext()) {
Principal p = i.next(); Principal p = i.next();
PolicyParser.PrincipalEntry spppe = PrincipalEntry spppe = new PrincipalEntry
new PolicyParser.PrincipalEntry
(p.getClass().getName(), p.getName()); (p.getClass().getName(), p.getName());
subjectList.add(spppe); subjectList.add(spppe);
} }
@ -281,23 +280,19 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
* <i>pppe</i> argument. * <i>pppe</i> argument.
*/ */
private boolean subjectListImpliesPrincipalEntry( private boolean subjectListImpliesPrincipalEntry(
LinkedList<PolicyParser.PrincipalEntry> subjectList, LinkedList<PrincipalEntry> subjectList, PrincipalEntry pppe) {
PolicyParser.PrincipalEntry pppe) {
ListIterator<PolicyParser.PrincipalEntry> li = ListIterator<PrincipalEntry> li = subjectList.listIterator(0);
subjectList.listIterator(0);
while (li.hasNext()) { while (li.hasNext()) {
PolicyParser.PrincipalEntry listPppe = li.next(); PrincipalEntry listPppe = li.next();
if (pppe.principalClass.equals if (pppe.getPrincipalClass().equals
(PolicyParser.PrincipalEntry.WILDCARD_CLASS) || (PrincipalEntry.WILDCARD_CLASS) ||
pppe.principalClass.equals pppe.getPrincipalClass().equals(listPppe.getPrincipalClass()))
(listPppe.principalClass)) { {
if (pppe.getPrincipalName().equals
if (pppe.principalName.equals (PrincipalEntry.WILDCARD_NAME) ||
(PolicyParser.PrincipalEntry.WILDCARD_NAME) || pppe.getPrincipalName().equals(listPppe.getPrincipalName()))
pppe.principalName.equals
(listPppe.principalName))
return true; return true;
} }
} }
@ -390,13 +385,12 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
} }
} }
if (principals != null) { if (principals != null) {
ListIterator<PolicyParser.PrincipalEntry> li = ListIterator<PrincipalEntry> li = principals.listIterator();
principals.listIterator();
while (li.hasNext()) { while (li.hasNext()) {
PolicyParser.PrincipalEntry pppe = li.next(); PrincipalEntry pppe = li.next();
returnMe = returnMe + rb.getString("NEWLINE") + returnMe = returnMe + rb.getString("NEWLINE") +
pppe.principalClass + " " + pppe.getPrincipalClass() + " " +
pppe.principalName; pppe.getPrincipalName();
} }
} }
return returnMe; return returnMe;

View File

@ -151,7 +151,7 @@ function JavaClassProto() {
while (tmp != null) { while (tmp != null) {
res[res.length] = tmp; res[res.length] = tmp;
tmp = tmp.superclass; tmp = tmp.superclass;
} }
return res; return res;
} }
@ -263,16 +263,19 @@ function wrapJavaObject(thing) {
if (name == 'class') { if (name == 'class') {
return wrapJavaValue(instance.clazz); return wrapJavaValue(instance.clazz);
} else if (name == 'toString') {
return function() {
return instance.toString();
}
} else if (name == 'wrapped-object') { } else if (name == 'wrapped-object') {
return instance; return instance;
} }
return undefined; return undefined;
} },
__call__: function(name) {
if (name == 'toString') {
return instance.toString();
} else {
return undefined;
}
}
} }
} }
@ -297,7 +300,7 @@ function wrapJavaObject(thing) {
return true; return true;
} }
} }
return theJavaClassProto[name] != undefined; return false;
}, },
__get__ : function(name) { __get__ : function(name) {
for (var i in fields) { for (var i in fields) {
@ -305,7 +308,7 @@ function wrapJavaObject(thing) {
return wrapJavaValue(fields[i].value); return wrapJavaValue(fields[i].value);
} }
} }
return theJavaClassProto[name]; return undefined;
} }
} }
@ -322,7 +325,12 @@ function wrapJavaObject(thing) {
this.name = jclass.name; this.name = jclass.name;
this.fields = jclass.fields; this.fields = jclass.fields;
this['wrapped-object'] = jclass; this['wrapped-object'] = jclass;
this.__proto__ = this.statics; }
for (var i in theJavaClassProto) {
if (typeof theJavaClassProto[i] == 'function') {
JavaClassWrapper.prototype[i] = theJavaClassProto[i];
}
} }
// returns wrapper for Java object arrays // returns wrapper for Java object arrays
@ -334,32 +342,35 @@ function wrapJavaObject(thing) {
__getIds__ : function() { __getIds__ : function() {
var res = new Array(elements.length); var res = new Array(elements.length);
for (var i = 0; i < elements.length; i++) { for (var i = 0; i < elements.length; i++) {
res[i] = i; res[i] = String(i);
} }
return res; return res;
}, },
__has__: function(name) { __has__: function(name) {
return (typeof(name) == 'number' && return (name >= 0 && name < elements.length) ||
name >= 0 && name < elements.length) ||
name == 'length' || name == 'class' || name == 'length' || name == 'class' ||
name == 'toString' || name == 'wrapped-object'; name == 'toString' || name == 'wrapped-object';
}, },
__get__ : function(name) { __get__ : function(name) {
if (typeof(name) == 'number' && if (name >= 0 && name < elements.length) {
name >= 0 && name < elements.length) {
return wrapJavaValue(elements[name]); return wrapJavaValue(elements[name]);
} else if (name == 'length') { } else if (name == 'length') {
return elements.length; return elements.length;
} else if (name == 'class') { } else if (name == 'class') {
return wrapJavaValue(array.clazz); return wrapJavaValue(array.clazz);
} else if (name == 'toString') {
return function() { return array.toString(); }
} else if (name == 'wrapped-object') { } else if (name == 'wrapped-object') {
return array; return array;
} else { } else {
return undefined; return undefined;
} }
} },
__call__: function(name) {
if (name == 'toString') {
return array.toString();
} else {
return undefined;
}
}
} }
} }
@ -373,26 +384,22 @@ function wrapJavaObject(thing) {
__getIds__ : function() { __getIds__ : function() {
var r = new Array(array.length); var r = new Array(array.length);
for (var i = 0; i < array.length; i++) { for (var i = 0; i < array.length; i++) {
r[i] = i; r[i] = String(i);
} }
return r; return r;
}, },
__has__: function(name) { __has__: function(name) {
return (typeof(name) == 'number' && return (name >= 0 && name < array.length) ||
name >= 0 && name < array.length) ||
name == 'length' || name == 'class' || name == 'length' || name == 'class' ||
name == 'toString' || name == 'wrapped-object'; name == 'toString' || name == 'wrapped-object';
}, },
__get__: function(name) { __get__: function(name) {
if (typeof(name) == 'number' && if (name >= 0 && name < array.length) {
name >= 0 && name < array.length) {
return elements[name]; return elements[name];
} }
if (name == 'length') { if (name == 'length') {
return array.length; return array.length;
} else if (name == 'toString') {
return function() { return array.valueString(true); }
} else if (name == 'wrapped-object') { } else if (name == 'wrapped-object') {
return array; return array;
} else if (name == 'class') { } else if (name == 'class') {
@ -400,7 +407,14 @@ function wrapJavaObject(thing) {
} else { } else {
return undefined; return undefined;
} }
} },
__call__: function(name) {
if (name == 'toString') {
return array.valueString(true);
} else {
return undefined;
}
}
} }
} }
return javaObject(thing); return javaObject(thing);
@ -673,34 +687,33 @@ function wrapHeapSnapshot(heap) {
__getIds__ : function() { __getIds__ : function() {
var res = new Array(path.length); var res = new Array(path.length);
for (var i = 0; i < path.length; i++) { for (var i = 0; i < path.length; i++) {
res[i] = i; res[i] = String(i);
} }
return res; return res;
}, },
__has__ : function (name) { __has__ : function (name) {
return (typeof(name) == 'number' && return (name >= 0 && name < path.length) ||
name >= 0 && name < path.length) ||
name == 'length' || name == 'toHtml' || name == 'length' || name == 'toHtml' ||
name == 'toString'; name == 'toString';
}, },
__get__ : function(name) { __get__ : function(name) {
if (typeof(name) == 'number' && if (name >= 0 && name < path.length) {
name >= 0 && name < path.length) {
return path[name]; return path[name];
} else if (name == 'length') { } else if (name == 'length') {
return path.length; return path.length;
} else if (name == 'toHtml') {
return function() {
return computeDescription(true);
}
} else if (name == 'toString') {
return function() {
return computeDescription(false);
}
} else { } else {
return undefined; return undefined;
} }
}, },
__call__: function(name) {
if (name == 'toHtml') {
return computeDescription(true);
} else if (name == 'toString') {
return computeDescription(false);
} else {
return undefined;
}
}
}; };
} }
@ -1005,22 +1018,8 @@ function toHtml(obj) {
return "<a href='/object/" + id + "'>" + return "<a href='/object/" + id + "'>" +
name + "@" + id + "</a>"; name + "@" + id + "</a>";
} }
} else if ((typeof(obj) == 'object') || (obj instanceof JSAdapter)) { } else if (obj instanceof Object) {
if (obj instanceof java.lang.Object) { if (Array.isArray(obj)) {
// script wrapped Java object
obj = wrapIterator(obj);
// special case for enumeration
if (obj instanceof java.util.Enumeration) {
var res = "[ ";
while (obj.hasMoreElements()) {
res += toHtml(obj.nextElement()) + ", ";
}
res += "]";
return res;
} else {
return obj;
}
} else if (obj instanceof Array) {
// script array // script array
var res = "[ "; var res = "[ ";
for (var i in obj) { for (var i in obj) {
@ -1047,8 +1046,19 @@ function toHtml(obj) {
} }
} }
} else { } else {
// JavaScript primitive value // a Java object
return obj; obj = wrapIterator(obj);
// special case for enumeration
if (obj instanceof java.util.Enumeration) {
var res = "[ ";
while (obj.hasMoreElements()) {
res += toHtml(obj.nextElement()) + ", ";
}
res += "]";
return res;
} else {
return obj;
}
} }
} }

View File

@ -79,7 +79,7 @@ bound to a JavaScript variable of the identifier name specified in <span class="
<li>select all Strings of length 100 or more <li>select all Strings of length 100 or more
<pre> <pre>
<code> <code>
select s from java.lang.String s where s.count >= 100 select s from java.lang.String s where s.value.length >= 100
</code> </code>
</pre> </pre>
<li>select all int arrays of length 256 or more <li>select all int arrays of length 256 or more
@ -92,7 +92,7 @@ bound to a JavaScript variable of the identifier name specified in <span class="
<pre> <pre>
<code> <code>
select s.value.toString() from java.lang.String s select s.value.toString() from java.lang.String s
where /java/(s.value.toString()) where /java/.test(s.value.toString())
</code> </code>
</pre> </pre>
<li>show path value of all File objects <li>show path value of all File objects
@ -219,7 +219,6 @@ Examples:
<pre> <pre>
<code> <code>
select heap.findClass("java.lang.System").statics.props select heap.findClass("java.lang.System").statics.props
select heap.findClass("java.lang.System").props
</code> </code>
</pre> </pre>
<li>get number of fields of java.lang.String class <li>get number of fields of java.lang.String class
@ -237,7 +236,7 @@ Examples:
<li>select all classes that have name pattern java.net.* <li>select all classes that have name pattern java.net.*
<pre> <pre>
<code> <code>
select <a href="#filter">filter</a>(heap.classes(), "/java.net./(it.name)") select <a href="#filter">filter</a>(heap.classes(), "/java.net./.test(it.name)")
</code> </code>
</pre> </pre>
</ul> </ul>
@ -536,7 +535,7 @@ refer to the following built-in variables.
Example: print number of classes that have specific name pattern Example: print number of classes that have specific name pattern
<pre> <pre>
<code> <code>
select count(<a href="#classes">heap.classes()</a>, "/java.io./(it.name)") select count(<a href="#classes">heap.classes()</a>, "/java.io./.test(it.name)")
</code> </code>
</pre> </pre>
@ -559,14 +558,14 @@ Examples:
<li>show all classes that have java.io.* name pattern <li>show all classes that have java.io.* name pattern
<pre> <pre>
<code> <code>
select filter(<a href="#classes">heap.classes</a>(), "/java.io./(it.name)") select filter(<a href="#classes">heap.classes</a>(), "/java.io./.test(it.name)")
</code> </code>
</pre> </pre>
<li> show all referrers of URL object where the referrer is not from <li> show all referrers of URL object where the referrer is not from
java.net package java.net package
<pre> <pre>
<code> <code>
select filter(<a href="#referrers">referrers</a>(u), "! /java.net./(<a href="#classof">classof</a>(it).name)") select filter(<a href="#referrers">referrers</a>(u), "! /java.net./.test(<a href="#classof">classof</a>(it).name)")
from java.net.URL u from java.net.URL u
</code> </code>
</pre> </pre>
@ -619,13 +618,13 @@ Examples:
<li>find the maximum length of any String instance <li>find the maximum length of any String instance
<pre> <pre>
<code> <code>
select max(map(heap.objects('java.lang.String', false), 'it.count')) select max(map(heap.objects('java.lang.String', false), 'it.value.length'))
</code> </code>
</pre> </pre>
<li>find string instance that has the maximum length <li>find string instance that has the maximum length
<pre> <pre>
<code> <code>
select max(heap.objects('java.lang.String'), 'lhs.count > rhs.count') select max(heap.objects('java.lang.String'), 'lhs.value.length > rhs.value.length')
</code> </code>
</pre> </pre>
</ul> </ul>
@ -775,7 +774,7 @@ and walk until parent is null using the callback function to map call.
<pre> <pre>
<code> <code>
select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').props.table, 'it != null'), select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').statics.props.table, 'it != null'),
function (it) { function (it) {
var res = ""; var res = "";
while (it != null) { while (it != null) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1995, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -56,7 +56,7 @@ public interface AppletContext {
/** /**
* Returns an <code>Image</code> object that can then be painted on * Returns an <code>Image</code> object that can then be painted on
* the screen. The <code>url</code> argument<code> </code>that is * the screen. The <code>url</code> argument that is
* passed as an argument must specify an absolute URL. * passed as an argument must specify an absolute URL.
* <p> * <p>
* This method always returns immediately, whether or not the image * This method always returns immediately, whether or not the image
@ -157,7 +157,7 @@ public interface AppletContext {
* @param stream stream to be associated with the specified key. If this * @param stream stream to be associated with the specified key. If this
* parameter is <code>null</code>, the specified key is removed * parameter is <code>null</code>, the specified key is removed
* in this applet context. * in this applet context.
* @throws <code>IOException</code> if the stream size exceeds a certain * @throws IOException if the stream size exceeds a certain
* size limit. Size limit is decided by the implementor of this * size limit. Size limit is decided by the implementor of this
* interface. * interface.
* @since 1.4 * @since 1.4

View File

@ -42,7 +42,7 @@ import java.util.EventListener;
* Container events are provided for notification purposes ONLY; * Container events are provided for notification purposes ONLY;
* The AWT will automatically handle add and remove operations * The AWT will automatically handle add and remove operations
* internally so the program works properly regardless of * internally so the program works properly regardless of
* whether the program registers a <code>ComponentListener</code> or not. * whether the program registers a {@code ContainerListener} or not.
* *
* @see ContainerAdapter * @see ContainerAdapter
* @see ContainerEvent * @see ContainerEvent

View File

@ -55,7 +55,7 @@ import java.awt.Image;
* Alternatively, the contents of the back buffer can be copied, or * Alternatively, the contents of the back buffer can be copied, or
* <i>blitted</i> forward in a chain instead of moving the video pointer. * <i>blitted</i> forward in a chain instead of moving the video pointer.
* <p> * <p>
* <pre> * <pre>{@code
* Double buffering: * Double buffering:
* *
* *********** *********** * *********** ***********
@ -72,7 +72,7 @@ import java.awt.Image;
* * * <------ * * <----- * * * * * <------ * * <----- * *
* *********** *********** *********** * *********** *********** ***********
* *
* </pre> * }</pre>
* <p> * <p>
* Here is an example of how buffer strategies can be created and used: * Here is an example of how buffer strategies can be created and used:
* <pre><code> * <pre><code>

View File

@ -602,12 +602,12 @@ public class BufferedImage extends java.awt.Image
* the raster has been premultiplied with alpha. * the raster has been premultiplied with alpha.
* @param properties <code>Hashtable</code> of * @param properties <code>Hashtable</code> of
* <code>String</code>/<code>Object</code> pairs. * <code>String</code>/<code>Object</code> pairs.
* @exception <code>RasterFormatException</code> if the number and * @exception RasterFormatException if the number and
* types of bands in the <code>SampleModel</code> of the * types of bands in the <code>SampleModel</code> of the
* <code>Raster</code> do not match the number and types required by * <code>Raster</code> do not match the number and types required by
* the <code>ColorModel</code> to represent its color and alpha * the <code>ColorModel</code> to represent its color and alpha
* components. * components.
* @exception <code>IllegalArgumentException</code> if * @exception IllegalArgumentException if
* <code>raster</code> is incompatible with <code>cm</code> * <code>raster</code> is incompatible with <code>cm</code>
* @see ColorModel * @see ColorModel
* @see Raster * @see Raster
@ -927,7 +927,7 @@ public class BufferedImage extends java.awt.Image
* each color component in the returned data when * each color component in the returned data when
* using this method. With a specified coordinate (x,&nbsp;y) in the * using this method. With a specified coordinate (x,&nbsp;y) in the
* image, the ARGB pixel can be accessed in this way: * image, the ARGB pixel can be accessed in this way:
* </p> * <p>
* *
* <pre> * <pre>
* pixel = rgbArray[offset + (y-startY)*scansize + (x-startX)]; </pre> * pixel = rgbArray[offset + (y-startY)*scansize + (x-startX)]; </pre>
@ -1131,7 +1131,7 @@ public class BufferedImage extends java.awt.Image
* @return an {@link Object} that is the property referred to by the * @return an {@link Object} that is the property referred to by the
* specified <code>name</code> or <code>null</code> if the * specified <code>name</code> or <code>null</code> if the
* properties of this image are not yet known. * properties of this image are not yet known.
* @throws <code>NullPointerException</code> if the property name is null. * @throws NullPointerException if the property name is null.
* @see ImageObserver * @see ImageObserver
* @see java.awt.Image#UndefinedProperty * @see java.awt.Image#UndefinedProperty
*/ */
@ -1144,7 +1144,7 @@ public class BufferedImage extends java.awt.Image
* @param name the property name * @param name the property name
* @return an <code>Object</code> that is the property referred to by * @return an <code>Object</code> that is the property referred to by
* the specified <code>name</code>. * the specified <code>name</code>.
* @throws <code>NullPointerException</code> if the property name is null. * @throws NullPointerException if the property name is null.
*/ */
public Object getProperty(String name) { public Object getProperty(String name) {
if (name == null) { if (name == null) {
@ -1196,7 +1196,7 @@ public class BufferedImage extends java.awt.Image
* @param h the height of the specified rectangular region * @param h the height of the specified rectangular region
* @return a <code>BufferedImage</code> that is the subimage of this * @return a <code>BufferedImage</code> that is the subimage of this
* <code>BufferedImage</code>. * <code>BufferedImage</code>.
* @exception <code>RasterFormatException</code> if the specified * @exception RasterFormatException if the specified
* area is not contained within this <code>BufferedImage</code>. * area is not contained within this <code>BufferedImage</code>.
*/ */
public BufferedImage getSubimage (int x, int y, int w, int h) { public BufferedImage getSubimage (int x, int y, int w, int h) {
@ -1388,7 +1388,7 @@ public class BufferedImage extends java.awt.Image
* @param tileY the y index of the requested tile in the tile array * @param tileY the y index of the requested tile in the tile array
* @return a <code>Raster</code> that is the tile defined by the * @return a <code>Raster</code> that is the tile defined by the
* arguments <code>tileX</code> and <code>tileY</code>. * arguments <code>tileX</code> and <code>tileY</code>.
* @exception <code>ArrayIndexOutOfBoundsException</code> if both * @exception ArrayIndexOutOfBoundsException if both
* <code>tileX</code> and <code>tileY</code> are not * <code>tileX</code> and <code>tileY</code> are not
* equal to 0 * equal to 0
*/ */
@ -1558,7 +1558,7 @@ public class BufferedImage extends java.awt.Image
* @return <code>true</code> if the tile specified by the specified * @return <code>true</code> if the tile specified by the specified
* indices is checked out for writing; <code>false</code> * indices is checked out for writing; <code>false</code>
* otherwise. * otherwise.
* @exception <code>ArrayIndexOutOfBoundsException</code> if both * @exception ArrayIndexOutOfBoundsException if both
* <code>tileX</code> and <code>tileY</code> are not equal * <code>tileX</code> and <code>tileY</code> are not equal
* to 0 * to 0
*/ */

View File

@ -171,7 +171,7 @@ public class ByteLookupTable extends LookupTable {
* @exception ArrayIndexOutOfBoundsException if <code>src</code> is * @exception ArrayIndexOutOfBoundsException if <code>src</code> is
* longer than <code>dst</code> or if for any element * longer than <code>dst</code> or if for any element
* <code>i</code> of <code>src</code>, * <code>i</code> of <code>src</code>,
* <code>(src[i]&0xff)-offset</code> is either less than * {@code (src[i]&0xff)-offset} is either less than
* zero or greater than or equal to the length of the * zero or greater than or equal to the length of the
* lookup table for any band. * lookup table for any band.
*/ */

View File

@ -692,12 +692,12 @@ public abstract class ColorModel implements Transparency{
* <code>DataBuffer.TYPE_INT</code>. * <code>DataBuffer.TYPE_INT</code>.
* @param inData an array of pixel values * @param inData an array of pixel values
* @return the value of the green component of the specified pixel. * @return the value of the green component of the specified pixel.
* @throws <code>ClassCastException</code> if <code>inData</code> * @throws ClassCastException if <code>inData</code>
* is not a primitive array of type <code>transferType</code> * is not a primitive array of type <code>transferType</code>
* @throws <code>ArrayIndexOutOfBoundsException</code> if * @throws ArrayIndexOutOfBoundsException if
* <code>inData</code> is not large enough to hold a pixel value * <code>inData</code> is not large enough to hold a pixel value
* for this <code>ColorModel</code> * for this <code>ColorModel</code>
* @throws <code>UnsupportedOperationException</code> if this * @throws UnsupportedOperationException if this
* <code>tranferType</code> is not supported by this * <code>tranferType</code> is not supported by this
* <code>ColorModel</code> * <code>ColorModel</code>
*/ */

View File

@ -642,12 +642,12 @@ public class DirectColorModel extends PackedColorModel {
* @param inData the specified pixel * @param inData the specified pixel
* @return the alpha component of the specified pixel, scaled from * @return the alpha component of the specified pixel, scaled from
* 0 to 255. * 0 to 255.
* @exception <code>ClassCastException</code> if <code>inData</code> * @exception ClassCastException if <code>inData</code>
* is not a primitive array of type <code>transferType</code> * is not a primitive array of type <code>transferType</code>
* @exception <code>ArrayIndexOutOfBoundsException</code> if * @exception ArrayIndexOutOfBoundsException if
* <code>inData</code> is not large enough to hold a pixel value * <code>inData</code> is not large enough to hold a pixel value
* for this <code>ColorModel</code> * for this <code>ColorModel</code>
* @exception <code>UnsupportedOperationException</code> if this * @exception UnsupportedOperationException if this
* <code>tranferType</code> is not supported by this * <code>tranferType</code> is not supported by this
* <code>ColorModel</code> * <code>ColorModel</code>
*/ */
@ -1055,7 +1055,7 @@ public class DirectColorModel extends PackedColorModel {
* begin retrieving the color and alpha components * begin retrieving the color and alpha components
* @return an <code>int</code> pixel value in this * @return an <code>int</code> pixel value in this
* <code>ColorModel</code> corresponding to the specified components. * <code>ColorModel</code> corresponding to the specified components.
* @exception <code>ArrayIndexOutOfBoundsException</code> if * @exception ArrayIndexOutOfBoundsException if
* the <code>components</code> array is not large enough to * the <code>components</code> array is not large enough to
* hold all of the color and alpha components starting at * hold all of the color and alpha components starting at
* <code>offset</code> * <code>offset</code>
@ -1097,9 +1097,9 @@ public class DirectColorModel extends PackedColorModel {
* and alpha components * and alpha components
* @return an <code>Object</code> representing an array of color and * @return an <code>Object</code> representing an array of color and
* alpha components. * alpha components.
* @exception <code>ClassCastException</code> if <code>obj</code> * @exception ClassCastException if <code>obj</code>
* is not a primitive array of type <code>transferType</code> * is not a primitive array of type <code>transferType</code>
* @exception <code>ArrayIndexOutOfBoundsException</code> if * @exception ArrayIndexOutOfBoundsException if
* <code>obj</code> is not large enough to hold a pixel value * <code>obj</code> is not large enough to hold a pixel value
* for this <code>ColorModel</code> or the <code>components</code> * for this <code>ColorModel</code> or the <code>components</code>
* array is not large enough to hold all of the color and alpha * array is not large enough to hold all of the color and alpha

View File

@ -100,11 +100,11 @@ public interface ImageProducer {
* <code>ImageProducer</code> should respond by executing * <code>ImageProducer</code> should respond by executing
* the following minimum set of <code>ImageConsumer</code> * the following minimum set of <code>ImageConsumer</code>
* method calls: * method calls:
* <pre> * <pre>{@code
* ic.setHints(TOPDOWNLEFTRIGHT | < otherhints >); * ic.setHints(TOPDOWNLEFTRIGHT | < otherhints >);
* ic.setPixels(...); // As many times as needed * ic.setPixels(...); // As many times as needed
* ic.imageComplete(); * ic.imageComplete();
* </pre> * }</pre>
* @param ic the specified <code>ImageConsumer</code> * @param ic the specified <code>ImageConsumer</code>
* @see ImageConsumer#setHints * @see ImageConsumer#setHints
*/ */

View File

@ -98,6 +98,7 @@ import java.math.BigInteger;
* Index values greater than or equal to the map size, but less than * Index values greater than or equal to the map size, but less than
* 2<sup><em>n</em></sup>, are undefined and return 0 for all color and * 2<sup><em>n</em></sup>, are undefined and return 0 for all color and
* alpha components. * alpha components.
* </a>
* <p> * <p>
* For those methods that use a primitive array pixel representation of * For those methods that use a primitive array pixel representation of
* type <code>transferType</code>, the array length is always one. * type <code>transferType</code>, the array length is always one.

View File

@ -37,7 +37,7 @@ import java.util.Enumeration;
* uses an array to produce pixel values for an Image. Here is an example * uses an array to produce pixel values for an Image. Here is an example
* which calculates a 100x100 image representing a fade from black to blue * which calculates a 100x100 image representing a fade from black to blue
* along the X axis and a fade from black to red along the Y axis: * along the X axis and a fade from black to red along the Y axis:
* <pre> * <pre>{@code
* *
* int w = 100; * int w = 100;
* int h = 100; * int h = 100;
@ -52,12 +52,12 @@ import java.util.Enumeration;
* } * }
* Image img = createImage(new MemoryImageSource(w, h, pix, 0, w)); * Image img = createImage(new MemoryImageSource(w, h, pix, 0, w));
* *
* </pre> * }</pre>
* The MemoryImageSource is also capable of managing a memory image which * The MemoryImageSource is also capable of managing a memory image which
* varies over time to allow animation or custom rendering. Here is an * varies over time to allow animation or custom rendering. Here is an
* example showing how to set up the animation source and signal changes * example showing how to set up the animation source and signal changes
* in the data (adapted from the MemoryAnimationSourceDemo by Garth Dickie): * in the data (adapted from the MemoryAnimationSourceDemo by Garth Dickie):
* <pre> * <pre>{@code
* *
* int pixels[]; * int pixels[];
* MemoryImageSource source; * MemoryImageSource source;
@ -96,7 +96,7 @@ import java.util.Enumeration;
* } * }
* } * }
* *
* </pre> * }</pre>
* *
* @see ImageProducer * @see ImageProducer
* *

View File

@ -52,14 +52,14 @@ package java.awt.image;
* <code>x,&nbsp;y</code> from <code>DataBuffer</code> <code>data</code> * <code>x,&nbsp;y</code> from <code>DataBuffer</code> <code>data</code>
* and storing the pixel data in data elements of type * and storing the pixel data in data elements of type
* <code>dataType</code>: * <code>dataType</code>:
* <pre> * <pre>{@code
* int dataElementSize = DataBuffer.getDataTypeSize(dataType); * int dataElementSize = DataBuffer.getDataTypeSize(dataType);
* int bitnum = dataBitOffset + x*pixelBitStride; * int bitnum = dataBitOffset + x*pixelBitStride;
* int element = data.getElem(y*scanlineStride + bitnum/dataElementSize); * int element = data.getElem(y*scanlineStride + bitnum/dataElementSize);
* int shift = dataElementSize - (bitnum & (dataElementSize-1)) * int shift = dataElementSize - (bitnum & (dataElementSize-1))
* - pixelBitStride; * - pixelBitStride;
* int pixel = (element >> shift) & ((1 << pixelBitStride) - 1); * int pixel = (element >> shift) & ((1 << pixelBitStride) - 1);
* </pre> * }</pre>
*/ */
public class MultiPixelPackedSampleModel extends SampleModel public class MultiPixelPackedSampleModel extends SampleModel

View File

@ -35,7 +35,7 @@ import java.awt.Image;
* The PixelGrabber class implements an ImageConsumer which can be attached * The PixelGrabber class implements an ImageConsumer which can be attached
* to an Image or ImageProducer object to retrieve a subset of the pixels * to an Image or ImageProducer object to retrieve a subset of the pixels
* in that image. Here is an example: * in that image. Here is an example:
* <pre> * <pre>{@code
* *
* public void handlesinglepixel(int x, int y, int pixel) { * public void handlesinglepixel(int x, int y, int pixel) {
* int alpha = (pixel >> 24) & 0xff; * int alpha = (pixel >> 24) & 0xff;
@ -65,7 +65,7 @@ import java.awt.Image;
* } * }
* } * }
* *
* </pre> * }</pre>
* *
* @see ColorModel#getRGBdefault * @see ColorModel#getRGBdefault
* *
@ -165,8 +165,8 @@ public class PixelGrabber implements ImageConsumer {
* accumulated in the default RGB ColorModel. If the forceRGB * accumulated in the default RGB ColorModel. If the forceRGB
* parameter is true, then the pixels will be accumulated in the * parameter is true, then the pixels will be accumulated in the
* default RGB ColorModel anyway. A buffer is allocated by the * default RGB ColorModel anyway. A buffer is allocated by the
* PixelGrabber to hold the pixels in either case. If (w < 0) or * PixelGrabber to hold the pixels in either case. If {@code (w < 0)} or
* (h < 0), then they will default to the remaining width and * {@code (h < 0)}, then they will default to the remaining width and
* height of the source data when that information is delivered. * height of the source data when that information is delivered.
* @param img the image to retrieve the image data from * @param img the image to retrieve the image data from
* @param x the x coordinate of the upper left corner of the rectangle * @param x the x coordinate of the upper left corner of the rectangle
@ -233,10 +233,10 @@ public class PixelGrabber implements ImageConsumer {
* behaves in the following ways, depending on the value of * behaves in the following ways, depending on the value of
* <code>ms</code>: * <code>ms</code>:
* <ul> * <ul>
* <li> If <code>ms</code> == 0, waits until all pixels are delivered * <li> If {@code ms == 0}, waits until all pixels are delivered
* <li> If <code>ms</code> > 0, waits until all pixels are delivered * <li> If {@code ms > 0}, waits until all pixels are delivered
* as timeout expires. * as timeout expires.
* <li> If <code>ms</code> < 0, returns <code>true</code> if all pixels * <li> If {@code ms < 0}, returns <code>true</code> if all pixels
* are grabbed, <code>false</code> otherwise and does not wait. * are grabbed, <code>false</code> otherwise and does not wait.
* </ul> * </ul>
* @param ms the number of milliseconds to wait for the image pixels * @param ms the number of milliseconds to wait for the image pixels

View File

@ -39,7 +39,7 @@ import java.awt.image.ColorModel;
* The only method which needs to be defined to create a useable image * The only method which needs to be defined to create a useable image
* filter is the filterRGB method. Here is an example of a definition * filter is the filterRGB method. Here is an example of a definition
* of a filter which swaps the red and blue components of an image: * of a filter which swaps the red and blue components of an image:
* <pre> * <pre>{@code
* *
* class RedBlueSwapFilter extends RGBImageFilter { * class RedBlueSwapFilter extends RGBImageFilter {
* public RedBlueSwapFilter() { * public RedBlueSwapFilter() {
@ -56,7 +56,7 @@ import java.awt.image.ColorModel;
* } * }
* } * }
* *
* </pre> * }</pre>
* *
* @see FilteredImageSource * @see FilteredImageSource
* @see ImageFilter * @see ImageFilter

View File

@ -114,7 +114,7 @@ public class ShortLookupTable extends LookupTable {
* @exception ArrayIndexOutOfBoundsException if <code>src</code> is * @exception ArrayIndexOutOfBoundsException if <code>src</code> is
* longer than <code>dst</code> or if for any element * longer than <code>dst</code> or if for any element
* <code>i</code> of <code>src</code>, * <code>i</code> of <code>src</code>,
* <code>(src[i]&0xffff)-offset</code> is either less than * {@code (src[i]&0xffff)-offset} is either less than
* zero or greater than or equal to the length of the * zero or greater than or equal to the length of the
* lookup table for any band. * lookup table for any band.
*/ */
@ -165,7 +165,7 @@ public class ShortLookupTable extends LookupTable {
* @exception ArrayIndexOutOfBoundsException if <code>src</code> is * @exception ArrayIndexOutOfBoundsException if <code>src</code> is
* longer than <code>dst</code> or if for any element * longer than <code>dst</code> or if for any element
* <code>i</code> of <code>src</code>, * <code>i</code> of <code>src</code>,
* <code>(src[i]&0xffff)-offset</code> is either less than * {@code (src[i]&0xffff)-offset} is either less than
* zero or greater than or equal to the length of the * zero or greater than or equal to the length of the
* lookup table for any band. * lookup table for any band.
*/ */

View File

@ -57,10 +57,10 @@ import java.util.Arrays;
* The following code illustrates extracting the bits of the sample * The following code illustrates extracting the bits of the sample
* representing band <code>b</code> for pixel <code>x,y</code> * representing band <code>b</code> for pixel <code>x,y</code>
* from DataBuffer <code>data</code>: * from DataBuffer <code>data</code>:
* <pre> * <pre>{@code
* int sample = data.getElem(y * scanlineStride + x); * int sample = data.getElem(y * scanlineStride + x);
* sample = (sample & bitMasks[b]) >>> bitOffsets[b]; * sample = (sample & bitMasks[b]) >>> bitOffsets[b];
* </pre> * }</pre>
*/ */
public class SinglePixelPackedSampleModel extends SampleModel public class SinglePixelPackedSampleModel extends SampleModel

View File

@ -372,13 +372,13 @@ public class WritableRaster extends Raster {
* integral type and less than or equal to 32 bits in size, then calling * integral type and less than or equal to 32 bits in size, then calling
* this method is equivalent to executing the following code for all * this method is equivalent to executing the following code for all
* <code>x,y</code> addresses valid in both Rasters. * <code>x,y</code> addresses valid in both Rasters.
* <pre> * <pre>{@code
* Raster srcRaster; * Raster srcRaster;
* WritableRaster dstRaster; * WritableRaster dstRaster;
* for (int b = 0; b < srcRaster.getNumBands(); b++) { * for (int b = 0; b < srcRaster.getNumBands(); b++) {
* dstRaster.setSample(x, y, b, srcRaster.getSample(x, y, b)); * dstRaster.setSample(x, y, b, srcRaster.getSample(x, y, b));
* } * }
* </pre> * }</pre>
* Thus, when copying an integral type source to an integral type * Thus, when copying an integral type source to an integral type
* destination, if the source sample size is greater than the destination * destination, if the source sample size is greater than the destination
* sample size for a particular band, the high order bits of the source * sample size for a particular band, the high order bits of the source

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2000, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -68,7 +68,6 @@ public interface AppletInitializer {
* the Applet with its Container during the subsequent invocation of its * the Applet with its Container during the subsequent invocation of its
* addChildren() method. * addChildren() method.
* </ol> * </ol>
* </p>
* *
* @param newAppletBean The newly instantiated JavaBean * @param newAppletBean The newly instantiated JavaBean
* @param bCtxt The BeanContext intended for this Applet, or * @param bCtxt The BeanContext intended for this Applet, or

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -62,7 +62,7 @@ public class Beans {
* <p> * <p>
* Instantiate a JavaBean. * Instantiate a JavaBean.
* </p> * </p>
* * @return a JavaBean
* @param cls the class-loader from which we should create * @param cls the class-loader from which we should create
* the bean. If this is null, then the system * the bean. If this is null, then the system
* class-loader is used. * class-loader is used.
@ -82,6 +82,7 @@ public class Beans {
* <p> * <p>
* Instantiate a JavaBean. * Instantiate a JavaBean.
* </p> * </p>
* @return a JavaBean
* *
* @param cls the class-loader from which we should create * @param cls the class-loader from which we should create
* the bean. If this is null, then the system * the bean. If this is null, then the system
@ -137,6 +138,7 @@ public class Beans {
* the JDK appletviewer (for a reference browser environment) and the * the JDK appletviewer (for a reference browser environment) and the
* BDK BeanBox (for a reference bean container). * BDK BeanBox (for a reference bean container).
* *
* @return a JavaBean
* @param cls the class-loader from which we should create * @param cls the class-loader from which we should create
* the bean. If this is null, then the system * the bean. If this is null, then the system
* class-loader is used. * class-loader is used.
@ -361,6 +363,8 @@ public class Beans {
* This method is provided in Beans 1.0 as a hook to allow the * This method is provided in Beans 1.0 as a hook to allow the
* addition of more flexible bean behaviour in the future. * addition of more flexible bean behaviour in the future.
* *
* @return an object representing a specified type view of the
* source object
* @param bean Object from which we want to obtain a view. * @param bean Object from which we want to obtain a view.
* @param targetType The type of view we'd like to get. * @param targetType The type of view we'd like to get.
* *
@ -384,7 +388,6 @@ public class Beans {
return Introspector.isSubclass(bean.getClass(), targetType); return Introspector.isSubclass(bean.getClass(), targetType);
} }
/** /**
* Test if we are in design-mode. * Test if we are in design-mode.
* *

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -61,7 +61,7 @@ import static java.lang.annotation.RetentionPolicy.*;
the {@code getY()} method. Since parameter names are not in the {@code getY()} method. Since parameter names are not in
general available at runtime, without the annotation there would be general available at runtime, without the annotation there would be
no way to know whether the parameters correspond to {@code getX()} no way to know whether the parameters correspond to {@code getX()}
and {@code getY()} or the other way around.</p> and {@code getY()} or the other way around.
@since 1.6 @since 1.6
*/ */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -382,6 +382,7 @@ public class DefaultPersistenceDelegate extends PersistenceDelegate {
* a class such that no property value depends on the value of * a class such that no property value depends on the value of
* a subsequent property. * a subsequent property.
* *
* @param type the type of the instances
* @param oldInstance The instance to be copied. * @param oldInstance The instance to be copied.
* @param newInstance The instance that is to be modified. * @param newInstance The instance that is to be modified.
* @param out The stream to which any initialization statements should be written. * @param out The stream to which any initialization statements should be written.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -515,6 +515,7 @@ public class EventHandler implements InvocationHandler {
*</pre> *</pre>
*</blockquote> *</blockquote>
* *
* @param <T> the type to create
* @param listenerInterface the listener interface to create a proxy for * @param listenerInterface the listener interface to create a proxy for
* @param target the object that will perform the action * @param target the object that will perform the action
* @param action the name of a (possibly qualified) property or method on * @param action the name of a (possibly qualified) property or method on
@ -570,6 +571,7 @@ public class EventHandler implements InvocationHandler {
*</pre> *</pre>
*</blockquote> *</blockquote>
* *
* @param <T> the type to create
* @param listenerInterface the listener interface to create a proxy for * @param listenerInterface the listener interface to create a proxy for
* @param target the object that will perform the action * @param target the object that will perform the action
* @param action the name of a (possibly qualified) property or method on * @param action the name of a (possibly qualified) property or method on
@ -659,6 +661,7 @@ public class EventHandler implements InvocationHandler {
* </pre> * </pre>
*</blockquote> *</blockquote>
* *
* @param <T> the type to create
* @param listenerInterface the listener interface to create a proxy for * @param listenerInterface the listener interface to create a proxy for
* @param target the object that will perform the action * @param target the object that will perform the action
* @param action the name of a (possibly qualified) property or method on * @param action the name of a (possibly qualified) property or method on

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -139,7 +139,7 @@ public class Expression extends Statement {
* replaces this default value in the same way that any other value * replaces this default value in the same way that any other value
* would, ensuring that expressions are never evaluated more than once. * would, ensuring that expressions are never evaluated more than once.
* <p> * <p>
* See the <code>excecute</code> method for details on how * See the <code>execute</code> method for details on how
* methods are chosen using the dynamic types of the target * methods are chosen using the dynamic types of the target
* and arguments. * and arguments.
* *
@ -147,6 +147,8 @@ public class Expression extends Statement {
* @see #setValue * @see #setValue
* *
* @return The result of applying this method to these arguments. * @return The result of applying this method to these arguments.
* @throws Exception if the method with the specified methodName
* throws an exception
*/ */
public Object getValue() throws Exception { public Object getValue() throws Exception {
if (value == unbound) { if (value == unbound) {

View File

@ -207,6 +207,8 @@ public class IndexedPropertyDescriptor extends PropertyDescriptor {
* Sets the method that should be used to read an indexed property value. * Sets the method that should be used to read an indexed property value.
* *
* @param readMethod The new indexed read method. * @param readMethod The new indexed read method.
* @throws IntrospectionException if an exception occurs during
* introspection.
*/ */
public synchronized void setIndexedReadMethod(Method readMethod) public synchronized void setIndexedReadMethod(Method readMethod)
throws IntrospectionException { throws IntrospectionException {
@ -285,6 +287,8 @@ public class IndexedPropertyDescriptor extends PropertyDescriptor {
* Sets the method that should be used to write an indexed property value. * Sets the method that should be used to write an indexed property value.
* *
* @param writeMethod The new indexed write method. * @param writeMethod The new indexed write method.
* @throws IntrospectionException if an exception occurs during
* introspection.
*/ */
public synchronized void setIndexedWriteMethod(Method writeMethod) public synchronized void setIndexedWriteMethod(Method writeMethod)
throws IntrospectionException { throws IntrospectionException {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -93,8 +93,17 @@ import sun.reflect.misc.ReflectUtil;
public class Introspector { public class Introspector {
// Flags that can be used to control getBeanInfo: // Flags that can be used to control getBeanInfo:
/**
* Flag to indicate to use of all beaninfo.
*/
public final static int USE_ALL_BEANINFO = 1; public final static int USE_ALL_BEANINFO = 1;
/**
* Flag to indicate to ignore immediate beaninfo.
*/
public final static int IGNORE_IMMEDIATE_BEANINFO = 2; public final static int IGNORE_IMMEDIATE_BEANINFO = 2;
/**
* Flag to indicate to ignore all beaninfo.
*/
public final static int IGNORE_ALL_BEANINFO = 3; public final static int IGNORE_ALL_BEANINFO = 3;
// Static Caches to speed up introspection. // Static Caches to speed up introspection.
@ -202,7 +211,7 @@ public class Introspector {
* If the BeanInfo class for a Java Bean has been previously Introspected * If the BeanInfo class for a Java Bean has been previously Introspected
* based on the same arguments, then the BeanInfo class is retrieved * based on the same arguments, then the BeanInfo class is retrieved
* from the BeanInfo cache. * from the BeanInfo cache.
* * @return the BeanInfo for the bean
* @param beanClass The bean class to be analyzed. * @param beanClass The bean class to be analyzed.
* @param stopClass The baseclass at which to stop the analysis. Any * @param stopClass The baseclass at which to stop the analysis. Any
* methods/properties/events in the stopClass or in its baseclasses * methods/properties/events in the stopClass or in its baseclasses

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -197,6 +197,7 @@ public abstract class PersistenceDelegate {
* The default implementation, calls the <code>initialize</code> * The default implementation, calls the <code>initialize</code>
* method of the type's superclass. * method of the type's superclass.
* *
* @param type the type of the instances
* @param oldInstance The instance to be copied. * @param oldInstance The instance to be copied.
* @param newInstance The instance that is to be modified. * @param newInstance The instance that is to be modified.
* @param out The stream to which any initialization statements should be written. * @param out The stream to which any initialization statements should be written.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -156,7 +156,7 @@ public class PropertyChangeSupport implements Serializable {
* <code>PropertyChangeListenerProxy</code>, perform the cast, and examine * <code>PropertyChangeListenerProxy</code>, perform the cast, and examine
* the parameter. * the parameter.
* *
* <pre> * <pre>{@code
* PropertyChangeListener[] listeners = bean.getPropertyChangeListeners(); * PropertyChangeListener[] listeners = bean.getPropertyChangeListeners();
* for (int i = 0; i < listeners.length; i++) { * for (int i = 0; i < listeners.length; i++) {
* if (listeners[i] instanceof PropertyChangeListenerProxy) { * if (listeners[i] instanceof PropertyChangeListenerProxy) {
@ -168,7 +168,7 @@ public class PropertyChangeSupport implements Serializable {
* } * }
* } * }
* } * }
*</pre> * }</pre>
* *
* @see PropertyChangeListenerProxy * @see PropertyChangeListenerProxy
* @return all of the <code>PropertyChangeListeners</code> added or an * @return all of the <code>PropertyChangeListeners</code> added or an

View File

@ -243,6 +243,7 @@ public class PropertyDescriptor extends FeatureDescriptor {
* Sets the method that should be used to read the property value. * Sets the method that should be used to read the property value.
* *
* @param readMethod The new read method. * @param readMethod The new read method.
* @throws IntrospectionException if the read method is invalid
*/ */
public synchronized void setReadMethod(Method readMethod) public synchronized void setReadMethod(Method readMethod)
throws IntrospectionException { throws IntrospectionException {
@ -313,6 +314,7 @@ public class PropertyDescriptor extends FeatureDescriptor {
* Sets the method that should be used to write the property value. * Sets the method that should be used to write the property value.
* *
* @param writeMethod The new write method. * @param writeMethod The new write method.
* @throws IntrospectionException if the write method is invalid
*/ */
public synchronized void setWriteMethod(Method writeMethod) public synchronized void setWriteMethod(Method writeMethod)
throws IntrospectionException { throws IntrospectionException {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -40,7 +40,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* A {@code true} value for the "transient" attribute * A {@code true} value for the "transient" attribute
* indicates to encoders derived from {@link Encoder} * indicates to encoders derived from {@link Encoder}
* that this feature should be ignored. * that this feature should be ignored.
* <p/> * <p>
* The {@code Transient} annotation may be be used * The {@code Transient} annotation may be be used
* in any of the methods that are involved * in any of the methods that are involved
* in a {@link FeatureDescriptor} subclass * in a {@link FeatureDescriptor} subclass
@ -49,7 +49,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* to put the annotation and it is this declaration * to put the annotation and it is this declaration
* that takes precedence in the case of multiple annotations * that takes precedence in the case of multiple annotations
* being defined for the same feature. * being defined for the same feature.
* <p/> * <p>
* To declare a feature non-transient in a class * To declare a feature non-transient in a class
* whose superclass declares it transient, * whose superclass declares it transient,
* use {@code @Transient(false)}. * use {@code @Transient(false)}.
@ -64,5 +64,11 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD}) @Target({METHOD})
@Retention(RUNTIME) @Retention(RUNTIME)
public @interface Transient { public @interface Transient {
/**
* Returns whether or not the {@code Introspector} should
* construct artifacts for the annotated method.
* @return whether or not the {@code Introspector} should
* construct artifacts for the annotated method
*/
boolean value() default true; boolean value() default true;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -42,7 +42,7 @@ import java.util.Map.Entry;
* <p> * <p>
* Here is an example of {@code VetoableChangeSupport} usage that follows * Here is an example of {@code VetoableChangeSupport} usage that follows
* the rules and recommendations laid out in the JavaBeans&trade; specification: * the rules and recommendations laid out in the JavaBeans&trade; specification:
* <pre> * <pre>{@code
* public class MyBean { * public class MyBean {
* private final VetoableChangeSupport vcs = new VetoableChangeSupport(this); * private final VetoableChangeSupport vcs = new VetoableChangeSupport(this);
* *
@ -68,7 +68,7 @@ import java.util.Map.Entry;
* *
* [...] * [...]
* } * }
* </pre> * }</pre>
* <p> * <p>
* A {@code VetoableChangeSupport} instance is thread-safe. * A {@code VetoableChangeSupport} instance is thread-safe.
* <p> * <p>
@ -156,7 +156,7 @@ public class VetoableChangeSupport implements Serializable {
* <code>VetoableChangeListenerProxy</code>, perform the cast, and examine * <code>VetoableChangeListenerProxy</code>, perform the cast, and examine
* the parameter. * the parameter.
* *
* <pre> * <pre>{@code
* VetoableChangeListener[] listeners = bean.getVetoableChangeListeners(); * VetoableChangeListener[] listeners = bean.getVetoableChangeListeners();
* for (int i = 0; i < listeners.length; i++) { * for (int i = 0; i < listeners.length; i++) {
* if (listeners[i] instanceof VetoableChangeListenerProxy) { * if (listeners[i] instanceof VetoableChangeListenerProxy) {
@ -168,7 +168,7 @@ public class VetoableChangeSupport implements Serializable {
* } * }
* } * }
* } * }
*</pre> * }</pre>
* *
* @see VetoableChangeListenerProxy * @see VetoableChangeListenerProxy
* @return all of the <code>VetoableChangeListeners</code> added or an * @return all of the <code>VetoableChangeListeners</code> added or an

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -64,10 +64,12 @@ public interface BeanContext extends BeanContextChild, Collection, DesignMode, V
* and is defined by the * and is defined by the
* <code>java.beans.Beans.instantiate()</code> method. * <code>java.beans.Beans.instantiate()</code> method.
* *
* @return a javaBean named as a child of this
* <code>BeanContext</code>
* @param beanName The name of the JavaBean to instantiate * @param beanName The name of the JavaBean to instantiate
* as a child of this <code>BeanContext</code> * as a child of this <code>BeanContext</code>
* @throws <code>IOException</code> * @throws IOException if an IO problem occurs
* @throws <code>ClassNotFoundException</code> if the class identified * @throws ClassNotFoundException if the class identified
* by the beanName parameter is not found * by the beanName parameter is not found
*/ */
Object instantiateChild(String beanName) throws IOException, ClassNotFoundException; Object instantiateChild(String beanName) throws IOException, ClassNotFoundException;
@ -83,7 +85,7 @@ public interface BeanContext extends BeanContextChild, Collection, DesignMode, V
* @return an <code>InputStream</code> for reading the resource, * @return an <code>InputStream</code> for reading the resource,
* or <code>null</code> if the resource could not * or <code>null</code> if the resource could not
* be found. * be found.
* @throws <code>IllegalArgumentException</code> if * @throws IllegalArgumentException if
* the resource is not valid * the resource is not valid
*/ */
InputStream getResourceAsStream(String name, BeanContextChild bcc) throws IllegalArgumentException; InputStream getResourceAsStream(String name, BeanContextChild bcc) throws IllegalArgumentException;
@ -98,7 +100,7 @@ public interface BeanContext extends BeanContextChild, Collection, DesignMode, V
* @param bcc the specified child * @param bcc the specified child
* @return a <code>URL</code> for the named * @return a <code>URL</code> for the named
* resource for the specified child * resource for the specified child
* @throws <code>IllegalArgumentException</code> * @throws IllegalArgumentException
* if the resource is not valid * if the resource is not valid
*/ */
URL getResource(String name, BeanContextChild bcc) throws IllegalArgumentException; URL getResource(String name, BeanContextChild bcc) throws IllegalArgumentException;
@ -109,7 +111,7 @@ public interface BeanContext extends BeanContextChild, Collection, DesignMode, V
* this <code>BeanContext</code> whenever it adds * this <code>BeanContext</code> whenever it adds
* or removes a child <code>Component</code>(s). * or removes a child <code>Component</code>(s).
* *
* @param bcml the <code>BeanContextMembershipListener</code> to be added * @param bcml the BeanContextMembershipListener to be added
*/ */
void addBeanContextMembershipListener(BeanContextMembershipListener bcml); void addBeanContextMembershipListener(BeanContextMembershipListener bcml);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -82,7 +82,7 @@ public interface BeanContextChild {
* </p> * </p>
* @param bc The <code>BeanContext</code> with which * @param bc The <code>BeanContext</code> with which
* to associate this <code>BeanContextChild</code>. * to associate this <code>BeanContextChild</code>.
* @throws <code>PropertyVetoException</code> if the * @throws PropertyVetoException if the
* addition of the specified <code>BeanContext</code> is refused. * addition of the specified <code>BeanContext</code> is refused.
*/ */
void setBeanContext(BeanContext bc) throws PropertyVetoException; void setBeanContext(BeanContext bc) throws PropertyVetoException;

View File

@ -78,6 +78,7 @@ public class BeanContextChildSupport implements BeanContextChild, BeanContextSer
* construct a BeanContextChildSupport where the JavaBean component * construct a BeanContextChildSupport where the JavaBean component
* itself implements BeanContextChild, and encapsulates this, delegating * itself implements BeanContextChild, and encapsulates this, delegating
* that interface to this implementation * that interface to this implementation
* @param bcc the underlying bean context child
*/ */
public BeanContextChildSupport(BeanContextChild bcc) { public BeanContextChildSupport(BeanContextChild bcc) {
@ -94,7 +95,7 @@ public class BeanContextChildSupport implements BeanContextChild, BeanContextSer
* this <code>BeanContextChildSupport</code>. * this <code>BeanContextChildSupport</code>.
* @param bc the new value to be assigned to the <code>BeanContext</code> * @param bc the new value to be assigned to the <code>BeanContext</code>
* property * property
* @throws <code>PropertyVetoException</code> if the change is rejected * @throws PropertyVetoException if the change is rejected
*/ */
public synchronized void setBeanContext(BeanContext bc) throws PropertyVetoException { public synchronized void setBeanContext(BeanContext bc) throws PropertyVetoException {
if (bc == beanContext) return; if (bc == beanContext) return;
@ -361,6 +362,9 @@ public class BeanContextChildSupport implements BeanContextChild, BeanContextSer
*/ */
protected VetoableChangeSupport vcSupport; protected VetoableChangeSupport vcSupport;
/**
* The bean context.
*/
protected transient BeanContext beanContext; protected transient BeanContext beanContext;
/** /**

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -103,6 +103,7 @@ public class BeanContextMembershipEvent extends BeanContextEvent {
* Is the child specified affected by the event? * Is the child specified affected by the event?
* @return <code>true</code> if affected, <code>false</code> * @return <code>true</code> if affected, <code>false</code>
* if not * if not
* @param child the object to check for being affected
*/ */
public boolean contains(Object child) { public boolean contains(Object child) {
return children.contains(child); return children.contains(child);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -60,6 +60,7 @@ public interface BeanContextServices extends BeanContext, BeanContextServicesLis
* @param serviceClass the service to add * @param serviceClass the service to add
* @param serviceProvider the <code>BeanContextServiceProvider</code> * @param serviceProvider the <code>BeanContextServiceProvider</code>
* associated with the service * associated with the service
* @return true if the service was successful added, false otherwise
*/ */
boolean addService(Class serviceClass, BeanContextServiceProvider serviceProvider); boolean addService(Class serviceClass, BeanContextServiceProvider serviceProvider);
@ -108,7 +109,7 @@ public interface BeanContextServices extends BeanContext, BeanContextServicesLis
* @param bcsrl the * @param bcsrl the
* <code>BeanContextServiceRevokedListener</code> to notify * <code>BeanContextServiceRevokedListener</code> to notify
* if the service should later become revoked * if the service should later become revoked
* @throws TooManyListenersException * @throws TooManyListenersException if there are too many listeners
* @return a reference to this context's named * @return a reference to this context's named
* Service as requested or <code>null</code> * Service as requested or <code>null</code>
*/ */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -603,12 +603,16 @@ public class BeanContextServicesSupport extends BeanContextSupport
serviceProvider = bcsp; serviceProvider = bcsp;
} }
/**
* Returns the service provider.
* @return the service provider
*/
protected BeanContextServiceProvider getServiceProvider() { protected BeanContextServiceProvider getServiceProvider() {
return serviceProvider; return serviceProvider;
} }
/* /**
* fields * The service provider.
*/ */
protected BeanContextServiceProvider serviceProvider; protected BeanContextServiceProvider serviceProvider;
@ -618,6 +622,9 @@ public class BeanContextServicesSupport extends BeanContextSupport
* subclasses can override this method to create new subclasses of * subclasses can override this method to create new subclasses of
* BCSSServiceProvider without having to overrride addService() in * BCSSServiceProvider without having to overrride addService() in
* order to instantiate. * order to instantiate.
* @param sc the class
* @param bcsp the service provider
* @return a service provider without overriding addService()
*/ */
protected BCSSServiceProvider createBCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) { protected BCSSServiceProvider createBCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) {
@ -629,7 +636,7 @@ public class BeanContextServicesSupport extends BeanContextSupport
/** /**
* add a BeanContextServicesListener * add a BeanContextServicesListener
* *
* @throws NullPointerException * @throws NullPointerException if the argument is null
*/ */
public void addBeanContextServicesListener(BeanContextServicesListener bcsl) { public void addBeanContextServicesListener(BeanContextServicesListener bcsl) {
@ -660,6 +667,8 @@ public class BeanContextServicesSupport extends BeanContextSupport
/** /**
* add a service * add a service
* @param serviceClass the service class
* @param bcsp the service provider
*/ */
public boolean addService(Class serviceClass, BeanContextServiceProvider bcsp) { public boolean addService(Class serviceClass, BeanContextServiceProvider bcsp) {
@ -668,6 +677,10 @@ public class BeanContextServicesSupport extends BeanContextSupport
/** /**
* add a service * add a service
* @param serviceClass the service class
* @param bcsp the service provider
* @param fireEvent whether or not an event should be fired
* @return true if the service was successfully added
*/ */
protected boolean addService(Class serviceClass, BeanContextServiceProvider bcsp, boolean fireEvent) { protected boolean addService(Class serviceClass, BeanContextServiceProvider bcsp, boolean fireEvent) {
@ -709,6 +722,9 @@ public class BeanContextServicesSupport extends BeanContextSupport
/** /**
* remove a service * remove a service
* @param serviceClass the service class
* @param bcsp the service provider
* @param revokeCurrentServicesNow whether or not to revoke the service
*/ */
public void revokeService(Class serviceClass, BeanContextServiceProvider bcsp, boolean revokeCurrentServicesNow) { public void revokeService(Class serviceClass, BeanContextServiceProvider bcsp, boolean revokeCurrentServicesNow) {
@ -1067,6 +1083,7 @@ public class BeanContextServicesSupport extends BeanContextSupport
/** /**
* Fires a <tt>BeanContextServiceEvent</tt> notifying of a new service. * Fires a <tt>BeanContextServiceEvent</tt> notifying of a new service.
* @param serviceClass the service class
*/ */
protected final void fireServiceAdded(Class serviceClass) { protected final void fireServiceAdded(Class serviceClass) {
BeanContextServiceAvailableEvent bcssae = new BeanContextServiceAvailableEvent(getBeanContextServicesPeer(), serviceClass); BeanContextServiceAvailableEvent bcssae = new BeanContextServiceAvailableEvent(getBeanContextServicesPeer(), serviceClass);
@ -1109,6 +1126,8 @@ public class BeanContextServicesSupport extends BeanContextSupport
* Fires a <tt>BeanContextServiceRevokedEvent</tt> * Fires a <tt>BeanContextServiceRevokedEvent</tt>
* indicating that a particular service is * indicating that a particular service is
* no longer available. * no longer available.
* @param serviceClass the service class
* @param revokeNow whether or not the event should be revoked now
*/ */
protected final void fireServiceRevoked(Class serviceClass, boolean revokeNow) { protected final void fireServiceRevoked(Class serviceClass, boolean revokeNow) {
Object[] copy; Object[] copy;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -62,7 +62,6 @@ import java.util.Map;
/** /**
* This helper class provides a utility implementation of the * This helper class provides a utility implementation of the
* java.beans.beancontext.BeanContext interface. * java.beans.beancontext.BeanContext interface.
* </p>
* <p> * <p>
* Since this class directly implements the BeanContext interface, the class * Since this class directly implements the BeanContext interface, the class
* can, and is intended to be used either by subclassing this implementation, * can, and is intended to be used either by subclassing this implementation,
@ -351,9 +350,8 @@ public class BeanContextSupport extends BeanContextChildSupport
* of Child without having to override add() or the other Collection * of Child without having to override add() or the other Collection
* methods that add children to the set. * methods that add children to the set.
* </p> * </p>
*
* @param targetChild the child to create the Child on behalf of * @param targetChild the child to create the Child on behalf of
* @param peer the peer if the tragetChild and the peer are related by an implementation of BeanContextProxy * @param peer the peer if the tragetChild and the peer are related by an implementation of BeanContextProxy * @return Subtype-specific subclass of Child without overriding collection methods
*/ */
protected BCSChild createBCSChild(Object targetChild, Object peer) { protected BCSChild createBCSChild(Object targetChild, Object peer) {
@ -492,6 +490,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* @param callChildSetBC used to indicate that * @param callChildSetBC used to indicate that
* the child should be notified that it is no * the child should be notified that it is no
* longer nested in this <tt>BeanContext</tt>. * longer nested in this <tt>BeanContext</tt>.
* @return whether or not was present before being removed
*/ */
protected boolean remove(Object targetChild, boolean callChildSetBC) { protected boolean remove(Object targetChild, boolean callChildSetBC) {
@ -580,7 +579,8 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* add Collection to set of Children (Unsupported) * add Collection to set of Children (Unsupported)
* implementations must synchronized on the hierarchy lock and "children" protected field * implementations must synchronized on the hierarchy lock and "children" protected field
* @throws UnsupportedOperationException * @throws UnsupportedOperationException thrown unconditionally by this implementation
* @return this implementation unconditionally throws {@code UnsupportedOperationException}
*/ */
public boolean addAll(Collection c) { public boolean addAll(Collection c) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@ -589,7 +589,9 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* remove all specified children (Unsupported) * remove all specified children (Unsupported)
* implementations must synchronized on the hierarchy lock and "children" protected field * implementations must synchronized on the hierarchy lock and "children" protected field
* @throws UnsupportedOperationException * @throws UnsupportedOperationException thrown unconditionally by this implementation
* @return this implementation unconditionally throws {@code UnsupportedOperationException}
*/ */
public boolean removeAll(Collection c) { public boolean removeAll(Collection c) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@ -599,7 +601,8 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* retain only specified children (Unsupported) * retain only specified children (Unsupported)
* implementations must synchronized on the hierarchy lock and "children" protected field * implementations must synchronized on the hierarchy lock and "children" protected field
* @throws UnsupportedOperationException * @throws UnsupportedOperationException thrown unconditionally by this implementation
* @return this implementation unconditionally throws {@code UnsupportedOperationException}
*/ */
public boolean retainAll(Collection c) { public boolean retainAll(Collection c) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@ -608,7 +611,7 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* clear the children (Unsupported) * clear the children (Unsupported)
* implementations must synchronized on the hierarchy lock and "children" protected field * implementations must synchronized on the hierarchy lock and "children" protected field
* @throws UnsupportedOperationException * @throws UnsupportedOperationException thrown unconditionally by this implementation
*/ */
public void clear() { public void clear() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@ -618,7 +621,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* Adds a BeanContextMembershipListener * Adds a BeanContextMembershipListener
* *
* @param bcml the BeanContextMembershipListener to add * @param bcml the BeanContextMembershipListener to add
* @throws NullPointerException * @throws NullPointerException if the argument is null
*/ */
public void addBeanContextMembershipListener(BeanContextMembershipListener bcml) { public void addBeanContextMembershipListener(BeanContextMembershipListener bcml) {
@ -636,7 +639,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* Removes a BeanContextMembershipListener * Removes a BeanContextMembershipListener
* *
* @param bcml the BeanContextMembershipListener to remove * @param bcml the BeanContextMembershipListener to remove
* @throws NullPointerException * @throws NullPointerException if the argument is null
*/ */
public void removeBeanContextMembershipListener(BeanContextMembershipListener bcml) { public void removeBeanContextMembershipListener(BeanContextMembershipListener bcml) {
@ -655,7 +658,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* @param bcc the child object making the request. * @param bcc the child object making the request.
* *
* @return the requested resource as an InputStream * @return the requested resource as an InputStream
* @throws NullPointerException * @throws NullPointerException if the argument is null
*/ */
public InputStream getResourceAsStream(String name, BeanContextChild bcc) { public InputStream getResourceAsStream(String name, BeanContextChild bcc) {
@ -849,6 +852,8 @@ public class BeanContextSupport extends BeanContextChildSupport
* *
* This method should not however be used by subclasses to replace their * This method should not however be used by subclasses to replace their
* own implementation (if any) of writeObject(). * own implementation (if any) of writeObject().
* @param oos the {@code ObjectOutputStream} to use during serialization
* @throws IOException if serialization failed
*/ */
protected void bcsPreSerializationHook(ObjectOutputStream oos) throws IOException { protected void bcsPreSerializationHook(ObjectOutputStream oos) throws IOException {
@ -864,6 +869,9 @@ public class BeanContextSupport extends BeanContextChildSupport
* *
* This method should not however be used by subclasses to replace their * This method should not however be used by subclasses to replace their
* own implementation (if any) of readObject(). * own implementation (if any) of readObject().
* @param ois the {@code ObjectInputStream} to use during deserialization
* @throws IOException if deserialization failed
* @throws ClassNotFoundException if needed classes are not found
*/ */
protected void bcsPreDeserializationHook(ObjectInputStream ois) throws IOException, ClassNotFoundException { protected void bcsPreDeserializationHook(ObjectInputStream ois) throws IOException, ClassNotFoundException {
@ -914,6 +922,8 @@ public class BeanContextSupport extends BeanContextChildSupport
* used by readObject to deserialize a collection. * used by readObject to deserialize a collection.
* @param ois the ObjectInputStream to use * @param ois the ObjectInputStream to use
* @param coll the Collection * @param coll the Collection
* @throws IOException if deserialization failed
* @throws ClassNotFoundException if needed classes are not found
*/ */
protected final void deserialize(ObjectInputStream ois, Collection coll) throws IOException, ClassNotFoundException { protected final void deserialize(ObjectInputStream ois, Collection coll) throws IOException, ClassNotFoundException {
int count = 0; int count = 0;
@ -1005,6 +1015,9 @@ public class BeanContextSupport extends BeanContextChildSupport
* When an instance of this class is used as a delegate for the * When an instance of this class is used as a delegate for the
* implementation of the BeanContext protocols (and its subprotocols) * implementation of the BeanContext protocols (and its subprotocols)
* there exists a 'chicken and egg' problem during deserialization * there exists a 'chicken and egg' problem during deserialization
* @param ois the ObjectInputStream to use
* @throws IOException if deserialization failed
* @throws ClassNotFoundException if needed classes are not found
*/ */
public final void readChildren(ObjectInputStream ois) throws IOException, ClassNotFoundException { public final void readChildren(ObjectInputStream ois) throws IOException, ClassNotFoundException {
@ -1122,6 +1135,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* immediately prior to their being added to the BeanContext. * immediately prior to their being added to the BeanContext.
* </p> * </p>
* *
* @param targetChild the child to create the Child on behalf of
* @return true iff the child may be added to this BeanContext, otherwise false. * @return true iff the child may be added to this BeanContext, otherwise false.
*/ */
@ -1136,6 +1150,7 @@ public class BeanContextSupport extends BeanContextChildSupport
* immediately prior to their being removed from the BeanContext. * immediately prior to their being removed from the BeanContext.
* </p> * </p>
* *
* @param targetChild the child to create the Child on behalf of
* @return true iff the child may be removed from this BeanContext, otherwise false. * @return true iff the child may be removed from this BeanContext, otherwise false.
*/ */
@ -1147,6 +1162,8 @@ public class BeanContextSupport extends BeanContextChildSupport
* subclasses may override this method to simply extend add() semantics * subclasses may override this method to simply extend add() semantics
* after the child has been added and before the event notification has * after the child has been added and before the event notification has
* occurred. The method is called with the child synchronized. * occurred. The method is called with the child synchronized.
* @param child the child
* @param bcsc the BCSChild
*/ */
protected void childJustAddedHook(Object child, BCSChild bcsc) { protected void childJustAddedHook(Object child, BCSChild bcsc) {
@ -1156,6 +1173,8 @@ public class BeanContextSupport extends BeanContextChildSupport
* subclasses may override this method to simply extend remove() semantics * subclasses may override this method to simply extend remove() semantics
* after the child has been removed and before the event notification has * after the child has been removed and before the event notification has
* occurred. The method is called with the child synchronized. * occurred. The method is called with the child synchronized.
* @param child the child
* @param bcsc the BCSChild
*/ */
protected void childJustRemovedHook(Object child, BCSChild bcsc) { protected void childJustRemovedHook(Object child, BCSChild bcsc) {
@ -1254,6 +1273,7 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* Fire a BeanContextshipEvent on the BeanContextMembershipListener interface * Fire a BeanContextshipEvent on the BeanContextMembershipListener interface
* @param bcme the event to fire
*/ */
protected final void fireChildrenAdded(BeanContextMembershipEvent bcme) { protected final void fireChildrenAdded(BeanContextMembershipEvent bcme) {
@ -1267,6 +1287,7 @@ public class BeanContextSupport extends BeanContextChildSupport
/** /**
* Fire a BeanContextshipEvent on the BeanContextMembershipListener interface * Fire a BeanContextshipEvent on the BeanContextMembershipListener interface
* @param bcme the event to fire
*/ */
protected final void fireChildrenRemoved(BeanContextMembershipEvent bcme) { protected final void fireChildrenRemoved(BeanContextMembershipEvent bcme) {

View File

@ -39,4 +39,7 @@ package java.net;
* @since 1.4 * @since 1.4
*/ */
public abstract class SocketAddress implements java.io.Serializable { public abstract class SocketAddress implements java.io.Serializable {
static final long serialVersionUID = 5215720748342549866L;
} }

View File

@ -25,10 +25,10 @@
package java.nio.file; package java.nio.file;
import java.nio.ByteBuffer;
import java.nio.file.attribute.*; import java.nio.file.attribute.*;
import java.nio.file.spi.FileSystemProvider; import java.nio.file.spi.FileSystemProvider;
import java.nio.file.spi.FileTypeDetector; import java.nio.file.spi.FileTypeDetector;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.nio.channels.SeekableByteChannel; import java.nio.channels.SeekableByteChannel;
import java.io.Closeable; import java.io.Closeable;
@ -2965,7 +2965,63 @@ public final class Files {
} }
/** /**
* Read all the bytes from a file. The method ensures that the file is * The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
/**
* Reads all the bytes from an input stream. Uses {@code initialSize} as a hint
* about how many bytes the stream will have.
*
* @param source
* the input stream to read from
* @param initialSize
* the initial size of the byte array to allocate
*
* @return a byte array containing the bytes read from the file
*
* @throws IOException
* if an I/O error occurs reading from the stream
* @throws OutOfMemoryError
* if an array of the required size cannot be allocated
*/
private static byte[] read(InputStream source, int initialSize)
throws IOException
{
int capacity = initialSize;
byte[] buf = new byte[capacity];
int nread = 0;
int n;
for (;;) {
// read to EOF which may read more or less than initialSize (eg: file
// is truncated while we are reading)
while ((n = source.read(buf, nread, capacity - nread)) > 0)
nread += n;
// if last call to source.read() returned -1, we are done
// otherwise, try to read one more byte; if that failed we're done too
if (n < 0 || (n = source.read()) < 0)
break;
// one more byte was read; need to allocate a larger buffer
if (capacity <= MAX_BUFFER_SIZE - capacity) {
capacity = Math.max(capacity << 1, BUFFER_SIZE);
} else {
if (capacity == MAX_BUFFER_SIZE)
throw new OutOfMemoryError("Required array size too large");
capacity = MAX_BUFFER_SIZE;
}
buf = Arrays.copyOf(buf, capacity);
buf[nread++] = (byte)n;
}
return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
}
/**
* Reads all the bytes from a file. The method ensures that the file is
* closed when all bytes have been read or an I/O error, or other runtime * closed when all bytes have been read or an I/O error, or other runtime
* exception, is thrown. * exception, is thrown.
* *
@ -2989,22 +3045,13 @@ public final class Files {
* method is invoked to check read access to the file. * method is invoked to check read access to the file.
*/ */
public static byte[] readAllBytes(Path path) throws IOException { public static byte[] readAllBytes(Path path) throws IOException {
try (FileChannel fc = FileChannel.open(path)) { try (FileChannel fc = FileChannel.open(path);
InputStream is = Channels.newInputStream(fc)) {
long size = fc.size(); long size = fc.size();
if (size > (long)Integer.MAX_VALUE) if (size > (long)MAX_BUFFER_SIZE)
throw new OutOfMemoryError("Required array size too large"); throw new OutOfMemoryError("Required array size too large");
byte[] arr = new byte[(int)size]; return read(is, (int)size);
ByteBuffer bb = ByteBuffer.wrap(arr);
while (bb.hasRemaining()) {
if (fc.read(bb) < 0) {
// truncated
break;
}
}
int nread = bb.position();
return (nread == size) ? arr : Arrays.copyOf(arr, nread);
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -33,15 +33,47 @@ import java.net.*;
* in order to obtain client and server sockets for RMI calls. An * in order to obtain client and server sockets for RMI calls. An
* application may use the <code>setSocketFactory</code> method to * application may use the <code>setSocketFactory</code> method to
* request that the RMI runtime use its socket factory instance * request that the RMI runtime use its socket factory instance
* instead of the default implementation.<p> * instead of the default implementation.
* *
* The default socket factory implementation used goes through a * <p>The default socket factory implementation performs a
* three-tiered approach to creating client sockets. First, a direct * three-tiered approach to creating client sockets. First, a direct
* socket connection to the remote VM is attempted. If that fails * socket connection to the remote VM is attempted. If that fails
* (due to a firewall), the runtime uses HTTP with the explicit port * (due to a firewall), the runtime uses HTTP with the explicit port
* number of the server. If the firewall does not allow this type of * number of the server. If the firewall does not allow this type of
* communication, then HTTP to a cgi-bin script on the server is used * communication, then HTTP to a cgi-bin script on the server is used
* to POST the RMI call.<p> * to POST the RMI call.
*
* <p>The default socket factory implementation creates server sockets that
* are bound to the wildcard address, which accepts requests from all network
* interfaces.
*
* @implNote
* <p>You can use the {@code RMISocketFactory} class to create a server socket that
* is bound to a specific address, restricting the origin of requests. For example,
* the following code implements a socket factory that binds server sockets to the
* loopback address. This restricts RMI to processing requests only from the local host.
*
* <pre>{@code
* class LoopbackSocketFactory extends RMISocketFactory {
* public ServerSocket createServerSocket(int port) throws IOException {
* return new ServerSocket(port, 5, InetAddress.getLoopbackAddress());
* }
*
* public Socket createSocket(String host, int port) throws IOException {
* // just call the default client socket factory
* return RMISocketFactory.getDefaultSocketFactory()
* .createSocket(host, port);
* }
* }
*
* // ...
*
* RMISocketFactory.setSocketFactory(new LoopbackSocketFactory());
* }</pre>
*
* Set the {@code java.rmi.server.hostname} system property
* to a host name (typically {@code localhost}) that resolves to the loopback
* interface to ensure that the generated stubs use the right network interface.
* *
* @author Ann Wollrath * @author Ann Wollrath
* @author Peter Jones * @author Peter Jones

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -100,6 +100,26 @@ import sun.rmi.server.UnicastServerRef2;
* </ul> * </ul>
* </ul> * </ul>
* *
* <p>If an object is exported with the
* {@link #exportObject(Remote) exportObject(Remote)}
* or
* {@link #exportObject(Remote, int) exportObject(Remote, port)}
* methods, or if a subclass constructor invokes one of the
* {@link #UnicastRemoteObject()}
* or
* {@link #UnicastRemoteObject(int) UnicastRemoteObject(port)}
* constructors, the object is exported with a server socket created using the
* {@link RMISocketFactory}
* class.
*
* @implNote
* <p>By default, server sockets created by the {@link RMISocketFactory} class
* listen on all network interfaces. See the
* {@link RMISocketFactory} class and the section
* <a href="{@docRoot}/../platform/rmi/spec/rmi-server29.html">RMI Socket Factories</a>
* in the
* <a href="{@docRoot}/../platform/rmi/spec/rmiTOC.html">Java RMI Specification</a>.
*
* @author Ann Wollrath * @author Ann Wollrath
* @author Peter Jones * @author Peter Jones
* @since JDK1.1 * @since JDK1.1

View File

@ -326,17 +326,13 @@ public final class Security {
* *
* <p>A provider cannot be added if it is already installed. * <p>A provider cannot be added if it is already installed.
* *
* <p>First, if there is a security manager, its * <p>If there is a security manager, the
* {@code checkSecurityAccess} * {@link java.lang.SecurityManager#checkSecurityAccess} method is called
* method is called with the string * with the {@code "insertProvider"} permission target name to see if
* {@code "insertProvider."+provider.getName()} * it's ok to add a new provider. If this permission check is denied,
* to see if it's ok to add a new provider. * {@code checkSecurityAccess} is called again with the
* If the default implementation of {@code checkSecurityAccess} * {@code "insertProvider."+provider.getName()} permission target name. If
* is used (i.e., that method is not overriden), then this will result in * both checks are denied, a {@code SecurityException} is thrown.
* a call to the security manager's {@code checkPermission} method
* with a
* {@code SecurityPermission("insertProvider."+provider.getName())}
* permission.
* *
* @param provider the provider to be added. * @param provider the provider to be added.
* *
@ -360,7 +356,7 @@ public final class Security {
public static synchronized int insertProviderAt(Provider provider, public static synchronized int insertProviderAt(Provider provider,
int position) { int position) {
String providerName = provider.getName(); String providerName = provider.getName();
check("insertProvider." + providerName); checkInsertProvider(providerName);
ProviderList list = Providers.getFullProviderList(); ProviderList list = Providers.getFullProviderList();
ProviderList newList = ProviderList.insertAt(list, provider, position - 1); ProviderList newList = ProviderList.insertAt(list, provider, position - 1);
if (list == newList) { if (list == newList) {
@ -373,17 +369,13 @@ public final class Security {
/** /**
* Adds a provider to the next position available. * Adds a provider to the next position available.
* *
* <p>First, if there is a security manager, its * <p>If there is a security manager, the
* {@code checkSecurityAccess} * {@link java.lang.SecurityManager#checkSecurityAccess} method is called
* method is called with the string * with the {@code "insertProvider"} permission target name to see if
* {@code "insertProvider."+provider.getName()} * it's ok to add a new provider. If this permission check is denied,
* to see if it's ok to add a new provider. * {@code checkSecurityAccess} is called again with the
* If the default implementation of {@code checkSecurityAccess} * {@code "insertProvider."+provider.getName()} permission target name. If
* is used (i.e., that method is not overriden), then this will result in * both checks are denied, a {@code SecurityException} is thrown.
* a call to the security manager's {@code checkPermission} method
* with a
* {@code SecurityPermission("insertProvider."+provider.getName())}
* permission.
* *
* @param provider the provider to be added. * @param provider the provider to be added.
* *
@ -863,6 +855,23 @@ public final class Security {
} }
} }
private static void checkInsertProvider(String name) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
try {
security.checkSecurityAccess("insertProvider");
} catch (SecurityException se1) {
try {
security.checkSecurityAccess("insertProvider." + name);
} catch (SecurityException se2) {
// throw first exception, but add second to suppressed
se1.addSuppressed(se2);
throw se1;
}
}
}
}
/* /*
* Returns all providers who satisfy the specified * Returns all providers who satisfy the specified
* criterion. * criterion.

View File

@ -130,14 +130,17 @@ import java.util.StringTokenizer;
* </tr> * </tr>
* *
* <tr> * <tr>
* <td>insertProvider.{provider name}</td> * <td>insertProvider</td>
* <td>Addition of a new provider, with the specified name</td> * <td>Addition of a new provider</td>
* <td>This would allow somebody to introduce a possibly * <td>This would allow somebody to introduce a possibly
* malicious provider (e.g., one that discloses the private keys passed * malicious provider (e.g., one that discloses the private keys passed
* to it) as the highest-priority provider. This would be possible * to it) as the highest-priority provider. This would be possible
* because the Security object (which manages the installed providers) * because the Security object (which manages the installed providers)
* currently does not check the integrity or authenticity of a provider * currently does not check the integrity or authenticity of a provider
* before attaching it.</td> * before attaching it. The "insertProvider" permission subsumes the
* "insertProvider.{provider name}" permission (see the section below for
* more information).
* </td>
* </tr> * </tr>
* *
* <tr> * <tr>
@ -186,9 +189,10 @@ import java.util.StringTokenizer;
* </table> * </table>
* *
* <P> * <P>
* The following permissions are associated with classes that have been * The following permissions have been superseded by newer permissions or are
* deprecated: {@link Identity}, {@link IdentityScope}, {@link Signer}. Use of * associated with classes that have been deprecated: {@link Identity},
* them is discouraged. See the applicable classes for more information. * {@link IdentityScope}, {@link Signer}. Use of them is discouraged. See the
* applicable classes for more information.
* <P> * <P>
* *
* <table border=1 cellpadding=5 summary="target name,what the permission allows, and associated risks"> * <table border=1 cellpadding=5 summary="target name,what the permission allows, and associated risks">
@ -199,6 +203,23 @@ import java.util.StringTokenizer;
* </tr> * </tr>
* *
* <tr> * <tr>
* <td>insertProvider.{provider name}</td>
* <td>Addition of a new provider, with the specified name</td>
* <td>Use of this permission is discouraged from further use because it is
* possible to circumvent the name restrictions by overriding the
* {@link java.security.Provider#getName} method. Also, there is an equivalent
* level of risk associated with granting code permission to insert a provider
* with a specific name, or any name it chooses. Users should use the
* "insertProvider" permission instead.
* <p>This would allow somebody to introduce a possibly
* malicious provider (e.g., one that discloses the private keys passed
* to it) as the highest-priority provider. This would be possible
* because the Security object (which manages the installed providers)
* currently does not check the integrity or authenticity of a provider
* before attaching it.</td>
* </tr>
*
* <tr>
* <td>setSystemScope</td> * <td>setSystemScope</td>
* <td>Setting of the system identity scope</td> * <td>Setting of the system identity scope</td>
* <td>This would allow an attacker to configure the system identity scope with * <td>This would allow an attacker to configure the system identity scope with
@ -306,7 +327,6 @@ public final class SecurityPermission extends BasicPermission {
* @throws NullPointerException if {@code name} is {@code null}. * @throws NullPointerException if {@code name} is {@code null}.
* @throws IllegalArgumentException if {@code name} is empty. * @throws IllegalArgumentException if {@code name} is empty.
*/ */
public SecurityPermission(String name) public SecurityPermission(String name)
{ {
super(name); super(name);
@ -323,7 +343,6 @@ public final class SecurityPermission extends BasicPermission {
* @throws NullPointerException if {@code name} is {@code null}. * @throws NullPointerException if {@code name} is {@code null}.
* @throws IllegalArgumentException if {@code name} is empty. * @throws IllegalArgumentException if {@code name} is empty.
*/ */
public SecurityPermission(String name, String actions) public SecurityPermission(String name, String actions)
{ {
super(name, actions); super(name, actions);

View File

@ -128,6 +128,7 @@ class ArrayPrefixHelpers {
this.lo = lo; this.hi = hi; this.lo = lo; this.hi = hi;
} }
@SuppressWarnings("unchecked")
public final void compute() { public final void compute() {
final BinaryOperator<T> fn; final BinaryOperator<T> fn;
final T[] a; final T[] a;
@ -692,6 +693,4 @@ class ArrayPrefixHelpers {
} }
} }
} }
}
}

View File

@ -1143,6 +1143,7 @@ public class Collections {
public boolean removeIf(Predicate<? super E> filter) { public boolean removeIf(Predicate<? super E> filter) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@SuppressWarnings("unchecked")
@Override @Override
public Spliterator<E> spliterator() { public Spliterator<E> spliterator() {
return (Spliterator<E>)c.spliterator(); return (Spliterator<E>)c.spliterator();
@ -1900,7 +1901,7 @@ public class Collections {
private static final long serialVersionUID = -2239321462712562324L; private static final long serialVersionUID = -2239321462712562324L;
EmptyNavigableMap() { super(new TreeMap()); } EmptyNavigableMap() { super(new TreeMap<K,V>()); }
@Override @Override
public NavigableSet<K> navigableKeySet() public NavigableSet<K> navigableKeySet()
@ -1928,46 +1929,52 @@ public class Collections {
public K ceilingKey(K key) { return nm.ceilingKey(key); } public K ceilingKey(K key) { return nm.ceilingKey(key); }
public K higherKey(K key) { return nm.higherKey(key); } public K higherKey(K key) { return nm.higherKey(key); }
@SuppressWarnings("unchecked")
public Entry<K, V> lowerEntry(K key) { public Entry<K, V> lowerEntry(K key) {
Entry<K,V> lower = (Entry<K, V>) nm.lowerEntry(key); Entry<K,V> lower = (Entry<K, V>) nm.lowerEntry(key);
return (null != lower) return (null != lower)
? new UnmodifiableEntrySet.UnmodifiableEntry(lower) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(lower)
: null; : null;
} }
@SuppressWarnings("unchecked")
public Entry<K, V> floorEntry(K key) { public Entry<K, V> floorEntry(K key) {
Entry<K,V> floor = (Entry<K, V>) nm.floorEntry(key); Entry<K,V> floor = (Entry<K, V>) nm.floorEntry(key);
return (null != floor) return (null != floor)
? new UnmodifiableEntrySet.UnmodifiableEntry(floor) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(floor)
: null; : null;
} }
@SuppressWarnings("unchecked")
public Entry<K, V> ceilingEntry(K key) { public Entry<K, V> ceilingEntry(K key) {
Entry<K,V> ceiling = (Entry<K, V>) nm.ceilingEntry(key); Entry<K,V> ceiling = (Entry<K, V>) nm.ceilingEntry(key);
return (null != ceiling) return (null != ceiling)
? new UnmodifiableEntrySet.UnmodifiableEntry(ceiling) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(ceiling)
: null; : null;
} }
@SuppressWarnings("unchecked")
public Entry<K, V> higherEntry(K key) { public Entry<K, V> higherEntry(K key) {
Entry<K,V> higher = (Entry<K, V>) nm.higherEntry(key); Entry<K,V> higher = (Entry<K, V>) nm.higherEntry(key);
return (null != higher) return (null != higher)
? new UnmodifiableEntrySet.UnmodifiableEntry(higher) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(higher)
: null; : null;
} }
@SuppressWarnings("unchecked")
public Entry<K, V> firstEntry() { public Entry<K, V> firstEntry() {
Entry<K,V> first = (Entry<K, V>) nm.firstEntry(); Entry<K,V> first = (Entry<K, V>) nm.firstEntry();
return (null != first) return (null != first)
? new UnmodifiableEntrySet.UnmodifiableEntry(first) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(first)
: null; : null;
} }
@SuppressWarnings("unchecked")
public Entry<K, V> lastEntry() { public Entry<K, V> lastEntry() {
Entry<K,V> last = (Entry<K, V>) nm.lastEntry(); Entry<K,V> last = (Entry<K, V>) nm.lastEntry();
return (null != last) return (null != last)
? new UnmodifiableEntrySet.UnmodifiableEntry(last) ? new UnmodifiableEntrySet.UnmodifiableEntry<>(last)
: null; : null;
} }
@ -2360,7 +2367,7 @@ public class Collections {
} }
public NavigableSet<E> tailSet(E fromElement) { public NavigableSet<E> tailSet(E fromElement) {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableSet(ns.tailSet(fromElement, true), mutex); return new SynchronizedNavigableSet<>(ns.tailSet(fromElement, true), mutex);
} }
} }
@ -2925,7 +2932,7 @@ public class Collections {
public NavigableMap<K, V> descendingMap() { public NavigableMap<K, V> descendingMap() {
synchronized (mutex) { synchronized (mutex) {
return return
new SynchronizedNavigableMap(nm.descendingMap(), mutex); new SynchronizedNavigableMap<>(nm.descendingMap(), mutex);
} }
} }
@ -2935,13 +2942,13 @@ public class Collections {
public NavigableSet<K> navigableKeySet() { public NavigableSet<K> navigableKeySet() {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableSet(nm.navigableKeySet(), mutex); return new SynchronizedNavigableSet<>(nm.navigableKeySet(), mutex);
} }
} }
public NavigableSet<K> descendingKeySet() { public NavigableSet<K> descendingKeySet() {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableSet(nm.descendingKeySet(), mutex); return new SynchronizedNavigableSet<>(nm.descendingKeySet(), mutex);
} }
} }
@ -2959,27 +2966,27 @@ public class Collections {
} }
public SortedMap<K,V> tailMap(K fromKey) { public SortedMap<K,V> tailMap(K fromKey) {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableMap<>(nm.tailMap(fromKey, true),mutex); return new SynchronizedNavigableMap<>(nm.tailMap(fromKey, true),mutex);
} }
} }
public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) { public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableMap( return new SynchronizedNavigableMap<>(
nm.subMap(fromKey, fromInclusive, toKey, toInclusive), mutex); nm.subMap(fromKey, fromInclusive, toKey, toInclusive), mutex);
} }
} }
public NavigableMap<K, V> headMap(K toKey, boolean inclusive) { public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableMap( return new SynchronizedNavigableMap<>(
nm.headMap(toKey, inclusive), mutex); nm.headMap(toKey, inclusive), mutex);
} }
} }
public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) { public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
synchronized (mutex) { synchronized (mutex) {
return new SynchronizedNavigableMap( return new SynchronizedNavigableMap<>(
nm.tailMap(fromKey, inclusive), mutex); nm.tailMap(fromKey, inclusive), mutex);
} }
} }
@ -4081,7 +4088,7 @@ public class Collections {
public Entry<K, V> lowerEntry(K key) { public Entry<K, V> lowerEntry(K key) {
Entry<K,V> lower = nm.lowerEntry(key); Entry<K,V> lower = nm.lowerEntry(key);
return (null != lower) return (null != lower)
? new CheckedMap.CheckedEntrySet.CheckedEntry(lower, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(lower, valueType)
: null; : null;
} }
@ -4090,7 +4097,7 @@ public class Collections {
public Entry<K, V> floorEntry(K key) { public Entry<K, V> floorEntry(K key) {
Entry<K,V> floor = nm.floorEntry(key); Entry<K,V> floor = nm.floorEntry(key);
return (null != floor) return (null != floor)
? new CheckedMap.CheckedEntrySet.CheckedEntry(floor, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(floor, valueType)
: null; : null;
} }
@ -4099,7 +4106,7 @@ public class Collections {
public Entry<K, V> ceilingEntry(K key) { public Entry<K, V> ceilingEntry(K key) {
Entry<K,V> ceiling = nm.ceilingEntry(key); Entry<K,V> ceiling = nm.ceilingEntry(key);
return (null != ceiling) return (null != ceiling)
? new CheckedMap.CheckedEntrySet.CheckedEntry(ceiling, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(ceiling, valueType)
: null; : null;
} }
@ -4108,7 +4115,7 @@ public class Collections {
public Entry<K, V> higherEntry(K key) { public Entry<K, V> higherEntry(K key) {
Entry<K,V> higher = nm.higherEntry(key); Entry<K,V> higher = nm.higherEntry(key);
return (null != higher) return (null != higher)
? new CheckedMap.CheckedEntrySet.CheckedEntry(higher, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(higher, valueType)
: null; : null;
} }
@ -4117,14 +4124,14 @@ public class Collections {
public Entry<K, V> firstEntry() { public Entry<K, V> firstEntry() {
Entry<K,V> first = nm.firstEntry(); Entry<K,V> first = nm.firstEntry();
return (null != first) return (null != first)
? new CheckedMap.CheckedEntrySet.CheckedEntry(first, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(first, valueType)
: null; : null;
} }
public Entry<K, V> lastEntry() { public Entry<K, V> lastEntry() {
Entry<K,V> last = nm.lastEntry(); Entry<K,V> last = nm.lastEntry();
return (null != last) return (null != last)
? new CheckedMap.CheckedEntrySet.CheckedEntry(last, valueType) ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(last, valueType)
: null; : null;
} }
@ -4132,14 +4139,14 @@ public class Collections {
Entry<K,V> entry = nm.pollFirstEntry(); Entry<K,V> entry = nm.pollFirstEntry();
return (null == entry) return (null == entry)
? null ? null
: new CheckedMap.CheckedEntrySet.CheckedEntry(entry, valueType); : new CheckedMap.CheckedEntrySet.CheckedEntry<>(entry, valueType);
} }
public Entry<K, V> pollLastEntry() { public Entry<K, V> pollLastEntry() {
Entry<K,V> entry = nm.pollLastEntry(); Entry<K,V> entry = nm.pollLastEntry();
return (null == entry) return (null == entry)
? null ? null
: new CheckedMap.CheckedEntrySet.CheckedEntry(entry, valueType); : new CheckedMap.CheckedEntrySet.CheckedEntry<>(entry, valueType);
} }
public NavigableMap<K, V> descendingMap() { public NavigableMap<K, V> descendingMap() {

View File

@ -352,6 +352,7 @@ public interface Comparator<T> {
* @see Comparable * @see Comparable
* @since 1.8 * @since 1.8
*/ */
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() { public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {
return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE; return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;
} }
@ -374,7 +375,7 @@ public interface Comparator<T> {
* @since 1.8 * @since 1.8
*/ */
public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) { public static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator) {
return new Comparators.NullComparator(true, comparator); return new Comparators.NullComparator<>(true, comparator);
} }
/** /**
@ -395,7 +396,7 @@ public interface Comparator<T> {
* @since 1.8 * @since 1.8
*/ */
public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) { public static <T> Comparator<T> nullsLast(Comparator<? super T> comparator) {
return new Comparators.NullComparator(false, comparator); return new Comparators.NullComparator<>(false, comparator);
} }
/** /**

View File

@ -87,12 +87,12 @@ class Comparators {
@Override @Override
public Comparator<T> thenComparing(Comparator<? super T> other) { public Comparator<T> thenComparing(Comparator<? super T> other) {
Objects.requireNonNull(other); Objects.requireNonNull(other);
return new NullComparator(nullFirst, real == null ? other : real.thenComparing(other)); return new NullComparator<>(nullFirst, real == null ? other : real.thenComparing(other));
} }
@Override @Override
public Comparator<T> reversed() { public Comparator<T> reversed() {
return new NullComparator(!nullFirst, real == null ? null : real.reversed()); return new NullComparator<>(!nullFirst, real == null ? null : real.reversed());
} }
} }
} }

View File

@ -38,7 +38,7 @@ package java.util;
/** /**
* A linear collection that supports element insertion and removal at * A linear collection that supports element insertion and removal at
* both ends. The name <i>deque</i> is short for "double ended queue" * both ends. The name <i>deque</i> is short for "double ended queue"
* and is usually pronounced "deck". Most <tt>Deque</tt> * and is usually pronounced "deck". Most {@code Deque}
* implementations place no fixed limits on the number of elements * implementations place no fixed limits on the number of elements
* they may contain, but this interface supports capacity-restricted * they may contain, but this interface supports capacity-restricted
* deques as well as those with no fixed size limit. * deques as well as those with no fixed size limit.
@ -47,10 +47,10 @@ package java.util;
* ends of the deque. Methods are provided to insert, remove, and * ends of the deque. Methods are provided to insert, remove, and
* examine the element. Each of these methods exists in two forms: * examine the element. Each of these methods exists in two forms:
* one throws an exception if the operation fails, the other returns a * one throws an exception if the operation fails, the other returns a
* special value (either <tt>null</tt> or <tt>false</tt>, depending on * special value (either {@code null} or {@code false}, depending on
* the operation). The latter form of the insert operation is * the operation). The latter form of the insert operation is
* designed specifically for use with capacity-restricted * designed specifically for use with capacity-restricted
* <tt>Deque</tt> implementations; in most implementations, insert * {@code Deque} implementations; in most implementations, insert
* operations cannot fail. * operations cannot fail.
* *
* <p>The twelve methods described above are summarized in the * <p>The twelve methods described above are summarized in the
@ -58,6 +58,7 @@ package java.util;
* *
* <p> * <p>
* <table BORDER CELLPADDING=3 CELLSPACING=1> * <table BORDER CELLPADDING=3 CELLSPACING=1>
* <caption>Summary of Deque methods</caption>
* <tr> * <tr>
* <td></td> * <td></td>
* <td ALIGN=CENTER COLSPAN = 2> <b>First Element (Head)</b></td> * <td ALIGN=CENTER COLSPAN = 2> <b>First Element (Head)</b></td>
@ -72,38 +73,39 @@ package java.util;
* </tr> * </tr>
* <tr> * <tr>
* <td><b>Insert</b></td> * <td><b>Insert</b></td>
* <td>{@link #addFirst addFirst(e)}</td> * <td>{@link Deque#addFirst addFirst(e)}</td>
* <td>{@link #offerFirst offerFirst(e)}</td> * <td>{@link Deque#offerFirst offerFirst(e)}</td>
* <td>{@link #addLast addLast(e)}</td> * <td>{@link Deque#addLast addLast(e)}</td>
* <td>{@link #offerLast offerLast(e)}</td> * <td>{@link Deque#offerLast offerLast(e)}</td>
* </tr> * </tr>
* <tr> * <tr>
* <td><b>Remove</b></td> * <td><b>Remove</b></td>
* <td>{@link #removeFirst removeFirst()}</td> * <td>{@link Deque#removeFirst removeFirst()}</td>
* <td>{@link #pollFirst pollFirst()}</td> * <td>{@link Deque#pollFirst pollFirst()}</td>
* <td>{@link #removeLast removeLast()}</td> * <td>{@link Deque#removeLast removeLast()}</td>
* <td>{@link #pollLast pollLast()}</td> * <td>{@link Deque#pollLast pollLast()}</td>
* </tr> * </tr>
* <tr> * <tr>
* <td><b>Examine</b></td> * <td><b>Examine</b></td>
* <td>{@link #getFirst getFirst()}</td> * <td>{@link Deque#getFirst getFirst()}</td>
* <td>{@link #peekFirst peekFirst()}</td> * <td>{@link Deque#peekFirst peekFirst()}</td>
* <td>{@link #getLast getLast()}</td> * <td>{@link Deque#getLast getLast()}</td>
* <td>{@link #peekLast peekLast()}</td> * <td>{@link Deque#peekLast peekLast()}</td>
* </tr> * </tr>
* </table> * </table>
* *
* <p>This interface extends the {@link Queue} interface. When a deque is * <p>This interface extends the {@link Queue} interface. When a deque is
* used as a queue, FIFO (First-In-First-Out) behavior results. Elements are * used as a queue, FIFO (First-In-First-Out) behavior results. Elements are
* added at the end of the deque and removed from the beginning. The methods * added at the end of the deque and removed from the beginning. The methods
* inherited from the <tt>Queue</tt> interface are precisely equivalent to * inherited from the {@code Queue} interface are precisely equivalent to
* <tt>Deque</tt> methods as indicated in the following table: * {@code Deque} methods as indicated in the following table:
* *
* <p> * <p>
* <table BORDER CELLPADDING=3 CELLSPACING=1> * <table BORDER CELLPADDING=3 CELLSPACING=1>
* <caption>Comparison of Queue and Deque methods</caption>
* <tr> * <tr>
* <td ALIGN=CENTER> <b><tt>Queue</tt> Method</b></td> * <td ALIGN=CENTER> <b>{@code Queue} Method</b></td>
* <td ALIGN=CENTER> <b>Equivalent <tt>Deque</tt> Method</b></td> * <td ALIGN=CENTER> <b>Equivalent {@code Deque} Method</b></td>
* </tr> * </tr>
* <tr> * <tr>
* <td>{@link java.util.Queue#add add(e)}</td> * <td>{@link java.util.Queue#add add(e)}</td>
@ -135,13 +137,14 @@ package java.util;
* interface should be used in preference to the legacy {@link Stack} class. * interface should be used in preference to the legacy {@link Stack} class.
* When a deque is used as a stack, elements are pushed and popped from the * When a deque is used as a stack, elements are pushed and popped from the
* beginning of the deque. Stack methods are precisely equivalent to * beginning of the deque. Stack methods are precisely equivalent to
* <tt>Deque</tt> methods as indicated in the table below: * {@code Deque} methods as indicated in the table below:
* *
* <p> * <p>
* <table BORDER CELLPADDING=3 CELLSPACING=1> * <table BORDER CELLPADDING=3 CELLSPACING=1>
* <caption>Comparison of Stack and Deque methods</caption>
* <tr> * <tr>
* <td ALIGN=CENTER> <b>Stack Method</b></td> * <td ALIGN=CENTER> <b>Stack Method</b></td>
* <td ALIGN=CENTER> <b>Equivalent <tt>Deque</tt> Method</b></td> * <td ALIGN=CENTER> <b>Equivalent {@code Deque} Method</b></td>
* </tr> * </tr>
* <tr> * <tr>
* <td>{@link #push push(e)}</td> * <td>{@link #push push(e)}</td>
@ -168,18 +171,18 @@ package java.util;
* <p>Unlike the {@link List} interface, this interface does not * <p>Unlike the {@link List} interface, this interface does not
* provide support for indexed access to elements. * provide support for indexed access to elements.
* *
* <p>While <tt>Deque</tt> implementations are not strictly required * <p>While {@code Deque} implementations are not strictly required
* to prohibit the insertion of null elements, they are strongly * to prohibit the insertion of null elements, they are strongly
* encouraged to do so. Users of any <tt>Deque</tt> implementations * encouraged to do so. Users of any {@code Deque} implementations
* that do allow null elements are strongly encouraged <i>not</i> to * that do allow null elements are strongly encouraged <i>not</i> to
* take advantage of the ability to insert nulls. This is so because * take advantage of the ability to insert nulls. This is so because
* <tt>null</tt> is used as a special return value by various methods * {@code null} is used as a special return value by various methods
* to indicated that the deque is empty. * to indicated that the deque is empty.
* *
* <p><tt>Deque</tt> implementations generally do not define * <p>{@code Deque} implementations generally do not define
* element-based versions of the <tt>equals</tt> and <tt>hashCode</tt> * element-based versions of the {@code equals} and {@code hashCode}
* methods, but instead inherit the identity-based versions from class * methods, but instead inherit the identity-based versions from class
* <tt>Object</tt>. * {@code Object}.
* *
* <p>This interface is a member of the <a * <p>This interface is a member of the <a
* href="{@docRoot}/../technotes/guides/collections/index.html"> Java Collections * href="{@docRoot}/../technotes/guides/collections/index.html"> Java Collections
@ -190,13 +193,13 @@ package java.util;
* @since 1.6 * @since 1.6
* @param <E> the type of elements held in this collection * @param <E> the type of elements held in this collection
*/ */
public interface Deque<E> extends Queue<E> { public interface Deque<E> extends Queue<E> {
/** /**
* Inserts the specified element at the front of this deque if it is * Inserts the specified element at the front of this deque if it is
* possible to do so immediately without violating capacity restrictions. * possible to do so immediately without violating capacity restrictions,
* When using a capacity-restricted deque, it is generally preferable to * throwing an {@code IllegalStateException} if no space is currently
* use method {@link #offerFirst}. * available. When using a capacity-restricted deque, it is generally
* preferable to use method {@link #offerFirst}.
* *
* @param e the element to add * @param e the element to add
* @throws IllegalStateException if the element cannot be added at this * @throws IllegalStateException if the element cannot be added at this
@ -212,9 +215,10 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Inserts the specified element at the end of this deque if it is * Inserts the specified element at the end of this deque if it is
* possible to do so immediately without violating capacity restrictions. * possible to do so immediately without violating capacity restrictions,
* When using a capacity-restricted deque, it is generally preferable to * throwing an {@code IllegalStateException} if no space is currently
* use method {@link #offerLast}. * available. When using a capacity-restricted deque, it is generally
* preferable to use method {@link #offerLast}.
* *
* <p>This method is equivalent to {@link #add}. * <p>This method is equivalent to {@link #add}.
* *
@ -237,8 +241,8 @@ public interface Deque<E> extends Queue<E> {
* which can fail to insert an element only by throwing an exception. * which can fail to insert an element only by throwing an exception.
* *
* @param e the element to add * @param e the element to add
* @return <tt>true</tt> if the element was added to this deque, else * @return {@code true} if the element was added to this deque, else
* <tt>false</tt> * {@code false}
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* prevents it from being added to this deque * prevents it from being added to this deque
* @throws NullPointerException if the specified element is null and this * @throws NullPointerException if the specified element is null and this
@ -255,8 +259,8 @@ public interface Deque<E> extends Queue<E> {
* which can fail to insert an element only by throwing an exception. * which can fail to insert an element only by throwing an exception.
* *
* @param e the element to add * @param e the element to add
* @return <tt>true</tt> if the element was added to this deque, else * @return {@code true} if the element was added to this deque, else
* <tt>false</tt> * {@code false}
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* prevents it from being added to this deque * prevents it from being added to this deque
* @throws NullPointerException if the specified element is null and this * @throws NullPointerException if the specified element is null and this
@ -288,17 +292,17 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Retrieves and removes the first element of this deque, * Retrieves and removes the first element of this deque,
* or returns <tt>null</tt> if this deque is empty. * or returns {@code null} if this deque is empty.
* *
* @return the head of this deque, or <tt>null</tt> if this deque is empty * @return the head of this deque, or {@code null} if this deque is empty
*/ */
E pollFirst(); E pollFirst();
/** /**
* Retrieves and removes the last element of this deque, * Retrieves and removes the last element of this deque,
* or returns <tt>null</tt> if this deque is empty. * or returns {@code null} if this deque is empty.
* *
* @return the tail of this deque, or <tt>null</tt> if this deque is empty * @return the tail of this deque, or {@code null} if this deque is empty
*/ */
E pollLast(); E pollLast();
@ -325,31 +329,31 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Retrieves, but does not remove, the first element of this deque, * Retrieves, but does not remove, the first element of this deque,
* or returns <tt>null</tt> if this deque is empty. * or returns {@code null} if this deque is empty.
* *
* @return the head of this deque, or <tt>null</tt> if this deque is empty * @return the head of this deque, or {@code null} if this deque is empty
*/ */
E peekFirst(); E peekFirst();
/** /**
* Retrieves, but does not remove, the last element of this deque, * Retrieves, but does not remove, the last element of this deque,
* or returns <tt>null</tt> if this deque is empty. * or returns {@code null} if this deque is empty.
* *
* @return the tail of this deque, or <tt>null</tt> if this deque is empty * @return the tail of this deque, or {@code null} if this deque is empty
*/ */
E peekLast(); E peekLast();
/** /**
* Removes the first occurrence of the specified element from this deque. * Removes the first occurrence of the specified element from this deque.
* If the deque does not contain the element, it is unchanged. * If the deque does not contain the element, it is unchanged.
* More formally, removes the first element <tt>e</tt> such that * More formally, removes the first element {@code e} such that
* <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt> * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
* (if such an element exists). * (if such an element exists).
* Returns <tt>true</tt> if this deque contained the specified element * Returns {@code true} if this deque contained the specified element
* (or equivalently, if this deque changed as a result of the call). * (or equivalently, if this deque changed as a result of the call).
* *
* @param o element to be removed from this deque, if present * @param o element to be removed from this deque, if present
* @return <tt>true</tt> if an element was removed as a result of this call * @return {@code true} if an element was removed as a result of this call
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* is incompatible with this deque * is incompatible with this deque
* (<a href="Collection.html#optional-restrictions">optional</a>) * (<a href="Collection.html#optional-restrictions">optional</a>)
@ -362,14 +366,14 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Removes the last occurrence of the specified element from this deque. * Removes the last occurrence of the specified element from this deque.
* If the deque does not contain the element, it is unchanged. * If the deque does not contain the element, it is unchanged.
* More formally, removes the last element <tt>e</tt> such that * More formally, removes the last element {@code e} such that
* <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt> * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
* (if such an element exists). * (if such an element exists).
* Returns <tt>true</tt> if this deque contained the specified element * Returns {@code true} if this deque contained the specified element
* (or equivalently, if this deque changed as a result of the call). * (or equivalently, if this deque changed as a result of the call).
* *
* @param o element to be removed from this deque, if present * @param o element to be removed from this deque, if present
* @return <tt>true</tt> if an element was removed as a result of this call * @return {@code true} if an element was removed as a result of this call
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* is incompatible with this deque * is incompatible with this deque
* (<a href="Collection.html#optional-restrictions">optional</a>) * (<a href="Collection.html#optional-restrictions">optional</a>)
@ -385,15 +389,15 @@ public interface Deque<E> extends Queue<E> {
* Inserts the specified element into the queue represented by this deque * Inserts the specified element into the queue represented by this deque
* (in other words, at the tail of this deque) if it is possible to do so * (in other words, at the tail of this deque) if it is possible to do so
* immediately without violating capacity restrictions, returning * immediately without violating capacity restrictions, returning
* <tt>true</tt> upon success and throwing an * {@code true} upon success and throwing an
* <tt>IllegalStateException</tt> if no space is currently available. * {@code IllegalStateException} if no space is currently available.
* When using a capacity-restricted deque, it is generally preferable to * When using a capacity-restricted deque, it is generally preferable to
* use {@link #offer(Object) offer}. * use {@link #offer(Object) offer}.
* *
* <p>This method is equivalent to {@link #addLast}. * <p>This method is equivalent to {@link #addLast}.
* *
* @param e the element to add * @param e the element to add
* @return <tt>true</tt> (as specified by {@link Collection#add}) * @return {@code true} (as specified by {@link Collection#add})
* @throws IllegalStateException if the element cannot be added at this * @throws IllegalStateException if the element cannot be added at this
* time due to capacity restrictions * time due to capacity restrictions
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
@ -409,7 +413,7 @@ public interface Deque<E> extends Queue<E> {
* Inserts the specified element into the queue represented by this deque * Inserts the specified element into the queue represented by this deque
* (in other words, at the tail of this deque) if it is possible to do so * (in other words, at the tail of this deque) if it is possible to do so
* immediately without violating capacity restrictions, returning * immediately without violating capacity restrictions, returning
* <tt>true</tt> upon success and <tt>false</tt> if no space is currently * {@code true} upon success and {@code false} if no space is currently
* available. When using a capacity-restricted deque, this method is * available. When using a capacity-restricted deque, this method is
* generally preferable to the {@link #add} method, which can fail to * generally preferable to the {@link #add} method, which can fail to
* insert an element only by throwing an exception. * insert an element only by throwing an exception.
@ -417,8 +421,8 @@ public interface Deque<E> extends Queue<E> {
* <p>This method is equivalent to {@link #offerLast}. * <p>This method is equivalent to {@link #offerLast}.
* *
* @param e the element to add * @param e the element to add
* @return <tt>true</tt> if the element was added to this deque, else * @return {@code true} if the element was added to this deque, else
* <tt>false</tt> * {@code false}
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* prevents it from being added to this deque * prevents it from being added to this deque
* @throws NullPointerException if the specified element is null and this * @throws NullPointerException if the specified element is null and this
@ -444,11 +448,11 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Retrieves and removes the head of the queue represented by this deque * Retrieves and removes the head of the queue represented by this deque
* (in other words, the first element of this deque), or returns * (in other words, the first element of this deque), or returns
* <tt>null</tt> if this deque is empty. * {@code null} if this deque is empty.
* *
* <p>This method is equivalent to {@link #pollFirst()}. * <p>This method is equivalent to {@link #pollFirst()}.
* *
* @return the first element of this deque, or <tt>null</tt> if * @return the first element of this deque, or {@code null} if
* this deque is empty * this deque is empty
*/ */
E poll(); E poll();
@ -469,12 +473,12 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Retrieves, but does not remove, the head of the queue represented by * Retrieves, but does not remove, the head of the queue represented by
* this deque (in other words, the first element of this deque), or * this deque (in other words, the first element of this deque), or
* returns <tt>null</tt> if this deque is empty. * returns {@code null} if this deque is empty.
* *
* <p>This method is equivalent to {@link #peekFirst()}. * <p>This method is equivalent to {@link #peekFirst()}.
* *
* @return the head of the queue represented by this deque, or * @return the head of the queue represented by this deque, or
* <tt>null</tt> if this deque is empty * {@code null} if this deque is empty
*/ */
E peek(); E peek();
@ -484,9 +488,8 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Pushes an element onto the stack represented by this deque (in other * Pushes an element onto the stack represented by this deque (in other
* words, at the head of this deque) if it is possible to do so * words, at the head of this deque) if it is possible to do so
* immediately without violating capacity restrictions, returning * immediately without violating capacity restrictions, throwing an
* <tt>true</tt> upon success and throwing an * {@code IllegalStateException} if no space is currently available.
* <tt>IllegalStateException</tt> if no space is currently available.
* *
* <p>This method is equivalent to {@link #addFirst}. * <p>This method is equivalent to {@link #addFirst}.
* *
@ -520,16 +523,16 @@ public interface Deque<E> extends Queue<E> {
/** /**
* Removes the first occurrence of the specified element from this deque. * Removes the first occurrence of the specified element from this deque.
* If the deque does not contain the element, it is unchanged. * If the deque does not contain the element, it is unchanged.
* More formally, removes the first element <tt>e</tt> such that * More formally, removes the first element {@code e} such that
* <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt> * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>
* (if such an element exists). * (if such an element exists).
* Returns <tt>true</tt> if this deque contained the specified element * Returns {@code true} if this deque contained the specified element
* (or equivalently, if this deque changed as a result of the call). * (or equivalently, if this deque changed as a result of the call).
* *
* <p>This method is equivalent to {@link #removeFirstOccurrence}. * <p>This method is equivalent to {@link #removeFirstOccurrence(Object)}.
* *
* @param o element to be removed from this deque, if present * @param o element to be removed from this deque, if present
* @return <tt>true</tt> if an element was removed as a result of this call * @return {@code true} if an element was removed as a result of this call
* @throws ClassCastException if the class of the specified element * @throws ClassCastException if the class of the specified element
* is incompatible with this deque * is incompatible with this deque
* (<a href="Collection.html#optional-restrictions">optional</a>) * (<a href="Collection.html#optional-restrictions">optional</a>)
@ -540,13 +543,13 @@ public interface Deque<E> extends Queue<E> {
boolean remove(Object o); boolean remove(Object o);
/** /**
* Returns <tt>true</tt> if this deque contains the specified element. * Returns {@code true} if this deque contains the specified element.
* More formally, returns <tt>true</tt> if and only if this deque contains * More formally, returns {@code true} if and only if this deque contains
* at least one element <tt>e</tt> such that * at least one element {@code e} such that
* <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>. * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
* *
* @param o element whose presence in this deque is to be tested * @param o element whose presence in this deque is to be tested
* @return <tt>true</tt> if this deque contains the specified element * @return {@code true} if this deque contains the specified element
* @throws ClassCastException if the type of the specified element * @throws ClassCastException if the type of the specified element
* is incompatible with this deque * is incompatible with this deque
* (<a href="Collection.html#optional-restrictions">optional</a>) * (<a href="Collection.html#optional-restrictions">optional</a>)

View File

@ -25,6 +25,7 @@
package java.util; package java.util;
import java.util.function.DoubleConsumer; import java.util.function.DoubleConsumer;
import java.util.stream.Collector;
/** /**
* A state object for collecting statistics such as count, min, max, sum, and * A state object for collecting statistics such as count, min, max, sum, and
@ -35,24 +36,24 @@ import java.util.function.DoubleConsumer;
* summary statistics on a stream of doubles with: * summary statistics on a stream of doubles with:
* <pre> {@code * <pre> {@code
* DoubleSummaryStatistics stats = doubleStream.collect(DoubleSummaryStatistics::new, * DoubleSummaryStatistics stats = doubleStream.collect(DoubleSummaryStatistics::new,
* DoubleSummaryStatistics::accept, * DoubleSummaryStatistics::accept,
* DoubleSummaryStatistics::combine); * DoubleSummaryStatistics::combine);
* }</pre> * }</pre>
* *
* <p>{@code DoubleSummaryStatistics} can be used as a * <p>{@code DoubleSummaryStatistics} can be used as a
* {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction} * {@linkplain java.util.stream.Stream#collect(Collector) reduction}
* target for a {@linkplain java.util.stream.Stream stream}. For example: * target for a {@linkplain java.util.stream.Stream stream}. For example:
* *
* <pre> {@code * <pre> {@code
* DoubleSummaryStatistics stats = people.stream() * DoubleSummaryStatistics stats = people.stream()
* .collect(Collectors.toDoubleSummaryStatistics(Person::getWeight)); * .collect(Collectors.summarizingDouble(Person::getWeight));
*}</pre> *}</pre>
* *
* This computes, in a single pass, the count of people, as well as the minimum, * This computes, in a single pass, the count of people, as well as the minimum,
* maximum, sum, and average of their weights. * maximum, sum, and average of their weights.
* *
* @implNote This implementation is not thread safe. However, it is safe to use * @implNote This implementation is not thread safe. However, it is safe to use
* {@link java.util.stream.Collectors#toDoubleSummaryStatistics(java.util.function.ToDoubleFunction) * {@link java.util.stream.Collectors#summarizingDouble(java.util.function.ToDoubleFunction)
* Collectors.toDoubleStatistics()} on a parallel stream, because the parallel * Collectors.toDoubleStatistics()} on a parallel stream, because the parallel
* implementation of {@link java.util.stream.Stream#collect Stream.collect()} * implementation of {@link java.util.stream.Stream#collect Stream.collect()}
* provides the necessary partitioning, isolation, and merging of results for * provides the necessary partitioning, isolation, and merging of results for
@ -152,7 +153,7 @@ public class DoubleSummaryStatistics implements DoubleConsumer {
} }
/** /**
* Returns the average of values recorded, or zero if no values have been * Returns the arithmetic mean of values recorded, or zero if no values have been
* recorded. The average returned can vary depending upon the order in * recorded. The average returned can vary depending upon the order in
* which values are recorded. This is due to accumulated rounding error in * which values are recorded. This is due to accumulated rounding error in
* addition of values of differing magnitudes. Values sorted by increasing * addition of values of differing magnitudes. Values sorted by increasing
@ -160,7 +161,7 @@ public class DoubleSummaryStatistics implements DoubleConsumer {
* value is a {@code NaN} or the sum is at any point a {@code NaN} then the * value is a {@code NaN} or the sum is at any point a {@code NaN} then the
* average will be {@code NaN}. * average will be {@code NaN}.
* *
* @return the average of values, or zero if none * @return the arithmetic mean of values, or zero if none
*/ */
public final double getAverage() { public final double getAverage() {
return getCount() > 0 ? getSum() / getCount() : 0.0d; return getCount() > 0 ? getSum() / getCount() : 0.0d;

View File

@ -626,12 +626,11 @@ import sun.misc.FormattedFloatingDecimal;
* <p> For general argument types, the precision is the maximum number of * <p> For general argument types, the precision is the maximum number of
* characters to be written to the output. * characters to be written to the output.
* *
* <p> For the floating-point conversions {@code 'e'}, {@code 'E'}, and * <p> For the floating-point conversions {@code 'a'}, {@code 'A'}, {@code 'e'},
* {@code 'f'} the precision is the number of digits after the decimal * {@code 'E'}, and {@code 'f'} the precision is the number of digits after the
* separator. If the conversion is {@code 'g'} or {@code 'G'}, then the * radix point. If the conversion is {@code 'g'} or {@code 'G'}, then the
* precision is the total number of digits in the resulting magnitude after * precision is the total number of digits in the resulting magnitude after
* rounding. If the conversion is {@code 'a'} or {@code 'A'}, then the * rounding.
* precision must not be specified.
* *
* <p> For character, integral, and date/time argument types and the percent * <p> For character, integral, and date/time argument types and the percent
* and line separator conversions, the precision is not applicable; if a * and line separator conversions, the precision is not applicable; if a
@ -1297,14 +1296,21 @@ import sun.misc.FormattedFloatingDecimal;
* of the significand as a fraction. The exponent is represented by * of the significand as a fraction. The exponent is represented by
* {@code 'p'} (<tt>'&#92;u0070'</tt>) followed by a decimal string of the * {@code 'p'} (<tt>'&#92;u0070'</tt>) followed by a decimal string of the
* unbiased exponent as if produced by invoking {@link * unbiased exponent as if produced by invoking {@link
* Integer#toString(int) Integer.toString} on the exponent value. * Integer#toString(int) Integer.toString} on the exponent value. If the
* precision is specified, the value is rounded to the given number of
* hexadecimal digits.
* *
* <li> If <i>m</i> is a {@code double} value with a subnormal * <li> If <i>m</i> is a {@code double} value with a subnormal
* representation then the significand is represented by the characters * representation then, unless the precision is specified to be in the range
* {@code '0x0.'} followed by the hexadecimal representation of the rest * 1 through 12, inclusive, the significand is represented by the characters
* of the significand as a fraction. The exponent is represented by * {@code '0x0.'} followed by the hexadecimal representation of the rest of
* {@code 'p-1022'}. Note that there must be at least one nonzero digit * the significand as a fraction, and the exponent represented by
* in a subnormal significand. * {@code 'p-1022'}. If the precision is in the interval
* [1,&nbsp;12], the subnormal value is normalized such that it
* begins with the characters {@code '0x1.'}, rounded to the number of
* hexadecimal digits of precision, and the exponent adjusted
* accordingly. Note that there must be at least one nonzero digit in a
* subnormal significand.
* *
* </ul> * </ul>
* *
@ -1367,7 +1373,7 @@ import sun.misc.FormattedFloatingDecimal;
* {@code 1}. * {@code 1}.
* *
* <p> If the conversion is {@code 'a'} or {@code 'A'}, then the precision * <p> If the conversion is {@code 'a'} or {@code 'A'}, then the precision
* is the number of hexadecimal digits after the decimal separator. If the * is the number of hexadecimal digits after the radix point. If the
* precision is not provided, then all of the digits as returned by {@link * precision is not provided, then all of the digits as returned by {@link
* Double#toHexString(double)} will be output. * Double#toHexString(double)} will be output.
* *

View File

@ -876,13 +876,9 @@ public class HashMap<K,V>
private static int roundUpToPowerOf2(int number) { private static int roundUpToPowerOf2(int number) {
// assert number >= 0 : "number must be non-negative"; // assert number >= 0 : "number must be non-negative";
int rounded = number >= MAXIMUM_CAPACITY return number >= MAXIMUM_CAPACITY
? MAXIMUM_CAPACITY ? MAXIMUM_CAPACITY
: (rounded = Integer.highestOneBit(number)) != 0 : (number > 1) ? Integer.highestOneBit((number - 1) << 1) : 1;
? (Integer.bitCount(number) > 1) ? rounded << 1 : rounded
: 1;
return rounded;
} }
/** /**

View File

@ -928,6 +928,7 @@ public class Hashtable<K,V>
return (null == result) ? defaultValue : result; return (null == result) ? defaultValue : result;
} }
@SuppressWarnings("unchecked")
@Override @Override
public synchronized void forEach(BiConsumer<? super K, ? super V> action) { public synchronized void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action); // explicit check required in case Objects.requireNonNull(action); // explicit check required in case
@ -947,6 +948,7 @@ public class Hashtable<K,V>
} }
} }
@SuppressWarnings("unchecked")
@Override @Override
public synchronized void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { public synchronized void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
Objects.requireNonNull(function); // explicit check required in case Objects.requireNonNull(function); // explicit check required in case

View File

@ -1339,6 +1339,7 @@ public class IdentityHashMap<K,V>
tab[i + 1] = value; tab[i + 1] = value;
} }
@SuppressWarnings("unchecked")
@Override @Override
public void forEach(BiConsumer<? super K, ? super V> action) { public void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action); Objects.requireNonNull(action);
@ -1357,6 +1358,7 @@ public class IdentityHashMap<K,V>
} }
} }
@SuppressWarnings("unchecked")
@Override @Override
public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
Objects.requireNonNull(function); Objects.requireNonNull(function);

View File

@ -25,6 +25,7 @@
package java.util; package java.util;
import java.util.function.IntConsumer; import java.util.function.IntConsumer;
import java.util.stream.Collector;
/** /**
* A state object for collecting statistics such as count, min, max, sum, and * A state object for collecting statistics such as count, min, max, sum, and
@ -35,24 +36,24 @@ import java.util.function.IntConsumer;
* summary statistics on a stream of ints with: * summary statistics on a stream of ints with:
* <pre> {@code * <pre> {@code
* IntSummaryStatistics stats = intStream.collect(IntSummaryStatistics::new, * IntSummaryStatistics stats = intStream.collect(IntSummaryStatistics::new,
* IntSummaryStatistics::accept, * IntSummaryStatistics::accept,
* IntSummaryStatistics::combine); * IntSummaryStatistics::combine);
* }</pre> * }</pre>
* *
* <p>{@code IntSummaryStatistics} can be used as a * <p>{@code IntSummaryStatistics} can be used as a
* {@linkplain java.util.stream.Stream#reduce(java.util.function.BinaryOperator) reduction} * {@linkplain java.util.stream.Stream#collect(Collector) reduction}
* target for a {@linkplain java.util.stream.Stream stream}. For example: * target for a {@linkplain java.util.stream.Stream stream}. For example:
* *
* <pre> {@code * <pre> {@code
* IntSummaryStatistics stats = people.stream() * IntSummaryStatistics stats = people.stream()
* .collect(Collectors.toIntSummaryStatistics(Person::getDependents)); * .collect(Collectors.summarizingInt(Person::getDependents));
*}</pre> *}</pre>
* *
* This computes, in a single pass, the count of people, as well as the minimum, * This computes, in a single pass, the count of people, as well as the minimum,
* maximum, sum, and average of their number of dependents. * maximum, sum, and average of their number of dependents.
* *
* @implNote This implementation is not thread safe. However, it is safe to use * @implNote This implementation is not thread safe. However, it is safe to use
* {@link java.util.stream.Collectors#toIntSummaryStatistics(java.util.function.ToIntFunction) * {@link java.util.stream.Collectors#summarizingInt(java.util.function.ToIntFunction)
* Collectors.toIntStatistics()} on a parallel stream, because the parallel * Collectors.toIntStatistics()} on a parallel stream, because the parallel
* implementation of {@link java.util.stream.Stream#collect Stream.collect()} * implementation of {@link java.util.stream.Stream#collect Stream.collect()}
* provides the necessary partitioning, isolation, and merging of results for * provides the necessary partitioning, isolation, and merging of results for
@ -140,10 +141,10 @@ public class IntSummaryStatistics implements IntConsumer {
} }
/** /**
* Returns the average of values recorded, or zero if no values have been * Returns the arithmetic mean of values recorded, or zero if no values have been
* recorded. * recorded.
* *
* @return the average of values, or zero if none * @return the arithmetic mean of values, or zero if none
*/ */
public final double getAverage() { public final double getAverage() {
return getCount() > 0 ? (double) getSum() / getCount() : 0.0d; return getCount() > 0 ? (double) getSum() / getCount() : 0.0d;

Some files were not shown because too many files have changed in this diff Show More