You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fx-dev@ws.apache.org by da...@apache.org on 2007/05/24 21:50:28 UTC

svn commit: r541406 - in /webservices/kandula/branches/Kandula_1/src/java/org/apache/kandula: coordinator/ coordinator/at/ geronimo/

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: kandula-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: kandula-dev-help@ws.apache.org