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 2017/02/19 01:49:40 UTC
[23/51] [abbrv] geronimo-yoko git commit: Use YASF negotiation to
maintain stream compatibility when talking Enums to unfixed yoko
Use YASF negotiation to maintain stream compatibility when talking Enums to unfixed yoko
Project: http://git-wip-us.apache.org/repos/asf/geronimo-yoko/repo
Commit: http://git-wip-us.apache.org/repos/asf/geronimo-yoko/commit/55b7d4f1
Tree: http://git-wip-us.apache.org/repos/asf/geronimo-yoko/tree/55b7d4f1
Diff: http://git-wip-us.apache.org/repos/asf/geronimo-yoko/diff/55b7d4f1
Branch: refs/heads/master
Commit: 55b7d4f1abd50b0d446759c71f4a249245982905
Parents: 02829e8
Author: Neil GM Richards <ne...@uk.ibm.com>
Authored: Thu Mar 24 01:42:06 2016 +0000
Committer: Neil GM Richards <ne...@uk.ibm.com>
Committed: Thu Mar 24 01:42:06 2016 +0000
----------------------------------------------------------------------
.../org/apache/yoko/orb/OBCORBA/ORB_impl.java | 2 +-
.../ClientRequestInfo_impl.java | 8 +-
.../ServerRequestInfo_impl.java | 17 ++--
.../java/org/apache/yoko/orb/yasf/Yasf.java | 71 ----------------
.../yoko/orb/yasf/YasfClientInterceptor.java | 11 ++-
.../org/apache/yoko/orb/yasf/YasfHelper.java | 87 ++++++++++++++++++++
.../yoko/orb/yasf/YasfIORInterceptor.java | 3 +-
.../yoko/orb/yasf/YasfServerInterceptor.java | 23 +++++-
.../apache/yoko/rmi/impl/EnumDescriptor.java | 35 ++++++--
.../yoko/rmi/impl/EnumSubclassDescriptor.java | 5 +-
.../org/apache/yoko/rmi/impl/ModelElement.java | 2 +-
.../org/apache/yoko/rmi/impl/ObjectWriter.java | 27 +++---
.../apache/yoko/rmi/impl/ValueDescriptor.java | 2 +-
.../java/org/apache/yoko/util/yasf/Yasf.java | 43 ++++++++++
.../apache/yoko/util/yasf/YasfThreadLocal.java | 87 ++++++++++++++++++++
15 files changed, 315 insertions(+), 108 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-core/src/main/java/org/apache/yoko/orb/OBCORBA/ORB_impl.java
----------------------------------------------------------------------
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/OBCORBA/ORB_impl.java b/yoko-core/src/main/java/org/apache/yoko/orb/OBCORBA/ORB_impl.java
index 36e0044..4159e83 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/OBCORBA/ORB_impl.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/OBCORBA/ORB_impl.java
@@ -296,7 +296,7 @@ public class ORB_impl extends org.apache.yoko.orb.CORBA.ORBSingleton {
try {
piManager.addIORInterceptor(new YasfIORInterceptor(), true);
piManager.addClientRequestInterceptor(new YasfClientInterceptor());
- piManager.addServerRequestInterceptor(new YasfServerInterceptor());
+ piManager.addServerRequestInterceptor(new YasfServerInterceptor(piManager.allocateSlotId()));
} catch (org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName ex) {
org.apache.yoko.orb.OB.Assert._OB_assert(ex);
}
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-core/src/main/java/org/apache/yoko/orb/PortableInterceptor/ClientRequestInfo_impl.java
----------------------------------------------------------------------
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/PortableInterceptor/ClientRequestInfo_impl.java b/yoko-core/src/main/java/org/apache/yoko/orb/PortableInterceptor/ClientRequestInfo_impl.java
index 53c938d..e2023e8 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/PortableInterceptor/ClientRequestInfo_impl.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/PortableInterceptor/ClientRequestInfo_impl.java
@@ -19,6 +19,8 @@ package org.apache.yoko.orb.PortableInterceptor;
import org.apache.yoko.util.cmsf.CmsfThreadLocal;
import org.apache.yoko.util.cmsf.CmsfThreadLocal.CmsfOverride;
+import org.apache.yoko.util.yasf.YasfThreadLocal;
+import org.apache.yoko.util.yasf.YasfThreadLocal.YasfOverride;
final public class ClientRequestInfo_impl extends RequestInfo_impl implements
org.omg.PortableInterceptor.ClientRequestInfo {
@@ -364,7 +366,8 @@ final public class ClientRequestInfo_impl extends RequestInfo_impl implements
argStrategy_.setArgsAvail(true);
argStrategy_.setExceptAvail(true);
- try (CmsfOverride cmsfo = CmsfThreadLocal.override()) {
+ try (CmsfOverride cmsfo = CmsfThreadLocal.override();
+ YasfOverride yasfo = YasfThreadLocal.override()) {
java.util.Enumeration e = interceptors.elements();
while (e.hasMoreElements()) {
org.omg.PortableInterceptor.ClientRequestInterceptor interceptor = (org.omg.PortableInterceptor.ClientRequestInterceptor) e
@@ -398,7 +401,8 @@ final public class ClientRequestInfo_impl extends RequestInfo_impl implements
current_._OB_pushSlotData(currentSlots_);
}
- try (CmsfOverride cmsfo = CmsfThreadLocal.override()) {
+ try (CmsfOverride cmsfo = CmsfThreadLocal.override();
+ YasfOverride yasfo = YasfThreadLocal.override()) {
int curr = interceptors_.size() - 1;
while (!interceptors_.isEmpty()) {
try {
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-core/src/main/java/org/apache/yoko/orb/PortableInterceptor/ServerRequestInfo_impl.java
----------------------------------------------------------------------
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/PortableInterceptor/ServerRequestInfo_impl.java b/yoko-core/src/main/java/org/apache/yoko/orb/PortableInterceptor/ServerRequestInfo_impl.java
index fb484e4..70e6fc5 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/PortableInterceptor/ServerRequestInfo_impl.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/PortableInterceptor/ServerRequestInfo_impl.java
@@ -19,6 +19,8 @@ package org.apache.yoko.orb.PortableInterceptor;
import org.apache.yoko.util.cmsf.CmsfThreadLocal;
import org.apache.yoko.util.cmsf.CmsfThreadLocal.CmsfOverride;
+import org.apache.yoko.util.yasf.YasfThreadLocal;
+import org.apache.yoko.util.yasf.YasfThreadLocal.YasfOverride;
final public class ServerRequestInfo_impl extends RequestInfo_impl implements
ServerRequestInfoExt {
@@ -380,7 +382,8 @@ final public class ServerRequestInfo_impl extends RequestInfo_impl implements
argStrategy_.setArgsAvail(false);
argStrategy_.setExceptAvail(false);
- try (CmsfOverride cmsfo = CmsfThreadLocal.override()) {
+ try (CmsfOverride cmsfo = CmsfThreadLocal.override();
+ YasfOverride yasfo = YasfThreadLocal.override()) {
java.util.Enumeration e = interceptors.elements();
while (e.hasMoreElements()) {
org.omg.PortableInterceptor.ServerRequestInterceptor i = (org.omg.PortableInterceptor.ServerRequestInterceptor) e
@@ -408,7 +411,8 @@ final public class ServerRequestInfo_impl extends RequestInfo_impl implements
status_ = NO_REPLY;
- try (CmsfOverride cmsfo = CmsfThreadLocal.override()) {
+ try (CmsfOverride cmsfo = CmsfThreadLocal.override();
+ YasfOverride yasfo = YasfThreadLocal.override()) {
java.util.Enumeration e = interceptors_.elements();
while (e.hasMoreElements()) {
((org.omg.PortableInterceptor.ServerRequestInterceptor) (e
@@ -434,7 +438,8 @@ final public class ServerRequestInfo_impl extends RequestInfo_impl implements
//
servant_ = null;
- try (CmsfOverride cmsfo = CmsfThreadLocal.override()) {
+ try (CmsfOverride cmsfo = CmsfThreadLocal.override();
+ YasfOverride yasfo = YasfThreadLocal.override()) {
int curr = interceptors_.size() - 1;
while (!interceptors_.isEmpty()) {
org.omg.PortableInterceptor.ServerRequestInterceptor i = (org.omg.PortableInterceptor.ServerRequestInterceptor) interceptors_
@@ -469,7 +474,8 @@ final public class ServerRequestInfo_impl extends RequestInfo_impl implements
//
servant_ = null;
- try (CmsfOverride cmsfo = CmsfThreadLocal.override()) {
+ try (CmsfOverride cmsfo = CmsfThreadLocal.override();
+ YasfOverride yasfo = YasfThreadLocal.override()) {
org.apache.yoko.orb.OB.Assert
._OB_assert(status_ == org.omg.PortableInterceptor.SYSTEM_EXCEPTION.value
|| status_ == org.omg.PortableInterceptor.USER_EXCEPTION.value);
@@ -511,7 +517,8 @@ final public class ServerRequestInfo_impl extends RequestInfo_impl implements
//
servant_ = null;
- try (CmsfOverride cmsfo = CmsfThreadLocal.override()) {
+ try (CmsfOverride cmsfo = CmsfThreadLocal.override();
+ YasfOverride yasfo = YasfThreadLocal.override()) {
org.apache.yoko.orb.OB.Assert
._OB_assert(status_ == org.omg.PortableInterceptor.LOCATION_FORWARD.value
|| status_ == org.omg.PortableInterceptor.TRANSPORT_RETRY.value);
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-core/src/main/java/org/apache/yoko/orb/yasf/Yasf.java
----------------------------------------------------------------------
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/yasf/Yasf.java b/yoko-core/src/main/java/org/apache/yoko/orb/yasf/Yasf.java
deleted file mode 100644
index 98fdf34..0000000
--- a/yoko-core/src/main/java/org/apache/yoko/orb/yasf/Yasf.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.apache.yoko.orb.yasf;
-
-import java.util.BitSet;
-
-import org.omg.IOP.ServiceContext;
-import org.omg.IOP.TaggedComponent;
-
-public enum Yasf {
- ;
-
- // TODO - Get ids from OMG assigned for these values
- public static final int TAG_YOKO_AUXILLIARY_STREAM_FORMAT = 0xeeeeeeee;
- public static final int YOKO_AUXIllIARY_STREAM_FORMAT_SC = 0xeeeeeeee;
-
- public final int itemIndex;
-
- private Yasf(int itemIndex) {
- this.itemIndex = itemIndex;
- }
-
- public boolean isSet(BitSet items) {
- return items.get(itemIndex);
- }
-
- public static Builder build() {
- return new BuilderImpl();
- }
-
- public static BitSet readData(byte[] data) {
- return BitSet.valueOf(data);
- }
-
- public interface Builder {
- public Builder set(Yasf... items);
- public Builder clear(Yasf... items);
- public TaggedComponent tc();
- public ServiceContext sc();
- }
-
- private static final class BuilderImpl implements Builder {
- private final BitSet bits = new BitSet();
-
- BuilderImpl() {}
-
- @Override
- public Builder set(Yasf... items) {
- for (Yasf item: items) {
- bits.set(item.itemIndex);
- }
- return this;
- }
-
- @Override
- public Builder clear(Yasf... items) {
- for (Yasf item: items) {
- bits.clear(item.itemIndex);
- }
- return this;
- }
-
- @Override
- public TaggedComponent tc() {
- return new TaggedComponent(TAG_YOKO_AUXILLIARY_STREAM_FORMAT, bits.toByteArray());
- }
-
- @Override
- public ServiceContext sc() {
- return new ServiceContext(YOKO_AUXIllIARY_STREAM_FORMAT_SC, bits.toByteArray());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfClientInterceptor.java
----------------------------------------------------------------------
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfClientInterceptor.java b/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfClientInterceptor.java
index 8a56c92..dc434a0 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfClientInterceptor.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfClientInterceptor.java
@@ -5,6 +5,8 @@ import java.io.NotSerializableException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import org.apache.yoko.util.yasf.Yasf;
+import org.apache.yoko.util.yasf.YasfThreadLocal;
import org.omg.CORBA.LocalObject;
import org.omg.PortableInterceptor.ClientRequestInfo;
import org.omg.PortableInterceptor.ClientRequestInterceptor;
@@ -15,7 +17,11 @@ public class YasfClientInterceptor extends LocalObject implements ClientRequestI
@Override
public void send_request(ClientRequestInfo ri) throws ForwardRequest {
- ri.add_request_service_context(Yasf.build().sc(), false);
+ byte[] yasfData = YasfHelper.readData(ri);
+
+ YasfThreadLocal.push(Yasf.toSet(yasfData));
+
+ YasfHelper.addSc(ri, Yasf.supported());
}
@Override
@@ -24,14 +30,17 @@ public class YasfClientInterceptor extends LocalObject implements ClientRequestI
@Override
public void receive_reply(ClientRequestInfo ri) {
+ YasfThreadLocal.pop();
}
@Override
public void receive_exception(ClientRequestInfo ri) throws ForwardRequest {
+ YasfThreadLocal.pop();
}
@Override
public void receive_other(ClientRequestInfo ri) throws ForwardRequest {
+ YasfThreadLocal.pop();
}
@Override
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfHelper.java
----------------------------------------------------------------------
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfHelper.java b/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfHelper.java
new file mode 100644
index 0000000..d652a2e
--- /dev/null
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfHelper.java
@@ -0,0 +1,87 @@
+package org.apache.yoko.orb.yasf;
+
+import org.apache.yoko.util.yasf.Yasf;
+import org.omg.CORBA.Any;
+import org.omg.CORBA.BAD_PARAM;
+import org.omg.CORBA.INTERNAL;
+import org.omg.CORBA.ORB;
+import org.omg.IOP.ServiceContext;
+import org.omg.IOP.TaggedComponent;
+import org.omg.PortableInterceptor.ClientRequestInfo;
+import org.omg.PortableInterceptor.IORInfo;
+import org.omg.PortableInterceptor.InvalidSlot;
+import org.omg.PortableInterceptor.ServerRequestInfo;
+
+import java.util.Set;
+
+import static org.apache.yoko.orb.OB.MinorCodes.MinorInvalidComponentId;
+import static org.apache.yoko.orb.OB.MinorCodes.MinorInvalidServiceContextId;
+
+/**
+ * Created by nrichard on 23/03/16.
+ */
+public enum YasfHelper {
+ ;
+
+ public static void addTc(IORInfo info, Set<Yasf> set) {
+ TaggedComponent tc = new TaggedComponent(Yasf.TAG_YOKO_AUXILLIARY_STREAM_FORMAT, Yasf.toData(set));
+ info.add_ior_component(tc);
+ }
+
+ private static ServiceContext sc(Set<Yasf> set) {
+ return new ServiceContext(Yasf.YOKO_AUXIllIARY_STREAM_FORMAT_SC, Yasf.toData(set));
+ }
+
+ public static void addSc(ClientRequestInfo ri, Set<Yasf> set) {
+ ServiceContext sc = sc(set);
+ ri.add_request_service_context(sc, false);
+ }
+
+ public static void addSc(ServerRequestInfo ri, Set<Yasf> set) {
+ ServiceContext sc = sc(set);
+ ri.add_reply_service_context(sc, false);
+ }
+
+ public static byte[] readData(ClientRequestInfo ri) {
+ try {
+ TaggedComponent tc = ri.get_effective_component(Yasf.TAG_YOKO_AUXILLIARY_STREAM_FORMAT);
+ return tc.component_data;
+ } catch (BAD_PARAM e) {
+ if (e.minor != MinorInvalidComponentId) {
+ throw e;
+ }
+ }
+ return null;
+ }
+
+ public static byte[] readData(ServerRequestInfo ri) {
+ try {
+ ServiceContext sc = ri.get_request_service_context(Yasf.YOKO_AUXIllIARY_STREAM_FORMAT_SC);
+ return sc.context_data;
+ } catch (BAD_PARAM e) {
+ if (e.minor != MinorInvalidServiceContextId) {
+ throw e;
+ }
+ }
+ return null;
+ }
+
+ public static void setSlot(int slotId, ServerRequestInfo ri, byte[] data) {
+ Any any = ORB.init().create_any();
+ any.insert_Value(data);
+ try {
+ ri.set_slot(slotId, any);
+ } catch (InvalidSlot e) {
+ throw (INTERNAL)(new INTERNAL(e.getMessage())).initCause(e);
+ }
+ }
+
+ public static byte[] getSlot(int slotId, ServerRequestInfo ri) {
+ try {
+ Any any = ri.get_slot(slotId);
+ return (byte[])any.extract_Value();
+ } catch (InvalidSlot e) {
+ throw (INTERNAL)(new INTERNAL(e.getMessage())).initCause(e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfIORInterceptor.java
----------------------------------------------------------------------
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfIORInterceptor.java b/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfIORInterceptor.java
index 68ef43e..ec3976a 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfIORInterceptor.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfIORInterceptor.java
@@ -5,6 +5,7 @@ import java.io.NotSerializableException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import org.apache.yoko.util.yasf.Yasf;
import org.omg.CORBA.LocalObject;
import org.omg.PortableInterceptor.IORInfo;
import org.omg.PortableInterceptor.IORInterceptor;
@@ -14,7 +15,7 @@ public class YasfIORInterceptor extends LocalObject implements IORInterceptor {
@Override
public void establish_components(IORInfo info) {
- info.add_ior_component(Yasf.build().tc());
+ YasfHelper.addTc(info, Yasf.supported());
}
@Override
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfServerInterceptor.java
----------------------------------------------------------------------
diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfServerInterceptor.java b/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfServerInterceptor.java
index f5d5bd1..352d70e 100644
--- a/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfServerInterceptor.java
+++ b/yoko-core/src/main/java/org/apache/yoko/orb/yasf/YasfServerInterceptor.java
@@ -5,6 +5,8 @@ import java.io.NotSerializableException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import org.apache.yoko.util.yasf.Yasf;
+import org.apache.yoko.util.yasf.YasfThreadLocal;
import org.omg.CORBA.LocalObject;
import org.omg.PortableInterceptor.ForwardRequest;
import org.omg.PortableInterceptor.ServerRequestInfo;
@@ -13,8 +15,17 @@ import org.omg.PortableInterceptor.ServerRequestInterceptor;
public class YasfServerInterceptor extends LocalObject implements ServerRequestInterceptor {
private static final String NAME = YasfServerInterceptor.class.getName();
+ private final int slotId;
+
+ public YasfServerInterceptor(int slotId) {
+ this.slotId = slotId;
+ }
+
@Override
public void receive_request_service_contexts(ServerRequestInfo ri) throws ForwardRequest {
+ YasfThreadLocal.reset();
+ byte[] yasfData = YasfHelper.readData(ri);
+ YasfHelper.setSlot(slotId, ri, yasfData);
}
@Override
@@ -23,17 +34,23 @@ public class YasfServerInterceptor extends LocalObject implements ServerRequestI
@Override
public void send_reply(ServerRequestInfo ri) {
- ri.add_reply_service_context(Yasf.build().sc(), false);
+ YasfThreadLocal.push(Yasf.toSet(YasfHelper.getSlot(slotId, ri)));
+ // Adding for diagnostic purposes
+ YasfHelper.addSc(ri, Yasf.supported());
}
@Override
public void send_exception(ServerRequestInfo ri) throws ForwardRequest {
- ri.add_reply_service_context(Yasf.build().sc(), false);
+ YasfThreadLocal.push(Yasf.toSet(YasfHelper.getSlot(slotId, ri)));
+ // Adding for diagnostic purposes
+ YasfHelper.addSc(ri, Yasf.supported());
}
@Override
public void send_other(ServerRequestInfo ri) throws ForwardRequest {
- ri.add_reply_service_context(Yasf.build().sc(), false);
+ YasfThreadLocal.push(Yasf.toSet(YasfHelper.getSlot(slotId, ri)));
+ // Adding for diagnostic purposes
+ YasfHelper.addSc(ri, Yasf.supported());
}
@Override
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumDescriptor.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumDescriptor.java
index 5c35933..44e692c 100644
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumDescriptor.java
@@ -18,13 +18,20 @@
package org.apache.yoko.rmi.impl;
+import org.apache.yoko.util.yasf.Yasf;
+import org.apache.yoko.util.yasf.YasfThreadLocal;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Set;
+
class EnumDescriptor extends ValueDescriptor {
public EnumDescriptor(Class<?> type, TypeRepository repo) {
super(type, repo);
}
@Override
- final long getSerialVersionUID() {
+ protected final long getSerialVersionUID() {
return 0L;
}
@@ -33,15 +40,29 @@ class EnumDescriptor extends ValueDescriptor {
return true;
}
+ private FieldDescriptor nameField = null;
+ private FieldDescriptor ordinalField = null;
+
@Override
public final void init() {
super.init();
- FieldDescriptor[] newFields = new FieldDescriptor[1];
- for (FieldDescriptor field: _fields) {
- if (!!!field.java_name.equals("name")) continue;
- newFields[0] = field;
- break;
+ // Avoid doing anything that would cause the calculated classHash to change
+ for (FieldDescriptor f: _fields) {
+ if (f.java_name.equals("name")) {
+ nameField = f;
+ } else if (f.java_name.equals("ordinal")) {
+ ordinalField = f;
+ }
+ }
+ }
+
+ @Override
+ protected void defaultWriteValue(ObjectWriter writer, Serializable val) throws IOException {
+ checkInit();
+ if ((writer.yasfSet != null) && !!!writer.yasfSet.contains(Yasf.ENUM_FIXED)) {
+ // talking to an old yoko that expects an ordinal field to be written;
+ ordinalField.write(writer, val);
}
- _fields = newFields;
+ nameField.write(writer, val);
}
}
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumSubclassDescriptor.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumSubclassDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumSubclassDescriptor.java
index 4f5a67f..12c34c6 100644
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumSubclassDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/EnumSubclassDescriptor.java
@@ -22,6 +22,7 @@ import java.io.IOException;
import java.io.Serializable;
import java.util.Map;
+import org.apache.yoko.rmi.util.StringUtil;
import org.omg.CORBA.portable.IndirectionException;
import org.omg.CORBA.portable.InputStream;
@@ -43,11 +44,11 @@ class EnumSubclassDescriptor extends ValueDescriptor {
@Override
public final void init() {
super.init();
- _fields = new FieldDescriptor[0];
+ // Avoid doing anything that would cause the calculated classHash to change
}
@Override
- final long getSerialVersionUID() {
+ protected final long getSerialVersionUID() {
return 0L;
}
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java
index 806028a..a3fd62e 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ModelElement.java
@@ -37,7 +37,7 @@ abstract class ModelElement {
protected abstract String genIDLName();
final void checkInit() {
- if (notInit) throw new IllegalStateException("Not initialized");
+ if (notInit) throw new IllegalStateException("Not initialized: " + java_name);
}
public String getIDLName() {
checkInit();
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ObjectWriter.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ObjectWriter.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ObjectWriter.java
index 6a14da2..9d9a5f5 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ObjectWriter.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ObjectWriter.java
@@ -28,8 +28,11 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
import org.apache.yoko.util.cmsf.CmsfThreadLocal;
+import org.apache.yoko.util.yasf.Yasf;
+import org.apache.yoko.util.yasf.YasfThreadLocal;
abstract class ObjectWriter extends ObjectOutputStream {
protected final Serializable object;
@@ -40,7 +43,8 @@ abstract class ObjectWriter extends ObjectOutputStream {
private WriteObjectState state = WriteObjectState.NOT_IN_WRITE_OBJECT;
- private byte streamFormatVersion = 1;
+ final byte cmsf;
+ final Set<Yasf> yasfSet;
private enum WriteObjectState {
NOT_IN_WRITE_OBJECT {
@@ -58,7 +62,7 @@ abstract class ObjectWriter extends ObjectOutputStream {
// If we're in stream format version 2, we must
// put the "null" marker to say that there isn't
// any optional data
- if (writer.getStreamFormatVersion() == 2) {
+ if (writer.cmsf == 2) {
writer._nullValue();
}
}
@@ -74,7 +78,7 @@ abstract class ObjectWriter extends ObjectOutputStream {
// writeDefaultObject was not invoked
writer.writeBoolean(false);
- if (writer.getStreamFormatVersion() == 2) {
+ if (writer.cmsf == 2) {
writer._startValue(writer._desc.getCustomRepositoryID());
}
}
@@ -92,7 +96,7 @@ abstract class ObjectWriter extends ObjectOutputStream {
// write a null-marker to identify that there is no custom
// state being marshalled...
- if (writer.getStreamFormatVersion() == 2) {
+ if (writer.cmsf == 2) {
writer._nullValue();
}
}
@@ -102,14 +106,14 @@ abstract class ObjectWriter extends ObjectOutputStream {
// been emitted in IN_WRITE_OBJECT.beforeWriteDefaultObject
writer.state = WROTE_CUSTOM_DATA;
- if (writer.getStreamFormatVersion() == 2) {
+ if (writer.cmsf == 2) {
writer._startValue(writer._desc.getCustomRepositoryID());
}
}
},
WROTE_CUSTOM_DATA {
void afterWriteObject(ObjectWriter writer) throws IOException {
- if (writer.getStreamFormatVersion() == 2) {
+ if (writer.cmsf == 2) {
writer._endValue();
}
@@ -144,11 +148,8 @@ abstract class ObjectWriter extends ObjectOutputStream {
ObjectWriter(Serializable obj) throws IOException {
object = obj;
- streamFormatVersion = CmsfThreadLocal.get();
- }
-
- private byte getStreamFormatVersion() {
- return streamFormatVersion;
+ cmsf = CmsfThreadLocal.get();
+ yasfSet = YasfThreadLocal.get();
}
abstract ObjectReader getObjectReader(Object newObject);
@@ -282,7 +283,7 @@ abstract class ObjectWriter extends ObjectOutputStream {
state = WriteObjectState.NOT_IN_WRITE_OBJECT;
try {
setCurrentValueDescriptor(descriptor);
- writeByte(getStreamFormatVersion());
+ writeByte(cmsf);
state.beforeWriteObject(this);
_write_object_method.invoke(val, this);
state.afterWriteObject(this);
@@ -299,7 +300,7 @@ abstract class ObjectWriter extends ObjectOutputStream {
protected abstract void _nullValue() throws IOException;
void invokeWriteExternal(Externalizable externalizable) throws IOException {
- writeByte(getStreamFormatVersion());
+ writeByte(cmsf);
externalizable.writeExternal(this);
}
}
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
index a686f77..65e6465 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
@@ -127,7 +127,7 @@ class ValueDescriptor extends TypeDescriptor {
return _custom_repid;
}
- long getSerialVersionUID() {
+ protected long getSerialVersionUID() {
if (_serial_version_uid_field != null) {
try {
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-util/src/main/java/org/apache/yoko/util/yasf/Yasf.java
----------------------------------------------------------------------
diff --git a/yoko-util/src/main/java/org/apache/yoko/util/yasf/Yasf.java b/yoko-util/src/main/java/org/apache/yoko/util/yasf/Yasf.java
new file mode 100644
index 0000000..616e27e
--- /dev/null
+++ b/yoko-util/src/main/java/org/apache/yoko/util/yasf/Yasf.java
@@ -0,0 +1,43 @@
+package org.apache.yoko.util.yasf;
+
+import java.util.BitSet;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Set;
+
+public enum Yasf {
+ ENUM_FIXED(0);
+
+ // TODO - Get ids from OMG assigned for these values
+ public static final int TAG_YOKO_AUXILLIARY_STREAM_FORMAT = 0xeeeeeeee;
+ public static final int YOKO_AUXIllIARY_STREAM_FORMAT_SC = 0xeeeeeeee;
+
+ public final int itemIndex;
+
+ private Yasf(int itemIndex) {
+ this.itemIndex = itemIndex;
+ }
+
+ public static Set<Yasf> supported() {
+ return Collections.unmodifiableSet(EnumSet.of(ENUM_FIXED));
+ }
+
+ public static Set<Yasf> toSet(byte[] data) {
+ if (data == null) return null;
+ final EnumSet<Yasf> set = EnumSet.noneOf(Yasf.class);
+ BitSet items = BitSet.valueOf(data);
+ for (Yasf yasf : values()) {
+ if (items.get(yasf.itemIndex)) set.add(yasf);
+ }
+ return Collections.unmodifiableSet(set);
+ }
+
+ public static byte[] toData(Set<Yasf> yasfSet) {
+ if (null == yasfSet) return null;
+ final BitSet bits = new BitSet();
+ for (Yasf yasf : yasfSet) {
+ bits.set(yasf.itemIndex);
+ }
+ return bits.toByteArray();
+ }
+}
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/55b7d4f1/yoko-util/src/main/java/org/apache/yoko/util/yasf/YasfThreadLocal.java
----------------------------------------------------------------------
diff --git a/yoko-util/src/main/java/org/apache/yoko/util/yasf/YasfThreadLocal.java b/yoko-util/src/main/java/org/apache/yoko/util/yasf/YasfThreadLocal.java
new file mode 100644
index 0000000..6cb897b
--- /dev/null
+++ b/yoko-util/src/main/java/org/apache/yoko/util/yasf/YasfThreadLocal.java
@@ -0,0 +1,87 @@
+package org.apache.yoko.util.yasf;
+
+import java.util.BitSet;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public final class YasfThreadLocal {
+ private static final Logger LOGGER = Logger.getLogger(YasfThreadLocal.class.getName());
+ private static final ThreadLocal<YasfInfo> yasfInfo = new ThreadLocal<YasfInfo>() {
+ @Override protected YasfInfo initialValue() {
+ return new YasfInfo();
+ }
+ };
+
+ private YasfThreadLocal() {}
+
+ private static final class YasfInfo {
+ public Frame head = Frame.DEFAULT;
+ public boolean override = false;
+ }
+
+ private static final class Frame {
+ static final Frame DEFAULT = new Frame();
+ public final Set<Yasf> value;
+ public final Frame prev;
+
+ private Frame() {
+ this.value = null;
+ this.prev = this;
+ }
+
+ Frame(Set<Yasf> value, Frame prev) {
+ this.value = value;
+ this.prev = prev;
+ }
+ }
+
+ public static final class YasfOverride implements AutoCloseable {
+ private final YasfInfo info;
+
+ YasfOverride(YasfInfo info) {
+ this.info = info;
+ info.override = true;
+ }
+
+ @Override
+ public void close() {
+ info.override = false;
+ }
+ }
+
+ public static YasfOverride override() {
+ return new YasfOverride(yasfInfo.get());
+ }
+
+ public static void push(Set<Yasf> items) {
+ final YasfInfo info = yasfInfo.get();
+ if (LOGGER.isLoggable(Level.FINER))
+ LOGGER.finer(String.format("YASF thread local version pushed onto stack: %s", items));
+ info.head = new Frame(items, info.head);
+ }
+
+ public static Set<Yasf> get() {
+ final YasfInfo info = yasfInfo.get();
+ final boolean override = info.override;
+ final Set<Yasf> items = (override) ? null : info.head.value;
+ if (LOGGER.isLoggable(Level.FINER))
+ LOGGER.finer(String.format("YASF thread local version retrieved: %s, override is %b", items, override));
+ return items;
+ }
+
+ public static Set<Yasf> pop() {
+ final YasfInfo info = yasfInfo.get();
+ final Set<Yasf> items = info.head.value;
+ if (LOGGER.isLoggable(Level.FINER))
+ LOGGER.finer(String.format("YASF thread local version popped from stack: %s", items));
+ info.head = info.head.prev;
+ return items;
+ }
+
+ public static void reset() {
+ if (LOGGER.isLoggable(Level.FINER))
+ LOGGER.finer("YASF thread local stack reset");
+ yasfInfo.remove();
+ }
+}