summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorMichi Henning <michi@zeroc.com>2007-11-05 23:43:07 +1000
committerMichi Henning <michi@zeroc.com>2007-11-05 23:43:07 +1000
commita2a5af41c5274fa7e254558841c1367d07a445d4 (patch)
treea7ede915600cc8dcb0df48c535bd602ec225e95c /java/src
parentFixed bug I introduced with the sequence mapping changes that caused (diff)
downloadice-a2a5af41c5274fa7e254558841c1367d07a445d4.tar.bz2
ice-a2a5af41c5274fa7e254558841c1367d07a445d4.tar.xz
ice-a2a5af41c5274fa7e254558841c1367d07a445d4.zip
Bug 2522 for C++ and Java.
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Ice/_ObjectDelD.java98
-rw-r--r--java/src/IceInternal/Direct.java14
-rw-r--r--java/src/IceInternal/Incoming.java69
-rw-r--r--java/src/IceInternal/IncomingAsync.java25
-rw-r--r--java/src/IceInternal/LocalExceptionWrapper.java35
5 files changed, 200 insertions, 41 deletions
diff --git a/java/src/Ice/_ObjectDelD.java b/java/src/Ice/_ObjectDelD.java
index c99eefc5dec..9000d0b356d 100644
--- a/java/src/Ice/_ObjectDelD.java
+++ b/java/src/Ice/_ObjectDelD.java
@@ -20,7 +20,10 @@ public class _ObjectDelD implements _ObjectDel
final BooleanHolder __result = new BooleanHolder();
- IceInternal.Direct __direct = new IceInternal.Direct(__current)
+ IceInternal.Direct __direct = null;
+ try
+ {
+ __direct = new IceInternal.Direct(__current)
{
public DispatchStatus run(Ice.Object __servant)
{
@@ -28,6 +31,11 @@ public class _ObjectDelD implements _ObjectDel
return DispatchStatus.DispatchOK;
}
};
+ }
+ catch(Throwable __ex)
+ {
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
+ }
try
{
@@ -35,14 +43,22 @@ public class _ObjectDelD implements _ObjectDel
assert __status == DispatchStatus.DispatchOK;
return __result.value;
}
- catch(Ice.LocalException __ex)
+ catch(java.lang.Throwable __ex)
{
- throw new IceInternal.LocalExceptionWrapper(__ex, false);
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
}
finally
{
- __direct.destroy();
+ try
+ {
+ __direct.destroy();
+ }
+ catch(Throwable __ex)
+ {
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
+ }
}
+ return false; // Keep compiler happy.
}
public void
@@ -52,7 +68,10 @@ public class _ObjectDelD implements _ObjectDel
final Current __current = new Current();
__initCurrent(__current, "ice_ping", OperationMode.Nonmutating, __context);
- IceInternal.Direct __direct = new IceInternal.Direct(__current)
+ IceInternal.Direct __direct = null;
+ try
+ {
+ __direct = new IceInternal.Direct(__current)
{
public DispatchStatus run(Ice.Object __servant)
{
@@ -60,19 +79,31 @@ public class _ObjectDelD implements _ObjectDel
return DispatchStatus.DispatchOK;
}
};
+ }
+ catch(Ice.UserException __ex)
+ {
+ throw new IceInternal.LocalExceptionWrapper(new Ice.UnknownUserException(__ex.toString()), false);
+ }
try
{
DispatchStatus __status = __direct.servant().__collocDispatch(__direct);
assert __status == DispatchStatus.DispatchOK;
}
- catch(Ice.LocalException __ex)
+ catch(Throwable __ex)
{
- throw new IceInternal.LocalExceptionWrapper(__ex, false);
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
}
finally
{
- __direct.destroy();
+ try
+ {
+ __direct.destroy();
+ }
+ catch(Throwable __ex)
+ {
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
+ }
}
}
@@ -85,28 +116,46 @@ public class _ObjectDelD implements _ObjectDel
final Ice.StringSeqHolder __result = new Ice.StringSeqHolder();
- IceInternal.Direct __direct = new IceInternal.Direct(__current)
+ IceInternal.Direct __direct = null;
+ try
+ {
+ __direct = new IceInternal.Direct(__current)
{
+
public DispatchStatus run(Ice.Object __servant)
{
__result.value = __servant.ice_ids(__current);
return DispatchStatus.DispatchOK;
}
};
+ }
+ catch(Throwable __ex)
+ {
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
+ }
+
try
{
DispatchStatus __status = __direct.servant().__collocDispatch(__direct);
assert __status == DispatchStatus.DispatchOK;
return __result.value;
}
- catch(Ice.LocalException __ex)
+ catch(Throwable __ex)
{
- throw new IceInternal.LocalExceptionWrapper(__ex, false);
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
}
finally
{
- __direct.destroy();
+ try
+ {
+ __direct.destroy();
+ }
+ catch(Throwable __ex)
+ {
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
+ }
}
+ return __result.value; // Keep compiler happy.
}
public String
@@ -118,7 +167,10 @@ public class _ObjectDelD implements _ObjectDel
final Ice.StringHolder __result = new Ice.StringHolder();
- IceInternal.Direct __direct = new IceInternal.Direct(__current)
+ IceInternal.Direct __direct = null;
+ try
+ {
+ __direct = new IceInternal.Direct(__current)
{
public DispatchStatus run(Ice.Object __servant)
{
@@ -126,20 +178,34 @@ public class _ObjectDelD implements _ObjectDel
return DispatchStatus.DispatchOK;
}
};
+ }
+ catch(Throwable __ex)
+ {
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
+ }
+
try
{
DispatchStatus __status = __direct.servant().__collocDispatch(__direct);
assert __status == DispatchStatus.DispatchOK;
return __result.value;
}
- catch(Ice.LocalException __ex)
+ catch(Throwable __ex)
{
- throw new IceInternal.LocalExceptionWrapper(__ex, false);
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
}
finally
{
- __direct.destroy();
+ try
+ {
+ __direct.destroy();
+ }
+ catch(Throwable __ex)
+ {
+ IceInternal.LocalExceptionWrapper.throwUnknownWrapper(__ex);
+ }
}
+ return __result.value; // Keep compiler happy.
}
public boolean
diff --git a/java/src/IceInternal/Direct.java b/java/src/IceInternal/Direct.java
index 6fc57c275ee..a25b395b60d 100644
--- a/java/src/IceInternal/Direct.java
+++ b/java/src/IceInternal/Direct.java
@@ -25,7 +25,7 @@ public abstract class Direct implements Ice.Request
public
- Direct(Ice.Current current)
+ Direct(Ice.Current current) throws Ice.UserException
{
_current = current;
@@ -57,7 +57,15 @@ public abstract class Direct implements Ice.Request
if(_locator != null)
{
_cookie = new Ice.LocalObjectHolder(); // Lazy creation.
- _servant = _locator.locate(_current, _cookie);
+ try
+ {
+ _servant = _locator.locate(_current, _cookie);
+ }
+ catch(Ice.UserException ex)
+ {
+ adapter.decDirectCount();
+ throw ex;
+ }
}
}
if(_servant == null)
@@ -98,7 +106,7 @@ public abstract class Direct implements Ice.Request
}
public void
- destroy()
+ destroy() throws Ice.UserException
{
Ice.ObjectAdapterI adapter = (Ice.ObjectAdapterI)_current.adapter;
assert(adapter != null);
diff --git a/java/src/IceInternal/Incoming.java b/java/src/IceInternal/Incoming.java
index 8a07df1c3fb..1200223cada 100644
--- a/java/src/IceInternal/Incoming.java
+++ b/java/src/IceInternal/Incoming.java
@@ -138,7 +138,15 @@ final public class Incoming extends IncomingBase implements Ice.Request
}
if(_locator != null)
{
- _servant = _locator.locate(_current, _cookie);
+ try
+ {
+ _servant = _locator.locate(_current, _cookie);
+ }
+ catch(Ice.UserException ex)
+ {
+ _os.writeUserException(ex);
+ replyStatus = ReplyStatus.replyUserException;
+ }
}
}
if(_servant == null)
@@ -146,27 +154,38 @@ final public class Incoming extends IncomingBase implements Ice.Request
_locator = servantManager.findServantLocator("");
if(_locator != null)
{
- _servant = _locator.locate(_current, _cookie);
+ try
+ {
+ _servant = _locator.locate(_current, _cookie);
+ }
+ catch(Ice.UserException ex)
+ {
+ _os.writeUserException(ex);
+ replyStatus = ReplyStatus.replyUserException;
+ }
}
}
}
- if(_servant == null)
+ if(replyStatus == ReplyStatus.replyOK)
{
- if(servantManager != null && servantManager.hasServant(_current.id))
+ if(_servant == null)
{
- replyStatus = ReplyStatus.replyFacetNotExist;
+ if(servantManager != null && servantManager.hasServant(_current.id))
+ {
+ replyStatus = ReplyStatus.replyFacetNotExist;
+ }
+ else
+ {
+ replyStatus = ReplyStatus.replyObjectNotExist;
+ }
}
else
{
- replyStatus = ReplyStatus.replyObjectNotExist;
- }
- }
- else
- {
- dispatchStatus = _servant.__dispatch(this, _current);
- if(dispatchStatus == Ice.DispatchStatus.DispatchUserException)
- {
- replyStatus = ReplyStatus.replyUserException;
+ dispatchStatus = _servant.__dispatch(this, _current);
+ if(dispatchStatus == Ice.DispatchStatus.DispatchUserException)
+ {
+ replyStatus = ReplyStatus.replyUserException;
+ }
}
}
}
@@ -174,16 +193,24 @@ final public class Incoming extends IncomingBase implements Ice.Request
{
if(_locator != null && _servant != null && dispatchStatus != Ice.DispatchStatus.DispatchAsync)
{
- _locator.finished(_current, _servant, _cookie.value);
+ try
+ {
+ _locator.finished(_current, _servant, _cookie.value);
+ }
+ catch(Ice.UserException ex)
+ {
+ //
+ // The operation may have already marshaled a reply; we must overwrite that reply.
+ //
+ _os.endWriteEncaps();
+ _os.resize(Protocol.headerSize + 5, false); // Byte following reply status.
+ _os.startWriteEncaps();
+ _os.writeUserException(ex);
+ replyStatus = ReplyStatus.replyUserException; // Code below inserts the reply status.
+ }
}
}
}
- /* Not possible in Java - UserExceptions are checked exceptions
- catch(Ice.UserException ex)
- {
- // ...
- }
- */
catch(java.lang.Exception ex)
{
_is.endReadEncaps();
diff --git a/java/src/IceInternal/IncomingAsync.java b/java/src/IceInternal/IncomingAsync.java
index acd29aeb375..3f774697137 100644
--- a/java/src/IceInternal/IncomingAsync.java
+++ b/java/src/IceInternal/IncomingAsync.java
@@ -113,7 +113,30 @@ public class IncomingAsync extends IncomingBase
{
if(_locator != null && _servant != null)
{
- _locator.finished(_current, _servant, _cookie.value);
+ try
+ {
+ _locator.finished(_current, _servant, _cookie.value);
+ }
+ catch(Ice.UserException ex)
+ {
+ // The operation may have already marshaled a reply; we must overwrite that reply.
+ //
+ if(_response)
+ {
+ _os.endWriteEncaps();
+ _os.resize(Protocol.headerSize + 4, false); // Reply status position.
+ _os.writeByte(ReplyStatus.replyUserException);
+ _os.startWriteEncaps();
+ _os.writeUserException(ex);
+ _os.endWriteEncaps();
+ _connection.sendResponse(_os, _compress);
+ }
+ else
+ {
+ _connection.sendNoResponse();
+ }
+ return false;
+ }
}
return true;
}
diff --git a/java/src/IceInternal/LocalExceptionWrapper.java b/java/src/IceInternal/LocalExceptionWrapper.java
index 8c9fbf976c6..36d99f391b7 100644
--- a/java/src/IceInternal/LocalExceptionWrapper.java
+++ b/java/src/IceInternal/LocalExceptionWrapper.java
@@ -44,6 +44,41 @@ public class LocalExceptionWrapper extends Exception
return _retry;
}
+ public static void
+ throwUnknownWrapper(java.lang.Throwable ex) throws LocalExceptionWrapper
+ {
+ if(ex instanceof Ice.UserException)
+ {
+ throw new LocalExceptionWrapper(new Ice.UnknownUserException(ex.toString()), false);
+ }
+ if(ex instanceof Ice.LocalException)
+ {
+ /*
+ //
+ // Commented-out code makes local exceptions fully location transparent,
+ // but the Freeze evictor relies on them not being transparent.
+ //
+ if(ex instanceof Ice.UnknownException ||
+ ex instanceof Ice.ObjectNotExistException ||
+ ex instanceof Ice.OperationNotExistException ||
+ ex instanceof Ice.FacetNotExistException)
+ {
+ throw new LocalExceptionWrapper((Ice.LocalException)ex, false);
+ }
+ throw new LocalExceptionWrapper(new Ice.UnknownLocalException(ex.toString()), false);
+ */
+ throw new LocalExceptionWrapper((Ice.LocalException)ex, false);
+ }
+ /*
+ throw new LocalExceptionWrapper(new Ice.UnknownException(ex.toString()), false);
+ */
+
+ if(ex instanceof RuntimeException)
+ {
+ throw (RuntimeException)ex;
+ }
+ }
+
private Ice.LocalException _ex;
private boolean _retry;
}