summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/IceInternal/BasicStream.java50
-rw-r--r--java/src/IceInternal/Instance.java23
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;
}