You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2011/08/01 23:25:05 UTC

svn commit: r1152937 - in /geronimo/yoko/trunk: yoko-core/src/main/java/org/apache/yoko/orb/CORBA/ yoko-core/src/main/java/org/apache/yoko/orb/OB/ yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/

Author: djencks
Date: Mon Aug  1 21:25:04 2011
New Revision: 1152937

URL: http://svn.apache.org/viewvc?rev=1152937&view=rev
Log:
YOKO-434 nasty try-it-twice attempt to determine if the source class had a write object method by seeing what deserializes correctly

Modified:
    geronimo/yoko/trunk/yoko-core/src/main/java/org/apache/yoko/orb/CORBA/InputStream.java
    geronimo/yoko/trunk/yoko-core/src/main/java/org/apache/yoko/orb/OB/ValueReader.java
    geronimo/yoko/trunk/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/CorbaObjectReader.java
    geronimo/yoko/trunk/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java

Modified: geronimo/yoko/trunk/yoko-core/src/main/java/org/apache/yoko/orb/CORBA/InputStream.java
URL: http://svn.apache.org/viewvc/geronimo/yoko/trunk/yoko-core/src/main/java/org/apache/yoko/orb/CORBA/InputStream.java?rev=1152937&r1=1152936&r2=1152937&view=diff
==============================================================================
--- geronimo/yoko/trunk/yoko-core/src/main/java/org/apache/yoko/orb/CORBA/InputStream.java (original)
+++ geronimo/yoko/trunk/yoko-core/src/main/java/org/apache/yoko/orb/CORBA/InputStream.java Mon Aug  1 21:25:04 2011
@@ -17,6 +17,7 @@
 
 package org.apache.yoko.orb.CORBA;
 
+import java.io.IOException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -63,6 +64,9 @@ final public class InputStream extends o
 
 	private String codebase_;
 
+    //mark support
+    private int mark_pos;
+
     // ------------------------------------------------------------------
     // Private and protected members
     // ------------------------------------------------------------------
@@ -2126,5 +2130,21 @@ final public class InputStream extends o
             valueReader_.checkChunk();
         }
     }
+
+    @Override
+    public void mark(int i) {
+        mark_pos = buf_.pos();
+    }
+
+    @Override
+    public boolean markSupported() {
+        return true;
+    }
+
+    @Override
+    public void reset() throws IOException {
+        buf_.pos(mark_pos);
+        mark_pos = 0;
+    }
 }
 

Modified: geronimo/yoko/trunk/yoko-core/src/main/java/org/apache/yoko/orb/OB/ValueReader.java
URL: http://svn.apache.org/viewvc/geronimo/yoko/trunk/yoko-core/src/main/java/org/apache/yoko/orb/OB/ValueReader.java?rev=1152937&r1=1152936&r2=1152937&view=diff
==============================================================================
--- geronimo/yoko/trunk/yoko-core/src/main/java/org/apache/yoko/orb/OB/ValueReader.java (original)
+++ geronimo/yoko/trunk/yoko-core/src/main/java/org/apache/yoko/orb/OB/ValueReader.java Mon Aug  1 21:25:04 2011
@@ -202,7 +202,7 @@ final public class ValueReader {
     //
     // Create a value using a factory
     //
-    private class FactoryCreationStrategy extends CreationStrategy {
+    static class FactoryCreationStrategy extends CreationStrategy {
         private String id_;
 
         private ORBInstance orbInstance_;
@@ -296,8 +296,8 @@ final public class ValueReader {
             Assert._OB_assert(h.tag >= 0x7fffff00 && h.tag != -1);
 
             if (h.isRMIValue ()) {
-                Serializable result = readRMIValue (h, null, h.ids[0]);
-                addInstance (h.headerPos, result);
+                Serializable result = reader_.readRMIValue(h, null, h.ids[0]);
+                reader_.addInstance(h.headerPos, result);
                 return result;
             }
             //

Modified: geronimo/yoko/trunk/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/CorbaObjectReader.java
URL: http://svn.apache.org/viewvc/geronimo/yoko/trunk/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/CorbaObjectReader.java?rev=1152937&r1=1152936&r2=1152937&view=diff
==============================================================================
--- geronimo/yoko/trunk/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/CorbaObjectReader.java (original)
+++ geronimo/yoko/trunk/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/CorbaObjectReader.java Mon Aug  1 21:25:04 2011
@@ -19,6 +19,8 @@
 package org.apache.yoko.rmi.impl;
 
 
+import java.io.IOException;
+
 public class CorbaObjectReader extends ObjectReader {
     final org.omg.CORBA_2_3.portable.InputStream in;
 
@@ -202,4 +204,18 @@ public class CorbaObjectReader extends O
         return in.available();
     }
 
+    @Override
+    public void mark(int i) {
+        in.mark(i);
+    }
+
+    @Override
+    public boolean markSupported() {
+        return in.markSupported();
+    }
+
+    @Override
+    public void reset() throws IOException {
+        in.reset();
+    }
 }

Modified: geronimo/yoko/trunk/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
URL: http://svn.apache.org/viewvc/geronimo/yoko/trunk/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java?rev=1152937&r1=1152936&r2=1152937&view=diff
==============================================================================
--- geronimo/yoko/trunk/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java (original)
+++ geronimo/yoko/trunk/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java Mon Aug  1 21:25:04 2011
@@ -818,13 +818,49 @@ public class ValueDescriptor extends Typ
 
         // System.out.println ("readValue "+getJavaClass());
 
-        if (_write_object_method != null) {
+        //Determine if source object had a writeObject method.
+        //If the source object had a writeObject method, the next two bytes will be stream format version and
+        //whether the write object method called defaultWriteObject.
+
+        //If the source object did not have a writeObject method, the next 4-byte-aligned bit will be the start of a header
+        //for the first field.
+        //What if there are no fields?
+
+        //The only obvious way to do this is to, if the reader supports mark, try the way suggested by the target class
+        // and if that doesn't work try the other possibility.
+
+        if (reader.markSupported()) {
+            reader.mark(7);
+        }
+        boolean hasWriteObjectMethod = _write_object_method != null;
+
+        try {
+            tryReadObject(reader, value, hasWriteObjectMethod);
+        } catch (org.omg.CORBA.MARSHAL e) {
+            if (reader.markSupported()) {
+                reader.reset();
+                tryReadObject(reader, value, !hasWriteObjectMethod);
+            } else {
+                throw e;
+            }
+        } catch (org.omg.CORBA.portable.UnknownException e) {
+            if (reader.markSupported()) {
+                reader.reset();
+                tryReadObject(reader, value, !hasWriteObjectMethod);
+            } else {
+                throw e;
+            }
+        }
+
+    }
+
+    private void tryReadObject(ObjectReader reader, Serializable value, boolean hasWriteObjectMethod) throws IOException {
+        if (hasWriteObjectMethod) {
 
             // read custom marshalling value header
             byte streamFormatVersion = reader.readByte();
             boolean writeDefaultStateCalled = reader.readBoolean();
         }
-
         if (_read_object_method != null) {
 
             // System.out.println ("readValue "+getJavaClass()+" calling
@@ -847,7 +883,6 @@ public class ValueDescriptor extends Typ
         } else {
             defaultReadValue(reader, value);
         }
-
     }
 
     protected long computeHashCode() {