diff options
author | Michi Henning <michi@zeroc.com> | 2007-11-05 23:43:07 +1000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2007-11-05 23:43:07 +1000 |
commit | a2a5af41c5274fa7e254558841c1367d07a445d4 (patch) | |
tree | a7ede915600cc8dcb0df48c535bd602ec225e95c /java/src | |
parent | Fixed bug I introduced with the sequence mapping changes that caused (diff) | |
download | ice-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.java | 98 | ||||
-rw-r--r-- | java/src/IceInternal/Direct.java | 14 | ||||
-rw-r--r-- | java/src/IceInternal/Incoming.java | 69 | ||||
-rw-r--r-- | java/src/IceInternal/IncomingAsync.java | 25 | ||||
-rw-r--r-- | java/src/IceInternal/LocalExceptionWrapper.java | 35 |
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; } |