src/java.base/share/classes/java/io/ObjectInputStream.java
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58288 48e480e56aad
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
53304
9e968a576dd2 8202675: Replace process-wide terminology in serial filtering to be consistent
rriggs
parents: 52427
diff changeset
     2
 * Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 715
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 715
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 715
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 715
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 715
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
package java.io;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
import java.io.ObjectStreamClass.WeakClassKey;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
    29
import java.lang.System.Logger;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
import java.lang.ref.ReferenceQueue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
import java.lang.reflect.Array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
import java.lang.reflect.Modifier;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
import java.lang.reflect.Proxy;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
import java.security.AccessControlContext;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
import java.security.AccessController;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
import java.security.PrivilegedAction;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
import java.security.PrivilegedActionException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
import java.security.PrivilegedExceptionAction;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
import java.util.Arrays;
36659
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
    40
import java.util.Map;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
    41
import java.util.Objects;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
import java.util.concurrent.ConcurrentHashMap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
import java.util.concurrent.ConcurrentMap;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
    44
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
import static java.io.ObjectStreamClass.processQueue;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
    46
52427
3c6aa484536c 8211122: Reduce the number of internal classes made accessible to jdk.unsupported
mchung
parents: 50271
diff changeset
    47
import jdk.internal.access.SharedSecrets;
33674
566777f73c32 8140606: Update library code to use internal Unsafe
chegar
parents: 33403
diff changeset
    48
import jdk.internal.misc.Unsafe;
16873
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
    49
import sun.reflect.misc.ReflectUtil;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
/**
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
 * An ObjectInputStream deserializes primitive data and objects previously
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
 * written using an ObjectOutputStream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
 *
49438
879cf9f18688 8197595: Serialization javadoc should link to security best practices
rriggs
parents: 48436
diff changeset
    55
 * <p><strong>Warning: Deserialization of untrusted data is inherently dangerous
879cf9f18688 8197595: Serialization javadoc should link to security best practices
rriggs
parents: 48436
diff changeset
    56
 * and should be avoided. Untrusted data should be carefully validated according to the
879cf9f18688 8197595: Serialization javadoc should link to security best practices
rriggs
parents: 48436
diff changeset
    57
 * "Serialization and Deserialization" section of the
879cf9f18688 8197595: Serialization javadoc should link to security best practices
rriggs
parents: 48436
diff changeset
    58
 * {@extLink secure_coding_guidelines_javase Secure Coding Guidelines for Java SE}.
879cf9f18688 8197595: Serialization javadoc should link to security best practices
rriggs
parents: 48436
diff changeset
    59
 * {@extLink serialization_filter_guide Serialization Filtering} describes best
879cf9f18688 8197595: Serialization javadoc should link to security best practices
rriggs
parents: 48436
diff changeset
    60
 * practices for defensive use of serial filters.
879cf9f18688 8197595: Serialization javadoc should link to security best practices
rriggs
parents: 48436
diff changeset
    61
 * </strong></p>
879cf9f18688 8197595: Serialization javadoc should link to security best practices
rriggs
parents: 48436
diff changeset
    62
 *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
 * <p>ObjectOutputStream and ObjectInputStream can provide an application with
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
 * persistent storage for graphs of objects when used with a FileOutputStream
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
 * and FileInputStream respectively.  ObjectInputStream is used to recover
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
 * those objects previously serialized. Other uses include passing objects
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
 * between hosts using a socket stream or for marshaling and unmarshaling
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
 * arguments and parameters in a remote communication system.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
 * <p>ObjectInputStream ensures that the types of all objects in the graph
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
 * created from the stream match the classes present in the Java Virtual
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
 * Machine.  Classes are loaded as required using the standard mechanisms.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
 * <p>Only objects that support the java.io.Serializable or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
 * java.io.Externalizable interface can be read from streams.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
 *
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
    77
 * <p>The method {@code readObject} is used to read an object from the
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
 * stream.  Java's safe casting should be used to get the desired type.  In
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
 * Java, strings and arrays are objects and are treated as objects during
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
 * serialization. When read they need to be cast to the expected type.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
 * <p>Primitive data types can be read from the stream using the appropriate
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
 * method on DataInput.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
 * <p>The default deserialization mechanism for objects restores the contents
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
 * of each field to the value and type it had when it was written.  Fields
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
 * declared as transient or static are ignored by the deserialization process.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
 * References to other objects cause those objects to be read from the stream
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
 * as necessary.  Graphs of objects are restored correctly using a reference
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
 * sharing mechanism.  New objects are always allocated when deserializing,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
 * which prevents existing objects from being overwritten.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
 * <p>Reading an object is analogous to running the constructors of a new
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
 * object.  Memory is allocated for the object and initialized to zero (NULL).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
 * No-arg constructors are invoked for the non-serializable classes and then
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
 * the fields of the serializable classes are restored from the stream starting
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
 * with the serializable class closest to java.lang.object and finishing with
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
 * the object's most specific class.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
 * <p>For example to read from a stream as written by the example in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
 * ObjectOutputStream:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
 * <br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
 * <pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
 *      FileInputStream fis = new FileInputStream("t.tmp");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
 *      ObjectInputStream ois = new ObjectInputStream(fis);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
 *      int i = ois.readInt();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
 *      String today = (String) ois.readObject();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
 *      Date date = (Date) ois.readObject();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
 *      ois.close();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
 * </pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
 * <p>Classes control how they are serialized by implementing either the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
 * java.io.Serializable or java.io.Externalizable interfaces.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
 * <p>Implementing the Serializable interface allows object serialization to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
 * save and restore the entire state of the object and it allows classes to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
 * evolve between the time the stream is written and the time it is read.  It
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
 * automatically traverses references between objects, saving and restoring
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
 * entire graphs.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
 * <p>Serializable classes that require special handling during the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
 * serialization and deserialization process should implement the following
21334
c60dfce46a77 8026982: javadoc errors in core libs
rriggs
parents: 20839
diff changeset
   125
 * methods:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
 * <pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
 * private void writeObject(java.io.ObjectOutputStream stream)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
 *     throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
 * private void readObject(java.io.ObjectInputStream stream)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
 *     throws IOException, ClassNotFoundException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
 * private void readObjectNoData()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
 *     throws ObjectStreamException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
 * </pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
 * <p>The readObject method is responsible for reading and restoring the state
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
 * of the object for its particular class using data written to the stream by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
 * the corresponding writeObject method.  The method does not need to concern
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
 * itself with the state belonging to its superclasses or subclasses.  State is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
 * restored by reading data from the ObjectInputStream for the individual
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
 * fields and making assignments to the appropriate fields of the object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
 * Reading primitive data types is supported by DataInput.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
 * <p>Any attempt to read object data which exceeds the boundaries of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
 * custom data written by the corresponding writeObject method will cause an
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
 * OptionalDataException to be thrown with an eof field value of true.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
 * Non-object reads which exceed the end of the allotted data will reflect the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
 * end of data in the same way that they would indicate the end of the stream:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
 * bytewise reads will return -1 as the byte read or number of bytes read, and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
 * primitive reads will throw EOFExceptions.  If there is no corresponding
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
 * writeObject method, then the end of default serialized data marks the end of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
 * the allotted data.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
 * <p>Primitive and object read calls issued from within a readExternal method
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
 * behave in the same manner--if the stream is already positioned at the end of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
 * data written by the corresponding writeExternal method, object reads will
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
 * throw OptionalDataExceptions with eof set to true, bytewise reads will
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
 * return -1, and primitive reads will throw EOFExceptions.  Note that this
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
 * behavior does not hold for streams written with the old
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   160
 * {@code ObjectStreamConstants.PROTOCOL_VERSION_1} protocol, in which the
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
 * end of data written by writeExternal methods is not demarcated, and hence
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
 * cannot be detected.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
 * <p>The readObjectNoData method is responsible for initializing the state of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
 * the object for its particular class in the event that the serialization
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
 * stream does not list the given class as a superclass of the object being
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
 * deserialized.  This may occur in cases where the receiving party uses a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
 * different version of the deserialized instance's class than the sending
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
 * party, and the receiver's version extends classes that are not extended by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
 * the sender's version.  This may also occur if the serialization stream has
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
 * been tampered; hence, readObjectNoData is useful for initializing
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
 * deserialized objects properly despite a "hostile" or incomplete source
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
 * stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
 * <p>Serialization does not read or assign values to the fields of any object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
 * that does not implement the java.io.Serializable interface.  Subclasses of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
 * Objects that are not serializable can be serializable. In this case the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
 * non-serializable class must have a no-arg constructor to allow its fields to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
 * be initialized.  In this case it is the responsibility of the subclass to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
 * save and restore the state of the non-serializable class. It is frequently
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
 * the case that the fields of that class are accessible (public, package, or
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
 * protected) or that there are get and set methods that can be used to restore
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
 * the state.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
 *
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   185
 * <p>The contents of the stream can be filtered during deserialization.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   186
 * If a {@linkplain #setObjectInputFilter(ObjectInputFilter) filter is set}
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   187
 * on an ObjectInputStream, the {@link ObjectInputFilter} can check that
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   188
 * the classes, array lengths, number of references in the stream, depth, and
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   189
 * number of bytes consumed from the input stream are allowed and
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   190
 * if not, can terminate deserialization.
53304
9e968a576dd2 8202675: Replace process-wide terminology in serial filtering to be consistent
rriggs
parents: 52427
diff changeset
   191
 * A {@linkplain ObjectInputFilter.Config#setSerialFilter(ObjectInputFilter) system-wide filter}
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   192
 * can be configured that is applied to each {@code ObjectInputStream} unless replaced
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   193
 * using {@link #setObjectInputFilter(ObjectInputFilter) setObjectInputFilter}.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   194
 *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
 * <p>Any exception that occurs while deserializing an object will be caught by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
 * the ObjectInputStream and abort the reading process.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
 * <p>Implementing the Externalizable interface allows the object to assume
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
 * complete control over the contents and format of the object's serialized
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
 * form.  The methods of the Externalizable interface, writeExternal and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
 * readExternal, are called to save and restore the objects state.  When
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
 * implemented by a class they can write and read their own state using all of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
 * the methods of ObjectOutput and ObjectInput.  It is the responsibility of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
 * the objects to handle any versioning that occurs.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
 * <p>Enum constants are deserialized differently than ordinary serializable or
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
 * externalizable objects.  The serialized form of an enum constant consists
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
 * solely of its name; field values of the constant are not transmitted.  To
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
 * deserialize an enum constant, ObjectInputStream reads the constant name from
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
 * the stream; the deserialized constant is then obtained by calling the static
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   211
 * method {@code Enum.valueOf(Class, String)} with the enum constant's
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
 * base type and the received constant name as arguments.  Like other
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
 * serializable or externalizable objects, enum constants can function as the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
 * targets of back references appearing subsequently in the serialization
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
 * stream.  The process by which enum constants are deserialized cannot be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
 * customized: any class-specific readObject, readObjectNoData, and readResolve
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
 * methods defined by enum types are ignored during deserialization.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
 * Similarly, any serialPersistentFields or serialVersionUID field declarations
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
 * are also ignored--all enum types have a fixed serialVersionUID of 0L.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
 * @author      Mike Warres
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
 * @author      Roger Riggs
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
 * @see java.io.DataInput
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
 * @see java.io.ObjectOutputStream
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
 * @see java.io.Serializable
45138
ddcafe0d0ea3 8180082: Broken javadoc links
rriggs
parents: 44756
diff changeset
   226
 * @see <a href="{@docRoot}/../specs/serialization/input.html">
ddcafe0d0ea3 8180082: Broken javadoc links
rriggs
parents: 44756
diff changeset
   227
 *     Object Serialization Specification, Section 3, Object Input Classes</a>
24865
09b1d992ca72 8044740: Convert all JDK versions used in @since tag to 1.n[.n] in jdk repo
henryjen
parents: 22936
diff changeset
   228
 * @since   1.1
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
public class ObjectInputStream
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
    extends InputStream implements ObjectInput, ObjectStreamConstants
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
    /** handle value representing null */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
    private static final int NULL_HANDLE = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
    /** marker for unshared objects in internal handle table */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
    private static final Object unsharedMarker = new Object();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
