[overlord-commits] Overlord SVN: r327 - in cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src: java/org/jboss/tools/overlord/cdl/jbossesb/model/actions and 3 other directories.

overlord-commits at lists.jboss.org overlord-commits at lists.jboss.org
Fri Sep 12 12:42:14 EDT 2008


Author: objectiser
Date: 2008-09-12 12:42:14 -0400 (Fri, 12 Sep 2008)
New Revision: 327

Modified:
   cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/DefaultESBLanguageModel.java
   cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/ESBAction.java
   cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/AbstractESBAction.java
   cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/ReceiveMessageAction.java
   cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/SwitchAction.java
   cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/WhileAction.java
   cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/change/ConversationInteractionModelChangeRule.java
   cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/TestESBAction.java
   cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/TestESBService.java
   cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/change/ConversationInteractionModelChangeRuleTest.java
Log:
Added concept of 'initiator' actions, which must be at the start of an ESB service action list (i.e. first session based action), as way to determine when insertion of an action needs to also insert a ScheduleState + new service. Only implemented for inserting a send currently.

Modified: cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/DefaultESBLanguageModel.java
===================================================================
--- cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/DefaultESBLanguageModel.java	2008-09-11 16:48:42 UTC (rev 326)
+++ cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/DefaultESBLanguageModel.java	2008-09-12 16:42:14 UTC (rev 327)
@@ -280,8 +280,13 @@
 			try {
 				for (int i=0; i < getConversations().size(); i++) {
 					ConversationModel model=new ConversationModel();
+					Conversation conv=getConversations().get(i);
+					ModelObject parent=conv.getParent();
 					
-					model.setConversation(getConversations().get(i));
+					// This command will overwrite the parent of
+					// the conversation, so need to set this back
+					// at the end
+					model.setConversation(conv);
 					
 					org.scribble.export.text.TextFormatter formatter=
 						new org.scribble.export.text.TextFormatter();
@@ -297,6 +302,9 @@
 					
 					System.out.println("EXPORTED JBOSS-ESB TEXT:");
 					System.out.println(str);
+					
+					// Re-establish the true parent
+					conv.setParent(parent);
 				}
 			} catch(Exception e) {
 				e.printStackTrace();

Modified: cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/ESBAction.java
===================================================================
--- cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/ESBAction.java	2008-09-11 16:48:42 UTC (rev 326)
+++ cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/ESBAction.java	2008-09-12 16:42:14 UTC (rev 327)
@@ -80,6 +80,15 @@
 	public boolean isPerform();
 	
 	/**
+	 * This method indicates whether the action is an initiator.
+	 * Initiator actions must precede any other session based
+	 * action, within an ESB service.
+	 * 
+	 * @return Whether the action is an initiator
+	 */
+	public boolean isInitiator();
+	
+	/**
 	 * This method returns the action's class name.
 	 * 
 	 * @return The action's class name

Modified: cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/AbstractESBAction.java
===================================================================
--- cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/AbstractESBAction.java	2008-09-11 16:48:42 UTC (rev 326)
+++ cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/AbstractESBAction.java	2008-09-12 16:42:14 UTC (rev 327)
@@ -308,6 +308,17 @@
 	}
 	
 	/**
+	 * This method indicates whether the action is an initiator.
+	 * Initiator actions must precede any other session based
+	 * action, within an ESB service.
+	 * 
+	 * @return Whether the action is an initiator
+	 */
+	public boolean isInitiator() {
+		return(false);
+	}
+	
+	/**
 	 * This method returns the mandatory property names.
 	 * 
 	 * @return The mandatory property names

Modified: cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/ReceiveMessageAction.java
===================================================================
--- cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/ReceiveMessageAction.java	2008-09-11 16:48:42 UTC (rev 326)
+++ cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/ReceiveMessageAction.java	2008-09-12 16:42:14 UTC (rev 327)
@@ -53,6 +53,18 @@
 	}
 
 	/**
+	 * This method indicates whether the action is an initiator.
+	 * Initiator actions must precede any other session based
+	 * action, within an ESB service.
+	 * 
+	 * @return Whether the action is an initiator
+	 */
+	@Override
+	public boolean isInitiator() {
+		return(true);
+	}
+	
+	/**
 	 * This method converts the ESB action into an equivalent
 	 * behavioural description for conformance checking.
 	 * 

Modified: cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/SwitchAction.java
===================================================================
--- cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/SwitchAction.java	2008-09-11 16:48:42 UTC (rev 326)
+++ cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/SwitchAction.java	2008-09-12 16:42:14 UTC (rev 327)
@@ -105,6 +105,18 @@
 	}	
 
 	/**
+	 * This method indicates whether the action is an initiator.
+	 * Initiator actions must precede any other session based
+	 * action, within an ESB service.
+	 * 
+	 * @return Whether the action is an initiator
+	 */
+	@Override
+	public boolean isInitiator() {
+		return(true);
+	}
+	
+	/**
 	 * This method validates the ESB action and reports warnings or
 	 * errors to the supplied model listener.
 	 * 

Modified: cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/WhileAction.java
===================================================================
--- cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/WhileAction.java	2008-09-11 16:48:42 UTC (rev 326)
+++ cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/actions/WhileAction.java	2008-09-12 16:42:14 UTC (rev 327)
@@ -124,6 +124,18 @@
 	}
 	
 	/**
+	 * This method indicates whether the action is an initiator.
+	 * Initiator actions must precede any other session based
+	 * action, within an ESB service.
+	 * 
+	 * @return Whether the action is an initiator
+	 */
+	@Override
+	public boolean isInitiator() {
+		return(true);
+	}
+	
+	/**
 	 * This method returns the mandatory property names.
 	 * 
 	 * @return The mandatory property names

Modified: cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/change/ConversationInteractionModelChangeRule.java
===================================================================
--- cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/change/ConversationInteractionModelChangeRule.java	2008-09-11 16:48:42 UTC (rev 326)
+++ cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/java/org/jboss/tools/overlord/cdl/jbossesb/model/change/ConversationInteractionModelChangeRule.java	2008-09-12 16:42:14 UTC (rev 327)
@@ -119,14 +119,28 @@
 		setMessageType(action, interaction);
 		
 		int pos=-1;
+		boolean f_subsequentInitiator=false;
+		boolean f_moveActions=false;
 		
 		// Check if reference model object provided, and if so,
 		// if it has a position within the service
 		if (ref != null && ref.getSource().getObject() instanceof ESBAction) {
 			pos = service.getActions().indexOf((ESBAction)
 					ref.getSource().getObject());
+			
+			// Check if subsequent action(s) are initiators
+			if (pos != -1) {
+				for (int i=pos; f_subsequentInitiator == false &&
+						i < service.getActions().size(); i++) {
+					f_subsequentInitiator =
+						service.getActions().get(i).isInitiator();
+				}
+			}
 		}
 		
+		// Move actions if a subsequent initiator has been found
+		f_moveActions = f_subsequentInitiator;
+		
 		service.addAction(action, pos);
 		
 		if (((ESBService)context.getParent()).getFirstSessionBasedAction() == action &&
@@ -150,6 +164,11 @@
 
 			context.setParent(respService);
 			
+			// Clear the sub-sequent initiator flag, as
+			// subsequent actions will be moved to new service
+			// anyway
+			f_subsequentInitiator = false;
+			
 		} else if (interaction.getReplyToLabel() != null) {
 			
 			if (interaction.getToRole() != null) {
@@ -157,8 +176,46 @@
 			} else {
 				action.setClientEPR("client");
 			}
-		}		
+		}	
+
+		// Check if subsequent initiator found, requiring
+		// a new service
+		if (f_subsequentInitiator) {
+			
+			ESBService extraService=esbModel.createService(
+					service.getCategory(),
+					esbModel.getUniqueServiceName(service.getCategory(),
+							service.getName()));
+
+			esbModel.addService(extraService);
+			
+			// Add schedule action
+			ScheduleStateAction schedule=
+				new ScheduleStateAction(service);
+			
+			schedule.setDestination(extraService.getCategory(),
+					extraService.getName(), false);
+			
+			service.addAction(schedule, pos+1);
+			
+			// Move pointer on, as now additional 'schedule' action
+			pos++;
+
+			context.setParent(extraService);
+		}
 		
+		// Check if existing actions need to be moved
+		if (f_moveActions) {
+			for (int i=pos+1; i < service.getActions().size();) {
+				ESBService extraService=(ESBService)context.getParent();
+				
+				ESBAction act=service.getActions().get(i);
+				service.getActions().remove(i);
+				
+				extraService.addAction(act, -1);
+			}
+		}
+		
 		// If not reply, then include the target service
 		// details
 		if (interaction.getReplyToLabel() == null &&
@@ -310,46 +367,71 @@
 	}
 		
 	/**
+	 * This method determines whether the rule is appropriate
+	 * for the supplied type of model, parent (in the context)
+	 * and modified model object.
+	 *
+	 * @param context The context
+	 * @param model The model
+	 * @param fromObj The source model object
+	 * @param toObj The model object to be updated
+	 * @return Whether the rule supports the supplied information
+	 */
+	@Override
+	public boolean isUpdateSupported(ModelChangeContext context,
+					Model model, ModelObject fromObj, ModelObject toObj) {
+		boolean ret=false;
+		
+		if (fromObj instanceof ConversationInteraction &&
+				toObj instanceof ConversationInteraction &&
+				context.getParent() instanceof ESBService &&
+				model instanceof ESBLanguageModel) {
+			ret = true;
+		}
+		
+		return(ret);
+	}
+	
+	/**
 	 * This method modifies an existing model object, within a
 	 * parent model object, with the details supplied in
 	 * another model object.
 	 * 
 	 * @param context The context
 	 * @param model The model being changed
-	 * @param mobj The model object details to be modified
-	 * @param position The position, where relevant
+	 * @param fromObj The source model object
+	 * @param toObj The model object to be updated
 	 * @return Whether the change has been applied
 	 */
+	@Override
 	public boolean update(ModelChangeContext context,
-				Model model, ModelObject mobj, int position) {
+				Model model, ModelObject fromObj, ModelObject toObj) {
 		boolean ret=false;
 		ESBLanguageModel esbModel=(ESBLanguageModel)model;
-		ConversationInteraction interaction=(ConversationInteraction)mobj;
+		ConversationInteraction fromInteraction=(ConversationInteraction)fromObj;
+		ConversationInteraction toInteraction=(ConversationInteraction)toObj;
 		ESBService service=(ESBService)context.getParent();
 		
-		// Get action at position
-		if (position != -1 && position < service.getActions().size()) {
-			ESBAction action=service.getActions().get(position);
+		// Get action from 'toInteraction'
+		if (toInteraction.getSource().getObject() instanceof
+							AbstractInteractionMessageAction) {
+			AbstractInteractionMessageAction ma=
+					(AbstractInteractionMessageAction)
+						toInteraction.getSource().getObject();
+				
+			String origMesgType=ma.getMessageType();
 			
-			// Check action is an interaction
-			if (action instanceof AbstractInteractionMessageAction) {
-				AbstractInteractionMessageAction ma=
-					(AbstractInteractionMessageAction)action;
-				
-				String origMesgType=ma.getMessageType();
-				
-				// Set message type
-				setMessageType(ma, interaction);
-				
-				// Update message type in router if appropriate
-				if (InteractionUtil.isSend(interaction) == false &&
-						interaction.getReplyToLabel() == null) {
-					updateRouterMessageType(esbModel, service,
-							origMesgType, ma);
-				}
-				
-				ret = true;
+			// Set message type
+			setMessageType(ma, fromInteraction);
+			
+			// Update message type in router if appropriate
+			if (InteractionUtil.isSend(fromInteraction) == false &&
+					fromInteraction.getReplyToLabel() == null) {
+				updateRouterMessageType(esbModel, service,
+						origMesgType, ma);
 			}
+			
+			ret = true;
 		}
 		
 		return(ret);

Modified: cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/TestESBAction.java
===================================================================
--- cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/TestESBAction.java	2008-09-11 16:48:42 UTC (rev 326)
+++ cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/TestESBAction.java	2008-09-12 16:42:14 UTC (rev 327)
@@ -55,6 +55,14 @@
 		
 	}
 
+	public boolean isInitiator() {
+		return(m_initiator);
+	}
+	
+	public void setInitiator(boolean initiator) {
+		m_initiator = initiator;
+	}
+	
 	public boolean isLoop() {
 		return(m_loop);
 	}
@@ -101,6 +109,7 @@
 	
 	private boolean m_sessionBased=false;
 	private boolean m_loop=false;
+	private boolean m_initiator=false;
 	private boolean m_createSession=false;
 	private java.util.Map<String,String> m_property=new java.util.Hashtable<String, String>();
 }

Modified: cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/TestESBService.java
===================================================================
--- cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/TestESBService.java	2008-09-11 16:48:42 UTC (rev 326)
+++ cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/TestESBService.java	2008-09-12 16:42:14 UTC (rev 327)
@@ -193,7 +193,11 @@
 	}
 
 	public void addAction(ESBAction action, int pos) {
-		m_actions.add(action);
+		if (pos == -1) {
+			m_actions.add(action);
+		} else {
+			m_actions.add(pos, action);
+		}
 	}
 
 	public boolean removeAction(ESBAction action) {

Modified: cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/change/ConversationInteractionModelChangeRuleTest.java
===================================================================
--- cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/change/ConversationInteractionModelChangeRuleTest.java	2008-09-11 16:48:42 UTC (rev 326)
+++ cdl/trunk/tools/plugins/org.jboss.tools.overlord.cdl.jbossesb/src/test/org/jboss/tools/overlord/cdl/jbossesb/model/change/ConversationInteractionModelChangeRuleTest.java	2008-09-12 16:42:14 UTC (rev 327)
@@ -509,6 +509,259 @@
 		}
 	}		
 	
