[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[cp-patches] FYI: Properly implement ObjectInputStream ObjectValidators
From: |
Mark Wielaard |
Subject: |
[cp-patches] FYI: Properly implement ObjectInputStream ObjectValidators |
Date: |
Wed, 12 Oct 2005 21:30:16 +0200 |
Hi,
This fixes bug #22841 by rewriting the ObjectValidators support. It
seems this code has been wrong since 1998 when it was first added. But
it is not a feature that is often used.
2005-10-12 Mark Wielaard <address@hidden>
Fixes bug #22841
* java/io/ObjectInputStream (validators): Removed field.
(isDeserializing): Removed field.
(currentObjectValidators): New field.
(ObjectInputStream): Remove validators and isDeserializing
initialization.
(readObject): Remove isDeserializing logic. Don't call
invokeValidators() here.
(parseContent): Call invokeValidators() after TC_OBJECT done.
(registerValidation): Create currentObjectValidators if needed.
(invokeValidators): Rewritten.
This fixes the gnu.testlet.java.io.ObjectInputStream.registerValidation
mauve tests and introduces no regressions.
Committed,
Mark
Index: java/io/ObjectInputStream.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/io/ObjectInputStream.java,v
retrieving revision 1.68
diff -u -r1.68 ObjectInputStream.java
--- java/io/ObjectInputStream.java 17 Sep 2005 15:46:22 -0000 1.68
+++ java/io/ObjectInputStream.java 12 Oct 2005 19:28:48 -0000
@@ -52,6 +52,8 @@
import java.security.PrivilegedAction;
import java.util.Arrays;
import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.TreeSet;
import java.util.Vector;
public class ObjectInputStream extends InputStream
@@ -90,7 +92,6 @@
}
this.resolveEnabled = false;
- this.isDeserializing = false;
this.blockDataPosition = 0;
this.blockDataBytes = 0;
this.blockData = new byte[BUFFER_SIZE];
@@ -98,7 +99,6 @@
this.realInputStream = new DataInputStream(in);
this.nextOID = baseWireHandle;
this.objectLookupTable = new Hashtable();
- this.validators = new Vector();
this.classLookupTable = new Hashtable();
setBlockDataMode(true);
readStreamHeader();
@@ -126,42 +126,28 @@
if (this.useSubclassMethod)
return readObjectOverride();
- boolean was_deserializing;
-
Object ret_val;
- was_deserializing = this.isDeserializing;
-
boolean old_mode = setBlockDataMode(false);
-
- this.isDeserializing = true;
-
byte marker = this.realInputStream.readByte();
- depth += 2;
+ if (DEBUG)
+ depth += 2;
if(dump) dumpElement("MARKER: 0x" + Integer.toHexString(marker) + " ");
try
{
ret_val = parseContent(marker);
- }
- finally
- {
+ }
+ finally
+ {
setBlockDataMode(old_mode);
-
- this.isDeserializing = was_deserializing;
-
- depth -= 2;
-
- if (! was_deserializing)
- {
- if (validators.size() > 0)
- invokeValidators();
- }
- }
-
- return ret_val;
- }
+ if (DEBUG)
+ depth -= 2;
+ }
+
+ return ret_val;
+ }
/**
* Handles a content block within the stream, which begins with a marker
@@ -347,8 +333,10 @@
int handle = assignNewHandle(obj);
Object prevObject = this.currentObject;
ObjectStreamClass prevObjectStreamClass =
this.currentObjectStreamClass;
+ TreeSet prevObjectValidators = this.currentObjectValidators;
this.currentObject = obj;
+ this.currentObjectValidators = null;
ObjectStreamClass[] hierarchy =
inputGetObjectStreamClasses(clazz);
@@ -400,7 +388,10 @@
this.currentObject = prevObject;
this.currentObjectStreamClass = prevObjectStreamClass;
ret_val = processResolution(osc, obj, handle);
-
+ if (currentObjectValidators != null)
+ invokeValidators();
+ this.currentObjectValidators = prevObjectValidators;
+
break;
}
@@ -732,8 +723,10 @@
throw new InvalidObjectException("attempt to add a null "
+ "ObjectInputValidation object");
- this.validators.addElement(new ValidatorAndPriority (validator,
- priority));
+ if (currentObjectValidators == null)
+ currentObjectValidators = new TreeSet();
+
+ currentObjectValidators.add(new ValidatorAndPriority(validator, priority));
}
@@ -1837,18 +1830,19 @@
// on OBJ
private void invokeValidators() throws InvalidObjectException
{
- Object[] validators = new Object[this.validators.size()];
- this.validators.copyInto (validators);
- Arrays.sort (validators);
-
try
{
- for (int i=0; i < validators.length; i++)
- ((ObjectInputValidation)validators[i]).validateObject();
+ Iterator it = currentObjectValidators.iterator();
+ while(it.hasNext())
+ {
+ ValidatorAndPriority vap = (ValidatorAndPriority) it.next();
+ ObjectInputValidation validator = vap.validator;
+ validator.validateObject();
+ }
}
finally
{
- this.validators.removeAllElements();
+ currentObjectValidators = null;
}
}
@@ -1897,10 +1891,9 @@
private Hashtable objectLookupTable;
private Object currentObject;
private ObjectStreamClass currentObjectStreamClass;
+ private TreeSet currentObjectValidators;
private boolean readDataFromBlock;
- private boolean isDeserializing;
private boolean fieldsAlreadyRead;
- private Vector validators;
private Hashtable classLookupTable;
private GetField prereadFields;
signature.asc
Description: This is a digitally signed message part
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cp-patches] FYI: Properly implement ObjectInputStream ObjectValidators,
Mark Wielaard <=