1 /* 2 * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package java.io; 27 28 /** 29 * Context during upcalls from object stream to class-defined 30 * readObject/writeObject methods. 31 * Holds object currently being deserialized and descriptor for current class. 32 * 33 * This context keeps track of the thread it was constructed on, and allows 34 * only a single call of defaultReadObject, readFields, defaultWriteObject 35 * or writeFields which must be invoked on the same thread before the class's 36 * readObject/writeObject method has returned. 37 * If not set to the current thread, the getObj method throws NotActiveException. 38 */ 39 final class SerialCallbackContext { 40 private final Object obj; 41 private final ObjectStreamClass desc; 42 /** 43 * Thread this context is in use by. 44 * As this only works in one thread, we do not need to worry about thread-safety. 45 */ 46 private Thread thread; 47 SerialCallbackContext(Object obj, ObjectStreamClass desc)48 public SerialCallbackContext(Object obj, ObjectStreamClass desc) { 49 this.obj = obj; 50 this.desc = desc; 51 this.thread = Thread.currentThread(); 52 } 53 getObj()54 public Object getObj() throws NotActiveException { 55 checkAndSetUsed(); 56 return obj; 57 } 58 getDesc()59 public ObjectStreamClass getDesc() { 60 return desc; 61 } 62 check()63 public void check() throws NotActiveException { 64 if (thread != null && thread != Thread.currentThread()) { 65 throw new NotActiveException( 66 "expected thread: " + thread + ", but got: " + Thread.currentThread()); 67 } 68 } 69 checkAndSetUsed()70 private void checkAndSetUsed() throws NotActiveException { 71 if (thread != Thread.currentThread()) { 72 throw new NotActiveException( 73 "not in readObject invocation or fields already read"); 74 } 75 thread = null; 76 } 77 setUsed()78 public void setUsed() { 79 thread = null; 80 } 81 } 82