+	public void testInsertThirdMiddleSendAction() {
+		ConversationInteractionModelChangeRule rule=new ConversationInteractionModelChangeRule();
+		
+		TestESBLanguageModel model=new TestESBLanguageModel();
+		
+		TestESBService service=(TestESBService)
+			model.createService("testcategory", "testname");
+		
+		model.addService(service);
+		
+		// Add gateway service
+		TestESBService gwservice=(TestESBService)
+			model.createService("testcategory", "gateway");
+		gwservice.setGateway(true);
+		
+		MessageRouterAction mra=new MessageRouterAction(gwservice);
+		gwservice.setGatewayAction(mra);
+		
+		model.setGatewayService(gwservice);
+		
+		
+		TestModelChangeContext context=new TestModelChangeContext();
+		context.setParent(service);
+		
+		Role role=new Role();
+		role.setName("role1");
+		
+		context.setRole(role);
+		
+		Conversation conv=new Conversation();
+		ModelName mname=new ModelName();
+		mname.setLocatedRole(role);
+		conv.setModelName(mname);
+		
+		ConversationInteraction mobj1=new ConversationInteraction();
+		mobj1.setToRole(role);
+		conv.getBlock().getContents().add(mobj1);
+		
+		MessageSignature msig1=new MessageSignature();
+		mobj1.setMessageSignature(msig1);
+		
+		TypeReference ref1=new TypeReference();
+		ref1.setNamespace("ns");
+		ref1.setLocalpart("lp1");
+		
+		msig1.getTypes().add(ref1);
+		
+		if (rule.insert(context, model, mobj1, null) == false) {
+			fail("Failed to insert 1");
+		}
+		
+		ConversationInteraction mobj2=new ConversationInteraction();
+		mobj2.setToRole(role);
+		conv.getBlock().getContents().add(mobj2);
+		
+		MessageSignature msig2=new MessageSignature();
+		mobj2.setMessageSignature(msig2);
+		
+		TypeReference ref2=new TypeReference();
+		ref2.setNamespace("ns");
+		ref2.setLocalpart("lp2");
+		
+		msig2.getTypes().add(ref2);
+		
+		// Once first interaction associated with service it
+		// will become session based
+		service.setSessionBased(true);
+		
+		if (rule.insert(context, model, mobj2, null) == false) {
+			fail("Failed to insert 2");
+		}
+		
+		// Check actions
+		if (service.getActions().size() != 2) {
+			fail("Expecting 2 actions: "+service.getActions().size());
+		}
+		
+		if ((service.getActions().get(0) instanceof ReceiveMessageAction) == false) {
+			fail("Action 1 was not ReceiveMessageAction: "+service.getActions().get(0));
+		}
+		
+		if ((service.getActions().get(1) instanceof ScheduleStateAction) == false) {
+			fail("Action 2 was not ScheduleStateAction: "+service.getActions().get(1));
+		}
+		
+		if (model.getServices().size() != 2) {
+			fail("Two services expected: "+model.getServices().size());
+		}
+		
+		ESBService newService=null;
+		java.util.Iterator<ESBService> iter=model.getServices().iterator();
+		while (newService == null && iter.hasNext()) {
+			ESBService s=iter.next();
+			
+			if (s != service) {
+				newService = s;
+			}
+		}
+		
+		if (newService == null) {
+			fail("Other service not found");
+		}
+		
+		((TestESBService)newService).setSessionBased(true);
+		
+		// Check schedule details
+		ScheduleStateAction schedule=(ScheduleStateAction)
+							service.getActions().get(1);
+		
+		if (newService.getCategory().equals(schedule.getPropertyValue(
+				ScheduleStateAction.SERVICE_CATEGORY)) == false) {
+			fail("Schedule service category '"+
+					schedule.getPropertyValue(
+							ScheduleStateAction.SERVICE_CATEGORY)+
+							"' invalid, expecting: "+
+							service.getCategory());
+		}
+
+		if (newService.getName().equals(schedule.getPropertyValue(
+				ScheduleStateAction.SERVICE_NAME)) == false) {
+			fail("Schedule service name '"+
+					schedule.getPropertyValue(
+							ScheduleStateAction.SERVICE_NAME)+
+							"' invalid, expecting: "+
+							service.getName());
+		}
+			
+		// Check actions
+		if (newService.getActions().size() != 1) {
+			fail("Expecting 1 action: "+newService.getActions().size());
+		}
+		
+		if ((newService.getActions().get(0) instanceof ReceiveMessageAction) == false) {
+			fail("Action 1 was not ReceiveMessageAction: "+newService.getActions().get(0));
+		}
+		
+		ReceiveMessageAction recv2=(ReceiveMessageAction)
+						newService.getActions().get(0);
+		
+
+		String mtype=InteractionUtil.getTypeString(ref2);
+
+		if (recv2.getPropertyValue("messageType").equals(mtype)==false) {
+			fail("Message type '"+recv2.getPropertyValue("messageType")+
+					"' invalid, expecting: "+mtype);
+		}
+		
+		java.util.List<Activity> acts=new java.util.Vector<Activity>();
+		
+		DefaultConversionContext convContext=new DefaultConversionContext(role.getName());
+		recv2.convert(acts, convContext);
+		
+		if (acts.size() != 1) {
+			fail("Expecting 1 activity: "+acts.size());
+		}
+		
+		// Now second service identified, add new receive
+		// action to ensure that third service inserted in the
+		// middle
+		ConversationInteraction mobj3=new ConversationInteraction();
+		mobj3.setFromRole(role);
+		conv.getBlock().getContents().add(mobj3);
+		
+		MessageSignature msig3=new MessageSignature();
+		mobj3.setMessageSignature(msig3);
+		
+		TypeReference ref3=new TypeReference();
+		ref3.setNamespace("ns");
+		ref3.setLocalpart("lp3");
+		
+		msig3.getTypes().add(ref3);
+		
+		// Insert into position 1, which should be after first
+		// receive
+		
+		// TODO: Need to pass representation of last interaction
+		if (rule.insert(context, model, mobj3, acts.get(0)) == false) {
+			fail("Failed to insert 3");
+		}
+		
+		// Re-Check actions
+		if (service.getActions().size() != 2) {
+			fail("Expecting 2 actions: "+service.getActions().size());
+		}
+		
+		if ((service.getActions().get(0) instanceof ReceiveMessageAction) == false) {
+			fail("Action 1 was not ReceiveMessageAction: "+service.getActions().get(0));
+		}
+		
+		if ((service.getActions().get(1) instanceof ScheduleStateAction) == false) {
+			fail("Action 2 was not ScheduleStateAction: "+service.getActions().get(1));
+		}
+		
+		if (model.getServices().size() != 3) {
+			fail("Three services expected: "+model.getServices().size());
+		}
+		
+		// TODO: Need to check if new service has been inserted
+		// in the middle of the previously inserted interactions
+
+		// Check actions
+		if (newService.getActions().size() != 2) {
+			fail("Now Expecting 2 action: "+newService.getActions().size());
+		}
+		
+		if ((newService.getActions().get(0) instanceof SendMessageAction) == false) {
+			fail("Action 1 was not SendMessageAction: "+newService.getActions().get(0));
+		}
+		
+		if ((newService.getActions().get(1) instanceof ScheduleStateAction) == false) {
+			fail("Action 2 was not ScheduleStateAction: "+newService.getActions().get(1));
+		}
+		
+		ScheduleStateAction ssa=(ScheduleStateAction)newService.getActions().get(1);
+		
+		ESBService newService2=model.getService(ssa.getPropertyValue(
+					ScheduleStateAction.SERVICE_CATEGORY),ssa.getPropertyValue(
+							ScheduleStateAction.SERVICE_NAME));
+		
+		if (newService2 == null) {
+			fail("Failed to find final service");
+		}
+		
+		if (newService2.getActions().size() != 1) {
+			fail("Only expecting one action: "+newService2.getActions().size());
+		}
+		
+		if ((newService2.getActions().get(0) instanceof ReceiveMessageAction) == false) {
+			fail("Expecting ReceiveMessageAction, but got: "+newService2.getActions().get(0));
+		}
+
+		ReceiveMessageAction recv4=(ReceiveMessageAction)
+					newService2.getActions().get(0);
+
+		String mtype4=InteractionUtil.getTypeString(ref2);
+
+		if (recv4.getPropertyValue("messageType").equals(mtype4)==false) {
+			fail("Message type '"+recv4.getPropertyValue("messageType")+
+						"' invalid, expecting: "+mtype4);
+		}
+
+
+		SendMessageAction send3=(SendMessageAction)
+					newService.getActions().get(0);
+
+		String mtype3=InteractionUtil.getTypeString(ref3);
+
+		if (send3.getPropertyValue("messageType").equals(mtype3)==false) {
+			fail("Message type '"+send3.getPropertyValue("messageType")+
+						"' invalid, expecting: "+mtype3);
+		}
+	}		
+
 	public void testInsertReceiveRequestAction() {
 		String fromRoleName="role1";
 		String toRoleName="role2";
@@ -935,13 +1188,6 @@
 			fail("Failed to insert");
 		}
 		
