summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/IceInternal/Incoming.java31
-rw-r--r--java/src/IceInternal/Instance.java11
2 files changed, 33 insertions, 9 deletions
diff --git a/java/src/IceInternal/Incoming.java b/java/src/IceInternal/Incoming.java
index 1c146cad944..1bb01d0ef68 100644
--- a/java/src/IceInternal/Incoming.java
+++ b/java/src/IceInternal/Incoming.java
@@ -208,17 +208,32 @@ final public class Incoming extends IncomingBase implements Ice.Request
{
if(_servant != null)
{
- //
- // DispatchAsync is a "pseudo dispatch status", used internally only
- // to indicate async dispatch.
- //
- if(_servant.__dispatch(this, _current) == Ice.DispatchStatus.DispatchAsync)
+ if(_instance.useServantClassLoader())
+ {
+ Thread.currentThread().setContextClassLoader(_servant.getClass().getClassLoader());
+ }
+
+ try
{
//
- // If this was an asynchronous dispatch, we're done here.
+ // DispatchAsync is a "pseudo dispatch status", used internally only
+ // to indicate async dispatch.
//
- return;
- }
+ if(_servant.__dispatch(this, _current) == Ice.DispatchStatus.DispatchAsync)
+ {
+ //
+ // If this was an asynchronous dispatch, we're done here.
+ //
+ return;
+ }
+ }
+ finally
+ {
+ if(_instance.useServantClassLoader())
+ {
+ Thread.currentThread().setContextClassLoader(null);
+ }
+ }
if(_locator != null && !__servantLocatorFinished())
{
diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java
index 2da2285863f..3f21329b6d9 100644
--- a/java/src/IceInternal/Instance.java
+++ b/java/src/IceInternal/Instance.java
@@ -615,6 +615,12 @@ public final class Instance
return _packages;
}
+ public boolean
+ useServantClassLoader()
+ {
+ return _useServantClassLoader;
+ }
+
//
// Only for use by Ice.CommunicatorI
//
@@ -711,6 +717,8 @@ public final class Instance
_packages = validatePackages();
+ _useServantClassLoader = _initData.properties.getPropertyAsInt("Ice.UseServantClassLoader") > 0;
+
_traceLevels = new TraceLevels(_initData.properties);
_defaultsAndOverrides = new DefaultsAndOverrides(_initData.properties);
@@ -1209,7 +1217,8 @@ public final class Instance
private Ice.Identity _adminIdentity;
private java.util.Map<String, String> _typeToClassMap = new java.util.HashMap<String, String>();
- private String[] _packages;
+ final private String[] _packages;
+ final private boolean _useServantClassLoader;
private static boolean _oneOffDone = false;
}