diff options
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/IceInternal/BasicStream.java | 50 | ||||
-rw-r--r-- | java/src/IceInternal/Instance.java | 23 |
2 files changed, 44 insertions, 29 deletions
diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java index 7ca5ab9e4ac..5d0006dcb07 100644 --- a/java/src/IceInternal/BasicStream.java +++ b/java/src/IceInternal/BasicStream.java @@ -2645,34 +2645,18 @@ public class BasicStream { UserExceptionFactory factory = null; - synchronized(_factoryMutex) - { - factory = _exceptionFactories.get(id); - } - - if(factory == null) + try { - try - { - Class<?> c = findClass(id); - if(c != null) - { - factory = new DynamicUserExceptionFactory(c); - } - } - catch(LinkageError ex) - { - throw new Ice.MarshalException(ex); - } - - if(factory != null) + Class<?> c = findClass(id); + if(c != null) { - synchronized(_factoryMutex) - { - _exceptionFactories.put(id, factory); - } + factory = new DynamicUserExceptionFactory(c); } } + catch(LinkageError ex) + { + throw new Ice.MarshalException(ex); + } return factory; } @@ -2693,7 +2677,14 @@ public class BasicStream // 3. If that fails, check for an Ice.Default.Package property. If found, // prepend the property value to the classname. // - String className = typeToClass(id); + String className = _instance.getClassForType(id); + boolean addClass = false; + if(className == null) + { + className = typeToClass(id); + addClass = true; + } + c = getConcreteClass(className); if(c == null) { @@ -2718,6 +2709,11 @@ public class BasicStream } } + if(c != null && addClass) + { + _instance.addClassForType(id, c.getName()); + } + return c; } @@ -4263,10 +4259,6 @@ public class BasicStream private static final byte FLAG_HAS_SLICE_SIZE = (byte)(1<<4); private static final byte FLAG_IS_LAST_SLICE = (byte)(1<<5); - private static java.util.HashMap<String, UserExceptionFactory> _exceptionFactories = - new java.util.HashMap<String, UserExceptionFactory>(); - private static java.lang.Object _factoryMutex = new java.lang.Object(); // Protects _exceptionFactories. - private static boolean _checkedBZip2 = false; private static java.lang.reflect.Constructor<?> _bzInputStreamCtor; private static java.lang.reflect.Constructor<?> _bzOutputStreamCtor; diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java index 4bfe313538f..1f81029f920 100644 --- a/java/src/IceInternal/Instance.java +++ b/java/src/IceInternal/Instance.java @@ -590,6 +590,25 @@ public final class Instance return Util.findClass(className, _initData.classLoader); } + public synchronized String + getClassForType(String type) + { + return _typeToClassMap.get(type); + } + + public synchronized void + addClassForType(String type, String className) + { + if(_typeToClassMap.containsKey(type)) + { + assert(_typeToClassMap.get(type).equals(className)); + } + else + { + _typeToClassMap.put(type, className); + } + } + // // Only for use by Ice.CommunicatorI // @@ -1069,6 +1088,8 @@ public final class Instance _adminAdapter = null; _adminFacets.clear(); + _typeToClassMap.clear(); + _state = StateDestroyed; } @@ -1169,5 +1190,7 @@ public final class Instance private java.util.Set<String> _adminFacetFilter = new java.util.HashSet<String>(); private Ice.Identity _adminIdentity; + private java.util.Map<String, String> _typeToClassMap = new java.util.HashMap<String, String>(); + private static boolean _oneOffDone = false; } |