-		// Change local part
-		ref.setLocalpart("lp2");
-		
-		if (rule.update(context, model, mobj, 0) == false) {
-			fail("Failed to update");
-		}
-		
 		// Check actions
 		if (service.getActions().size() != 1) {
 			fail("Expecting 1 action: "+service.getActions().size());
@@ -957,6 +1203,19 @@
 		
 		ReceiveMessageAction action=(ReceiveMessageAction)service.getActions().get(0);
 		
+		java.util.List<Activity> activities=new java.util.Vector<Activity>();
+		action.convert(activities, new DefaultConversionContext(null));
+		
+		if (activities.size() != 1) {
+			fail("Expecting single interaction activity from ReceiveMessageAction: "+activities.size());
+		}
+		
+		if ((activities.get(0) instanceof ConversationInteraction) == false) {
+			fail("Not conversation interaction");
+		}
+		
+		ConversationInteraction recvci=(ConversationInteraction)activities.get(0);		
+		
 		String mtype=InteractionUtil.getTypeString(ref);
 
 		if (action.getPropertyValue("messageType").equals(mtype)==false) {
@@ -964,6 +1223,21 @@
 					"' invalid, expecting: "+mtype);
 		}
 		
+		// Change local part
+		ref.setLocalpart("lp2");
+		
+		if (rule.update(context, model, mobj, recvci) == false) {
+			fail("Failed to update");
+		}
+
+		// Re-check the message type, to make sure has been updated
+		mtype = InteractionUtil.getTypeString(ref);
+
+		if (action.getPropertyValue("messageType").equals(mtype)==false) {
+			fail("Message type '"+action.getPropertyValue("messageType")+
+					"' invalid, expecting: "+mtype);
+		}
+		
 		if (mra.getNumberOfRoutes() != 1) {
 			fail("One route expected: "+mra.getNumberOfRoutes());
 		}




More information about the overlord-commits mailing list