snichol 2002/07/11 08:45:54 Modified: java/src/org/apache/soap/server/http ServerHTTPUtils.java java/docs changes.html Log: Remove deadlock for a service that in the constructor invokes another service when both services are at application scope. The deadlock still occurs if both services are at session scope. Based on a technique submitted by Adam Moore ([EMAIL PROTECTED]). Revision Changes Path 1.24 +18 -5 xml-soap/java/src/org/apache/soap/server/http/ServerHTTPUtils.java Index: ServerHTTPUtils.java =================================================================== RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/http/ServerHTTPUtils.java,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- ServerHTTPUtils.java 25 Jun 2002 05:16:27 -0000 1.23 +++ ServerHTTPUtils.java 11 Jul 2002 15:45:53 -0000 1.24 @@ -246,7 +246,20 @@ } else if (scope == DeploymentDescriptor.SCOPE_SESSION) { scopeLock = session; } else if (scope == DeploymentDescriptor.SCOPE_APPLICATION) { - scopeLock = context; + try { + scopeLock = ctxt.loadClass(className); + } catch (ClassNotFoundException e) { + String msg; + if (providerType == DeploymentDescriptor.PROVIDER_JAVA || + providerType == DeploymentDescriptor.PROVIDER_USER_DEFINED) { + msg = "Unable to resolve target object at application scope: " + e.getMessage (); + } else { + msg = "Unable to load BSF at application scope: script services not available " + + "without BSF: " + e.getMessage (); + } + throw new SOAPException ( + Constants.FAULT_CODE_SERVER_BAD_TARGET_OBJECT_URI, msg, e); + } } else { throw new SOAPException (Constants.FAULT_CODE_SERVER, "Service uses deprecated object scope " + @@ -264,10 +277,10 @@ // locate (or create) the target object and invoke the method if ( scopeLock == null ) scopeLock = className ; // Just pick something synchronized (scopeLock) { - if (scopeLock == session) { + if (scope == DeploymentDescriptor.SCOPE_SESSION) { // targetObject = session.getAttribute (targetID); targetObject = session.getValue (targetID); - } else if (scopeLock == context) { + } else if (scope == DeploymentDescriptor.SCOPE_APPLICATION) { targetObject = context.getAttribute (targetID); } else { targetObject = null; @@ -295,10 +308,10 @@ // remember the created instance if the scope is not REQUEST; // in that case the object is to be thrown away after handling // the request - if (scopeLock == session) { + if (scope == DeploymentDescriptor.SCOPE_SESSION) { session.putValue (targetID, targetObject); // session.setAttribute (targetID, targetObject); - } else if (scopeLock == context) { + } else if (scope == DeploymentDescriptor.SCOPE_APPLICATION) { context.setAttribute (targetID, targetObject); } } catch (Exception e) { 1.32 +3 -0 xml-soap/java/docs/changes.html Index: changes.html =================================================================== RCS file: /home/cvs/xml-soap/java/docs/changes.html,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- changes.html 28 Jun 2002 03:07:35 -0000 1.31 +++ changes.html 11 Jul 2002 15:45:54 -0000 1.32 @@ -46,6 +46,9 @@ multi-reference serialization is supported. Added a sample to demonstrate serialization and deserialization of a cyclic graph of beans.</li> + <li>Remove deadlock for a service that in the constructor invokes + another service when both services are at application scope. The + deadlock still occurs if both services are at session scope.</li> </ul> </li> </ul>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>