Author: dasarath
Date: Thu May 24 12:50:26 2007
New Revision: 541406

URL: http://svn.apache.org/viewvc?view=rev&rev=541406
Log:
patch from Hannes,

* Mediator: fix getStatus() NullPointerEx when there is no transaction 
going on by checking this.tx != null before invoking this.tx.getStatus()

* Cancel timeout timertasks when CallbackRegistry.remove() is called, so 
no timeouts occur after correct teardowns (CallbackRegistry)

* TransactionImpl now invokes notifyAll() instead of notify() to make 
sure all waiting threads will be unlocked

* Changed the invocation of prefactured SOAP-Errors from static fields 
to small methods, so the stack trace current when creating the fault may 
be given out to aid troubleshooters. Without this change, the caller 
only gets the trace until where the fault is thrown, which may be a very 
different place than were it is created.

* Moved constant Participant_REF from ATCoordinator to Coordinator (is 
reused in WSBA components) and promoted Coordinator from Interface to a 
class (otherwise one couldn't define these Fault creating methods...)

Modified:
    
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CallbackRegistry.java
    
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CoordinationService.java
    
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/Coordinator.java
    
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CoordinatorImpl.java
    
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/ATCoordinator.java
    
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/ATCoordinatorImpl.java
    
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/AbstractParticipant.java
    
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/TransactionImpl.java
    
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/geronimo/Mediator.java

Modified: 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CallbackRegistry.java
URL: 
http://svn.apache.org/viewvc/webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CallbackRegistry.java?view=diff&rev=541406&r1=541405&r2=541406
==============================================================================
--- 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CallbackRegistry.java
 (original)
+++ 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CallbackRegistry.java
 Thu May 24 12:50:26 2007
@@ -23,18 +23,34 @@
 public class CallbackRegistry {
 
        public static final QName CALLBACK_REF = new QName(
-                       "http://ws.apache.org/kandula";, "CallbackRef");
+                       "http://ws.apache.org/kandula";, "CallbackRef"
+       );
 
-       // FIXME:
+       public static final QName CALLBACK_REF_PARTICIPANT = new QName(
+                       "http://ws.apache.org/kandula";, "ParticipantRef"
+       );
+
+       // FIXME _ALL_ Make default callback timeout configurable
        public static final int DEFAULT_TIMEOUT_MILLIS = 20 * 1000;
 
        private static Timer timer = new Timer();
 
        private static final CallbackRegistry instance = new CallbackRegistry();
 
+       /**
+        * This map maintains the CallbackID-->Callback association.
+        */
        private Map callbacks = new HashMap();
+       
+       /**
+        * This map maintains the CallbackID-->Timertask association.
+        *
+        */
+       private Map timertasks = new HashMap();
 
+       
        protected CallbackRegistry() {
+               // Empty constructor
        }
 
        public static CallbackRegistry getInstance() {
@@ -42,40 +58,60 @@
        }
 
        public synchronized void registerCallback(Callback callback) {
-               callbacks.put(callback.getID(), callback);
+               this.callbacks.put(callback.getID(), callback);
        }
 
-       public synchronized void registerCallback(final Callback callback,
-                       long timeout) {
-               callbacks.put(callback.getID(), callback);
-
+       public synchronized void registerCallback(
+                       final Callback callback,
+                       final long timeout
+       ) {
+               final String callbackID = callback.getID();
+               
+               final long myTimeout; 
                if (timeout == 0)
-                       timeout = DEFAULT_TIMEOUT_MILLIS;
+                       myTimeout = DEFAULT_TIMEOUT_MILLIS;
+               else
+                       myTimeout = timeout;
 
                System.out.println("[CallbackRegistry] registerCallback: 
timeout= "
                                + timeout + " callbacks.size= " + 
callbacks.size());
 
-               timer.schedule(new TimerTask() {
+               final TimerTask task = new TimerTask() {
+
                        public void run() {
-                               callbacks.remove(callback.getID());
+                               final Object removed = 
CallbackRegistry.this.callbacks.remove(callbackID);
                                try {
-                                       callback.timeout();
+                                       // If nothing was removed, don't invoke 
any event handlers 
+                                       if (removed == null)
+                                               
System.out.println("CallbackRegistry: nothing found to remove for callback 
"+callbackID+" after timeout");
+                                       else
+                                               ((Callback) removed).timeout();
+                                               
                                } catch (TimedOutException e) {
                                        //      e.printStackTrace();
                                }
                        }
-               }, timeout);
+               };
+               timer.schedule(task, myTimeout);
+               
+               this.callbacks.put (callbackID, callback);
+               this.timertasks.put(callbackID, task);
        }
 
-       public synchronized Callback correlateMessage(QName q, boolean 
terminal) {
+       public synchronized Callback correlateMessage(final QName q, final 
boolean terminal) {
                String s = getRef(q);
                if (s == null)
                        return null;
-               else
-                       return (Callback) callbacks.get(s);
+
+               return (Callback) this.callbacks.get(s);
        }
 
-       private String getRef(QName q) {
+       /**
+        * Fetch an addressing header's value.
+        * @param q The QName of the wanted header.
+        * @return The header's value.
+        */
+       public static String getRef(final QName q) {
                AddressingHeaders headers = 
org.apache.kandula.utils.AddressingHeaders.getAddressingHeadersOfCurrentMessage();
                try {
                        return 
headers.getReferenceProperties().get(q).getValue();
@@ -84,7 +120,18 @@
                }
        }
 
-       public synchronized void remove(Callback callback) {
-               callbacks.remove(callback.getID());
+       /**
+        * Remove a callback and cancel the associated timetask.
+        * 
+        * @param callback The callback to remove.
+        */
+       public synchronized void remove(final Callback callback) {
+               System.out.println("CallbackRegistry removed "+callback);
+
+               final TimerTask task = (TimerTask) 
this.timertasks.remove(callback.getID());
+               this.callbacks.remove(callback.getID());
+
+               if (task != null)
+                       task.cancel();
        }
-}
\ No newline at end of file
+}

Modified: 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CoordinationService.java
URL: 
http://svn.apache.org/viewvc/webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CoordinationService.java?view=diff&rev=541406&r1=541405&r2=541406
==============================================================================
--- 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CoordinationService.java
 (original)
+++ 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CoordinationService.java
 Thu May 24 12:50:26 2007
@@ -58,7 +58,7 @@
                        String participantRef) {
                EndpointReference epr = getEndpointReference(context + 
"coordinator", c);
                epr.getProperties().add(
-                       new MessageElement(ATCoordinator.PARTICIPANT_REF, 
participantRef));
+                       new MessageElement(Coordinator.PARTICIPANT_REF, 
participantRef));
                return epr;
        }
 
@@ -76,12 +76,12 @@
                return getEndpointReference(context + "faultDispatcher", 
callback);
        }
 
-       public EndpointReference getFaultDispatcherService(Coordinator callback,
+       public EndpointReference getFaultDispatcherService(Callback callback,
                        String participantRef) {
                EndpointReference epr = getEndpointReference(context
                                + "faultDispatcher", callback);
                epr.getProperties().add(
-                       new MessageElement(ATCoordinator.PARTICIPANT_REF, 
participantRef));
+                       new MessageElement(Coordinator.PARTICIPANT_REF, 
participantRef));
                return epr;
        }
 

Modified: 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/Coordinator.java
URL: 
http://svn.apache.org/viewvc/webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/Coordinator.java?view=diff&rev=541406&r1=541405&r2=541406
==============================================================================
--- 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/Coordinator.java
 (original)
+++ 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/Coordinator.java
 Thu May 24 12:50:26 2007
@@ -13,30 +13,69 @@
  * @author Dasarath Weeratunge
  *  
  */
-public interface Coordinator extends RegistrationPortTypeRPC, Callback {
+public abstract class Coordinator implements RegistrationPortTypeRPC, Callback 
{
 
-       AxisFault ALREADY_REGISTERED_SOAP_FAULT = new AxisFault(
+       public final static QName PARTICIPANT_REF = new QName(
+                       "http://ws.apache.org/kandula";, "ParticipantRef"
+       );
+
+       public static AxisFault ALREADY_REGISTERED_SOAP_FAULT(){
+               return  new AxisFault(
                        new 
QName("http://schemas.xmlsoap.org/ws/2004/10/wscoor";,
                                        "AlreadyRegistered"),
                        "The participant has already registered for the same 
protocol.",
                        null, null);
+       }
 
-       AxisFault INVALID_PROTOCOL_SOAP_FAULT = new AxisFault(new QName(
+       public static AxisFault INVALID_PROTOCOL_SOAP_FAULT(){ 
+               return new AxisFault(new QName(
                        "http://schemas.xmlsoap.org/ws/2004/10/wscoor";, 
"InvalidProtocol"),
                        "The protocol is invalid or is not supported by the 
coordinator.",
                        null, null);
+       }
 
-       AxisFault INVALID_STATE_SOAP_FAULT = new AxisFault(new QName(
+       public static AxisFault INVALID_STATE_SOAP_FAULT(){
+               return  new AxisFault(new QName(
                        "http://schemas.xmlsoap.org/ws/2004/10/wscoor";, 
"InvalidState"),
                        "The message was invalid for the current state of the 
activity.",
                        null, null);
-
-       AxisFault INVALID_PARAMETERS_SOAP_FAULT = new AxisFault(
+       }
+       public static AxisFault INVALID_STATE_SOAP_FAULT(final String 
faultDetail){
+               final AxisFault af = new AxisFault(new QName(
+                       "http://schemas.xmlsoap.org/ws/2004/10/wscoor";, 
"InvalidState"),
+                       "The message was invalid for the current state of the 
activity.",
+                       null, null);
+               
+               af.setFaultDetailString(faultDetail);
+               
+               return af;
+       }
+       
+       public static AxisFault CONTEXT_REFUSED_SOAP_FAULT(){ 
+               return new AxisFault(new QName(
+                       "http://schemas.xmlsoap.org/ws/2004/10/wscoor";, 
"ContextRefused"),
+                       "The coordination context that was provided could not 
be accepted.",
+                       null, null);
+       }
+       
+       public static AxisFault INVALID_PARAMETERS_SOAP_FAULT(){
+               return new AxisFault(
                        new 
QName("http://schemas.xmlsoap.org/ws/2004/10/wscoor";,
                                        "InvalidParameters"),
                        "The message contained invalid parameters and could not 
be processed.",
                        null, null);
-
-       CoordinationContext getCoordinationContext();
-
-}
\ No newline at end of file
+       }
+       public static AxisFault INVALID_PARAMETERS_SOAP_FAULT(final String 
faultDetail){
+               final AxisFault af = new AxisFault(
+                       new 
QName("http://schemas.xmlsoap.org/ws/2004/10/wscoor";,
+                                       "InvalidParameters"),
+                       "The message contained invalid parameters and could not 
be processed.",
+                       null, null);
+               
+               af.setFaultDetailString(faultDetail);
+               
+               return af;
+       }
+       
+       abstract CoordinationContext getCoordinationContext();
+}

Modified: 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CoordinatorImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CoordinatorImpl.java?view=diff&rev=541406&r1=541405&r2=541406
==============================================================================
--- 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CoordinatorImpl.java
 (original)
+++ 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/CoordinatorImpl.java
 Thu May 24 12:50:26 2007
@@ -22,7 +22,7 @@
  * @author Dasarath Weeratunge
  *  
  */
-public abstract class CoordinatorImpl implements Coordinator {
+public abstract class CoordinatorImpl extends Coordinator {
 
        private String id;
 
@@ -57,13 +57,13 @@
                                new 
EndpointReference(params.getParticipantProtocolService()));
 
                } catch (InvalidCoordinationProtocolException e) {
-                       throw INVALID_PROTOCOL_SOAP_FAULT;
+                       throw INVALID_PROTOCOL_SOAP_FAULT();
 
                } catch (IllegalStateException e) {
-                       throw INVALID_STATE_SOAP_FAULT;
+                       throw INVALID_STATE_SOAP_FAULT();
 
                } catch (IllegalArgumentException e) {
-                       throw INVALID_PARAMETERS_SOAP_FAULT;
+                       throw INVALID_PARAMETERS_SOAP_FAULT();
                }
 
                RegisterResponseType r = new RegisterResponseType();

Modified: 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/ATCoordinator.java
URL: 
http://svn.apache.org/viewvc/webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/ATCoordinator.java?view=diff&rev=541406&r1=541405&r2=541406
==============================================================================
--- 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/ATCoordinator.java
 (original)
+++ 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/ATCoordinator.java
 Thu May 24 12:50:26 2007
@@ -16,17 +16,12 @@
  */
 package org.apache.kandula.coordinator.at;
 
-import javax.xml.namespace.QName;
-
-import org.apache.kandula.coordinator.Coordinator;
+import org.apache.kandula.coordinator.Callback;
 import org.apache.kandula.wsat.CompletionCoordinatorPortType;
 import org.apache.kandula.wsat.CoordinatorPortType;
 
-public interface ATCoordinator extends Coordinator, CoordinatorPortType,
-               CompletionCoordinatorPortType {
-
-       final QName PARTICIPANT_REF = new QName("http://ws.apache.org/kandula";,
-                       "ParticipantRef");
+public interface ATCoordinator extends CoordinatorPortType,
+               CompletionCoordinatorPortType, Callback {
 
        final String COORDINATION_TYPE_ID = 
"http://schemas.xmlsoap.org/ws/2004/10/wsat";;
 

Modified: 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/ATCoordinatorImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/ATCoordinatorImpl.java?view=diff&rev=541406&r1=541405&r2=541406
==============================================================================
--- 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/ATCoordinatorImpl.java
 (original)
+++ 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/ATCoordinatorImpl.java
 Thu May 24 12:50:26 2007
@@ -136,7 +136,7 @@
                        return;
 
                case AT2PCStatus.COMMITTING:
-                       trigger(participantRef, INVALID_STATE_SOAP_FAULT);
+                       trigger(participantRef, INVALID_STATE_SOAP_FAULT());
                        return;
 
                case AT2PCStatus.ABORTING:
@@ -156,7 +156,7 @@
                        return;
 
                case AT2PCStatus.COMMITTING:
-                       trigger(participantRef, INVALID_STATE_SOAP_FAULT);
+                       trigger(participantRef, INVALID_STATE_SOAP_FAULT());
                        return;
 
                case AT2PCStatus.ABORTING:
@@ -204,7 +204,7 @@
 
                case AT2PCStatus.NONE:
                        if (volatile2PCParticipants.containsKey(participantRef))
-                               trigger(participantRef, 
INVALID_STATE_SOAP_FAULT);
+                               trigger(participantRef, 
INVALID_STATE_SOAP_FAULT());
                        else {
                                epr = (EndpointReference) 
durable2PCParticipants.get(participantRef);
                                if (epr == null)
@@ -233,7 +233,7 @@
                switch (status) {
                case AT2PCStatus.ACTIVE:
                        try {
-                               trigger(participantRef, 
INVALID_STATE_SOAP_FAULT);
+                               trigger(participantRef, 
INVALID_STATE_SOAP_FAULT());
                        } finally {
                                rollback();
                        }
@@ -263,7 +263,7 @@
 
                case AT2PCStatus.ABORTING:
                        if (volatile2PCParticipants.remove(participantRef) != 
null)
-                               trigger(participantRef, 
INVALID_STATE_SOAP_FAULT);
+                               trigger(participantRef, 
INVALID_STATE_SOAP_FAULT());
                        else {
                                epr = (EndpointReference) 
durable2PCParticipants.remove(participantRef);
                                if (epr == null)
@@ -281,7 +281,7 @@
 
                case AT2PCStatus.NONE:
                        if (volatile2PCParticipants.containsKey(participantRef))
-                               trigger(participantRef, 
INVALID_STATE_SOAP_FAULT);
+                               trigger(participantRef, 
INVALID_STATE_SOAP_FAULT());
                        else {
                                epr = (EndpointReference) 
durable2PCParticipants.get(participantRef);
                                if (epr == null)
@@ -303,7 +303,7 @@
                case AT2PCStatus.PREPARING_VOLATILE:
                case AT2PCStatus.PREPARING_DURABLE:
                        try {
-                               trigger(participantRef, 
INVALID_STATE_SOAP_FAULT);
+                               trigger(participantRef, 
INVALID_STATE_SOAP_FAULT());
                        } finally {
                                rollback();
                        }
@@ -314,7 +314,7 @@
                        return;
 
                case AT2PCStatus.ABORTING:
-                       trigger(participantRef, INVALID_STATE_SOAP_FAULT);
+                       trigger(participantRef, INVALID_STATE_SOAP_FAULT());
                        return;
 
                case AT2PCStatus.NONE:

Modified: 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/AbstractParticipant.java
URL: 
http://svn.apache.org/viewvc/webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/AbstractParticipant.java?view=diff&rev=541406&r1=541405&r2=541406
==============================================================================
--- 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/AbstractParticipant.java
 (original)
+++ 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/AbstractParticipant.java
 Thu May 24 12:50:26 2007
@@ -170,7 +170,7 @@
                        return;
 
                case AT2PCStatus.ABORTING:
-                       throw Coordinator.INVALID_STATE_SOAP_FAULT;
+                       throw Coordinator.INVALID_STATE_SOAP_FAULT();
 
                case AT2PCStatus.COMMITTING:
                }
@@ -201,7 +201,7 @@
                        return;
 
                case AT2PCStatus.COMMITTING:
-                       throw Coordinator.INVALID_STATE_SOAP_FAULT;
+                       throw Coordinator.INVALID_STATE_SOAP_FAULT();
                }
        }
 

Modified: 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/TransactionImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/TransactionImpl.java?view=diff&rev=541406&r1=541405&r2=541406
==============================================================================
--- 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/TransactionImpl.java
 (original)
+++ 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/coordinator/at/TransactionImpl.java
 Thu May 24 12:50:26 2007
@@ -83,21 +83,21 @@
 
                public synchronized void committedOperation(Notification 
parameters) {
                        committed = true;
-                       notify();
+                       notifyAll();
                }
 
                public synchronized void abortedOperation(Notification 
parameters) {
                        aborted = true;
-                       notify();
+                       notifyAll();
                }
 
                public synchronized void timeout() {
                        timedOut = true;
-                       notify();
+                       notifyAll();
                }
 
                public synchronized void onFault(Name code) {
-                       notify();
+                       notifyAll();
                }
 
                public String getID() {
@@ -193,4 +193,4 @@
                        tm.resume(tx);
                }
        }
-}
\ No newline at end of file
+}

Modified: 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/geronimo/Mediator.java
URL: 
http://svn.apache.org/viewvc/webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/geronimo/Mediator.java?view=diff&rev=541406&r1=541405&r2=541406
==============================================================================
--- 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/geronimo/Mediator.java
 (original)
+++ 
webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula/geronimo/Mediator.java
 Thu May 24 12:50:26 2007
@@ -132,6 +132,9 @@
 
        public int getStatus() {
                try {
+                       if (this.tx == null)
+                               return Status.STATUS_NO_TRANSACTION;
+                       
                        switch (tx.getStatus()) {
                        case Status.STATUS_ACTIVE:
                        case Status.STATUS_MARKED_ROLLBACK:



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to