36659
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   239
    /**
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   240
     * immutable table mapping primitive type names to corresponding
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   241
     * class objects
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   242
     */
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   243
    private static final Map<String, Class<?>> primClasses =
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   244
        Map.of("boolean", boolean.class,
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   245
               "byte", byte.class,
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   246
               "char", char.class,
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   247
               "short", short.class,
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   248
               "int", int.class,
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   249
               "long", long.class,
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   250
               "float", float.class,
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   251
               "double", double.class,
4c3494cead61 8151957: ObjectInputStream - Use new convenience method for immutable Map creation during static initialization
bpb
parents: 36511
diff changeset
   252
               "void", void.class);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
    private static class Caches {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
        /** cache of subclass security audit results */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
        static final ConcurrentMap<WeakClassKey,Boolean> subclassAudits =
7803
56bc97d69d93 6880112: Project Coin: Port JDK core library code to use diamond operator
smarks
parents: 7535
diff changeset
   257
            new ConcurrentHashMap<>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
        /** queue for WeakReferences to audited subclasses */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
        static final ReferenceQueue<Class<?>> subclassAuditsQueue =
7803
56bc97d69d93 6880112: Project Coin: Port JDK core library code to use diamond operator
smarks
parents: 7535
diff changeset
   261
            new ReferenceQueue<>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   264
    /*
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   265
     * Separate class to defer initialization of logging until needed.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   266
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   267
    private static class Logging {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   268
        /*
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   269
         * Logger for ObjectInputFilter results.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   270
         * Setup the filter logger if it is set to DEBUG or TRACE.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   271
         * (Assuming it will not change).
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   272
         */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   273
        static final System.Logger filterLogger;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   274
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   275
        static {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   276
            Logger filterLog = System.getLogger("java.io.serialization");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   277
            filterLogger = (filterLog.isLoggable(Logger.Level.DEBUG)
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   278
                    || filterLog.isLoggable(Logger.Level.TRACE)) ? filterLog : null;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   279
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   280
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   281
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
    /** filter stream for handling block data conversion */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
    private final BlockDataInputStream bin;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
    /** validation callback list */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
    private final ValidationList vlist;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
    /** recursion depth */
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   287
    private long depth;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   288
    /** Total number of references to any type of object, class, enum, proxy, etc. */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   289
    private long totalObjectRefs;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
    /** whether stream is closed */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
    private boolean closed;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
    /** wire handle -> obj/exception map */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
    private final HandleTable handles;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
    /** scratch field for passing handle values up/down call stack */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
    private int passHandle = NULL_HANDLE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
    /** flag set when at end of field value block with no TC_ENDBLOCKDATA */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
    private boolean defaultDataEnd = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
    /** if true, invoke readObjectOverride() instead of readObject() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
    private final boolean enableOverride;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
    /** if true, invoke resolveObject() */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
    private boolean enableResolve;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
     * Context during upcalls to class-defined readObject methods; holds
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
     * object currently being deserialized and descriptor for current class.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
     * Null when not during readObject upcall.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
     */
7030
90cf66131063 6559775: Race allows defaultReadObject to be invoked instead of readFields during deserialization
skoppar
parents: 5506
diff changeset
   310
    private SerialCallbackContext curContext;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
    /**
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   313
     * Filter of class descriptors and classes read from the stream;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   314
     * may be null.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   315
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   316
    private ObjectInputFilter serialFilter;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   317
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   318
    /**
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
     * Creates an ObjectInputStream that reads from the specified InputStream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
     * A serialization stream header is read from the stream and verified.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
     * This constructor will block until the corresponding ObjectOutputStream
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
     * has written and flushed the header.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
     *
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   324
     * <p>The serialization filter is initialized to the value of
53304
9e968a576dd2 8202675: Replace process-wide terminology in serial filtering to be consistent
rriggs
parents: 52427
diff changeset
   325
     * {@linkplain ObjectInputFilter.Config#getSerialFilter() the system-wide filter}.
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   326
     *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
     * <p>If a security manager is installed, this constructor will check for
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
     * the "enableSubclassImplementation" SerializablePermission when invoked
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
     * directly or indirectly by the constructor of a subclass which overrides
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
     * the ObjectInputStream.readFields or ObjectInputStream.readUnshared
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
     * methods.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
     * @param   in input stream to read from
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
     * @throws  StreamCorruptedException if the stream header is incorrect
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
     * @throws  IOException if an I/O error occurs while reading stream header
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
     * @throws  SecurityException if untrusted subclass illegally overrides
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
     *          security-sensitive methods
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   338
     * @throws  NullPointerException if {@code in} is {@code null}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
     * @see     ObjectInputStream#ObjectInputStream()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
     * @see     ObjectInputStream#readFields()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
     * @see     ObjectOutputStream#ObjectOutputStream(OutputStream)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
    public ObjectInputStream(InputStream in) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
        verifySubclass();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
        bin = new BlockDataInputStream(in);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
        handles = new HandleTable(10);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
        vlist = new ValidationList();
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   348
        serialFilter = ObjectInputFilter.Config.getSerialFilter();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
        enableOverride = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
        readStreamHeader();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
        bin.setBlockDataMode(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
     * Provide a way for subclasses that are completely reimplementing
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
     * ObjectInputStream to not have to allocate private data just used by this
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
     * implementation of ObjectInputStream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
     *
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   359
     * <p>The serialization filter is initialized to the value of
53304
9e968a576dd2 8202675: Replace process-wide terminology in serial filtering to be consistent
rriggs
parents: 52427
diff changeset
   360
     * {@linkplain ObjectInputFilter.Config#getSerialFilter() the system-wide filter}.
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   361
     *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
     * <p>If there is a security manager installed, this method first calls the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   363
     * security manager's {@code checkPermission} method with the
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   364
     * {@code SerializablePermission("enableSubclassImplementation")}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
     * permission to ensure it's ok to enable subclassing.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
     * @throws  SecurityException if a security manager exists and its
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   368
     *          {@code checkPermission} method denies enabling
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
     *          subclassing.
19047
08210fe86260 8021408: Fix misc doclint issues in java.util and java.io
darcy
parents: 16873
diff changeset
   370
     * @throws  IOException if an I/O error occurs while creating this stream
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
     * @see SecurityManager#checkPermission
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
     * @see java.io.SerializablePermission
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
    protected ObjectInputStream() throws IOException, SecurityException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
        SecurityManager sm = System.getSecurityManager();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
        if (sm != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
            sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   379
        bin = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
        handles = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
        vlist = null;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   382
        serialFilter = ObjectInputFilter.Config.getSerialFilter();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
        enableOverride = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
     * Read an object from the ObjectInputStream.  The class of the object, the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
     * signature of the class, and the values of the non-transient and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
     * non-static fields of the class and all of its supertypes are read.
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   390
     * Default deserializing for a class can be overridden using the writeObject
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
     * and readObject methods.  Objects referenced by this object are read
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
     * transitively so that a complete equivalent graph of objects is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
     * reconstructed by readObject.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
     * <p>The root object is completely restored when all of its fields and the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
     * objects it references are completely restored.  At this point the object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
     * validation callbacks are executed in order based on their registered
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
     * priorities. The callbacks are registered by objects (in the readObject
90ce3da70b43 Initial load
duke
parents:
diff changeset
   399
     * special methods) as they are individually restored.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
     *
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   401
     * <p>The serialization filter, when not {@code null}, is invoked for
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   402
     * each object (regular or class) read to reconstruct the root object.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   403
     * See {@link #setObjectInputFilter(ObjectInputFilter) setObjectInputFilter} for details.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   404
     *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   405
     * <p>Exceptions are thrown for problems with the InputStream and for
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
     * classes that should not be deserialized.  All exceptions are fatal to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
     * the InputStream and leave it in an indeterminate state; it is up to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
     * caller to ignore or recover the stream state.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
     * @throws  ClassNotFoundException Class of a serialized object cannot be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
     *          found.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
     * @throws  InvalidClassException Something is wrong with a class used by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
     *          serialization.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
     * @throws  StreamCorruptedException Control information in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
     *          stream is inconsistent.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
     * @throws  OptionalDataException Primitive data was found in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
     *          stream instead of objects.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
     * @throws  IOException Any of the usual Input/Output related exceptions.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
    public final Object readObject()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
        throws IOException, ClassNotFoundException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
        if (enableOverride) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
            return readObjectOverride();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
        // if nested read, passHandle contains handle of enclosing object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
        int outerHandle = passHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
            Object obj = readObject0(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
            handles.markDependency(outerHandle, passHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
            ClassNotFoundException ex = handles.lookupException(passHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
            if (ex != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
                throw ex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
            if (depth == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
                vlist.doCallbacks();
29220
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
   438
                freeze();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
            return obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
            passHandle = outerHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
            if (closed && depth == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
                clear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
    /**
55198
30fe07cac527 6394787: Typos in javadoc of OIS.readObjectOverride and OOS.writeObjectOverride
chegar
parents: 53304
diff changeset
   450
     * This method is called by trusted subclasses of ObjectInputStream that
30fe07cac527 6394787: Typos in javadoc of OIS.readObjectOverride and OOS.writeObjectOverride
chegar
parents: 53304
diff changeset
   451
     + constructed ObjectInputStream using the protected no-arg constructor.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
     * The subclass is expected to provide an override method with the modifier
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
     * "final".
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
     * @return  the Object read from the stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
     * @throws  ClassNotFoundException Class definition of a serialized object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
     *          cannot be found.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
     * @throws  OptionalDataException Primitive data was found in the stream
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
     *          instead of objects.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
     * @throws  IOException if I/O errors occurred while reading from the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
     *          underlying stream
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
     * @see #ObjectInputStream()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
     * @see #readObject()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
     * @since 1.2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
    protected Object readObjectOverride()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
        throws IOException, ClassNotFoundException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
        return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
     * Reads an "unshared" object from the ObjectInputStream.  This method is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
     * identical to readObject, except that it prevents subsequent calls to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
     * readObject and readUnshared from returning additional references to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
     * deserialized instance obtained via this call.  Specifically:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
     * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
     *   <li>If readUnshared is called to deserialize a back-reference (the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
     *       stream representation of an object which has been written
90ce3da70b43 Initial load
duke
parents:
diff changeset
   480
     *       previously to the stream), an ObjectStreamException will be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
     *       thrown.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   482
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
     *   <li>If readUnshared returns successfully, then any subsequent attempts
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
     *       to deserialize back-references to the stream handle deserialized
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
     *       by readUnshared will cause an ObjectStreamException to be thrown.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
     * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
     * Deserializing an object via readUnshared invalidates the stream handle
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
     * associated with the returned object.  Note that this in itself does not
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
     * always guarantee that the reference returned by readUnshared is unique;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
     * the deserialized object may define a readResolve method which returns an
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
     * object visible to other parties, or readUnshared may return a Class
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
     * object or enum constant obtainable elsewhere in the stream or through
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
     * external means. If the deserialized object defines a readResolve method
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
     * and the invocation of that method returns an array, then readUnshared
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
     * returns a shallow clone of that array; this guarantees that the returned
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
     * array object is unique and cannot be obtained a second time from an
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
     * invocation of readObject or readUnshared on the ObjectInputStream,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
     * even if the underlying data stream has been manipulated.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
     *
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   500
     * <p>The serialization filter, when not {@code null}, is invoked for
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   501
     * each object (regular or class) read to reconstruct the root object.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   502
     * See {@link #setObjectInputFilter(ObjectInputFilter) setObjectInputFilter} for details.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
   503
     *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
     * <p>ObjectInputStream subclasses which override this method can only be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
     * constructed in security contexts possessing the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
     * "enableSubclassImplementation" SerializablePermission; any attempt to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
     * instantiate such a subclass without this permission will cause a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
     * SecurityException to be thrown.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
     * @return  reference to deserialized object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
     * @throws  ClassNotFoundException if class of an object to deserialize
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
     *          cannot be found
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
     * @throws  StreamCorruptedException if control information in the stream
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
     *          is inconsistent
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
     * @throws  ObjectStreamException if object to deserialize has already
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
     *          appeared in stream
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
     * @throws  OptionalDataException if primitive data is next in stream
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
     * @throws  IOException if an I/O error occurs during deserialization
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
     * @since   1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
    public Object readUnshared() throws IOException, ClassNotFoundException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
        // if nested read, passHandle contains handle of enclosing object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
        int outerHandle = passHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
            Object obj = readObject0(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
            handles.markDependency(outerHandle, passHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
            ClassNotFoundException ex = handles.lookupException(passHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
            if (ex != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
                throw ex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
            if (depth == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
                vlist.doCallbacks();
29220
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
   533
                freeze();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
            return obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
            passHandle = outerHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
            if (closed && depth == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
                clear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
     * Read the non-static and non-transient fields of the current class from
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
     * this stream.  This may only be called from the readObject method of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
     * class being deserialized. It will throw the NotActiveException if it is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
     * called otherwise.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
     * @throws  ClassNotFoundException if the class of a serialized object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
     *          could not be found.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
     * @throws  IOException if an I/O error occurs.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
     * @throws  NotActiveException if the stream is not currently reading
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
     *          objects.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
    public void defaultReadObject()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
        throws IOException, ClassNotFoundException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
    {
20815
31d867b2565d 8014987: Augment serialization handling
smarks
parents: 16873
diff changeset
   559
        SerialCallbackContext ctx = curContext;
31d867b2565d 8014987: Augment serialization handling
smarks
parents: 16873
diff changeset
   560
        if (ctx == null) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
            throw new NotActiveException("not in call to readObject");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
        }
20815
31d867b2565d 8014987: Augment serialization handling
smarks
parents: 16873
diff changeset
   563
        Object curObj = ctx.getObj();
31d867b2565d 8014987: Augment serialization handling
smarks
parents: 16873
diff changeset
   564
        ObjectStreamClass curDesc = ctx.getDesc();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
        bin.setBlockDataMode(false);
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
   566
        FieldValues vals = defaultReadFields(curObj, curDesc);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
   567
        if (curObj != null) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
   568
            defaultCheckFieldValues(curObj, curDesc, vals);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
   569
            defaultSetFieldValues(curObj, curDesc, vals);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
   570
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
        bin.setBlockDataMode(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
        if (!curDesc.hasWriteObjectData()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
             * Fix for 4360508: since stream does not contain terminating
90ce3da70b43 Initial load
duke
parents:
diff changeset
   575
             * TC_ENDBLOCKDATA tag, set flag so that reading code elsewhere
90ce3da70b43 Initial load
duke
parents:
diff changeset
   576
             * knows to simulate end-of-custom-data behavior.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   577
             */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   578
            defaultDataEnd = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   579
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   580
        ClassNotFoundException ex = handles.lookupException(passHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
        if (ex != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
            throw ex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   585
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   587
     * Reads the persistent fields from the stream and makes them available by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
     * name.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
     *
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   590
     * @return  the {@code GetField} object representing the persistent
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
     *          fields of the object being deserialized
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
     * @throws  ClassNotFoundException if the class of a serialized object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
     *          could not be found.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
     * @throws  IOException if an I/O error occurs.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
     * @throws  NotActiveException if the stream is not currently reading
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
     *          objects.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
     * @since 1.2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   598
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
    public ObjectInputStream.GetField readFields()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
        throws IOException, ClassNotFoundException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   601
    {
20815
31d867b2565d 8014987: Augment serialization handling
smarks
parents: 16873
diff changeset
   602
        SerialCallbackContext ctx = curContext;
31d867b2565d 8014987: Augment serialization handling
smarks
parents: 16873
diff changeset
   603
        if (ctx == null) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
            throw new NotActiveException("not in call to readObject");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
        }
22936
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
   606
        ctx.checkAndSetUsed();
20815
31d867b2565d 8014987: Augment serialization handling
smarks
parents: 16873
diff changeset
   607
        ObjectStreamClass curDesc = ctx.getDesc();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   608
        bin.setBlockDataMode(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   609
        GetFieldImpl getField = new GetFieldImpl(curDesc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   610
        getField.readFields();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   611
        bin.setBlockDataMode(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   612
        if (!curDesc.hasWriteObjectData()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   613
            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   614
             * Fix for 4360508: since stream does not contain terminating
90ce3da70b43 Initial load
duke
parents:
diff changeset
   615
             * TC_ENDBLOCKDATA tag, set flag so that reading code elsewhere
90ce3da70b43 Initial load
duke
parents:
diff changeset
   616
             * knows to simulate end-of-custom-data behavior.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   617
             */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
            defaultDataEnd = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
        return getField;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
     * Register an object to be validated before the graph is returned.  While
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
     * similar to resolveObject these validations are called after the entire
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
     * graph has been reconstituted.  Typically, a readObject method will
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
     * register the object with the stream so that when all of the objects are
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
     * restored a final set of validations can be performed.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
     * @param   obj the object to receive the validation callback.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
     * @param   prio controls the order of callbacks;zero is a good default.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
     *          Use higher numbers to be called back earlier, lower numbers for
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
     *          later callbacks. Within a priority, callbacks are processed in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
     *          no particular order.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
     * @throws  NotActiveException The stream is not currently reading objects
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
     *          so it is invalid to register a callback.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
     * @throws  InvalidObjectException The validation object is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
    public void registerValidation(ObjectInputValidation obj, int prio)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
        throws NotActiveException, InvalidObjectException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   643
        if (depth == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
            throw new NotActiveException("stream inactive");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
        vlist.register(obj, prio);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   647
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   648
90ce3da70b43 Initial load
duke
parents:
diff changeset
   649
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
     * Load the local class equivalent of the specified stream class
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
     * description.  Subclasses may implement this method to allow classes to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
     * be fetched from an alternate source.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
     *
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   654
     * <p>The corresponding method in {@code ObjectOutputStream} is
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   655
     * {@code annotateClass}.  This method will be invoked only once for
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
     * each unique class in the stream.  This method can be implemented by
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
     * subclasses to use an alternate loading mechanism but must return a
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   658
     * {@code Class} object. Once returned, if the class is not an array
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
     * class, its serialVersionUID is compared to the serialVersionUID of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
     * serialized class, and if there is a mismatch, the deserialization fails
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
     * and an {@link InvalidClassException} is thrown.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
     * <p>The default implementation of this method in
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   664
     * {@code ObjectInputStream} returns the result of calling
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
     * <pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
     *     Class.forName(desc.getName(), false, loader)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
     * </pre>
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   668
     * where {@code loader} is the first class loader on the current
42440
ec843594bcc6 8169653: Restore ObjectInputStream::resolveClass call stack default search order
chegar
parents: 41230
diff changeset
   669
     * thread's stack (starting from the currently executing method) that is
ec843594bcc6 8169653: Restore ObjectInputStream::resolveClass call stack default search order
chegar
parents: 41230
diff changeset
   670
     * neither the {@linkplain ClassLoader#getPlatformClassLoader() platform
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   671
     * class loader} nor its ancestor; otherwise, {@code loader} is the
42440
ec843594bcc6 8169653: Restore ObjectInputStream::resolveClass call stack default search order
chegar
parents: 41230
diff changeset
   672
     * <em>platform class loader</em>. If this call results in a
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   673
     * {@code ClassNotFoundException} and the name of the passed
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   674
     * {@code ObjectStreamClass} instance is the Java language keyword
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   675
     * for a primitive type or void, then the {@code Class} object
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
     * representing that primitive type or void will be returned
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   677
     * (e.g., an {@code ObjectStreamClass} with the name
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   678
     * {@code "int"} will be resolved to {@code Integer.TYPE}).
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   679
     * Otherwise, the {@code ClassNotFoundException} will be thrown to
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
     * the caller of this method.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
     *
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   682
     * @param   desc an instance of class {@code ObjectStreamClass}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   683
     * @return  a {@code Class} object corresponding to {@code desc}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
     * @throws  IOException any of the usual Input/Output exceptions.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
     * @throws  ClassNotFoundException if class of a serialized object cannot
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
     *          be found.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
    protected Class<?> resolveClass(ObjectStreamClass desc)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
        throws IOException, ClassNotFoundException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
        String name = desc.getName();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
            return Class.forName(name, false, latestUserDefinedLoader());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
        } catch (ClassNotFoundException ex) {
51
6fe31bc95bbc 6600143: Remove another 450 unnecessary casts
martin
parents: 2
diff changeset
   695
            Class<?> cl = primClasses.get(name);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
            if (cl != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
                return cl;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
                throw ex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
     * Returns a proxy class that implements the interfaces named in a proxy
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
     * class descriptor; subclasses may implement this method to read custom
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
     * data from the stream along with the descriptors for dynamic proxy
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
     * classes, allowing them to use an alternate loading mechanism for the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
     * interfaces and the proxy class.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
     * <p>This method is called exactly once for each unique proxy class
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
     * descriptor in the stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
     *
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   714
     * <p>The corresponding method in {@code ObjectOutputStream} is
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   715
     * {@code annotateProxyClass}.  For a given subclass of
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   716
     * {@code ObjectInputStream} that overrides this method, the
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   717
     * {@code annotateProxyClass} method in the corresponding subclass of
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   718
     * {@code ObjectOutputStream} must write any data or objects read by
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
     * this method.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
     * <p>The default implementation of this method in
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   722
     * {@code ObjectInputStream} returns the result of calling
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   723
     * {@code Proxy.getProxyClass} with the list of {@code Class}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   724
     * objects for the interfaces that are named in the {@code interfaces}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   725
     * parameter.  The {@code Class} object for each interface name
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   726
     * {@code i} is the value returned by calling
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
     * <pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
     *     Class.forName(i, false, loader)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
     * </pre>
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   730
     * where {@code loader} is the first class loader on the current
42440
ec843594bcc6 8169653: Restore ObjectInputStream::resolveClass call stack default search order
chegar
parents: 41230
diff changeset
   731
     * thread's stack (starting from the currently executing method) that is
ec843594bcc6 8169653: Restore ObjectInputStream::resolveClass call stack default search order
chegar
parents: 41230
diff changeset
   732
     * neither the {@linkplain ClassLoader#getPlatformClassLoader() platform
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   733
     * class loader} nor its ancestor; otherwise, {@code loader} is the
42440
ec843594bcc6 8169653: Restore ObjectInputStream::resolveClass call stack default search order
chegar
parents: 41230
diff changeset
   734
     * <em>platform class loader</em>.
37899
1b8ec90a1e15 8155977: ObjectInputStream::resolveClass & resolveProxyClass for platform loader
mchung
parents: 37591
diff changeset
   735
     * Unless any of the resolved interfaces are non-public, this same value
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   736
     * of {@code loader} is also the class loader passed to
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   737
     * {@code Proxy.getProxyClass}; if non-public interfaces are present,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
     * their class loader is passed instead (if more than one non-public
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
     * interface class loader is encountered, an
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   740
     * {@code IllegalAccessError} is thrown).
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   741
     * If {@code Proxy.getProxyClass} throws an
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   742
     * {@code IllegalArgumentException}, {@code resolveProxyClass}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   743
     * will throw a {@code ClassNotFoundException} containing the
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   744
     * {@code IllegalArgumentException}.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   745
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
     * @param interfaces the list of interface names that were
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
     *                deserialized in the proxy class descriptor
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
     * @return  a proxy class for the specified interfaces
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
     * @throws        IOException any exception thrown by the underlying
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   750
     *                {@code InputStream}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
     * @throws        ClassNotFoundException if the proxy class or any of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
     *                named interfaces could not be found
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
     * @see ObjectOutputStream#annotateProxyClass(Class)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
     * @since 1.3
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
    protected Class<?> resolveProxyClass(String[] interfaces)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   757
        throws IOException, ClassNotFoundException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   758
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
        ClassLoader latestLoader = latestUserDefinedLoader();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   760
        ClassLoader nonPublicLoader = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   761
        boolean hasNonPublicInterface = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   762
90ce3da70b43 Initial load
duke
parents:
diff changeset
   763
        // define proxy in class loader of non-public interface(s), if any
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
   764
        Class<?>[] classObjs = new Class<?>[interfaces.length];
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   765
        for (int i = 0; i < interfaces.length; i++) {
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
   766
            Class<?> cl = Class.forName(interfaces[i], false, latestLoader);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
            if ((cl.getModifiers() & Modifier.PUBLIC) == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
                if (hasNonPublicInterface) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   769
                    if (nonPublicLoader != cl.getClassLoader()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   770
                        throw new IllegalAccessError(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   771
                            "conflicting non-public interface class loaders");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   772
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
                    nonPublicLoader = cl.getClassLoader();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   775
                    hasNonPublicInterface = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   776
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   777
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   778
            classObjs[i] = cl;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   779
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   780
        try {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35788
diff changeset
   781
            @SuppressWarnings("deprecation")
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35788
diff changeset
   782
            Class<?> proxyClass = Proxy.getProxyClass(
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   783
                hasNonPublicInterface ? nonPublicLoader : latestLoader,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   784
                classObjs);
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 35788
diff changeset
   785
            return proxyClass;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   786
        } catch (IllegalArgumentException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   787
            throw new ClassNotFoundException(null, e);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   788
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   789
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   790
90ce3da70b43 Initial load
duke
parents:
diff changeset
   791
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   792
     * This method will allow trusted subclasses of ObjectInputStream to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   793
     * substitute one object for another during deserialization. Replacing
90ce3da70b43 Initial load
duke
parents:
diff changeset
   794
     * objects is disabled until enableResolveObject is called. The
90ce3da70b43 Initial load
duke
parents:
diff changeset
   795
     * enableResolveObject method checks that the stream requesting to resolve
90ce3da70b43 Initial load
duke
parents:
diff changeset
   796
     * object can be trusted. Every reference to serializable objects is passed
90ce3da70b43 Initial load
duke
parents:
diff changeset
   797
     * to resolveObject.  To insure that the private state of objects is not
90ce3da70b43 Initial load
duke
parents:
diff changeset
   798
     * unintentionally exposed only trusted streams may use resolveObject.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   799
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   800
     * <p>This method is called after an object has been read but before it is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   801
     * returned from readObject.  The default resolveObject method just returns
90ce3da70b43 Initial load
duke
parents:
diff changeset
   802
     * the same object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   803
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   804
     * <p>When a subclass is replacing objects it must insure that the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   805
     * substituted object is compatible with every field where the reference
90ce3da70b43 Initial load
duke
parents:
diff changeset
   806
     * will be stored.  Objects whose type is not a subclass of the type of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   807
     * field or array element abort the serialization by raising an exception
90ce3da70b43 Initial load
duke
parents:
diff changeset
   808
     * and the object is not be stored.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   809
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   810
     * <p>This method is called only once when each object is first
90ce3da70b43 Initial load
duke
parents:
diff changeset
   811
     * encountered.  All subsequent references to the object will be redirected
90ce3da70b43 Initial load
duke
parents:
diff changeset
   812
     * to the new object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   813
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   814
     * @param   obj object to be substituted
90ce3da70b43 Initial load
duke
parents:
diff changeset
   815
     * @return  the substituted object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   816
     * @throws  IOException Any of the usual Input/Output exceptions.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   817
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   818
    protected Object resolveObject(Object obj) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   819
        return obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   820
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   821
90ce3da70b43 Initial load
duke
parents:
diff changeset
   822
    /**
44261
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   823
     * Enables the stream to do replacement of objects read from the stream. When
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   824
     * enabled, the {@link #resolveObject} method is called for every object being
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   825
     * deserialized.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   826
     *
44261
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   827
     * <p>If object replacement is currently not enabled, and
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   828
     * {@code enable} is true, and there is a security manager installed,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   829
     * this method first calls the security manager's
44261
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   830
     * {@code checkPermission} method with the
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   831
     * {@code SerializablePermission("enableSubstitution")} permission to
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   832
     * ensure that the caller is permitted to enable the stream to do replacement
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   833
     * of objects read from the stream.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   834
     *
44261
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   835
     * @param   enable true for enabling use of {@code resolveObject} for
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   836
     *          every object being deserialized
90ce3da70b43 Initial load
duke
parents:
diff changeset
   837
     * @return  the previous setting before this method was invoked
90ce3da70b43 Initial load
duke
parents:
diff changeset
   838
     * @throws  SecurityException if a security manager exists and its
44261
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   839
     *          {@code checkPermission} method denies enabling the stream
124fd1218a88 8066640: clarify security checks in ObjectInputStream.enableResolveObject and ObjectOutputStream.enableReplaceObject
smarks
parents: 42446
diff changeset
   840
     *          to do replacement of objects read from the stream.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   841
     * @see SecurityManager#checkPermission
90ce3da70b43 Initial load
duke
parents:
diff changeset
   842
     * @see java.io.SerializablePermission
90ce3da70b43 Initial load
duke
parents:
diff changeset
   843
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   844
    protected boolean enableResolveObject(boolean enable)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   845
        throws SecurityException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   846
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   847
        if (enable == enableResolve) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   848
            return enable;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   849
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
        if (enable) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   851
            SecurityManager sm = System.getSecurityManager();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   852
            if (sm != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   853
                sm.checkPermission(SUBSTITUTION_PERMISSION);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   854
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   855
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   856
        enableResolve = enable;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   857
        return !enableResolve;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   858
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   859
90ce3da70b43 Initial load
duke
parents:
diff changeset
   860
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   861
     * The readStreamHeader method is provided to allow subclasses to read and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   862
     * verify their own stream headers. It reads and verifies the magic number
90ce3da70b43 Initial load
duke
parents:
diff changeset
   863
     * and version number.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   864
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   865
     * @throws  IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   866
     *          underlying {@code InputStream}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   867
     * @throws  StreamCorruptedException if control information in the stream
90ce3da70b43 Initial load
duke
parents:
diff changeset
   868
     *          is inconsistent
90ce3da70b43 Initial load
duke
parents:
diff changeset
   869
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   870
    protected void readStreamHeader()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   871
        throws IOException, StreamCorruptedException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   872
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   873
        short s0 = bin.readShort();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   874
        short s1 = bin.readShort();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   875
        if (s0 != STREAM_MAGIC || s1 != STREAM_VERSION) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   876
            throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   877
                String.format("invalid stream header: %04X%04X", s0, s1));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   878
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   879
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   880
90ce3da70b43 Initial load
duke
parents:
diff changeset
   881
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   882
     * Read a class descriptor from the serialization stream.  This method is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   883
     * called when the ObjectInputStream expects a class descriptor as the next
90ce3da70b43 Initial load
duke
parents:
diff changeset
   884
     * item in the serialization stream.  Subclasses of ObjectInputStream may
90ce3da70b43 Initial load
duke
parents:
diff changeset
   885
     * override this method to read in class descriptors that have been written
90ce3da70b43 Initial load
duke
parents:
diff changeset
   886
     * in non-standard formats (by subclasses of ObjectOutputStream which have
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   887
     * overridden the {@code writeClassDescriptor} method).  By default,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   888
     * this method reads class descriptors according to the format defined in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   889
     * the Object Serialization specification.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   890
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   891
     * @return  the class descriptor read
90ce3da70b43 Initial load
duke
parents:
diff changeset
   892
     * @throws  IOException If an I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   893
     * @throws  ClassNotFoundException If the Class of a serialized object used
90ce3da70b43 Initial load
duke
parents:
diff changeset
   894
     *          in the class descriptor representation cannot be found
90ce3da70b43 Initial load
duke
parents:
diff changeset
   895
     * @see java.io.ObjectOutputStream#writeClassDescriptor(java.io.ObjectStreamClass)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   896
     * @since 1.3
90ce3da70b43 Initial load
duke
parents:
diff changeset
   897
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   898
    protected ObjectStreamClass readClassDescriptor()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   899
        throws IOException, ClassNotFoundException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   900
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   901
        ObjectStreamClass desc = new ObjectStreamClass();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   902
        desc.readNonProxy(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   903
        return desc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   904
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   905
90ce3da70b43 Initial load
duke
parents:
diff changeset
   906
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   907
     * Reads a byte of data. This method will block if no input is available.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   908
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   909
     * @return  the byte read, or -1 if the end of the stream is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   910
     * @throws  IOException If an I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   911
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   912
    public int read() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   913
        return bin.read();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   914
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   915
90ce3da70b43 Initial load
duke
parents:
diff changeset
   916
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   917
     * Reads into an array of bytes.  This method will block until some input
90ce3da70b43 Initial load
duke
parents:
diff changeset
   918
     * is available. Consider using java.io.DataInputStream.readFully to read
90ce3da70b43 Initial load
duke
parents:
diff changeset
   919
     * exactly 'length' bytes.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   920
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   921
     * @param   buf the buffer into which the data is read
37591
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
   922
     * @param   off the start offset in the destination array {@code buf}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   923
     * @param   len the maximum number of bytes read
90ce3da70b43 Initial load
duke
parents:
diff changeset
   924
     * @return  the actual number of bytes read, -1 is returned when the end of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   925
     *          the stream is reached.
37591
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
   926
     * @throws  NullPointerException if {@code buf} is {@code null}.
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
   927
     * @throws  IndexOutOfBoundsException if {@code off} is negative,
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
   928
     *          {@code len} is negative, or {@code len} is greater than
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
   929
     *          {@code buf.length - off}.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   930
     * @throws  IOException If an I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   931
     * @see java.io.DataInputStream#readFully(byte[],int,int)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   932
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   933
    public int read(byte[] buf, int off, int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   934
        if (buf == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   935
            throw new NullPointerException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   936
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   937
        int endoff = off + len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   938
        if (off < 0 || len < 0 || endoff > buf.length || endoff < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   939
            throw new IndexOutOfBoundsException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   940
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   941
        return bin.read(buf, off, len, false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   942
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   943
90ce3da70b43 Initial load
duke
parents:
diff changeset
   944
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   945
     * Returns the number of bytes that can be read without blocking.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   946
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   947
     * @return  the number of available bytes.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   948
     * @throws  IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
   949
     *          underlying {@code InputStream}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   950
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   951
    public int available() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   952
        return bin.available();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   953
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   954
90ce3da70b43 Initial load
duke
parents:
diff changeset
   955
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   956
     * Closes the input stream. Must be called to release any resources
90ce3da70b43 Initial load
duke
parents:
diff changeset
   957
     * associated with the stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   958
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   959
     * @throws  IOException If an I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   960
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   961
    public void close() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   962
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   963
         * Even if stream already closed, propagate redundant close to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   964
         * underlying stream to stay consistent with previous implementations.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   965
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   966
        closed = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   967
        if (depth == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   968
            clear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   969
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   970
        bin.close();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   971
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   972
90ce3da70b43 Initial load
duke
parents:
diff changeset
   973
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   974
     * Reads in a boolean.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   975
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   976
     * @return  the boolean read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   977
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   978
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   979
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   980
    public boolean readBoolean() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   981
        return bin.readBoolean();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   982
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   983
90ce3da70b43 Initial load
duke
parents:
diff changeset
   984
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   985
     * Reads an 8 bit byte.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   986
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   987
     * @return  the 8 bit byte read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   988
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   989
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   990
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   991
    public byte readByte() throws IOException  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   992
        return bin.readByte();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   993
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   994
90ce3da70b43 Initial load
duke
parents:
diff changeset
   995
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   996
     * Reads an unsigned 8 bit byte.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   997
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   998
     * @return  the 8 bit byte read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   999
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1000
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1001
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1002
    public int readUnsignedByte()  throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1003
        return bin.readUnsignedByte();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1004
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1005
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1006
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1007
     * Reads a 16 bit char.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1008
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1009
     * @return  the 16 bit char read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1010
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1011
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1012
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1013
    public char readChar()  throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1014
        return bin.readChar();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1015
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1016
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1017
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1018
     * Reads a 16 bit short.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1019
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1020
     * @return  the 16 bit short read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1021
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1022
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1023
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1024
    public short readShort()  throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1025
        return bin.readShort();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1026
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1027
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1028
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1029
     * Reads an unsigned 16 bit short.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1030
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1031
     * @return  the 16 bit short read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1032
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1033
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1034
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1035
    public int readUnsignedShort() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1036
        return bin.readUnsignedShort();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1037
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1038
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1039
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1040
     * Reads a 32 bit int.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1041
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1042
     * @return  the 32 bit integer read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1043
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1044
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1045
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1046
    public int readInt()  throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1047
        return bin.readInt();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1048
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1049
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1050
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1051
     * Reads a 64 bit long.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1052
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1053
     * @return  the read 64 bit long.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1054
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1055
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1056
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1057
    public long readLong()  throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1058
        return bin.readLong();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1059
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1060
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1061
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1062
     * Reads a 32 bit float.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1063
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1064
     * @return  the 32 bit float read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1065
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1066
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1067
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1068
    public float readFloat() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1069
        return bin.readFloat();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1070
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1071
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1072
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1073
     * Reads a 64 bit double.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1074
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1075
     * @return  the 64 bit double read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1076
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1077
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1078
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1079
    public double readDouble() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1080
        return bin.readDouble();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1081
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1082
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1083
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1084
     * Reads bytes, blocking until all bytes are read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1085
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1086
     * @param   buf the buffer into which the data is read
37591
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
  1087
     * @throws  NullPointerException If {@code buf} is {@code null}.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1088
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1089
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1090
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1091
    public void readFully(byte[] buf) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1092
        bin.readFully(buf, 0, buf.length, false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1093
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1094
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1095
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1096
     * Reads bytes, blocking until all bytes are read.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1097
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1098
     * @param   buf the buffer into which the data is read
37591
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
  1099
     * @param   off the start offset into the data array {@code buf}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1100
     * @param   len the maximum number of bytes to read
37591
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
  1101
     * @throws  NullPointerException If {@code buf} is {@code null}.
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
  1102
     * @throws  IndexOutOfBoundsException If {@code off} is negative,
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
  1103
     *          {@code len} is negative, or {@code len} is greater than
b71bda3ce058 8154183: (spec) Spec of read(byte[],int,int) and readFully(byte[],int,int) is confusing/incomplete
bpb
parents: 37584
diff changeset
  1104
     *          {@code buf.length - off}.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1105
     * @throws  EOFException If end of file is reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1106
     * @throws  IOException If other I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1107
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1108
    public void readFully(byte[] buf, int off, int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1109
        int endoff = off + len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1110
        if (off < 0 || len < 0 || endoff > buf.length || endoff < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1111
            throw new IndexOutOfBoundsException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1112
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1113
        bin.readFully(buf, off, len, false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1114
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1115
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1116
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1117
     * Skips bytes.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1118
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1119
     * @param   len the number of bytes to be skipped
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1120
     * @return  the actual number of bytes skipped.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1121
     * @throws  IOException If an I/O error has occurred.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1122
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1123
    public int skipBytes(int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1124
        return bin.skipBytes(len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1125
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1126
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1127
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1128
     * Reads in a line that has been terminated by a \n, \r, \r\n or EOF.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1129
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1130
     * @return  a String copy of the line.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1131
     * @throws  IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1132
     *          underlying {@code InputStream}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1133
     * @deprecated This method does not properly convert bytes to characters.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1134
     *          see DataInputStream for the details and alternatives.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1135
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1136
    @Deprecated
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1137
    public String readLine() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1138
        return bin.readLine();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1139
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1140
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1141
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1142
     * Reads a String in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1143
     * <a href="DataInput.html#modified-utf-8">modified UTF-8</a>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1144
     * format.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1145
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1146
     * @return  the String.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1147
     * @throws  IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1148
     *          underlying {@code InputStream}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1149
     * @throws  UTFDataFormatException if read bytes do not represent a valid
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1150
     *          modified UTF-8 encoding of a string
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1151
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1152
    public String readUTF() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1153
        return bin.readUTF();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1154
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1155
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1156
    /**
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1157
     * Returns the serialization filter for this stream.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1158
     * The serialization filter is the most recent filter set in
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1159
     * {@link #setObjectInputFilter setObjectInputFilter} or
53304
9e968a576dd2 8202675: Replace process-wide terminology in serial filtering to be consistent
rriggs
parents: 52427
diff changeset
  1160
     * the initial system-wide filter from
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1161
     * {@link ObjectInputFilter.Config#getSerialFilter() ObjectInputFilter.Config.getSerialFilter}.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1162
     *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1163
     * @return the serialization filter for the stream; may be null
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1164
     * @since 9
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1165
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1166
    public final ObjectInputFilter getObjectInputFilter() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1167
        return serialFilter;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1168
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1169
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1170
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1171
     * Set the serialization filter for the stream.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1172
     * The filter's {@link ObjectInputFilter#checkInput checkInput} method is called
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1173
     * for each class and reference in the stream.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1174
     * The filter can check any or all of the class, the array length, the number
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1175
     * of references, the depth of the graph, and the size of the input stream.
42446
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 42440
diff changeset
  1176
     * The depth is the number of nested {@linkplain #readObject readObject}
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 42440
diff changeset
  1177
     * calls starting with the reading of the root of the graph being deserialized
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 42440
diff changeset
  1178
     * and the current object being deserialized.
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 42440
diff changeset
  1179
     * The number of references is the cumulative number of objects and references
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 42440
diff changeset
  1180
     * to objects already read from the stream including the current object being read.
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 42440
diff changeset
  1181
     * The filter is invoked only when reading objects from the stream and for
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 42440
diff changeset
  1182
     * not primitives.
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1183
     * <p>
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1184
     * If the filter returns {@link ObjectInputFilter.Status#REJECTED Status.REJECTED},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1185
     * {@code null} or throws a {@link RuntimeException},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1186
     * the active {@code readObject} or {@code readUnshared}
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1187
     * throws {@link InvalidClassException}, otherwise deserialization
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1188
     * continues uninterrupted.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1189
     * <p>
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1190
     * The serialization filter is initialized to the value of
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1191
     * {@link ObjectInputFilter.Config#getSerialFilter() ObjectInputFilter.Config.getSerialFilter}
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1192
     * when the {@code  ObjectInputStream} is constructed and can be set
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1193
     * to a custom filter only once.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1194
     *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1195
     * @implSpec
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1196
     * The filter, when not {@code null}, is invoked during {@link #readObject readObject}
42446
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 42440
diff changeset
  1197
     * and {@link #readUnshared readUnshared} for each object (regular or class) in the stream.
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 42440
diff changeset
  1198
     * Strings are treated as primitives and do not invoke the filter.
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 42440
diff changeset
  1199
     * The filter is called for:
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1200
     * <ul>
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1201
     *     <li>each object reference previously deserialized from the stream
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1202
     *     (class is {@code null}, arrayLength is -1),
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1203
     *     <li>each regular class (class is not {@code null}, arrayLength is -1),
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1204
     *     <li>each interface of a dynamic proxy and the dynamic proxy class itself
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1205
     *     (class is not {@code null}, arrayLength is -1),
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1206
     *     <li>each array is filtered using the array type and length of the array
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1207
     *     (class is the array type, arrayLength is the requested length),
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1208
     *     <li>each object replaced by its class' {@code readResolve} method
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1209
     *         is filtered using the replacement object's class, if not {@code null},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1210
     *         and if it is an array, the arrayLength, otherwise -1,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1211
     *     <li>and each object replaced by {@link #resolveObject resolveObject}
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1212
     *         is filtered using the replacement object's class, if not {@code null},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1213
     *         and if it is an array, the arrayLength, otherwise -1.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1214
     * </ul>
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1215
     *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1216
     * When the {@link ObjectInputFilter#checkInput checkInput} method is invoked
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1217
     * it is given access to the current class, the array length,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1218
     * the current number of references already read from the stream,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1219
     * the depth of nested calls to {@link #readObject readObject} or
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1220
     * {@link #readUnshared readUnshared},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1221
     * and the implementation dependent number of bytes consumed from the input stream.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1222
     * <p>
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1223
     * Each call to {@link #readObject readObject} or
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1224
     * {@link #readUnshared readUnshared} increases the depth by 1
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1225
     * before reading an object and decreases by 1 before returning
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1226
     * normally or exceptionally.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1227
     * The depth starts at {@code 1} and increases for each nested object and
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1228
     * decrements when each nested call returns.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1229
     * The count of references in the stream starts at {@code 1} and
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1230
     * is increased before reading an object.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1231
     *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1232
     * @param filter the filter, may be null
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1233
     * @throws SecurityException if there is security manager and the
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1234
     *       {@code SerializablePermission("serialFilter")} is not granted
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1235
     * @throws IllegalStateException if the {@linkplain #getObjectInputFilter() current filter}
53304
9e968a576dd2 8202675: Replace process-wide terminology in serial filtering to be consistent
rriggs
parents: 52427
diff changeset
  1236
     *       is not {@code null} and is not the system-wide filter
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1237
     * @since 9
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1238
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1239
    public final void setObjectInputFilter(ObjectInputFilter filter) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1240
        SecurityManager sm = System.getSecurityManager();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1241
        if (sm != null) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1242
            sm.checkPermission(ObjectStreamConstants.SERIAL_FILTER_PERMISSION);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1243
        }
53304
9e968a576dd2 8202675: Replace process-wide terminology in serial filtering to be consistent
rriggs
parents: 52427
diff changeset
  1244
        // Allow replacement of the system-wide filter if not already set
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1245
        if (serialFilter != null &&
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1246
                serialFilter != ObjectInputFilter.Config.getSerialFilter()) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1247
            throw new IllegalStateException("filter can not be set more than once");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1248
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1249
        this.serialFilter = filter;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1250
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1251
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1252
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1253
     * Invoke the serialization filter if non-null.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1254
     * If the filter rejects or an exception is thrown, throws InvalidClassException.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1255
     *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1256
     * @param clazz the class; may be null
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1257
     * @param arrayLength the array length requested; use {@code -1} if not creating an array
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1258
     * @throws InvalidClassException if it rejected by the filter or
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1259
     *        a {@link RuntimeException} is thrown
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1260
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1261
    private void filterCheck(Class<?> clazz, int arrayLength)
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1262
            throws InvalidClassException {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1263
        if (serialFilter != null) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1264
            RuntimeException ex = null;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1265
            ObjectInputFilter.Status status;
50271
697b49a04e19 8203368: ObjectInputStream filterCheck method throws NullPointerException
rriggs
parents: 49438
diff changeset
  1266
            // Info about the stream is not available if overridden by subclass, return 0
697b49a04e19 8203368: ObjectInputStream filterCheck method throws NullPointerException
rriggs
parents: 49438
diff changeset
  1267
            long bytesRead = (bin == null) ? 0 : bin.getBytesRead();
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1268
            try {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1269
                status = serialFilter.checkInput(new FilterValues(clazz, arrayLength,
50271
697b49a04e19 8203368: ObjectInputStream filterCheck method throws NullPointerException
rriggs
parents: 49438
diff changeset
  1270
                        totalObjectRefs, depth, bytesRead));
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1271
            } catch (RuntimeException e) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1272
                // Preventive interception of an exception to log
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1273
                status = ObjectInputFilter.Status.REJECTED;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1274
                ex = e;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1275
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1276
            if (Logging.filterLogger != null) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1277
                // Debug logging of filter checks that fail; Tracing for those that succeed
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1278
                Logging.filterLogger.log(status == null || status == ObjectInputFilter.Status.REJECTED
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1279
                                ? Logger.Level.DEBUG
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1280
                                : Logger.Level.TRACE,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1281
                        "ObjectInputFilter {0}: {1}, array length: {2}, nRefs: {3}, depth: {4}, bytes: {5}, ex: {6}",
50271
697b49a04e19 8203368: ObjectInputStream filterCheck method throws NullPointerException
rriggs
parents: 49438
diff changeset
  1282
                        status, clazz, arrayLength, totalObjectRefs, depth, bytesRead,
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1283
                        Objects.toString(ex, "n/a"));
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1284
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1285
            if (status == null ||
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1286
                    status == ObjectInputFilter.Status.REJECTED) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1287
                InvalidClassException ice = new InvalidClassException("filter status: " + status);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1288
                ice.initCause(ex);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1289
                throw ice;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1290
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1291
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1292
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1293
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1294
    /**
47423
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1295
     * Checks the given array type and length to ensure that creation of such
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1296
     * an array is permitted by this ObjectInputStream. The arrayType argument
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1297
     * must represent an actual array type.
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1298
     *
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1299
     * This private method is called via SharedSecrets.
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1300
     *
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1301
     * @param arrayType the array type
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1302
     * @param arrayLength the array length
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1303
     * @throws NullPointerException if arrayType is null
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1304
     * @throws IllegalArgumentException if arrayType isn't actually an array type
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1305
     * @throws NegativeArraySizeException if arrayLength is negative
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1306
     * @throws InvalidClassException if the filter rejects creation
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1307
     */
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1308
    private void checkArray(Class<?> arrayType, int arrayLength) throws InvalidClassException {
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1309
        if (! arrayType.isArray()) {
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1310
            throw new IllegalArgumentException("not an array type");
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1311
        }
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1312
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1313
        if (arrayLength < 0) {
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1314
            throw new NegativeArraySizeException();
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1315
        }
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1316
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1317
        filterCheck(arrayType, arrayLength);
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1318
    }
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1319
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  1320
    /**
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1321
     * Provide access to the persistent fields read from the input stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1322
     */
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 31709
diff changeset
  1323
    public abstract static class GetField {
58054
ee230ad8cfef 8230723: Remove default constructors from java.lang and java.io
darcy
parents: 55198
diff changeset
  1324
        /**
ee230ad8cfef 8230723: Remove default constructors from java.lang and java.io
darcy
parents: 55198
diff changeset
  1325
         * Constructor for subclasses to call.
ee230ad8cfef 8230723: Remove default constructors from java.lang and java.io
darcy
parents: 55198
diff changeset
  1326
         */
ee230ad8cfef 8230723: Remove default constructors from java.lang and java.io
darcy
parents: 55198
diff changeset
  1327
        public GetField() {}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1328
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1329
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1330
         * Get the ObjectStreamClass that describes the fields in the stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1331
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1332
         * @return  the descriptor class that describes the serializable fields
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1333
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1334
        public abstract ObjectStreamClass getObjectStreamClass();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1335
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1336
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1337
         * Return true if the named field is defaulted and has no value in this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1338
         * stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1339
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1340
         * @param  name the name of the field
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1341
         * @return true, if and only if the named field is defaulted
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1342
         * @throws IOException if there are I/O errors while reading from
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1343
         *         the underlying {@code InputStream}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1344
         * @throws IllegalArgumentException if {@code name} does not
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1345
         *         correspond to a serializable field
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1346
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1347
        public abstract boolean defaulted(String name) throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1348
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1349
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1350
         * Get the value of the named boolean field from the persistent field.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1351
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1352
         * @param  name the name of the field
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1353
         * @param  val the default value to use if {@code name} does not
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1354
         *         have a value
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1355
         * @return the value of the named {@code boolean} field
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1356
         * @throws IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1357
         *         underlying {@code InputStream}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1358
         * @throws IllegalArgumentException if type of {@code name} is
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1359
         *         not serializable or if the field type is incorrect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1360
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1361
        public abstract boolean get(String name, boolean val)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1362
            throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1363
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1364
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1365
         * Get the value of the named byte field from the persistent field.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1366
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1367
         * @param  name the name of the field
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1368
         * @param  val the default value to use if {@code name} does not
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1369
         *         have a value
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1370
         * @return the value of the named {@code byte} field
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1371
         * @throws IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1372
         *         underlying {@code InputStream}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1373
         * @throws IllegalArgumentException if type of {@code name} is
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1374
         *         not serializable or if the field type is incorrect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1375
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1376
        public abstract byte get(String name, byte val) throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1377
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1378
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1379
         * Get the value of the named char field from the persistent field.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1380
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1381
         * @param  name the name of the field
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1382
         * @param  val the default value to use if {@code name} does not
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1383
         *         have a value
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1384
         * @return the value of the named {@code char} field
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1385
         * @throws IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1386
         *         underlying {@code InputStream}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1387
         * @throws IllegalArgumentException if type of {@code name} is
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1388
         *         not serializable or if the field type is incorrect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1389
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1390
        public abstract char get(String name, char val) throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1391
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1392
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1393
         * Get the value of the named short field from the persistent field.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1394
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1395
         * @param  name the name of the field
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1396
         * @param  val the default value to use if {@code name} does not
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1397
         *         have a value
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1398
         * @return the value of the named {@code short} field
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1399
         * @throws IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1400
         *         underlying {@code InputStream}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1401
         * @throws IllegalArgumentException if type of {@code name} is
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1402
         *         not serializable or if the field type is incorrect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1403
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1404
        public abstract short get(String name, short val) throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1405
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1406
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1407
         * Get the value of the named int field from the persistent field.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1408
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1409
         * @param  name the name of the field
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1410
         * @param  val the default value to use if {@code name} does not
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1411
         *         have a value
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1412
         * @return the value of the named {@code int} field
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1413
         * @throws IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1414
         *         underlying {@code InputStream}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1415
         * @throws IllegalArgumentException if type of {@code name} is
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1416
         *         not serializable or if the field type is incorrect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1417
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1418
        public abstract int get(String name, int val) throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1419
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1420
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1421
         * Get the value of the named long field from the persistent field.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1422
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1423
         * @param  name the name of the field
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1424
         * @param  val the default value to use if {@code name} does not
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1425
         *         have a value
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1426
         * @return the value of the named {@code long} field
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1427
         * @throws IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1428
         *         underlying {@code InputStream}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1429
         * @throws IllegalArgumentException if type of {@code name} is
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1430
         *         not serializable or if the field type is incorrect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1431
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1432
        public abstract long get(String name, long val) throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1433
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1434
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1435
         * Get the value of the named float field from the persistent field.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1436
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1437
         * @param  name the name of the field
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1438
         * @param  val the default value to use if {@code name} does not
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1439
         *         have a value
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1440
         * @return the value of the named {@code float} field
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1441
         * @throws IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1442
         *         underlying {@code InputStream}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1443
         * @throws IllegalArgumentException if type of {@code name} is
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1444
         *         not serializable or if the field type is incorrect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1445
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1446
        public abstract float get(String name, float val) throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1447
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1448
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1449
         * Get the value of the named double field from the persistent field.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1450
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1451
         * @param  name the name of the field
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1452
         * @param  val the default value to use if {@code name} does not
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1453
         *         have a value
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1454
         * @return the value of the named {@code double} field
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1455
         * @throws IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1456
         *         underlying {@code InputStream}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1457
         * @throws IllegalArgumentException if type of {@code name} is
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1458
         *         not serializable or if the field type is incorrect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1459
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1460
        public abstract double get(String name, double val) throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1461
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1462
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1463
         * Get the value of the named Object field from the persistent field.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1464
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1465
         * @param  name the name of the field
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1466
         * @param  val the default value to use if {@code name} does not
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1467
         *         have a value
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1468
         * @return the value of the named {@code Object} field
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1469
         * @throws IOException if there are I/O errors while reading from the
58288
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1470
         *         underlying {@code InputStream}
48e480e56aad 8231186: Replace html tag <code>foo</code> with javadoc tag {@code foo} in java.base
jboes
parents: 58244
diff changeset
  1471
         * @throws IllegalArgumentException if type of {@code name} is
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1472
         *         not serializable or if the field type is incorrect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1473
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1474
        public abstract Object get(String name, Object val) throws IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1475
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1476
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1477
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1478
     * Verifies that this (possibly subclass) instance can be constructed
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1479
     * without violating security constraints: the subclass must not override
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1480
     * security-sensitive non-final methods, or else the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1481
     * "enableSubclassImplementation" SerializablePermission is checked.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1482
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1483
    private void verifySubclass() {
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  1484
        Class<?> cl = getClass();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1485
        if (cl == ObjectInputStream.class) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1486
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1487
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1488
        SecurityManager sm = System.getSecurityManager();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1489
        if (sm == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1490
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1491
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1492
        processQueue(Caches.subclassAuditsQueue, Caches.subclassAudits);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1493
        WeakClassKey key = new WeakClassKey(cl, Caches.subclassAuditsQueue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1494
        Boolean result = Caches.subclassAudits.get(key);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1495
        if (result == null) {
40410
5fd4a1f809f8 8163517: Various cleanup in java.io code
igerasim
parents: 37899
diff changeset
  1496
            result = auditSubclass(cl);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1497
            Caches.subclassAudits.putIfAbsent(key, result);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1498
        }
40410
5fd4a1f809f8 8163517: Various cleanup in java.io code
igerasim
parents: 37899
diff changeset
  1499
        if (!result) {
5fd4a1f809f8 8163517: Various cleanup in java.io code
igerasim
parents: 37899
diff changeset
  1500
            sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1501
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1502
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1503
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1504
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1505
     * Performs reflective checks on given subclass to verify that it doesn't
40410
5fd4a1f809f8 8163517: Various cleanup in java.io code
igerasim
parents: 37899
diff changeset
  1506
     * override security-sensitive non-final methods.  Returns TRUE if subclass
5fd4a1f809f8 8163517: Various cleanup in java.io code
igerasim
parents: 37899
diff changeset
  1507
     * is "safe", FALSE otherwise.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1508
     */
40410
5fd4a1f809f8 8163517: Various cleanup in java.io code
igerasim
parents: 37899
diff changeset
  1509
    private static Boolean auditSubclass(Class<?> subcl) {
5fd4a1f809f8 8163517: Various cleanup in java.io code
igerasim
parents: 37899
diff changeset
  1510
        return AccessController.doPrivileged(
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1511
            new PrivilegedAction<Boolean>() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1512
                public Boolean run() {
51
6fe31bc95bbc 6600143: Remove another 450 unnecessary casts
martin
parents: 2
diff changeset
  1513
                    for (Class<?> cl = subcl;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1514
                         cl != ObjectInputStream.class;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1515
                         cl = cl.getSuperclass())
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1516
                    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1517
                        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1518
                            cl.getDeclaredMethod(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1519
                                "readUnshared", (Class[]) null);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1520
                            return Boolean.FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1521
                        } catch (NoSuchMethodException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1522
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1523
                        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1524
                            cl.getDeclaredMethod("readFields", (Class[]) null);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1525
                            return Boolean.FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1526
                        } catch (NoSuchMethodException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1527
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1528
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1529
                    return Boolean.TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1530
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1531
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1532
        );
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1533
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1534
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1535
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1536
     * Clears internal data structures.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1537
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1538
    private void clear() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1539
        handles.clear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1540
        vlist.clear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1541
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1542
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1543
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1544
     * Underlying readObject implementation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1545
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1546
    private Object readObject0(boolean unshared) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1547
        boolean oldMode = bin.getBlockDataMode();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1548
        if (oldMode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1549
            int remain = bin.currentBlockRemaining();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1550
            if (remain > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1551
                throw new OptionalDataException(remain);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1552
            } else if (defaultDataEnd) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1553
                /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1554
                 * Fix for 4360508: stream is currently at the end of a field
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1555
                 * value block written via default serialization; since there
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1556
                 * is no terminating TC_ENDBLOCKDATA tag, simulate
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1557
                 * end-of-custom-data behavior explicitly.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1558
                 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1559
                throw new OptionalDataException(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1560
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1561
            bin.setBlockDataMode(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1562
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1563
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1564
        byte tc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1565
        while ((tc = bin.peekByte()) == TC_RESET) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1566
            bin.readByte();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1567
            handleReset();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1568
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1569
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1570
        depth++;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1571
        totalObjectRefs++;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1572
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1573
            switch (tc) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1574
                case TC_NULL:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1575
                    return readNull();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1576
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1577
                case TC_REFERENCE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1578
                    return readHandle(unshared);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1579
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1580
                case TC_CLASS:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1581
                    return readClass(unshared);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1582
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1583
                case TC_CLASSDESC:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1584
                case TC_PROXYCLASSDESC:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1585
                    return readClassDesc(unshared);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1586
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1587
                case TC_STRING:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1588
                case TC_LONGSTRING:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1589
                    return checkResolve(readString(unshared));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1590
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1591
                case TC_ARRAY:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1592
                    return checkResolve(readArray(unshared));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1593
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1594
                case TC_ENUM:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1595
                    return checkResolve(readEnum(unshared));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1596
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1597
                case TC_OBJECT:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1598
                    return checkResolve(readOrdinaryObject(unshared));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1599
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1600
                case TC_EXCEPTION:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1601
                    IOException ex = readFatalException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1602
                    throw new WriteAbortedException("writing aborted", ex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1603
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1604
                case TC_BLOCKDATA:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1605
                case TC_BLOCKDATALONG:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1606
                    if (oldMode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1607
                        bin.setBlockDataMode(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1608
                        bin.peek();             // force header read
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1609
                        throw new OptionalDataException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1610
                            bin.currentBlockRemaining());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1611
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1612
                        throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1613
                            "unexpected block data");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1614
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1615
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1616
                case TC_ENDBLOCKDATA:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1617
                    if (oldMode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1618
                        throw new OptionalDataException(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1619
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1620
                        throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1621
                            "unexpected end of block data");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1622
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1623
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1624
                default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1625
                    throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1626
                        String.format("invalid type code: %02X", tc));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1627
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1628
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1629
            depth--;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1630
            bin.setBlockDataMode(oldMode);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1631
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1632
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1633
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1634
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1635
     * If resolveObject has been enabled and given object does not have an
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1636
     * exception associated with it, calls resolveObject to determine
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1637
     * replacement for object, and updates handle table accordingly.  Returns
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1638
     * replacement object, or echoes provided object if no replacement
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1639
     * occurred.  Expects that passHandle is set to given object's handle prior
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1640
     * to calling this method.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1641
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1642
    private Object checkResolve(Object obj) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1643
        if (!enableResolve || handles.lookupException(passHandle) != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1644
            return obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1645
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1646
        Object rep = resolveObject(obj);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1647
        if (rep != obj) {
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1648
            // The type of the original object has been filtered but resolveObject
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1649
            // may have replaced it;  filter the replacement's type
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1650
            if (rep != null) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1651
                if (rep.getClass().isArray()) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1652
                    filterCheck(rep.getClass(), Array.getLength(rep));
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1653
                } else {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1654
                    filterCheck(rep.getClass(), -1);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1655
                }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1656
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1657
            handles.setObject(passHandle, rep);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1658
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1659
        return rep;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1660
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1661
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1662
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1663
     * Reads string without allowing it to be replaced in stream.  Called from
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1664
     * within ObjectStreamClass.read().
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1665
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1666
    String readTypeString() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1667
        int oldHandle = passHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1668
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1669
            byte tc = bin.peekByte();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1670
            switch (tc) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1671
                case TC_NULL:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1672
                    return (String) readNull();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1673
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1674
                case TC_REFERENCE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1675
                    return (String) readHandle(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1676
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1677
                case TC_STRING:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1678
                case TC_LONGSTRING:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1679
                    return readString(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1680
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1681
                default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1682
                    throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1683
                        String.format("invalid type code: %02X", tc));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1684
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1685
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1686
            passHandle = oldHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1687
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1688
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1689
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1690
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1691
     * Reads in null code, sets passHandle to NULL_HANDLE and returns null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1692
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1693
    private Object readNull() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1694
        if (bin.readByte() != TC_NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1695
            throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1696
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1697
        passHandle = NULL_HANDLE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1698
        return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1699
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1700
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1701
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1702
     * Reads in object handle, sets passHandle to the read handle, and returns
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1703
     * object associated with the handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1704
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1705
    private Object readHandle(boolean unshared) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1706
        if (bin.readByte() != TC_REFERENCE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1707
            throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1708
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1709
        passHandle = bin.readInt() - baseWireHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1710
        if (passHandle < 0 || passHandle >= handles.size()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1711
            throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1712
                String.format("invalid handle value: %08X", passHandle +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1713
                baseWireHandle));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1714
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1715
        if (unshared) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1716
            // REMIND: what type of exception to throw here?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1717
            throw new InvalidObjectException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1718
                "cannot read back reference as unshared");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1719
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1720
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1721
        Object obj = handles.lookupObject(passHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1722
        if (obj == unsharedMarker) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1723
            // REMIND: what type of exception to throw here?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1724
            throw new InvalidObjectException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1725
                "cannot read back reference to unshared object");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1726
        }
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1727
        filterCheck(null, -1);       // just a check for number of references, depth, no class
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1728
        return obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1729
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1730
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1731
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1732
     * Reads in and returns class object.  Sets passHandle to class object's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1733
     * assigned handle.  Returns null if class is unresolvable (in which case a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1734
     * ClassNotFoundException will be associated with the class' handle in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1735
     * handle table).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1736
     */
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  1737
    private Class<?> readClass(boolean unshared) throws IOException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1738
        if (bin.readByte() != TC_CLASS) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1739
            throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1740
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1741
        ObjectStreamClass desc = readClassDesc(false);
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  1742
        Class<?> cl = desc.forClass();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1743
        passHandle = handles.assign(unshared ? unsharedMarker : cl);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1744
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1745
        ClassNotFoundException resolveEx = desc.getResolveException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1746
        if (resolveEx != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1747
            handles.markException(passHandle, resolveEx);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1748
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1749
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1750
        handles.finish(passHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1751
        return cl;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1752
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1753
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1754
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1755
     * Reads in and returns (possibly null) class descriptor.  Sets passHandle
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1756
     * to class descriptor's assigned handle.  If class descriptor cannot be
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1757
     * resolved to a class in the local VM, a ClassNotFoundException is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1758
     * associated with the class descriptor's handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1759
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1760
    private ObjectStreamClass readClassDesc(boolean unshared)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1761
        throws IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1762
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1763
        byte tc = bin.peekByte();
37584
0cc00d7a0755 8144430: Improve JMX connections
sjiang
parents: 37583
diff changeset
  1764
        ObjectStreamClass descriptor;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1765
        switch (tc) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1766
            case TC_NULL:
37584
0cc00d7a0755 8144430: Improve JMX connections
sjiang
parents: 37583
diff changeset
  1767
                descriptor = (ObjectStreamClass) readNull();
0cc00d7a0755 8144430: Improve JMX connections
sjiang
parents: 37583
diff changeset
  1768
                break;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1769
            case TC_REFERENCE:
37584
0cc00d7a0755 8144430: Improve JMX connections
sjiang
parents: 37583
diff changeset
  1770
                descriptor = (ObjectStreamClass) readHandle(unshared);
0cc00d7a0755 8144430: Improve JMX connections
sjiang
parents: 37583
diff changeset
  1771
                break;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1772
            case TC_PROXYCLASSDESC:
37584
0cc00d7a0755 8144430: Improve JMX connections
sjiang
parents: 37583
diff changeset
  1773
                descriptor = readProxyDesc(unshared);
0cc00d7a0755 8144430: Improve JMX connections
sjiang
parents: 37583
diff changeset
  1774
                break;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1775
            case TC_CLASSDESC:
37584
0cc00d7a0755 8144430: Improve JMX connections
sjiang
parents: 37583
diff changeset
  1776
                descriptor = readNonProxyDesc(unshared);
0cc00d7a0755 8144430: Improve JMX connections
sjiang
parents: 37583
diff changeset
  1777
                break;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1778
            default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1779
                throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1780
                    String.format("invalid type code: %02X", tc));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1781
        }
37584
0cc00d7a0755 8144430: Improve JMX connections
sjiang
parents: 37583
diff changeset
  1782
        return descriptor;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1783
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1784
16873
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1785
    private boolean isCustomSubclass() {
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1786
        // Return true if this class is a custom subclass of ObjectInputStream
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1787
        return getClass().getClassLoader()
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1788
                    != ObjectInputStream.class.getClassLoader();
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1789
    }
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1790
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1791
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1792
     * Reads in and returns class descriptor for a dynamic proxy class.  Sets
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1793
     * passHandle to proxy class descriptor's assigned handle.  If proxy class
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1794
     * descriptor cannot be resolved to a class in the local VM, a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1795
     * ClassNotFoundException is associated with the descriptor's handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1796
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1797
    private ObjectStreamClass readProxyDesc(boolean unshared)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1798
        throws IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1799
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1800
        if (bin.readByte() != TC_PROXYCLASSDESC) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1801
            throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1802
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1803
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1804
        ObjectStreamClass desc = new ObjectStreamClass();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1805
        int descHandle = handles.assign(unshared ? unsharedMarker : desc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1806
        passHandle = NULL_HANDLE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1807
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1808
        int numIfaces = bin.readInt();
47415
354a527f3246 8181597: Process Proxy presentation
rriggs
parents: 47216
diff changeset
  1809
        if (numIfaces > 65535) {
354a527f3246 8181597: Process Proxy presentation
rriggs
parents: 47216
diff changeset
  1810
            throw new InvalidObjectException("interface limit exceeded: "
354a527f3246 8181597: Process Proxy presentation
rriggs
parents: 47216
diff changeset
  1811
                    + numIfaces);
354a527f3246 8181597: Process Proxy presentation
rriggs
parents: 47216
diff changeset
  1812
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1813
        String[] ifaces = new String[numIfaces];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1814
        for (int i = 0; i < numIfaces; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1815
            ifaces[i] = bin.readUTF();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1816
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1817
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  1818
        Class<?> cl = null;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1819
        ClassNotFoundException resolveEx = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1820
        bin.setBlockDataMode(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1821
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1822
            if ((cl = resolveProxyClass(ifaces)) == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1823
                resolveEx = new ClassNotFoundException("null class");
16873
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1824
            } else if (!Proxy.isProxyClass(cl)) {
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1825
                throw new InvalidClassException("Not a proxy");
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1826
            } else {
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1827
                // ReflectUtil.checkProxyPackageAccess makes a test
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1828
                // equivalent to isCustomSubclass so there's no need
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1829
                // to condition this call to isCustomSubclass == true here.
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1830
                ReflectUtil.checkProxyPackageAccess(
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1831
                        getClass().getClassLoader(),
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1832
                        cl.getInterfaces());
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1833
                // Filter the interfaces
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1834
                for (Class<?> clazz : cl.getInterfaces()) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1835
                    filterCheck(clazz, -1);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1836
                }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1837
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1838
        } catch (ClassNotFoundException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1839
            resolveEx = ex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1840
        }
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1841
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1842
        // Call filterCheck on the class before reading anything else
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1843
        filterCheck(cl, -1);
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1844
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1845
        skipCustomData();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1846
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1847
        try {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1848
            totalObjectRefs++;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1849
            depth++;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1850
            desc.initProxy(cl, resolveEx, readClassDesc(false));
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1851
        } finally {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1852
            depth--;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1853
        }
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1854
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1855
        handles.finish(descHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1856
        passHandle = descHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1857
        return desc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1858
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1859
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1860
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1861
     * Reads in and returns class descriptor for a class that is not a dynamic
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1862
     * proxy class.  Sets passHandle to class descriptor's assigned handle.  If
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1863
     * class descriptor cannot be resolved to a class in the local VM, a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1864
     * ClassNotFoundException is associated with the descriptor's handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1865
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1866
    private ObjectStreamClass readNonProxyDesc(boolean unshared)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1867
        throws IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1868
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1869
        if (bin.readByte() != TC_CLASSDESC) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1870
            throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1871
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1872
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1873
        ObjectStreamClass desc = new ObjectStreamClass();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1874
        int descHandle = handles.assign(unshared ? unsharedMarker : desc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1875
        passHandle = NULL_HANDLE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1876
22936
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  1877
        ObjectStreamClass readDesc;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1878
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1879
            readDesc = readClassDescriptor();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1880
        } catch (ClassNotFoundException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1881
            throw (IOException) new InvalidClassException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1882
                "failed to read class descriptor").initCause(ex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1883
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1884
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  1885
        Class<?> cl = null;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1886
        ClassNotFoundException resolveEx = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1887
        bin.setBlockDataMode(true);
16873
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1888
        final boolean checksRequired = isCustomSubclass();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1889
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1890
            if ((cl = resolveClass(readDesc)) == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1891
                resolveEx = new ClassNotFoundException("null class");
16873
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1892
            } else if (checksRequired) {
fb95bea093ea 8001322: Refactor deserialization
dfuchs
parents: 16100
diff changeset
  1893
                ReflectUtil.checkPackageAccess(cl);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1894
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1895
        } catch (ClassNotFoundException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1896
            resolveEx = ex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1897
        }
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1898
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1899
        // Call filterCheck on the class before reading anything else
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1900
        filterCheck(cl, -1);
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1901
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1902
        skipCustomData();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1903
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1904
        try {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1905
            totalObjectRefs++;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1906
            depth++;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1907
            desc.initNonProxy(readDesc, cl, resolveEx, readClassDesc(false));
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1908
        } finally {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1909
            depth--;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 44261
diff changeset
  1910
        }
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1911
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1912
        handles.finish(descHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1913
        passHandle = descHandle;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1914
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1915
        return desc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1916
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1917
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1918
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1919
     * Reads in and returns new string.  Sets passHandle to new string's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1920
     * assigned handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1921
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1922
    private String readString(boolean unshared) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1923
        String str;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1924
        byte tc = bin.readByte();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1925
        switch (tc) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1926
            case TC_STRING:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1927
                str = bin.readUTF();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1928
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1929
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1930
            case TC_LONGSTRING:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1931
                str = bin.readLongUTF();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1932
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1933
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1934
            default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1935
                throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1936
                    String.format("invalid type code: %02X", tc));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1937
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1938
        passHandle = handles.assign(unshared ? unsharedMarker : str);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1939
        handles.finish(passHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1940
        return str;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1941
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1942
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1943
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1944
     * Reads in and returns array object, or null if array class is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1945
     * unresolvable.  Sets passHandle to array's assigned handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1946
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1947
    private Object readArray(boolean unshared) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1948
        if (bin.readByte() != TC_ARRAY) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1949
            throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1950
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1951
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1952
        ObjectStreamClass desc = readClassDesc(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1953
        int len = bin.readInt();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1954
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1955
        filterCheck(desc.forClass(), len);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  1956
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1957
        Object array = null;
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  1958
        Class<?> cl, ccl = null;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1959
        if ((cl = desc.forClass()) != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1960
            ccl = cl.getComponentType();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1961
            array = Array.newInstance(ccl, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1962
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1963
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1964
        int arrayHandle = handles.assign(unshared ? unsharedMarker : array);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1965
        ClassNotFoundException resolveEx = desc.getResolveException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1966
        if (resolveEx != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1967
            handles.markException(arrayHandle, resolveEx);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1968
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1969
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1970
        if (ccl == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1971
            for (int i = 0; i < len; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1972
                readObject0(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1973
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1974
        } else if (ccl.isPrimitive()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1975
            if (ccl == Integer.TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1976
                bin.readInts((int[]) array, 0, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1977
            } else if (ccl == Byte.TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1978
                bin.readFully((byte[]) array, 0, len, true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1979
            } else if (ccl == Long.TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1980
                bin.readLongs((long[]) array, 0, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1981
            } else if (ccl == Float.TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1982
                bin.readFloats((float[]) array, 0, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1983
            } else if (ccl == Double.TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1984
                bin.readDoubles((double[]) array, 0, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1985
            } else if (ccl == Short.TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1986
                bin.readShorts((short[]) array, 0, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1987
            } else if (ccl == Character.TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1988
                bin.readChars((char[]) array, 0, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1989
            } else if (ccl == Boolean.TYPE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1990
                bin.readBooleans((boolean[]) array, 0, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1991
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1992
                throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1993
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1994
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1995
            Object[] oa = (Object[]) array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1996
            for (int i = 0; i < len; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1997
                oa[i] = readObject0(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1998
                handles.markDependency(arrayHandle, passHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1999
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2000
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2001
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2002
        handles.finish(arrayHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2003
        passHandle = arrayHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2004
        return array;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2005
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2006
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2007
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2008
     * Reads in and returns enum constant, or null if enum type is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2009
     * unresolvable.  Sets passHandle to enum constant's assigned handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2010
     */
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  2011
    private Enum<?> readEnum(boolean unshared) throws IOException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2012
        if (bin.readByte() != TC_ENUM) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2013
            throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2014
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2015
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2016
        ObjectStreamClass desc = readClassDesc(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2017
        if (!desc.isEnum()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2018
            throw new InvalidClassException("non-enum class: " + desc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2019
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2020
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2021
        int enumHandle = handles.assign(unshared ? unsharedMarker : null);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2022
        ClassNotFoundException resolveEx = desc.getResolveException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2023
        if (resolveEx != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2024
            handles.markException(enumHandle, resolveEx);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2025
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2026
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2027
        String name = readString(false);
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  2028
        Enum<?> result = null;
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  2029
        Class<?> cl = desc.forClass();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2030
        if (cl != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2031
            try {
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  2032
                @SuppressWarnings("unchecked")
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  2033
                Enum<?> en = Enum.valueOf((Class)cl, name);
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  2034
                result = en;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2035
            } catch (IllegalArgumentException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2036
                throw (IOException) new InvalidObjectException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2037
                    "enum constant " + name + " does not exist in " +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2038
                    cl).initCause(ex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2039
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2040
            if (!unshared) {
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  2041
                handles.setObject(enumHandle, result);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2042
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2043
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2044
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2045
        handles.finish(enumHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2046
        passHandle = enumHandle;
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  2047
        return result;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2048
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2049
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2050
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2051
     * Reads and returns "ordinary" (i.e., not a String, Class,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2052
     * ObjectStreamClass, array, or enum constant) object, or null if object's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2053
     * class is unresolvable (in which case a ClassNotFoundException will be
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2054
     * associated with object's handle).  Sets passHandle to object's assigned
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2055
     * handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2056
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2057
    private Object readOrdinaryObject(boolean unshared)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2058
        throws IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2059
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2060
        if (bin.readByte() != TC_OBJECT) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2061
            throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2062
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2063
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2064
        ObjectStreamClass desc = readClassDesc(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2065
        desc.checkDeserialize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2066
16090
633bc7653c3b 7201070: Serialization to conform to protocol
smarks
parents: 11117
diff changeset
  2067
        Class<?> cl = desc.forClass();
633bc7653c3b 7201070: Serialization to conform to protocol
smarks
parents: 11117
diff changeset
  2068
        if (cl == String.class || cl == Class.class
633bc7653c3b 7201070: Serialization to conform to protocol
smarks
parents: 11117
diff changeset
  2069
                || cl == ObjectStreamClass.class) {
633bc7653c3b 7201070: Serialization to conform to protocol
smarks
parents: 11117
diff changeset
  2070
            throw new InvalidClassException("invalid class descriptor");
633bc7653c3b 7201070: Serialization to conform to protocol
smarks
parents: 11117
diff changeset
  2071
        }
633bc7653c3b 7201070: Serialization to conform to protocol
smarks
parents: 11117
diff changeset
  2072
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2073
        Object obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2074
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2075
            obj = desc.isInstantiable() ? desc.newInstance() : null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2076
        } catch (Exception ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2077
            throw (IOException) new InvalidClassException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2078
                desc.forClass().getName(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2079
                "unable to create instance").initCause(ex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2080
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2081
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2082
        passHandle = handles.assign(unshared ? unsharedMarker : obj);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2083
        ClassNotFoundException resolveEx = desc.getResolveException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2084
        if (resolveEx != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2085
            handles.markException(passHandle, resolveEx);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2086
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2087
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2088
        if (desc.isExternalizable()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2089
            readExternalData((Externalizable) obj, desc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2090
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2091
            readSerialData(obj, desc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2092
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2093
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2094
        handles.finish(passHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2095
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2096
        if (obj != null &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2097
            handles.lookupException(passHandle) == null &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2098
            desc.hasReadResolveMethod())
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2099
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2100
            Object rep = desc.invokeReadResolve(obj);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2101
            if (unshared && rep.getClass().isArray()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2102
                rep = cloneArray(rep);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2103
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2104
            if (rep != obj) {
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2105
                // Filter the replacement object
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2106
                if (rep != null) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2107
                    if (rep.getClass().isArray()) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2108
                        filterCheck(rep.getClass(), Array.getLength(rep));
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2109
                    } else {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2110
                        filterCheck(rep.getClass(), -1);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2111
                    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2112
                }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2113
                handles.setObject(passHandle, obj = rep);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2114
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2115
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2116
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2117
        return obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2118
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2119
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2120
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2121
     * If obj is non-null, reads externalizable data by invoking readExternal()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2122
     * method of obj; otherwise, attempts to skip over externalizable data.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2123
     * Expects that passHandle is set to obj's handle before this method is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2124
     * called.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2125
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2126
    private void readExternalData(Externalizable obj, ObjectStreamClass desc)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2127
        throws IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2128
    {
7030
90cf66131063 6559775: Race allows defaultReadObject to be invoked instead of readFields during deserialization
skoppar
parents: 5506
diff changeset
  2129
        SerialCallbackContext oldContext = curContext;
31709
885627926ab1 8076405: Improve serial serialization
chegar
parents: 31708
diff changeset
  2130
        if (oldContext != null)
885627926ab1 8076405: Improve serial serialization
chegar
parents: 31708
diff changeset
  2131
            oldContext.check();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2132
        curContext = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2133
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2134
            boolean blocked = desc.hasBlockExternalData();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2135
            if (blocked) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2136
                bin.setBlockDataMode(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2137
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2138
            if (obj != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2139
                try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2140
                    obj.readExternal(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2141
                } catch (ClassNotFoundException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2142
                    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2143
                     * In most cases, the handle table has already propagated
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2144
                     * a CNFException to passHandle at this point; this mark
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2145
                     * call is included to address cases where the readExternal
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2146
                     * method has cons'ed and thrown a new CNFException of its
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2147
                     * own.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2148
                     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2149
                     handles.markException(passHandle, ex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2150
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2151
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2152
            if (blocked) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2153
                skipCustomData();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2154
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2155
        } finally {
31709
885627926ab1 8076405: Improve serial serialization
chegar
parents: 31708
diff changeset
  2156
            if (oldContext != null)
885627926ab1 8076405: Improve serial serialization
chegar
parents: 31708
diff changeset
  2157
                oldContext.check();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2158
            curContext = oldContext;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2159
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2160
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2161
         * At this point, if the externalizable data was not written in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2162
         * block-data form and either the externalizable class doesn't exist
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2163
         * locally (i.e., obj == null) or readExternal() just threw a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2164
         * CNFException, then the stream is probably in an inconsistent state,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2165
         * since some (or all) of the externalizable data may not have been
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2166
         * consumed.  Since there's no "correct" action to take in this case,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2167
         * we mimic the behavior of past serialization implementations and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2168
         * blindly hope that the stream is in sync; if it isn't and additional
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2169
         * externalizable data remains in the stream, a subsequent read will
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2170
         * most likely throw a StreamCorruptedException.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2171
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2172
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2173
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2174
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2175
     * Reads (or attempts to skip, if obj is null or is tagged with a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2176
     * ClassNotFoundException) instance data for each serializable class of
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2177
     * object in stream, from superclass to subclass.  Expects that passHandle
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2178
     * is set to obj's handle before this method is called.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2179
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2180
    private void readSerialData(Object obj, ObjectStreamClass desc)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2181
        throws IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2182
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2183
        ObjectStreamClass.ClassDataSlot[] slots = desc.getClassDataLayout();
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2184
        // Best effort Failure Atomicity; slotValues will be non-null if field
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2185
        // values can be set after reading all field data in the hierarchy.
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2186
        // Field values can only be set after reading all data if there are no
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2187
        // user observable methods in the hierarchy, readObject(NoData). The
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2188
        // top most Serializable class in the hierarchy can be skipped.
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2189
        FieldValues[] slotValues = null;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2190
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2191
        boolean hasSpecialReadMethod = false;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2192
        for (int i = 1; i < slots.length; i++) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2193
            ObjectStreamClass slotDesc = slots[i].desc;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2194
            if (slotDesc.hasReadObjectMethod()
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2195
                  || slotDesc.hasReadObjectNoDataMethod()) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2196
                hasSpecialReadMethod = true;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2197
                break;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2198
            }
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2199
        }
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2200
        // No special read methods, can store values and defer setting.
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2201
        if (!hasSpecialReadMethod)
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2202
            slotValues = new FieldValues[slots.length];
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2203
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2204
        for (int i = 0; i < slots.length; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2205
            ObjectStreamClass slotDesc = slots[i].desc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2206
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2207
            if (slots[i].hasData) {
31708
702a66d7e231 8076401: Serialize OIS data
chegar
parents: 30911
diff changeset
  2208
                if (obj == null || handles.lookupException(passHandle) != null) {
702a66d7e231 8076401: Serialize OIS data
chegar
parents: 30911
diff changeset
  2209
                    defaultReadFields(null, slotDesc); // skip field values
702a66d7e231 8076401: Serialize OIS data
chegar
parents: 30911
diff changeset
  2210
                } else if (slotDesc.hasReadObjectMethod()) {
37583
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2211
                    ThreadDeath t = null;
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2212
                    boolean reset = false;
7030
90cf66131063 6559775: Race allows defaultReadObject to be invoked instead of readFields during deserialization
skoppar
parents: 5506
diff changeset
  2213
                    SerialCallbackContext oldContext = curContext;
31709
885627926ab1 8076405: Improve serial serialization
chegar
parents: 31708
diff changeset
  2214
                    if (oldContext != null)
885627926ab1 8076405: Improve serial serialization
chegar
parents: 31708
diff changeset
  2215
                        oldContext.check();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2216
                    try {
7030
90cf66131063 6559775: Race allows defaultReadObject to be invoked instead of readFields during deserialization
skoppar
parents: 5506
diff changeset
  2217
                        curContext = new SerialCallbackContext(obj, slotDesc);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2218
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2219
                        bin.setBlockDataMode(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2220
                        slotDesc.invokeReadObject(obj, this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2221
                    } catch (ClassNotFoundException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2222
                        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2223
                         * In most cases, the handle table has already
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2224
                         * propagated a CNFException to passHandle at this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2225
                         * point; this mark call is included to address cases
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2226
                         * where the custom readObject method has cons'ed and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2227
                         * thrown a new CNFException of its own.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2228
                         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2229
                        handles.markException(passHandle, ex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2230
                    } finally {
37583
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2231
                        do {
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2232
                            try {
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2233
                                curContext.setUsed();
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2234
                                if (oldContext!= null)
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2235
                                    oldContext.check();
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2236
                                curContext = oldContext;
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2237
                                reset = true;
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2238
                            } catch (ThreadDeath x) {
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2239
                                t = x;  // defer until reset is true
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2240
                            }
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2241
                        } while (!reset);
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2242
                        if (t != null)
60553c2df76e 8129952: Ensure thread consistency
chegar
parents: 36659
diff changeset
  2243
                            throw t;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2244
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2245
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2246
                    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2247
                     * defaultDataEnd may have been set indirectly by custom
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2248
                     * readObject() method when calling defaultReadObject() or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2249
                     * readFields(); clear it to restore normal read behavior.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2250
                     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2251
                    defaultDataEnd = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2252
                } else {
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2253
                    FieldValues vals = defaultReadFields(obj, slotDesc);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2254
                    if (slotValues != null) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2255
                        slotValues[i] = vals;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2256
                    } else if (obj != null) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2257
                        defaultCheckFieldValues(obj, slotDesc, vals);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2258
                        defaultSetFieldValues(obj, slotDesc, vals);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2259
                    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2260
                }
31708
702a66d7e231 8076401: Serialize OIS data
chegar
parents: 30911
diff changeset
  2261
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2262
                if (slotDesc.hasWriteObjectData()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2263
                    skipCustomData();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2264
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2265
                    bin.setBlockDataMode(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2266
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2267
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2268
                if (obj != null &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2269
                    slotDesc.hasReadObjectNoDataMethod() &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2270
                    handles.lookupException(passHandle) == null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2271
                {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2272
                    slotDesc.invokeReadObjectNoData(obj);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2273
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2274
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2275
        }
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2276
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2277
        if (obj != null && slotValues != null) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2278
            // Check that the non-primitive types are assignable for all slots
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2279
            // before assigning.
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2280
            for (int i = 0; i < slots.length; i++) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2281
                if (slotValues[i] != null)
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2282
                    defaultCheckFieldValues(obj, slots[i].desc, slotValues[i]);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2283
            }
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2284
            for (int i = 0; i < slots.length; i++) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2285
                if (slotValues[i] != null)
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2286
                    defaultSetFieldValues(obj, slots[i].desc, slotValues[i]);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2287
            }
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2288
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2289
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2290
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2291
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2292
     * Skips over all block data and objects until TC_ENDBLOCKDATA is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2293
     * encountered.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2294
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2295
    private void skipCustomData() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2296
        int oldHandle = passHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2297
        for (;;) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2298
            if (bin.getBlockDataMode()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2299
                bin.skipBlockData();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2300
                bin.setBlockDataMode(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2301
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2302
            switch (bin.peekByte()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2303
                case TC_BLOCKDATA:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2304
                case TC_BLOCKDATALONG:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2305
                    bin.setBlockDataMode(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2306
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2307
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2308
                case TC_ENDBLOCKDATA:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2309
                    bin.readByte();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2310
                    passHandle = oldHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2311
                    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2312
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2313
                default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2314
                    readObject0(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2315
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2316
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2317
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2318
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2319
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2320
    private class FieldValues {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2321
        final byte[] primValues;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2322
        final Object[] objValues;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2323
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2324
        FieldValues(byte[] primValues, Object[] objValues) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2325
            this.primValues = primValues;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2326
            this.objValues = objValues;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2327
        }
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2328
    }
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2329
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2330
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2331
     * Reads in values of serializable fields declared by given class
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2332
     * descriptor. Expects that passHandle is set to obj's handle before this
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2333
     * method is called.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2334
     */
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2335
    private FieldValues defaultReadFields(Object obj, ObjectStreamClass desc)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2336
        throws IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2337
    {
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  2338
        Class<?> cl = desc.forClass();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2339
        if (cl != null && obj != null && !cl.isInstance(obj)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2340
            throw new ClassCastException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2341
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2342
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2343
        byte[] primVals = null;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2344
        int primDataSize = desc.getPrimDataSize();
22936
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2345
        if (primDataSize > 0) {
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2346
            primVals = new byte[primDataSize];
22936
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2347
            bin.readFully(primVals, 0, primDataSize, false);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2348
        }
22936
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2349
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2350
        Object[] objVals = null;
22936
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2351
        int numObjFields = desc.getNumObjFields();
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2352
        if (numObjFields > 0) {
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2353
            int objHandle = passHandle;
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2354
            ObjectStreamField[] fields = desc.getFields(false);
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2355
            objVals = new Object[numObjFields];
22936
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2356
            int numPrimFields = fields.length - objVals.length;
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2357
            for (int i = 0; i < objVals.length; i++) {
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2358
                ObjectStreamField f = fields[numPrimFields + i];
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2359
                objVals[i] = readObject0(f.isUnshared());
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2360
                if (f.getField() != null) {
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2361
                    handles.markDependency(objHandle, passHandle);
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2362
                }
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2363
            }
1263cd9144d7 8033778: ObjectIn/OutputStream improvements
chegar
parents: 21334
diff changeset
  2364
            passHandle = objHandle;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2365
        }
30911
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2366
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2367
        return new FieldValues(primVals, objVals);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2368
    }
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2369
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2370
    /** Throws ClassCastException if any value is not assignable. */
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2371
    private void defaultCheckFieldValues(Object obj, ObjectStreamClass desc,
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2372
                                         FieldValues values) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2373
        Object[] objectValues = values.objValues;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2374
        if (objectValues != null)
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2375
            desc.checkObjFieldValueTypes(obj, objectValues);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2376
    }
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2377
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2378
    /** Sets field values in obj. */
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2379
    private void defaultSetFieldValues(Object obj, ObjectStreamClass desc,
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2380
                                       FieldValues values) {
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2381
        byte[] primValues = values.primValues;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2382
        Object[] objectValues = values.objValues;
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2383
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2384
        if (primValues != null)
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2385
            desc.setPrimFieldValues(obj, primValues);
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2386
        if (objectValues != null)
99e027461f4a 8071474: Better failure atomicity for default read object
chegar
parents: 29986
diff changeset
  2387
            desc.setObjFieldValues(obj, objectValues);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2388
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2389
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2390
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2391
     * Reads in and returns IOException that caused serialization to abort.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2392
     * All stream state is discarded prior to reading in fatal exception.  Sets
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2393
     * passHandle to fatal exception's handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2394
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2395
    private IOException readFatalException() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2396
        if (bin.readByte() != TC_EXCEPTION) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2397
            throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2398
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2399
        clear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2400
        return (IOException) readObject0(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2401
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2402
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2403
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2404
     * If recursion depth is 0, clears internal data structures; otherwise,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2405
     * throws a StreamCorruptedException.  This method is called when a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2406
     * TC_RESET typecode is encountered.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2407
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2408
    private void handleReset() throws StreamCorruptedException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2409
        if (depth > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2410
            throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2411
                "unexpected reset; recursion depth: " + depth);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2412
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2413
        clear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2414
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2415
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2416
    /**
42440
ec843594bcc6 8169653: Restore ObjectInputStream::resolveClass call stack default search order
chegar
parents: 41230
diff changeset
  2417
     * Returns the first non-null and non-platform class loader (not counting
ec843594bcc6 8169653: Restore ObjectInputStream::resolveClass call stack default search order
chegar
parents: 41230
diff changeset
  2418
     * class loaders of generated reflection implementation classes) up the
ec843594bcc6 8169653: Restore ObjectInputStream::resolveClass call stack default search order
chegar
parents: 41230
diff changeset
  2419
     * execution stack, or the platform class loader if only code from the
ec843594bcc6 8169653: Restore ObjectInputStream::resolveClass call stack default search order
chegar
parents: 41230
diff changeset
  2420
     * bootstrap and platform class loader is on the stack.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2421
     */
10797
f51518b30c84 7104209: Cleanup and remove librmi (native library)
chegar
parents: 7803
diff changeset
  2422
    private static ClassLoader latestUserDefinedLoader() {
34882
ce2a8ec851c1 8145544: Move sun.misc.VM to jdk.internal.misc
chegar
parents: 33674
diff changeset
  2423
        return jdk.internal.misc.VM.latestUserDefinedLoader();
10797
f51518b30c84 7104209: Cleanup and remove librmi (native library)
chegar
parents: 7803
diff changeset
  2424
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2425
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2426
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2427
     * Default GetField implementation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2428
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2429
    private class GetFieldImpl extends GetField {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2430
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2431
        /** class descriptor describing serializable fields */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2432
        private final ObjectStreamClass desc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2433
        /** primitive field values */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2434
        private final byte[] primVals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2435
        /** object field values */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2436
        private final Object[] objVals;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2437
        /** object field value handles */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2438
        private final int[] objHandles;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2439
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2440
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2441
         * Creates GetFieldImpl object for reading fields defined in given
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2442
         * class descriptor.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2443
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2444
        GetFieldImpl(ObjectStreamClass desc) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2445
            this.desc = desc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2446
            primVals = new byte[desc.getPrimDataSize()];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2447
            objVals = new Object[desc.getNumObjFields()];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2448
            objHandles = new int[objVals.length];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2449
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2450
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2451
        public ObjectStreamClass getObjectStreamClass() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2452
            return desc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2453
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2454
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2455
        public boolean defaulted(String name) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2456
            return (getFieldOffset(name, null) < 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2457
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2458
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2459
        public boolean get(String name, boolean val) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2460
            int off = getFieldOffset(name, Boolean.TYPE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2461
            return (off >= 0) ? Bits.getBoolean(primVals, off) : val;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2462
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2463
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2464
        public byte get(String name, byte val) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2465
            int off = getFieldOffset(name, Byte.TYPE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2466
            return (off >= 0) ? primVals[off] : val;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2467
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2468
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2469
        public char get(String name, char val) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2470
            int off = getFieldOffset(name, Character.TYPE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2471
            return (off >= 0) ? Bits.getChar(primVals, off) : val;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2472
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2473
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2474
        public short get(String name, short val) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2475
            int off = getFieldOffset(name, Short.TYPE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2476
            return (off >= 0) ? Bits.getShort(primVals, off) : val;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2477
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2478
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2479
        public int get(String name, int val) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2480
            int off = getFieldOffset(name, Integer.TYPE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2481
            return (off >= 0) ? Bits.getInt(primVals, off) : val;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2482
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2483
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2484
        public float get(String name, float val) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2485
            int off = getFieldOffset(name, Float.TYPE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2486
            return (off >= 0) ? Bits.getFloat(primVals, off) : val;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2487
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2488
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2489
        public long get(String name, long val) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2490
            int off = getFieldOffset(name, Long.TYPE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2491
            return (off >= 0) ? Bits.getLong(primVals, off) : val;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2492
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2493
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2494
        public double get(String name, double val) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2495
            int off = getFieldOffset(name, Double.TYPE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2496
            return (off >= 0) ? Bits.getDouble(primVals, off) : val;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2497
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2498
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2499
        public Object get(String name, Object val) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2500
            int off = getFieldOffset(name, Object.class);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2501
            if (off >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2502
                int objHandle = objHandles[off];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2503
                handles.markDependency(passHandle, objHandle);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2504
                return (handles.lookupException(objHandle) == null) ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2505
                    objVals[off] : null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2506
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2507
                return val;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2508
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2509
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2510
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2511
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2512
         * Reads primitive and object field values from stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2513
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2514
        void readFields() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2515
            bin.readFully(primVals, 0, primVals.length, false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2516
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2517
            int oldHandle = passHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2518
            ObjectStreamField[] fields = desc.getFields(false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2519
            int numPrimFields = fields.length - objVals.length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2520
            for (int i = 0; i < objVals.length; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2521
                objVals[i] =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2522
                    readObject0(fields[numPrimFields + i].isUnshared());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2523
                objHandles[i] = passHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2524
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2525
            passHandle = oldHandle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2526
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2527
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2528
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2529
         * Returns offset of field with given name and type.  A specified type
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2530
         * of null matches all types, Object.class matches all non-primitive
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2531
         * types, and any other non-null type matches assignable types only.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2532
         * If no matching field is found in the (incoming) class
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2533
         * descriptor but a matching field is present in the associated local
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2534
         * class descriptor, returns -1.  Throws IllegalArgumentException if
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2535
         * neither incoming nor local class descriptor contains a match.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2536
         */
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  2537
        private int getFieldOffset(String name, Class<?> type) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2538
            ObjectStreamField field = desc.getField(name, type);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2539
            if (field != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2540
                return field.getOffset();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2541
            } else if (desc.getLocalDesc().getField(name, type) != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2542
                return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2543
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2544
                throw new IllegalArgumentException("no such field " + name +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2545
                                                   " with type " + type);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2546
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2547
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2548
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2549
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2550
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2551
     * Prioritized list of callbacks to be performed once object graph has been
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2552
     * completely deserialized.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2553
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2554
    private static class ValidationList {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2555
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2556
        private static class Callback {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2557
            final ObjectInputValidation obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2558
            final int priority;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2559
            Callback next;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2560
            final AccessControlContext acc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2561
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2562
            Callback(ObjectInputValidation obj, int priority, Callback next,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2563
                AccessControlContext acc)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2564
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2565
                this.obj = obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2566
                this.priority = priority;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2567
                this.next = next;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2568
                this.acc = acc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2569
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2570
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2571
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2572
        /** linked list of callbacks */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2573
        private Callback list;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2574
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2575
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2576
         * Creates new (empty) ValidationList.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2577
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2578
        ValidationList() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2579
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2580
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2581
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2582
         * Registers callback.  Throws InvalidObjectException if callback
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2583
         * object is null.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2584
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2585
        void register(ObjectInputValidation obj, int priority)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2586
            throws InvalidObjectException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2587
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2588
            if (obj == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2589
                throw new InvalidObjectException("null callback");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2590
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2591
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2592
            Callback prev = null, cur = list;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2593
            while (cur != null && priority < cur.priority) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2594
                prev = cur;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2595
                cur = cur.next;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2596
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2597
            AccessControlContext acc = AccessController.getContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2598
            if (prev != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2599
                prev.next = new Callback(obj, priority, cur, acc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2600
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2601
                list = new Callback(obj, priority, list, acc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2602
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2603
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2604
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2605
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2606
         * Invokes all registered callbacks and clears the callback list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2607
         * Callbacks with higher priorities are called first; those with equal
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2608
         * priorities may be called in any order.  If any of the callbacks
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2609
         * throws an InvalidObjectException, the callback process is terminated
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2610
         * and the exception propagated upwards.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2611
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2612
        void doCallbacks() throws InvalidObjectException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2613
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2614
                while (list != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2615
                    AccessController.doPrivileged(
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2616
                        new PrivilegedExceptionAction<Void>()
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2617
                    {
51
6fe31bc95bbc 6600143: Remove another 450 unnecessary casts
martin
parents: 2
diff changeset
  2618
                        public Void run() throws InvalidObjectException {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2619
                            list.obj.validateObject();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2620
                            return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2621
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2622
                    }, list.acc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2623
                    list = list.next;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2624
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2625
            } catch (PrivilegedActionException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2626
                list = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2627
                throw (InvalidObjectException) ex.getException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2628
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2629
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2630
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2631
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2632
         * Resets the callback list to its initial (empty) state.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2633
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2634
        public void clear() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2635
            list = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2636
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2637
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2638
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2639
    /**
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2640
     * Hold a snapshot of values to be passed to an ObjectInputFilter.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2641
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2642
    static class FilterValues implements ObjectInputFilter.FilterInfo {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2643
        final Class<?> clazz;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2644
        final long arrayLength;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2645
        final long totalObjectRefs;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2646
        final long depth;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2647
        final long streamBytes;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2648
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2649
        public FilterValues(Class<?> clazz, long arrayLength, long totalObjectRefs,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2650
                            long depth, long streamBytes) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2651
            this.clazz = clazz;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2652
            this.arrayLength = arrayLength;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2653
            this.totalObjectRefs = totalObjectRefs;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2654
            this.depth = depth;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2655
            this.streamBytes = streamBytes;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2656
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2657
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2658
        @Override
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2659
        public Class<?> serialClass() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2660
            return clazz;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2661
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2662
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2663
        @Override
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2664
        public long arrayLength() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2665
            return arrayLength;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2666
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2667
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2668
        @Override
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2669
        public long references() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2670
            return totalObjectRefs;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2671
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2672
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2673
        @Override
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2674
        public long depth() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2675
            return depth;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2676
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2677
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2678
        @Override
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2679
        public long streamBytes() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2680
            return streamBytes;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2681
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2682
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2683
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2684
    /**
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2685
     * Input stream supporting single-byte peek operations.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2686
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2687
    private static class PeekInputStream extends InputStream {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2688
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2689
        /** underlying stream */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2690
        private final InputStream in;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2691
        /** peeked byte */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2692
        private int peekb = -1;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2693
        /** total bytes read from the stream */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2694
        private long totalBytesRead = 0;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2695
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2696
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2697
         * Creates new PeekInputStream on top of given underlying stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2698
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2699
        PeekInputStream(InputStream in) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2700
            this.in = in;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2701
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2702
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2703
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2704
         * Peeks at next byte value in stream.  Similar to read(), except
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2705
         * that it does not consume the read value.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2706
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2707
        int peek() throws IOException {
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2708
            if (peekb >= 0) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2709
                return peekb;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2710
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2711
            peekb = in.read();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2712
            totalBytesRead += peekb >= 0 ? 1 : 0;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2713
            return peekb;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2714
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2715
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2716
        public int read() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2717
            if (peekb >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2718
                int v = peekb;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2719
                peekb = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2720
                return v;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2721
            } else {
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2722
                int nbytes = in.read();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2723
                totalBytesRead += nbytes >= 0 ? 1 : 0;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2724
                return nbytes;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2725
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2726
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2727
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2728
        public int read(byte[] b, int off, int len) throws IOException {
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2729
            int nbytes;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2730
            if (len == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2731
                return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2732
            } else if (peekb < 0) {
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2733
                nbytes = in.read(b, off, len);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2734
                totalBytesRead += nbytes >= 0 ? nbytes : 0;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2735
                return nbytes;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2736
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2737
                b[off++] = (byte) peekb;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2738
                len--;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2739
                peekb = -1;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2740
                nbytes = in.read(b, off, len);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2741
                totalBytesRead += nbytes >= 0 ? nbytes : 0;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2742
                return (nbytes >= 0) ? (nbytes + 1) : 1;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2743
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2744
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2745
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2746
        void readFully(byte[] b, int off, int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2747
            int n = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2748
            while (n < len) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2749
                int count = read(b, off + n, len - n);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2750
                if (count < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2751
                    throw new EOFException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2752
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2753
                n += count;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2754
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2755
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2756
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2757
        public long skip(long n) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2758
            if (n <= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2759
                return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2760
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2761
            int skipped = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2762
            if (peekb >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2763
                peekb = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2764
                skipped++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2765
                n--;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2766
            }
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2767
            n = skipped + in.skip(n);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2768
            totalBytesRead += n;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2769
            return n;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2770
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2771
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2772
        public int available() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2773
            return in.available() + ((peekb >= 0) ? 1 : 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2774
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2775
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2776
        public void close() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2777
            in.close();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2778
        }
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2779
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2780
        public long getBytesRead() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2781
            return totalBytesRead;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  2782
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2783
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2784
29220
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2785
    private static final Unsafe UNSAFE = Unsafe.getUnsafe();
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2786
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2787
    /**
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2788
     * Performs a "freeze" action, required to adhere to final field semantics.
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2789
     *
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2790
     * <p> This method can be called unconditionally before returning the graph,
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2791
     * from the topmost readObject call, since it is expected that the
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2792
     * additional cost of the freeze action is negligible compared to
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2793
     * reconstituting even the most simple graph.
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2794
     *
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2795
     * <p> Nested calls to readObject do not issue freeze actions because the
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2796
     * sub-graph returned from a nested call is not guaranteed to be fully
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2797
     * initialized yet (possible cycles).
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2798
     */
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2799
    private void freeze() {
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2800
        // Issue a StoreStore|StoreLoad fence, which is at least sufficient
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2801
        // to provide final-freeze semantics.
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2802
        UNSAFE.storeFence();
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2803
    }
b07abc731618 8074022: Serialization should issue a freeze action after reconstituting a graph that contains objects with final fields
chegar
parents: 28116
diff changeset
  2804
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2805
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2806
     * Input stream with two modes: in default mode, inputs data written in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2807
     * same format as DataOutputStream; in "block data" mode, inputs data
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2808
     * bracketed by block data markers (see object serialization specification
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2809
     * for details).  Buffering depends on block data mode: when in default
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2810
     * mode, no data is buffered in advance; when in block data mode, all data
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2811
     * for the current data block is read in at once (and buffered).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2812
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2813
    private class BlockDataInputStream
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2814
        extends InputStream implements DataInput
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2815
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2816
        /** maximum data block length */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2817
        private static final int MAX_BLOCK_SIZE = 1024;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2818
        /** maximum data block header length */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2819
        private static final int MAX_HEADER_SIZE = 5;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2820
        /** (tunable) length of char buffer (for reading strings) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2821
        private static final int CHAR_BUF_SIZE = 256;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2822
        /** readBlockHeader() return value indicating header read may block */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2823
        private static final int HEADER_BLOCKED = -2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2824
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2825
        /** buffer for reading general/block data */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2826
        private final byte[] buf = new byte[MAX_BLOCK_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2827
        /** buffer for reading block data headers */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2828
        private final byte[] hbuf = new byte[MAX_HEADER_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2829
        /** char buffer for fast string reads */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2830
        private final char[] cbuf = new char[CHAR_BUF_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2831
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2832
        /** block data mode */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2833
        private boolean blkmode = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2834
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2835
        // block data state fields; values meaningful only when blkmode true
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2836
        /** current offset into buf */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2837
        private int pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2838
        /** end offset of valid data in buf, or -1 if no more block data */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2839
        private int end = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2840
        /** number of bytes in current block yet to be read from stream */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2841
        private int unread = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2842
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2843
        /** underlying stream (wrapped in peekable filter stream) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2844
        private final PeekInputStream in;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2845
        /** loopback stream (for data reads that span data blocks) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2846
        private final DataInputStream din;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2847
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2848
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2849
         * Creates new BlockDataInputStream on top of given underlying stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2850
         * Block data mode is turned off by default.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2851
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2852
        BlockDataInputStream(InputStream in) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2853
            this.in = new PeekInputStream(in);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2854
            din = new DataInputStream(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2855
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2856
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2857
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2858
         * Sets block data mode to the given mode (true == on, false == off)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2859
         * and returns the previous mode value.  If the new mode is the same as
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2860
         * the old mode, no action is taken.  Throws IllegalStateException if
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2861
         * block data mode is being switched from on to off while unconsumed
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2862
         * block data is still present in the stream.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2863
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2864
        boolean setBlockDataMode(boolean newmode) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2865
            if (blkmode == newmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2866
                return blkmode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2867
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2868
            if (newmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2869
                pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2870
                end = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2871
                unread = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2872
            } else if (pos < end) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2873
                throw new IllegalStateException("unread block data");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2874
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2875
            blkmode = newmode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2876
            return !blkmode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2877
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2878
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2879
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2880
         * Returns true if the stream is currently in block data mode, false
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2881
         * otherwise.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2882
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2883
        boolean getBlockDataMode() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2884
            return blkmode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2885
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2886
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2887
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2888
         * If in block data mode, skips to the end of the current group of data
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2889
         * blocks (but does not unset block data mode).  If not in block data
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2890
         * mode, throws an IllegalStateException.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2891
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2892
        void skipBlockData() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2893
            if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2894
                throw new IllegalStateException("not in block data mode");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2895
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2896
            while (end >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2897
                refill();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2898
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2899
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2900
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2901
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2902
         * Attempts to read in the next block data header (if any).  If
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2903
         * canBlock is false and a full header cannot be read without possibly
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2904
         * blocking, returns HEADER_BLOCKED, else if the next element in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2905
         * stream is a block data header, returns the block data length
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2906
         * specified by the header, else returns -1.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2907
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2908
        private int readBlockHeader(boolean canBlock) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2909
            if (defaultDataEnd) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2910
                /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2911
                 * Fix for 4360508: stream is currently at the end of a field
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2912
                 * value block written via default serialization; since there
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2913
                 * is no terminating TC_ENDBLOCKDATA tag, simulate
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2914
                 * end-of-custom-data behavior explicitly.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2915
                 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2916
                return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2917
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2918
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2919
                for (;;) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2920
                    int avail = canBlock ? Integer.MAX_VALUE : in.available();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2921
                    if (avail == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2922
                        return HEADER_BLOCKED;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2923
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2924
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2925
                    int tc = in.peek();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2926
                    switch (tc) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2927
                        case TC_BLOCKDATA:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2928
                            if (avail < 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2929
                                return HEADER_BLOCKED;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2930
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2931
                            in.readFully(hbuf, 0, 2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2932
                            return hbuf[1] & 0xFF;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2933
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2934
                        case TC_BLOCKDATALONG:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2935
                            if (avail < 5) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2936
                                return HEADER_BLOCKED;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2937
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2938
                            in.readFully(hbuf, 0, 5);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2939
                            int len = Bits.getInt(hbuf, 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2940
                            if (len < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2941
                                throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2942
                                    "illegal block data header length: " +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2943
                                    len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2944
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2945
                            return len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2946
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2947
                        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2948
                         * TC_RESETs may occur in between data blocks.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2949
                         * Unfortunately, this case must be parsed at a lower
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2950
                         * level than other typecodes, since primitive data
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2951
                         * reads may span data blocks separated by a TC_RESET.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2952
                         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2953
                        case TC_RESET:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2954
                            in.read();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2955
                            handleReset();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2956
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2957
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2958
                        default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2959
                            if (tc >= 0 && (tc < TC_BASE || tc > TC_MAX)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2960
                                throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2961
                                    String.format("invalid type code: %02X",
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2962
                                    tc));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2963
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2964
                            return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2965
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2966
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2967
            } catch (EOFException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2968
                throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2969
                    "unexpected EOF while reading block data header");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2970
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2971
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2972
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2973
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2974
         * Refills internal buffer buf with block data.  Any data in buf at the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2975
         * time of the call is considered consumed.  Sets the pos, end, and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2976
         * unread fields to reflect the new amount of available block data; if
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2977
         * the next element in the stream is not a data block, sets pos and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2978
         * unread to 0 and end to -1.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2979
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2980
        private void refill() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2981
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2982
                do {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2983
                    pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2984
                    if (unread > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2985
                        int n =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2986
                            in.read(buf, 0, Math.min(unread, MAX_BLOCK_SIZE));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2987
                        if (n >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2988
                            end = n;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2989
                            unread -= n;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2990
                        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2991
                            throw new StreamCorruptedException(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2992
                                "unexpected EOF in middle of data block");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2993
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2994
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2995
                        int n = readBlockHeader(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2996
                        if (n >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2997
                            end = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2998
                            unread = n;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2999
                        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3000
                            end = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3001
                            unread = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3002
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3003
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3004
                } while (pos == end);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3005
            } catch (IOException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3006
                pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3007
                end = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3008
                unread = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3009
                throw ex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3010
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3011
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3012
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3013
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3014
         * If in block data mode, returns the number of unconsumed bytes
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3015
         * remaining in the current data block.  If not in block data mode,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3016
         * throws an IllegalStateException.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3017
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3018
        int currentBlockRemaining() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3019
            if (blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3020
                return (end >= 0) ? (end - pos) + unread : 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3021
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3022
                throw new IllegalStateException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3023
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3024
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3025
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3026
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3027
         * Peeks at (but does not consume) and returns the next byte value in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3028
         * the stream, or -1 if the end of the stream/block data (if in block
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3029
         * data mode) has been reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3030
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3031
        int peek() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3032
            if (blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3033
                if (pos == end) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3034
                    refill();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3035
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3036
                return (end >= 0) ? (buf[pos] & 0xFF) : -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3037
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3038
                return in.peek();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3039
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3040
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3041
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3042
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3043
         * Peeks at (but does not consume) and returns the next byte value in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3044
         * the stream, or throws EOFException if end of stream/block data has
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3045
         * been reached.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3046
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3047
        byte peekByte() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3048
            int val = peek();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3049
            if (val < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3050
                throw new EOFException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3051
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3052
            return (byte) val;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3053
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3054
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3055
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3056
        /* ----------------- generic input stream methods ------------------ */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3057
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3058
         * The following methods are equivalent to their counterparts in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3059
         * InputStream, except that they interpret data block boundaries and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3060
         * read the requested data from within data blocks when in block data
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3061
         * mode.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3062
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3063
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3064
        public int read() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3065
            if (blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3066
                if (pos == end) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3067
                    refill();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3068
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3069
                return (end >= 0) ? (buf[pos++] & 0xFF) : -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3070
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3071
                return in.read();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3072
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3073
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3074
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3075
        public int read(byte[] b, int off, int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3076
            return read(b, off, len, false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3077
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3078
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3079
        public long skip(long len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3080
            long remain = len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3081
            while (remain > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3082
                if (blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3083
                    if (pos == end) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3084
                        refill();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3085
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3086
                    if (end < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3087
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3088
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3089
                    int nread = (int) Math.min(remain, end - pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3090
                    remain -= nread;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3091
                    pos += nread;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3092
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3093
                    int nread = (int) Math.min(remain, MAX_BLOCK_SIZE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3094
                    if ((nread = in.read(buf, 0, nread)) < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3095
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3096
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3097
                    remain -= nread;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3098
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3099
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3100
            return len - remain;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3101
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3102
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3103
        public int available() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3104
            if (blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3105
                if ((pos == end) && (unread == 0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3106
                    int n;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3107
                    while ((n = readBlockHeader(false)) == 0) ;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3108
                    switch (n) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3109
                        case HEADER_BLOCKED:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3110
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3111
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3112
                        case -1:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3113
                            pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3114
                            end = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3115
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3116
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3117
                        default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3118
                            pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3119
                            end = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3120
                            unread = n;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3121
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3122
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3123
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3124
                // avoid unnecessary call to in.available() if possible
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3125
                int unreadAvail = (unread > 0) ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3126
                    Math.min(in.available(), unread) : 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3127
                return (end >= 0) ? (end - pos) + unreadAvail : 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3128
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3129
                return in.available();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3130
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3131
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3132
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3133
        public void close() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3134
            if (blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3135
                pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3136
                end = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3137
                unread = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3138
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3139
            in.close();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3140
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3141
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3142
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3143
         * Attempts to read len bytes into byte array b at offset off.  Returns
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3144
         * the number of bytes read, or -1 if the end of stream/block data has
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3145
         * been reached.  If copy is true, reads values into an intermediate
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3146
         * buffer before copying them to b (to avoid exposing a reference to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3147
         * b).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3148
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3149
        int read(byte[] b, int off, int len, boolean copy) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3150
            if (len == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3151
                return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3152
            } else if (blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3153
                if (pos == end) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3154
                    refill();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3155
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3156
                if (end < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3157
                    return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3158
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3159
                int nread = Math.min(len, end - pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3160
                System.arraycopy(buf, pos, b, off, nread);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3161
                pos += nread;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3162
                return nread;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3163
            } else if (copy) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3164
                int nread = in.read(buf, 0, Math.min(len, MAX_BLOCK_SIZE));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3165
                if (nread > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3166
                    System.arraycopy(buf, 0, b, off, nread);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3167
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3168
                return nread;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3169
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3170
                return in.read(b, off, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3171
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3172
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3173
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3174
        /* ----------------- primitive data input methods ------------------ */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3175
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3176
         * The following methods are equivalent to their counterparts in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3177
         * DataInputStream, except that they interpret data block boundaries
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3178
         * and read the requested data from within data blocks when in block
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3179
         * data mode.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3180
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3181
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3182
        public void readFully(byte[] b) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3183
            readFully(b, 0, b.length, false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3184
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3185
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3186
        public void readFully(byte[] b, int off, int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3187
            readFully(b, off, len, false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3188
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3189
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3190
        public void readFully(byte[] b, int off, int len, boolean copy)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3191
            throws IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3192
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3193
            while (len > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3194
                int n = read(b, off, len, copy);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3195
                if (n < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3196
                    throw new EOFException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3197
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3198
                off += n;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3199
                len -= n;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3200
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3201
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3202
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3203
        public int skipBytes(int n) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3204
            return din.skipBytes(n);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3205
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3206
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3207
        public boolean readBoolean() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3208
            int v = read();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3209
            if (v < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3210
                throw new EOFException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3211
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3212
            return (v != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3213
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3214
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3215
        public byte readByte() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3216
            int v = read();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3217
            if (v < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3218
                throw new EOFException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3219
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3220
            return (byte) v;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3221
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3222
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3223
        public int readUnsignedByte() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3224
            int v = read();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3225
            if (v < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3226
                throw new EOFException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3227
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3228
            return v;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3229
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3230
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3231
        public char readChar() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3232
            if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3233
                pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3234
                in.readFully(buf, 0, 2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3235
            } else if (end - pos < 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3236
                return din.readChar();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3237
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3238
            char v = Bits.getChar(buf, pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3239
            pos += 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3240
            return v;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3241
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3242
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3243
        public short readShort() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3244
            if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3245
                pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3246
                in.readFully(buf, 0, 2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3247
            } else if (end - pos < 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3248
                return din.readShort();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3249
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3250
            short v = Bits.getShort(buf, pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3251
            pos += 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3252
            return v;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3253
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3254
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3255
        public int readUnsignedShort() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3256
            if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3257
                pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3258
                in.readFully(buf, 0, 2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3259
            } else if (end - pos < 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3260
                return din.readUnsignedShort();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3261
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3262
            int v = Bits.getShort(buf, pos) & 0xFFFF;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3263
            pos += 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3264
            return v;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3265
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3266
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3267
        public int readInt() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3268
            if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3269
                pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3270
                in.readFully(buf, 0, 4);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3271
            } else if (end - pos < 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3272
                return din.readInt();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3273
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3274
            int v = Bits.getInt(buf, pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3275
            pos += 4;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3276
            return v;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3277
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3278
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3279
        public float readFloat() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3280
            if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3281
                pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3282
                in.readFully(buf, 0, 4);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3283
            } else if (end - pos < 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3284
                return din.readFloat();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3285
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3286
            float v = Bits.getFloat(buf, pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3287
            pos += 4;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3288
            return v;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3289
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3290
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3291
        public long readLong() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3292
            if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3293
                pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3294
                in.readFully(buf, 0, 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3295
            } else if (end - pos < 8) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3296
                return din.readLong();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3297
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3298
            long v = Bits.getLong(buf, pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3299
            pos += 8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3300
            return v;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3301
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3302
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3303
        public double readDouble() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3304
            if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3305
                pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3306
                in.readFully(buf, 0, 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3307
            } else if (end - pos < 8) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3308
                return din.readDouble();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3309
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3310
            double v = Bits.getDouble(buf, pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3311
            pos += 8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3312
            return v;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3313
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3314
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3315
        public String readUTF() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3316
            return readUTFBody(readUnsignedShort());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3317
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3318
11117
b6e68b1344d4 7116404: Miscellaneous warnings (java.rmi.**, serialization, some core classes)
alanb
parents: 10797
diff changeset
  3319
        @SuppressWarnings("deprecation")
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3320
        public String readLine() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3321
            return din.readLine();      // deprecated, not worth optimizing
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3322
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3323
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3324
        /* -------------- primitive data array input methods --------------- */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3325
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3326
         * The following methods read in spans of primitive data values.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3327
         * Though equivalent to calling the corresponding primitive read
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3328
         * methods repeatedly, these methods are optimized for reading groups
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3329
         * of primitive data values more efficiently.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3330
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3331
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3332
        void readBooleans(boolean[] v, int off, int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3333
            int stop, endoff = off + len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3334
            while (off < endoff) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3335
                if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3336
                    int span = Math.min(endoff - off, MAX_BLOCK_SIZE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3337
                    in.readFully(buf, 0, span);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3338
                    stop = off + span;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3339
                    pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3340
                } else if (end - pos < 1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3341
                    v[off++] = din.readBoolean();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3342
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3343
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3344
                    stop = Math.min(endoff, off + end - pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3345
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3346
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3347
                while (off < stop) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3348
                    v[off++] = Bits.getBoolean(buf, pos++);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3349
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3350
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3351
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3352
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3353
        void readChars(char[] v, int off, int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3354
            int stop, endoff = off + len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3355
            while (off < endoff) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3356
                if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3357
                    int span = Math.min(endoff - off, MAX_BLOCK_SIZE >> 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3358
                    in.readFully(buf, 0, span << 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3359
                    stop = off + span;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3360
                    pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3361
                } else if (end - pos < 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3362
                    v[off++] = din.readChar();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3363
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3364
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3365
                    stop = Math.min(endoff, off + ((end - pos) >> 1));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3366
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3367
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3368
                while (off < stop) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3369
                    v[off++] = Bits.getChar(buf, pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3370
                    pos += 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3371
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3372
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3373
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3374
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3375
        void readShorts(short[] v, int off, int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3376
            int stop, endoff = off + len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3377
            while (off < endoff) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3378
                if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3379
                    int span = Math.min(endoff - off, MAX_BLOCK_SIZE >> 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3380
                    in.readFully(buf, 0, span << 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3381
                    stop = off + span;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3382
                    pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3383
                } else if (end - pos < 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3384
                    v[off++] = din.readShort();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3385
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3386
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3387
                    stop = Math.min(endoff, off + ((end - pos) >> 1));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3388
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3389
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3390
                while (off < stop) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3391
                    v[off++] = Bits.getShort(buf, pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3392
                    pos += 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3393
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3394
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3395
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3396
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3397
        void readInts(int[] v, int off, int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3398
            int stop, endoff = off + len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3399
            while (off < endoff) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3400
                if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3401
                    int span = Math.min(endoff - off, MAX_BLOCK_SIZE >> 2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3402
                    in.readFully(buf, 0, span << 2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3403
                    stop = off + span;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3404
                    pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3405
                } else if (end - pos < 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3406
                    v[off++] = din.readInt();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3407
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3408
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3409
                    stop = Math.min(endoff, off + ((end - pos) >> 2));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3410
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3411
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3412
                while (off < stop) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3413
                    v[off++] = Bits.getInt(buf, pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3414
                    pos += 4;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3415
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3416
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3417
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3418
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3419
        void readFloats(float[] v, int off, int len) throws IOException {
58244
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3420
            int stop, endoff = off + len;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3421
            while (off < endoff) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3422
                if (!blkmode) {
58244
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3423
                    int span = Math.min(endoff - off, MAX_BLOCK_SIZE >> 2);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3424
                    in.readFully(buf, 0, span << 2);
58244
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3425
                    stop = off + span;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3426
                    pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3427
                } else if (end - pos < 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3428
                    v[off++] = din.readFloat();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3429
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3430
                } else {
58244
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3431
                    stop = Math.min(endoff, ((end - pos) >> 2));
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3432
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3433
58244
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3434
                while (off < stop) {
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3435
                    v[off++] = Bits.getFloat(buf, pos);
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3436
                    pos += 4;
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3437
                }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3438
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3439
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3440
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3441
        void readLongs(long[] v, int off, int len) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3442
            int stop, endoff = off + len;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3443
            while (off < endoff) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3444
                if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3445
                    int span = Math.min(endoff - off, MAX_BLOCK_SIZE >> 3);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3446
                    in.readFully(buf, 0, span << 3);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3447
                    stop = off + span;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3448
                    pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3449
                } else if (end - pos < 8) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3450
                    v[off++] = din.readLong();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3451
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3452
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3453
                    stop = Math.min(endoff, off + ((end - pos) >> 3));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3454
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3455
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3456
                while (off < stop) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3457
                    v[off++] = Bits.getLong(buf, pos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3458
                    pos += 8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3459
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3460
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3461
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3462
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3463
        void readDoubles(double[] v, int off, int len) throws IOException {
58244
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3464
            int stop, endoff = off + len;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3465
            while (off < endoff) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3466
                if (!blkmode) {
58244
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3467
                    int span = Math.min(endoff - off, MAX_BLOCK_SIZE >> 3);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3468
                    in.readFully(buf, 0, span << 3);
58244
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3469
                    stop = off + span;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3470
                    pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3471
                } else if (end - pos < 8) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3472
                    v[off++] = din.readDouble();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3473
                    continue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3474
                } else {
58244
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3475
                    stop = Math.min(endoff - off, ((end - pos) >> 3));
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3476
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3477
58244
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3478
                while (off < stop) {
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3479
                    v[off++] = Bits.getDouble(buf, pos);
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3480
                    pos += 8;
da8673f61e94 8199424: consider removing ObjectInputStream and ObjectOutputStream native methods
darcy
parents: 58054
diff changeset
  3481
                }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3482
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3483
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3484
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3485
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3486
         * Reads in string written in "long" UTF format.  "Long" UTF format is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3487
         * identical to standard UTF, except that it uses an 8 byte header
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3488
         * (instead of the standard 2 bytes) to convey the UTF encoding length.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3489
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3490
        String readLongUTF() throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3491
            return readUTFBody(readLong());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3492
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3493
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3494
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3495
         * Reads in the "body" (i.e., the UTF representation minus the 2-byte
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3496
         * or 8-byte length header) of a UTF encoding, which occupies the next
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3497
         * utflen bytes.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3498
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3499
        private String readUTFBody(long utflen) throws IOException {
35788
04c8859c969b 8134424: BlockDataInputStream.readUTFBody: size local StringBuffer with the given length
chegar
parents: 34882
diff changeset
  3500
            StringBuilder sbuf;
04c8859c969b 8134424: BlockDataInputStream.readUTFBody: size local StringBuffer with the given length
chegar
parents: 34882
diff changeset
  3501
            if (utflen > 0 && utflen < Integer.MAX_VALUE) {
04c8859c969b 8134424: BlockDataInputStream.readUTFBody: size local StringBuffer with the given length
chegar
parents: 34882
diff changeset
  3502
                // a reasonable initial capacity based on the UTF length
04c8859c969b 8134424: BlockDataInputStream.readUTFBody: size local StringBuffer with the given length
chegar
parents: 34882
diff changeset
  3503
                int initialCapacity = Math.min((int)utflen, 0xFFFF);
04c8859c969b 8134424: BlockDataInputStream.readUTFBody: size local StringBuffer with the given length
chegar
parents: 34882
diff changeset
  3504
                sbuf = new StringBuilder(initialCapacity);
04c8859c969b 8134424: BlockDataInputStream.readUTFBody: size local StringBuffer with the given length
chegar
parents: 34882
diff changeset
  3505
            } else {
04c8859c969b 8134424: BlockDataInputStream.readUTFBody: size local StringBuffer with the given length
chegar
parents: 34882
diff changeset
  3506
                sbuf = new StringBuilder();
04c8859c969b 8134424: BlockDataInputStream.readUTFBody: size local StringBuffer with the given length
chegar
parents: 34882
diff changeset
  3507
            }
04c8859c969b 8134424: BlockDataInputStream.readUTFBody: size local StringBuffer with the given length
chegar
parents: 34882
diff changeset
  3508
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3509
            if (!blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3510
                end = pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3511
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3512
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3513
            while (utflen > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3514
                int avail = end - pos;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3515
                if (avail >= 3 || (long) avail == utflen) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3516
                    utflen -= readUTFSpan(sbuf, utflen);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3517
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3518
                    if (blkmode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3519
                        // near block boundary, read one byte at a time
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3520
                        utflen -= readUTFChar(sbuf, utflen);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3521
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3522
                        // shift and refill buffer manually
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3523
                        if (avail > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3524
                            System.arraycopy(buf, pos, buf, 0, avail);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3525
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3526
                        pos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3527
                        end = (int) Math.min(MAX_BLOCK_SIZE, utflen);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3528
                        in.readFully(buf, avail, end - avail);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3529
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3530
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3531
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3532
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3533
            return sbuf.toString();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3534
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3535
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3536
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3537
         * Reads span of UTF-encoded characters out of internal buffer
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3538
         * (starting at offset pos and ending at or before offset end),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3539
         * consuming no more than utflen bytes.  Appends read characters to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3540
         * sbuf.  Returns the number of bytes consumed.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3541
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3542
        private long readUTFSpan(StringBuilder sbuf, long utflen)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3543
            throws IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3544
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3545
            int cpos = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3546
            int start = pos;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3547
            int avail = Math.min(end - pos, CHAR_BUF_SIZE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3548
            // stop short of last char unless all of utf bytes in buffer
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3549
            int stop = pos + ((utflen > avail) ? avail - 2 : (int) utflen);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3550
            boolean outOfBounds = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3551
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3552
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3553
                while (pos < stop) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3554
                    int b1, b2, b3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3555
                    b1 = buf[pos++] & 0xFF;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3556
                    switch (b1 >> 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3557
                        case 0:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3558
                        case 1:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3559
                        case 2:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3560
                        case 3:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3561
                        case 4:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3562
                        case 5:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3563
                        case 6:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3564
                        case 7:   // 1 byte format: 0xxxxxxx
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3565
                            cbuf[cpos++] = (char) b1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3566
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3567
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3568
                        case 12:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3569
                        case 13:  // 2 byte format: 110xxxxx 10xxxxxx
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3570
                            b2 = buf[pos++];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3571
                            if ((b2 & 0xC0) != 0x80) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3572
                                throw new UTFDataFormatException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3573
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3574
                            cbuf[cpos++] = (char) (((b1 & 0x1F) << 6) |
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3575
                                                   ((b2 & 0x3F) << 0));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3576
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3577
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3578
                        case 14:  // 3 byte format: 1110xxxx 10xxxxxx 10xxxxxx
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3579
                            b3 = buf[pos + 1];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3580
                            b2 = buf[pos + 0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3581
                            pos += 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3582
                            if ((b2 & 0xC0) != 0x80 || (b3 & 0xC0) != 0x80) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3583
                                throw new UTFDataFormatException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3584
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3585
                            cbuf[cpos++] = (char) (((b1 & 0x0F) << 12) |
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3586
                                                   ((b2 & 0x3F) << 6) |
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3587
                                                   ((b3 & 0x3F) << 0));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3588
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3589
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3590
                        default:  // 10xx xxxx, 1111 xxxx
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3591
                            throw new UTFDataFormatException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3592
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3593
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3594
            } catch (ArrayIndexOutOfBoundsException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3595
                outOfBounds = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3596
            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3597
                if (outOfBounds || (pos - start) > utflen) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3598
                    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3599
                     * Fix for 4450867: if a malformed utf char causes the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3600
                     * conversion loop to scan past the expected end of the utf
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3601
                     * string, only consume the expected number of utf bytes.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3602
                     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3603
                    pos = start + (int) utflen;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3604
                    throw new UTFDataFormatException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3605
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3606
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3607
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3608
            sbuf.append(cbuf, 0, cpos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3609
            return pos - start;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3610
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3611
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3612
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3613
         * Reads in single UTF-encoded character one byte at a time, appends
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3614
         * the character to sbuf, and returns the number of bytes consumed.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3615
         * This method is used when reading in UTF strings written in block
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3616
         * data mode to handle UTF-encoded characters which (potentially)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3617
         * straddle block-data boundaries.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3618
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3619
        private int readUTFChar(StringBuilder sbuf, long utflen)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3620
            throws IOException
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3621
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3622
            int b1, b2, b3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3623
            b1 = readByte() & 0xFF;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3624
            switch (b1 >> 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3625
                case 0:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3626
                case 1:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3627
                case 2:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3628
                case 3:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3629
                case 4:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3630
                case 5:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3631
                case 6:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3632
                case 7:     // 1 byte format: 0xxxxxxx
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3633
                    sbuf.append((char) b1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3634
                    return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3635
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3636
                case 12:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3637
                case 13:    // 2 byte format: 110xxxxx 10xxxxxx
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3638
                    if (utflen < 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3639
                        throw new UTFDataFormatException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3640
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3641
                    b2 = readByte();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3642
                    if ((b2 & 0xC0) != 0x80) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3643
                        throw new UTFDataFormatException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3644
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3645
                    sbuf.append((char) (((b1 & 0x1F) << 6) |
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3646
                                        ((b2 & 0x3F) << 0)));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3647
                    return 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3648
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3649
                case 14:    // 3 byte format: 1110xxxx 10xxxxxx 10xxxxxx
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3650
                    if (utflen < 3) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3651
                        if (utflen == 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3652
                            readByte();         // consume remaining byte
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3653
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3654
                        throw new UTFDataFormatException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3655
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3656
                    b2 = readByte();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3657
                    b3 = readByte();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3658
                    if ((b2 & 0xC0) != 0x80 || (b3 & 0xC0) != 0x80) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3659
                        throw new UTFDataFormatException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3660
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3661
                    sbuf.append((char) (((b1 & 0x0F) << 12) |
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3662
                                        ((b2 & 0x3F) << 6) |
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3663
                                        ((b3 & 0x3F) << 0)));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3664
                    return 3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3665
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3666
                default:   // 10xx xxxx, 1111 xxxx
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3667
                    throw new UTFDataFormatException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3668
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3669
        }
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  3670
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  3671
        /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  3672
         * Returns the number of bytes read from the input stream.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  3673
         * @return the number of bytes read from the input stream
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  3674
         */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  3675
        long getBytesRead() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  3676
            return in.getBytesRead();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents: 40410
diff changeset
  3677
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3678
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3679
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3680
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3681
     * Unsynchronized table which tracks wire handle to object mappings, as
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3682
     * well as ClassNotFoundExceptions associated with deserialized objects.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3683
     * This class implements an exception-propagation algorithm for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3684
     * determining which objects should have ClassNotFoundExceptions associated
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3685
     * with them, taking into account cycles and discontinuities (e.g., skipped
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3686
     * fields) in the object graph.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3687
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3688
     * <p>General use of the table is as follows: during deserialization, a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3689
     * given object is first assigned a handle by calling the assign method.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3690
     * This method leaves the assigned handle in an "open" state, wherein
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3691
     * dependencies on the exception status of other handles can be registered
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3692
     * by calling the markDependency method, or an exception can be directly
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3693
     * associated with the handle by calling markException.  When a handle is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3694
     * tagged with an exception, the HandleTable assumes responsibility for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3695
     * propagating the exception to any other objects which depend
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3696
     * (transitively) on the exception-tagged object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3697
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3698
     * <p>Once all exception information/dependencies for the handle have been
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3699
     * registered, the handle should be "closed" by calling the finish method
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3700
     * on it.  The act of finishing a handle allows the exception propagation
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3701
     * algorithm to aggressively prune dependency links, lessening the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3702
     * performance/memory impact of exception tracking.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3703
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3704
     * <p>Note that the exception propagation algorithm used depends on handles
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3705
     * being assigned/finished in LIFO order; however, for simplicity as well
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3706
     * as memory conservation, it does not enforce this constraint.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3707
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3708
    // REMIND: add full description of exception propagation algorithm?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3709
    private static class HandleTable {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3710
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3711
        /* status codes indicating whether object has associated exception */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3712
        private static final byte STATUS_OK = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3713
        private static final byte STATUS_UNKNOWN = 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3714
        private static final byte STATUS_EXCEPTION = 3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3715
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3716
        /** array mapping handle -> object status */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3717
        byte[] status;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3718
        /** array mapping handle -> object/exception (depending on status) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3719
        Object[] entries;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3720
        /** array mapping handle -> list of dependent handles (if any) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3721
        HandleList[] deps;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3722
        /** lowest unresolved dependency */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3723
        int lowDep = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3724
        /** number of handles in table */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3725
        int size = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3726
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3727
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3728
         * Creates handle table with the given initial capacity.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3729
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3730
        HandleTable(int initialCapacity) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3731
            status = new byte[initialCapacity];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3732
            entries = new Object[initialCapacity];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3733
            deps = new HandleList[initialCapacity];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3734
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3735
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3736
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3737
         * Assigns next available handle to given object, and returns assigned
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3738
         * handle.  Once object has been completely deserialized (and all
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3739
         * dependencies on other objects identified), the handle should be
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3740
         * "closed" by passing it to finish().
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3741
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3742
        int assign(Object obj) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3743
            if (size >= entries.length) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3744
                grow();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3745
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3746
            status[size] = STATUS_UNKNOWN;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3747
            entries[size] = obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3748
            return size++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3749
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3750
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3751
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3752
         * Registers a dependency (in exception status) of one handle on
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3753
         * another.  The dependent handle must be "open" (i.e., assigned, but
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3754
         * not finished yet).  No action is taken if either dependent or target
33403
d2bfc26f26cc 6823565: Excessive use of HandleList class in de-serialization code causes OutOfMemory
redestad
parents: 32649
diff changeset
  3755
         * handle is NULL_HANDLE. Additionally, no action is taken if the
d2bfc26f26cc 6823565: Excessive use of HandleList class in de-serialization code causes OutOfMemory
redestad
parents: 32649
diff changeset
  3756
         * dependent and target are the same.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3757
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3758
        void markDependency(int dependent, int target) {
33403
d2bfc26f26cc 6823565: Excessive use of HandleList class in de-serialization code causes OutOfMemory
redestad
parents: 32649
diff changeset
  3759
            if (dependent == target || dependent == NULL_HANDLE || target == NULL_HANDLE) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3760
                return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3761
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3762
            switch (status[dependent]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3763
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3764
                case STATUS_UNKNOWN:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3765
                    switch (status[target]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3766
                        case STATUS_OK:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3767
                            // ignore dependencies on objs with no exception
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3768
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3769
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3770
                        case STATUS_EXCEPTION:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3771
                            // eagerly propagate exception
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3772
                            markException(dependent,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3773
                                (ClassNotFoundException) entries[target]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3774
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3775
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3776
                        case STATUS_UNKNOWN:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3777
                            // add to dependency list of target
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3778
                            if (deps[target] == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3779
                                deps[target] = new HandleList();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3780
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3781
                            deps[target].add(dependent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3782
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3783
                            // remember lowest unresolved target seen
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3784
                            if (lowDep < 0 || lowDep > target) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3785
                                lowDep = target;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3786
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3787
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3788
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3789
                        default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3790
                            throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3791
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3792
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3793
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3794
                case STATUS_EXCEPTION:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3795
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3796
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3797
                default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3798
                    throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3799
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3800
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3801
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3802
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3803
         * Associates a ClassNotFoundException (if one not already associated)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3804
         * with the currently active handle and propagates it to other
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3805
         * referencing objects as appropriate.  The specified handle must be
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3806
         * "open" (i.e., assigned, but not finished yet).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3807
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3808
        void markException(int handle, ClassNotFoundException ex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3809
            switch (status[handle]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3810
                case STATUS_UNKNOWN:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3811
                    status[handle] = STATUS_EXCEPTION;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3812
                    entries[handle] = ex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3813
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3814
                    // propagate exception to dependents
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3815
                    HandleList dlist = deps[handle];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3816
                    if (dlist != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3817
                        int ndeps = dlist.size();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3818
                        for (int i = 0; i < ndeps; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3819
                            markException(dlist.get(i), ex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3820
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3821
                        deps[handle] = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3822
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3823
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3824
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3825
                case STATUS_EXCEPTION:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3826
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3827
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3828
                default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3829
                    throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3830
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3831
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3832
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3833
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3834
         * Marks given handle as finished, meaning that no new dependencies
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3835
         * will be marked for handle.  Calls to the assign and finish methods
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3836
         * must occur in LIFO order.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3837
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3838
        void finish(int handle) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3839
            int end;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3840
            if (lowDep < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3841
                // no pending unknowns, only resolve current handle
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3842
                end = handle + 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3843
            } else if (lowDep >= handle) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3844
                // pending unknowns now clearable, resolve all upward handles
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3845
                end = size;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3846
                lowDep = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3847
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3848
                // unresolved backrefs present, can't resolve anything yet
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3849
                return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3850
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3851
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3852
            // change STATUS_UNKNOWN -> STATUS_OK in selected span of handles
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3853
            for (int i = handle; i < end; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3854
                switch (status[i]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3855
                    case STATUS_UNKNOWN:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3856
                        status[i] = STATUS_OK;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3857
                        deps[i] = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3858
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3859
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3860
                    case STATUS_OK:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3861
                    case STATUS_EXCEPTION:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3862
                        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3863
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3864
                    default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3865
                        throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3866
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3867
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3868
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3869
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3870
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3871
         * Assigns a new object to the given handle.  The object previously
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3872
         * associated with the handle is forgotten.  This method has no effect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3873
         * if the given handle already has an exception associated with it.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3874
         * This method may be called at any time after the handle is assigned.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3875
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3876
        void setObject(int handle, Object obj) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3877
            switch (status[handle]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3878
                case STATUS_UNKNOWN:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3879
                case STATUS_OK:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3880
                    entries[handle] = obj;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3881
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3882
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3883
                case STATUS_EXCEPTION:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3884
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3885
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3886
                default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3887
                    throw new InternalError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3888
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3889
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3890
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3891
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3892
         * Looks up and returns object associated with the given handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3893
         * Returns null if the given handle is NULL_HANDLE, or if it has an
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3894
         * associated ClassNotFoundException.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3895
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3896
        Object lookupObject(int handle) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3897
            return (handle != NULL_HANDLE &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3898
                    status[handle] != STATUS_EXCEPTION) ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3899
                entries[handle] : null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3900
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3901
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3902
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3903
         * Looks up and returns ClassNotFoundException associated with the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3904
         * given handle.  Returns null if the given handle is NULL_HANDLE, or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3905
         * if there is no ClassNotFoundException associated with the handle.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3906
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3907
        ClassNotFoundException lookupException(int handle) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3908
            return (handle != NULL_HANDLE &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3909
                    status[handle] == STATUS_EXCEPTION) ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3910
                (ClassNotFoundException) entries[handle] : null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3911
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3912
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3913
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3914
         * Resets table to its initial state.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3915
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3916
        void clear() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3917
            Arrays.fill(status, 0, size, (byte) 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3918
            Arrays.fill(entries, 0, size, null);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3919
            Arrays.fill(deps, 0, size, null);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3920
            lowDep = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3921
            size = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3922
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3923
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3924
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3925
         * Returns number of handles registered in table.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3926
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3927
        int size() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3928
            return size;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3929
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3930
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3931
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3932
         * Expands capacity of internal arrays.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3933
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3934
        private void grow() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3935
            int newCapacity = (entries.length << 1) + 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3936
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3937
            byte[] newStatus = new byte[newCapacity];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3938
            Object[] newEntries = new Object[newCapacity];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3939
            HandleList[] newDeps = new HandleList[newCapacity];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3940
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3941
            System.arraycopy(status, 0, newStatus, 0, size);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3942
            System.arraycopy(entries, 0, newEntries, 0, size);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3943
            System.arraycopy(deps, 0, newDeps, 0, size);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3944
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3945
            status = newStatus;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3946
            entries = newEntries;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3947
            deps = newDeps;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3948
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3949
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3950
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3951
         * Simple growable list of (integer) handles.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3952
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3953
        private static class HandleList {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3954
            private int[] list = new int[4];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3955
            private int size = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3956
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3957
            public HandleList() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3958
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3959
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3960
            public void add(int handle) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3961
                if (size >= list.length) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3962
                    int[] newList = new int[list.length << 1];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3963
                    System.arraycopy(list, 0, newList, 0, list.length);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3964
                    list = newList;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3965
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3966
                list[size++] = handle;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3967
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3968
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3969
            public int get(int index) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3970
                if (index >= size) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3971
                    throw new ArrayIndexOutOfBoundsException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3972
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3973
                return list[index];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3974
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3975
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3976
            public int size() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3977
                return size;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3978
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3979
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3980
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3981
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3982
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3983
     * Method for cloning arrays in case of using unsharing reading
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3984
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3985
    private static Object cloneArray(Object array) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3986
        if (array instanceof Object[]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3987
            return ((Object[]) array).clone();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3988
        } else if (array instanceof boolean[]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3989
            return ((boolean[]) array).clone();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3990
        } else if (array instanceof byte[]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3991
            return ((byte[]) array).clone();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3992
        } else if (array instanceof char[]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3993
            return ((char[]) array).clone();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3994
        } else if (array instanceof double[]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3995
            return ((double[]) array).clone();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3996
        } else if (array instanceof float[]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3997
            return ((float[]) array).clone();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3998
        } else if (array instanceof int[]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3999
            return ((int[]) array).clone();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  4000
        } else if (array instanceof long[]) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  4001
            return ((long[]) array).clone();
7535
53c289115e11 6990094: ObjectInputStream cloneArray doesn't handle short[]
darcy
parents: 7030
diff changeset
  4002
        } else if (array instanceof short[]) {
53c289115e11 6990094: ObjectInputStream cloneArray doesn't handle short[]
darcy
parents: 7030
diff changeset
  4003
            return ((short[]) array).clone();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  4004
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  4005
            throw new AssertionError();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  4006
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  4007
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  4008
47423
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  4009
    static {
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  4010
        SharedSecrets.setJavaObjectInputStreamAccess(ObjectInputStream::checkArray);
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  4011
    }
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47415
diff changeset
  4012
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  4013
}