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

overlord-commits at lists.jboss.org overlord-commits at lists.jboss.org
Wed Jun 25 14:19:59 EDT 2008


Author: objectiser
Date: 2008-06-25 14:19:59 -0400 (Wed, 25 Jun 2008)
New Revision: 72

Added:
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ConversionContext.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/DefaultConversionContext.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/WhenAction.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/WhileAction.java
Modified:
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBAction.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBActionFactory.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBLanguageModel.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBService.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/UnsupportedAction.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/CreateSessionAction.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/IfAction.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/Messages.properties
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ParallelAction.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ReceiveMessageAction.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/RetrieveSessionAction.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ScheduleStateAction.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SendMessageAction.java
   trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SwitchAction.java
Log:
Initial support for while and when actions.

Added: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ConversionContext.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ConversionContext.java	                        (rev 0)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ConversionContext.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2005-8 Pi4 Technologies Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Change History:
+ * 25 Jun 2008 : Initial version created by gary
+ */
+package org.jboss.tools.overlord.jbossesb.model;
+
+public interface ConversionContext {
+
+	/**
+	 * This method is invoked when an ESB service is being processed.
+	 * 
+	 * @param service The service
+	 */
+	public void processing(ESBService service);
+	
+	/**
+	 * This method is invoked when an ESB service has been processed.
+	 * 
+	 * @param service The service
+	 */
+	public void processed(ESBService service);
+	
+	/**
+	 * Push service on the stack of services in which the current
+	 * context is contained.
+	 * 
+	 * @param service The service
+	 */
+	public void push(ESBService service);
+	
+	/**
+	 * Pop service from the stack of services in which the current
+	 * context is contained.
+	 * 
+	 * @param service The service
+	 */
+	public void pop(ESBService service);
+	
+	/**
+	 * This method determines whether the supplied service is on
+	 * the stack of services in which the current context is
+	 * contained.
+	 * 
+	 * @param service The service
+	 * @return Whether the service is on the stack
+	 */
+	public boolean isOnStack(ESBService service);
+	
+	/**
+	 * This method marks an ESB service as being a join state.
+	 * 
+	 * @param service The service
+	 */
+	public void markJoin(ESBService service);
+	
+	/**
+	 * This method determines whether the ESB service is a join
+	 * state.
+	 * 
+	 * @param service The serviice
+	 * @return Whether the service is a join state
+	 */
+	public boolean isJoin(ESBService service);
+	
+}

Added: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/DefaultConversionContext.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/DefaultConversionContext.java	                        (rev 0)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/DefaultConversionContext.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2005-8 Pi4 Technologies Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Change History:
+ * 25 Jun 2008 : Initial version created by gary
+ */
+package org.jboss.tools.overlord.jbossesb.model;
+
+import java.util.logging.Logger;
+
+public class DefaultConversionContext implements ConversionContext {
+
+	/**
+	 * This method is invoked when an ESB service is being processed.
+	 * 
+	 * @param service The service
+	 */
+	public void processing(ESBService service) {
+		m_joins.remove(service);
+	}
+	
+	/**
+	 * This method is invoked when an ESB service has been processed.
+	 * 
+	 * @param service The service
+	 */
+	public void processed(ESBService service) {
+		
+	}
+	
+	/**
+	 * Push service on the stack of services in which the current
+	 * context is contained.
+	 * 
+	 * @param service The service
+	 */
+	public void push(ESBService service) {
+		m_serviceStack.add(service);
+	}
+	
+	/**
+	 * Pop service from the stack of services in which the current
+	 * context is contained.
+	 * 
+	 * @param service The service
+	 */
+	public void pop(ESBService service) {
+		
+		// Check if the service is the last element on the stack
+		if (m_serviceStack.size() == 0 ||
+				m_serviceStack.get(m_serviceStack.size()-1) != service) {
+			logger.severe("Request to pop service '"+service+
+					"' that is not the most recent entry on the stack");
+		}
+		
+		m_serviceStack.remove(service);
+	}
+	
+	/**
+	 * This method determines whether the supplied service is on
+	 * the stack of services in which the current context is
+	 * contained.
+	 * 
+	 * @param service The service
+	 * @return Whether the service is on the stack
+	 */
+	public boolean isOnStack(ESBService service) {
+		return(m_serviceStack.contains(service));
+	}
+	
+	/**
+	 * This method marks an ESB service as being a join state.
+	 * 
+	 * @param service The service
+	 */
+	public void markJoin(ESBService service) {
+		m_joins.add(service);
+	}
+	
+	/**
+	 * This method determines whether the ESB service is a join
+	 * state.
+	 * 
+	 * @param service The serviice
+	 * @return Whether the service is a join state
+	 */
+	public boolean isJoin(ESBService service) {
+		return(m_joins.contains(service));
+	}
+	
+	private static Logger logger = Logger.getLogger("org.jboss.tools.overlord.jbossesb.model");
+	
+	private java.util.List<ESBService> m_serviceStack=new java.util.Vector<ESBService>();
+	private java.util.List<ESBService> m_joins=new java.util.Vector<ESBService>();
+}

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBAction.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -17,6 +17,8 @@
  */
 package org.jboss.tools.overlord.jbossesb.model;
 
+import java.util.logging.Logger;
+
 import org.scribble.model.*;
 
 /**
@@ -32,6 +34,9 @@
 	private static final String NAME_ATTR = "name";
 	private static final String PROPERTY_ELEMENT = "property";
 	private static final String CLASS_PROPERTY = "class";
+	
+	protected static final String BUSINESS_OBJECT_TYPE_PROPERTY = "session";
+
 	/**
 	 * The default constructor.
 	 */
@@ -104,6 +109,29 @@
 	 */
 	public void validate(ModelListener l) {
 		
+		String session=getPropertyValue(BUSINESS_OBJECT_TYPE_PROPERTY);
+		
+		if (session != null) {
+			// Validate that the business object type exists
+			try {
+				ClassLoader cl=getService().getProjectLoader();
+				
+				try {
+					Class.forName(session, true, cl);
+				} catch(ClassNotFoundException cfne) {
+					l.error(this, org.scribble.util.MessageUtil.format(
+							java.util.PropertyResourceBundle.getBundle(
+							"org.jboss.tools.overlord.jbossesb.model.actions.Messages"),
+								"_NOT_FOUND_BUSINESS_OBJECT_TYPE",
+								new String[]{session}), null);
+				}
+				
+			} catch(Exception e) {
+				logger.log(java.util.logging.Level.SEVERE,
+						"Failed to load business class '"+session+"'", e);
+			}
+		}
+		
 		// Validate links
 		for (int i=0; i < m_links.size(); i++) {
 			ESBLink link=(ESBLink)m_links.get(i);
@@ -123,6 +151,15 @@
 	}
 	
 	/**
+	 * This method determines if the action represents a loop construct.
+	 * 
+	 * @return Whether the action represents a loop construct
+	 */
+	public boolean isLoop() {
+		return(false);
+	}
+	
+	/**
 	 * This method returns the action's class name.
 	 * 
 	 * @return The action's class name
@@ -213,8 +250,10 @@
 	 * 
 	 * @param activities The list of activities that will contain
 	 * 				the converted action(s)
+	 * @param context The conversion context
 	 */
-	public abstract void convert(java.util.List<Activity> activities);
+	public abstract void convert(java.util.List<Activity> activities,
+					ConversionContext context);
 		
 	/**
 	 * This method returns the position of the service node within the
@@ -273,6 +312,8 @@
 		return(actionCount);
 	}
 
+	private static Logger logger = Logger.getLogger("org.jboss.tools.overlord.jbossesb.model");
+
 	private ESBService m_service=null;
 	private org.w3c.dom.Element m_action=null;
 	private java.util.List<ESBLink> m_links=new java.util.Vector<ESBLink>();

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBActionFactory.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBActionFactory.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBActionFactory.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -17,6 +17,8 @@
  */
 package org.jboss.tools.overlord.jbossesb.model;
 
+import java.util.logging.Logger;
+
 /**
  * This class provides a factory for ESBAction instances.
  *  
@@ -59,10 +61,14 @@
 					ret.init(service, action);
 					
 				} catch(Exception e) {
-					e.printStackTrace();
+					logger.log(java.util.logging.Level.SEVERE,
+							"Unable to find action class '"+
+							MODEL_ACTION_PACKAGE+"."+actionName+"'", e);
 				}
 			}
-		} else {
+		}
+		
+		if (ret == null) {
 			// Unrecognised or unsupported action
 			ret = new UnsupportedAction();
 			ret.init(service, action);
@@ -70,4 +76,6 @@
 		
 		return(ret);
 	}
+
+	private static Logger logger = Logger.getLogger("org.jboss.tools.overlord.jbossesb.model");
 }

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBLanguageModel.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBLanguageModel.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBLanguageModel.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -21,6 +21,7 @@
 import java.util.logging.Logger;
 
 import org.scribble.conversation.model.*;
+import org.scribble.extensions.RegistryFactory;
 import org.scribble.model.*;
 
 /**
@@ -168,13 +169,46 @@
 								
 					conv.setBlock(new Block());
 					
-					service.convert(conv.getBlock().getContents());
+					service.convert(conv.getBlock().getContents(),
+									new DefaultConversionContext());
 					
 					getConversations().add(conv);
 				}
 			}
-
 		}
+		
+		if (logger.isLoggable(java.util.logging.Level.FINEST)) {
+			
+			org.scribble.export.Exporter exporter=
+				(org.scribble.export.Exporter)
+				RegistryFactory.getRegistry().getExtension(
+						org.scribble.export.Exporter.class, null);
+			
+			try {
+				for (int i=0; i < getConversations().size(); i++) {
+					ConversationModel model=new ConversationModel();
+					
+					model.setConversation(getConversations().get(i));
+					
+					org.scribble.export.text.TextFormatter formatter=
+						new org.scribble.export.text.TextFormatter();
+					
+					java.io.ByteArrayOutputStream os=
+						new java.io.ByteArrayOutputStream();
+					
+					formatter.setOutputStream(os);
+					
+					exporter.export(model, formatter);
+					
+					String str=new String(os.toByteArray());
+					
+					System.out.println("EXPORTED TEXT:");
+					System.out.println(str);
+				}
+			} catch(Exception e) {
+				e.printStackTrace();
+			}
+		}
 	}
 	
 	@Override

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBService.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBService.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/ESBService.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -148,44 +148,56 @@
 	protected java.lang.annotation.Annotation getServiceAnnotation(String session) {
 		java.lang.annotation.Annotation ret=null;
 		
-		IFile file=OSGIModelRepository.getFile(getModel().getModelReference());
-		
-		if (file != null) {
-			IJavaProject jproj=JavaCore.create(file.getProject());
+		try {
+			ClassLoader cl=getProjectLoader();
 			
-			try {
-				ClassLoader cl=getProjectLoader(jproj);
-				
-				Class<?> cls=Class.forName(session, true, cl);
-				
-				// TODO: This should be replaced by direct lookup
-				// of Service annotation - but library not available
-				// at the moment
-				java.lang.annotation.Annotation[] annotations=
-								cls.getAnnotations();
-				for (int i=0; ret == null &&
-								i < annotations.length; i++) {
-					try {
-						if (annotations[i].annotationType().getName().equals(
-								"org.jboss.soa.overlord.jbossesb.actions.Service")) {
-							ret = annotations[i];
-						}
-					} catch(Throwable ex) {
-						// Ignore
-						System.err.println("ANNOTATION: "+annotations[i].annotationType());
-						ex.printStackTrace();
+			Class<?> cls=Class.forName(session, true, cl);
+			
+			// TODO: This should be replaced by direct lookup
+			// of Service annotation - but library not available
+			// at the moment
+			java.lang.annotation.Annotation[] annotations=
+							cls.getAnnotations();
+			for (int i=0; ret == null &&
+							i < annotations.length; i++) {
+				try {
+					if (annotations[i].annotationType().getName().equals(
+							"org.jboss.soa.overlord.jbossesb.actions.Service")) {
+						ret = annotations[i];
 					}
+				} catch(Throwable ex) {
+					// Ignore
+					System.err.println("ANNOTATION: "+annotations[i].annotationType());
+					ex.printStackTrace();
 				}
-				
-			} catch(Exception e) {
-				e.printStackTrace();
 			}
+			
+		} catch(Exception e) {
+			e.printStackTrace();
 		}
 		
 		return(ret);
 	}
 	
 	/**
+	 * This method determines whether the ESB service represents a
+	 * loop construct.
+	 * 
+	 * @return Whether the service represents a loop
+	 */
+	public boolean isLoop() {
+		boolean ret=false;
+		
+		if (m_actions.size() > 0) {
+			ESBAction action=(ESBAction)m_actions.get(0);
+			
+			ret = action.isLoop();
+		}
+		
+		return(ret);
+	}
+	
+	/**
 	 * This method determines whether the ESB service descriptor represents
 	 * a 'root' conversation.
 	 * 
@@ -289,7 +301,6 @@
 				ret = action.getPropertyValue(CONVERSATION_TYPE_PROPERTY);
 				
 				if (ret == null) {
-					/* TODO: Uncomment when conversationType defined on Service annotation
 					String session=action.getPropertyValue(BUSINESS_OBJECT_TYPE_PROPERTY);
 					
 					java.lang.annotation.Annotation annotation=
@@ -310,7 +321,6 @@
 									"Failed to get 'name' annotation value", t);
 						}
 					}
-					*/
 				}
 			}
 		}
@@ -325,12 +335,18 @@
 	 * 
 	 * @param activities The target list of activities associated with the
 	 * 					ESB actions being converted
+	 * @param context The conversion context
 	 */
-	public void convert(java.util.List<Activity> activities) {
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
 		
+		context.processing(this);
+		
 		for (int i=0; i < m_actions.size(); i++) {
-			((ESBAction)m_actions.get(i)).convert(activities);
+			((ESBAction)m_actions.get(i)).convert(activities, context);
 		}
+		
+		context.processed(this);
 	}
 
 	/**
@@ -339,55 +355,76 @@
 	 * 
 	 * @see http://dev.eclipse.org/newslists/news.eclipse.tools.jdt/msg17769.html
 	 * 
-	 * @param javaProject The Java project containing the config file
 	 * @return The classloader
 	 * @throws Exception Failed to obtain the classloader
 	 */
-	private static ClassLoader getProjectLoader(IJavaProject javaProject)
-								throws Exception {
-		IClasspathEntry[] entries = javaProject.getResolvedClasspath(true);
-		String wsPath = javaProject.getProject().getLocation().toPortableString();
-		String firstEntryLocation = javaProject.getPath().toPortableString();
-		int idx = wsPath.indexOf(firstEntryLocation);
-		wsPath = wsPath.substring(0,idx);
+	protected ClassLoader getProjectLoader() throws Exception {
+		java.net.URLClassLoader classLoader=null;
+		IFile file=OSGIModelRepository.getFile(getModel().getModelReference());
+		
+		if (file != null) {
+			IJavaProject javaProject=JavaCore.create(file.getProject());
+			IClasspathEntry[] entries = javaProject.getResolvedClasspath(true);
+			String wsPath = javaProject.getProject().getLocation().toPortableString();
+			String firstEntryLocation = javaProject.getPath().toPortableString();
+			int idx = wsPath.indexOf(firstEntryLocation);
+			wsPath = wsPath.substring(0,idx);
+			
+			String fullPath = null;
 
-		String fullPath = null;
-
-		java.net.URL[] urls = new java.net.URL[entries.length+1];
-		int i = 0;
-		urls[i++] = new java.io.File(wsPath + 
-				javaProject.getOutputLocation().toPortableString()).toURL();
-
-		for (IClasspathEntry entry : entries) {
-			if(entry.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
-				IResource project = 
-					ResourcesPlugin.getWorkspace().getRoot().findMember(entry.getPath());
-				String projectPath = 
-					JavaCore.create(project.getProject()).getOutputLocation().toPortableString();
-						fullPath = wsPath + projectPath;
-			} else {
-				// TODO: Need to find alternative to this internal class (JavaModel)
-				Object resource = 
-					JavaModel.getTarget(ResourcesPlugin.getWorkspace().getRoot(),entry.getPath(),true);
-
-				if (resource instanceof IResource) {
-					IResource iFile = (IResource) resource;
-					fullPath = iFile.getLocation().toPortableString();
-				} else if (resource instanceof java.io.File) {
-					java.io.File file = (java.io.File) resource;
-					fullPath = file.getAbsolutePath();
+			java.net.URL[] urls = new java.net.URL[entries.length+1];
+			int i = 0;
+			urls[i++] = new java.io.File(wsPath + 
+					javaProject.getOutputLocation().toPortableString()).toURL();
+	
+			for (IClasspathEntry entry : entries) {
+				if(entry.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
+					IResource project = 
+						ResourcesPlugin.getWorkspace().getRoot().findMember(entry.getPath());
+					String projectPath = 
+						JavaCore.create(project.getProject()).getOutputLocation().toPortableString();
+							fullPath = wsPath + projectPath;
+				} else {
+					// TODO: Need to find alternative to this internal class (JavaModel)
+					Object resource = 
+						JavaModel.getTarget(ResourcesPlugin.getWorkspace().getRoot(),entry.getPath(),true);
+	
+					if (resource instanceof IResource) {
+						IResource iFile = (IResource) resource;
+						fullPath = iFile.getLocation().toPortableString();
+					} else if (resource instanceof java.io.File) {
+						java.io.File resfile = (java.io.File) resource;
+						fullPath = resfile.getAbsolutePath();
+					}
 				}
+	
+				urls[i++] = new java.io.File(fullPath).toURL();
 			}
 
-			urls[i++] = new java.io.File(fullPath).toURL();
+			classLoader = new java.net.URLClassLoader(urls,String.class.getClassLoader());
 		}
-
-		java.net.URLClassLoader classLoader = new 
-			java.net.URLClassLoader(urls,String.class.getClassLoader());
-
+		
 		return(classLoader);
-	 }
+	}
 	
+	public int hashCode() {
+		return(m_service.hashCode());
+	}
+	
+	public boolean equals(Object obj) {
+		boolean ret=false;
+		
+		if (obj instanceof ESBService) {
+			ESBService other=(ESBService)obj;
+			
+			if (m_service == other.m_service) {
+				ret = true;
+			}
+		}
+		
+		return(ret);
+	}
+	
 	private static Logger logger = Logger.getLogger("org.jboss.tools.overlord.jbossesb.model");
 
 	private ESBLanguageModel m_model=null;

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/UnsupportedAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/UnsupportedAction.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/UnsupportedAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -33,8 +33,10 @@
 	 * 
 	 * @param activities The list of activities that will contain
 	 * 				the converted action(s)
+	 * @param context The conversion context
 	 */
-	public void convert(java.util.List<Activity> activities) {
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
 	}
 
 }

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/CreateSessionAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/CreateSessionAction.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/CreateSessionAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -17,7 +17,9 @@
  */
 package org.jboss.tools.overlord.jbossesb.model.actions;
 
+import org.jboss.tools.overlord.jbossesb.model.ConversionContext;
 import org.jboss.tools.overlord.jbossesb.model.ESBAction;
+import org.jboss.tools.overlord.jbossesb.model.ESBService;
 import org.scribble.model.*;
 
 /**
@@ -33,8 +35,11 @@
 	 * 
 	 * @param activities The list of activities that will contain
 	 * 				the converted action(s)
+	 * @param context The conversion context
 	 */
-	public void convert(java.util.List<Activity> activities) {
+	@Override
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
 	}
 	
 }

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/IfAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/IfAction.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/IfAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -17,6 +17,7 @@
  */
 package org.jboss.tools.overlord.jbossesb.model.actions;
 
+import org.jboss.tools.overlord.jbossesb.model.ConversionContext;
 import org.jboss.tools.overlord.jbossesb.model.ESBAction;
 import org.jboss.tools.overlord.jbossesb.model.ESBLink;
 import org.jboss.tools.overlord.jbossesb.model.ESBService;
@@ -89,8 +90,11 @@
 	 * 
 	 * @param activities The list of activities that will contain
 	 * 				the converted action(s)
+	 * @param context The conversion context
 	 */
-	public void convert(java.util.List<Activity> activities) {
+	@Override
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
 		
 		org.w3c.dom.NodeList nl=getPropertyChildNodes(PATHS);
 
@@ -116,7 +120,7 @@
 				ESBService service=getService().getModel().getService(category, name);
 				
 				if (service != null) {
-					service.convert(cond.getContents());
+					service.convert(cond.getContents(), context);
 				}
 			}
 		}

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/Messages.properties
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/Messages.properties	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/Messages.properties	2008-06-25 18:19:59 UTC (rev 72)
@@ -16,4 +16,6 @@
 #  * MA  02110-1301, USA.
 #  */
 
+_NOT_FOUND_BUSINESS_OBJECT_TYPE=Business object type '{0}' could not be found
 _NOT_FOUND_SERVICE_DESCRIPTOR=Service descriptor for category '{0}' and name '{1}' not found
+_MUST_BE_FIRST_ACTION='{0}' action must be first in the service descriptor
\ No newline at end of file

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ParallelAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ParallelAction.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ParallelAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -17,6 +17,7 @@
  */
 package org.jboss.tools.overlord.jbossesb.model.actions;
 
+import org.jboss.tools.overlord.jbossesb.model.ConversionContext;
 import org.jboss.tools.overlord.jbossesb.model.ESBAction;
 import org.jboss.tools.overlord.jbossesb.model.ESBLink;
 import org.jboss.tools.overlord.jbossesb.model.ESBService;
@@ -72,8 +73,11 @@
 	 * 
 	 * @param activities The list of activities that will contain
 	 * 				the converted action(s)
+	 * @param context The conversion context
 	 */
-	public void convert(java.util.List<Activity> activities) {
+	@Override
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
 		
 		org.w3c.dom.NodeList nl=getPropertyChildNodes(PATHS);
 		
@@ -94,7 +98,7 @@
 					ESBService service=getService().getModel().getService(category, name);
 					
 					if (service != null) {
-						service.convert(block.getContents());
+						service.convert(block.getContents(), context);
 					}
 					
 					if (block.getContents().size() > 0) {
@@ -109,7 +113,7 @@
 					if (service != null) {
 						// Join activities should be added after the
 						// parallel construct
-						service.convert(activities);
+						service.convert(activities, context);
 					}
 				}
 			}

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ReceiveMessageAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ReceiveMessageAction.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ReceiveMessageAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -17,6 +17,7 @@
  */
 package org.jboss.tools.overlord.jbossesb.model.actions;
 
+import org.jboss.tools.overlord.jbossesb.model.ConversionContext;
 import org.jboss.tools.overlord.jbossesb.model.ESBAction;
 import org.scribble.conversation.model.*;
 import org.scribble.model.*;
@@ -37,8 +38,11 @@
 	 * 
 	 * @param activities The list of activities that will contain
 	 * 				the converted action(s)
+	 * @param context The conversion context
 	 */
-	public void convert(java.util.List<Activity> activities) {
+	@Override
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
 		
 		ConversationInteraction recv=new ConversationInteraction();	
 		activities.add(recv);

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/RetrieveSessionAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/RetrieveSessionAction.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/RetrieveSessionAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -17,6 +17,7 @@
  */
 package org.jboss.tools.overlord.jbossesb.model.actions;
 
+import org.jboss.tools.overlord.jbossesb.model.ConversionContext;
 import org.jboss.tools.overlord.jbossesb.model.ESBAction;
 import org.scribble.model.*;
 
@@ -33,8 +34,11 @@
 	 * 
 	 * @param activities The list of activities that will contain
 	 * 				the converted action(s)
+	 * @param context The conversion context
 	 */
-	public void convert(java.util.List<Activity> activities) {
+	@Override
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
 	}
 	
 }
\ No newline at end of file

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ScheduleStateAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ScheduleStateAction.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/ScheduleStateAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -17,8 +17,11 @@
  */
 package org.jboss.tools.overlord.jbossesb.model.actions;
 
+import org.jboss.tools.overlord.jbossesb.model.ConversionContext;
 import org.jboss.tools.overlord.jbossesb.model.ESBAction;
+import org.jboss.tools.overlord.jbossesb.model.ESBLink;
 import org.scribble.model.*;
+import org.jboss.tools.overlord.jbossesb.model.ESBService;
 
 /**
  * The model component for the 'ScheduleStateAction'. 
@@ -28,13 +31,49 @@
 public class ScheduleStateAction extends ESBAction {
 
 	/**
+	 * This method initializes the links with the ESB service descriptors
+	 * identified in each path of the action.
+	 */
+	@Override
+	protected void initializeLinks() {
+		super.initializeLinks();
+		
+		String serviceCategory=getPropertyValue("serviceCategory");
+		String serviceName=getPropertyValue("serviceName");
+		String immediate=getPropertyValue("immediate");
+		
+		m_service=getService().getModel().getService(serviceCategory, serviceName);
+		
+		getLinks().add(new ESBLink(serviceCategory, serviceName, m_service,
+				(immediate != null && immediate.equalsIgnoreCase("true"))));
+	}
+
+	/**
 	 * This method converts the ESB action into an equivalent
 	 * behavioural description for conformance checking.
 	 * 
 	 * @param activities The list of activities that will contain
 	 * 				the converted action(s)
+	 * @param context The conversion context
 	 */
-	public void convert(java.util.List<Activity> activities) {
+	@Override
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
+
+		// If the service has been located, then convert its activities
+		// if it is either not a loop construct (i.e. a while action), or
+		// if it is a loop, then we need to ensure that it is not in the
+		// current stack of ESB services that logically 'contain' this
+		// action. If this action is within the scope of the loop, then
+		// the default behaviour should be to return to the loop
+		// condition (i.e. just let the loop return implicitly).
+		if (m_service != null &&
+				(m_service.isLoop() == false ||
+				context.isOnStack(m_service) == false) &&
+				context.isJoin(m_service) == false) {
+			m_service.convert(activities, context);
+		}
 	}
 	
+	private ESBService m_service=null;
 }
\ No newline at end of file

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SendMessageAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SendMessageAction.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SendMessageAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -17,6 +17,7 @@
  */
 package org.jboss.tools.overlord.jbossesb.model.actions;
 
+import org.jboss.tools.overlord.jbossesb.model.ConversionContext;
 import org.jboss.tools.overlord.jbossesb.model.ESBAction;
 import org.jboss.tools.overlord.jbossesb.model.ESBLink;
 import org.jboss.tools.overlord.jbossesb.model.ESBService;
@@ -73,8 +74,11 @@
 	 * 
 	 * @param activities The list of activities that will contain
 	 * 				the converted action(s)
+	 * @param context The conversion context
 	 */
-	public void convert(java.util.List<Activity> activities) {
+	@Override
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
 		
 		ConversationInteraction send=new ConversationInteraction();
 		activities.add(send);
@@ -128,7 +132,7 @@
 			// the set of activities. If service not found, then ignore
 			// here as will be reported as part of the validation of links.
 			if (service != null) {
-				service.convert(activities);
+				service.convert(activities, context);
 			}
 		}
 	}

Modified: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SwitchAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SwitchAction.java	2008-06-24 14:02:05 UTC (rev 71)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SwitchAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -17,6 +17,7 @@
  */
 package org.jboss.tools.overlord.jbossesb.model.actions;
 
+import org.jboss.tools.overlord.jbossesb.model.ConversionContext;
 import org.jboss.tools.overlord.jbossesb.model.ESBAction;
 import org.jboss.tools.overlord.jbossesb.model.ESBLink;
 import org.jboss.tools.overlord.jbossesb.model.ESBService;
@@ -70,8 +71,11 @@
 	 * 
 	 * @param activities The list of activities that will contain
 	 * 				the converted action(s)
+	 * @param context The conversion context
 	 */
-	public void convert(java.util.List<Activity> activities) {
+	@Override
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
 		
 		org.w3c.dom.NodeList nl=getPropertyChildNodes(PATHS);
 		
@@ -96,7 +100,7 @@
 				ESBService service=getService().getModel().getService(category, name);
 				
 				if (service != null) {
-					service.convert(block.getContents());
+					service.convert(block.getContents(), context);
 				}
 			}
 		}

Added: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/WhenAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/WhenAction.java	                        (rev 0)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/WhenAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -0,0 +1,145 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and others contributors as indicated
+ * by the @authors tag. All rights reserved.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+package org.jboss.tools.overlord.jbossesb.model.actions;
+
+import org.jboss.tools.overlord.jbossesb.model.ConversionContext;
+import org.jboss.tools.overlord.jbossesb.model.ESBAction;
+import org.jboss.tools.overlord.jbossesb.model.ESBLink;
+import org.jboss.tools.overlord.jbossesb.model.ESBService;
+import org.scribble.model.*;
+import org.scribble.conversation.model.*;
+
+/**
+ * The model component for the 'WhenAction'.
+ *  
+ * @author gary
+ */
+public class WhenAction extends ESBAction {
+
+	private static final String SERVICE_NAME = "service-name";
+	private static final String SERVICE_CATEGORY = "service-category";
+	private static final String WHEN = "when";
+	private static final String JOIN = "join";
+	private static final String PATHS = "paths";
+
+	/**
+	 * This method initializes the links with the ESB service descriptors
+	 * identified in each path of the action.
+	 */
+	@Override
+	protected void initializeLinks() {
+		super.initializeLinks();
+		
+		org.w3c.dom.NodeList nl=getPropertyChildNodes(PATHS);
+		
+		for (int i=0; i < nl.getLength(); i++) {
+			
+			org.w3c.dom.Node n=nl.item(i);
+			
+			if (n instanceof org.w3c.dom.Element) {
+				if (n.getNodeName().equals(WHEN)) {
+					String category=((org.w3c.dom.Element)n).getAttribute(SERVICE_CATEGORY);
+					String name=((org.w3c.dom.Element)n).getAttribute(SERVICE_NAME);
+
+					// Lookup service associated with category and name
+					ESBService service=getService().getModel().getService(category, name);
+				
+					// Initialize link, even if service is null - this will be
+					// reported as a validation error later
+					getLinks().add(new ESBLink(category, name, service, true));
+					
+					if (service != null) {
+						m_services.add(service);
+					}
+					
+				} else if (n.getNodeName().equals(JOIN)) {
+					m_joinCategory=((org.w3c.dom.Element)n).getAttribute(SERVICE_CATEGORY);
+					m_joinName=((org.w3c.dom.Element)n).getAttribute(SERVICE_NAME);
+
+					// Lookup service associated with category and name
+					m_joinService=getService().getModel().getService(m_joinCategory, m_joinName);
+				
+					// Initialize link, even if service is null - this will be
+					// reported as a validation error later
+					getLinks().add(new ESBLink(m_joinCategory, m_joinName, m_joinService, true));
+				}
+			}
+		}
+	}
+	
+	/**
+	 * This method validates the ESB action and reports warnings or
+	 * errors to the supplied model listener.
+	 * 
+	 * @param l The model listener
+	 */
+	@Override
+	public void validate(ModelListener l) {
+		super.validate(l);
+		
+		// TODO: Validate only one 'when' element, if decision-method
+		// specified, that method exists, if expression, then
+		// validate the expression etc.
+		
+	}
+
+	/**
+	 * This method converts the ESB action into an equivalent
+	 * behavioural description for conformance checking.
+	 * 
+	 * @param activities The list of activities that will contain
+	 * 				the converted action(s)
+	 * @param context The conversion context
+	 */
+	@Override
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
+		
+		When elem=new When();
+		activities.add(elem);
+		
+		elem.derivedFrom(this);
+		
+		if (m_joinService != null) {
+			context.markJoin(m_joinService);
+		}
+		
+		for (int i=0; i < m_services.size(); i++) {
+			ConditionalBlock block=new ConditionalBlock();
+			
+			m_services.get(i).convert(block.getContents(), context);
+			
+			if (block.getContents().size() > 0) {
+				elem.getConditionalBlocks().add(block);
+			}
+		}
+		
+		if (elem.getConditionalBlocks().size() == 0) {
+			activities.remove(elem);
+		}
+		
+		if (m_joinService != null) {
+			m_joinService.convert(activities, context);
+		}
+	}
+
+	private java.util.List<ESBService> m_services=new java.util.Vector<ESBService>();
+	private String m_joinCategory=null;
+	private String m_joinName=null;
+	private ESBService m_joinService=null;
+}

Added: trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/WhileAction.java
===================================================================
--- trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/WhileAction.java	                        (rev 0)
+++ trunk/cdl/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/WhileAction.java	2008-06-25 18:19:59 UTC (rev 72)
@@ -0,0 +1,173 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and others contributors as indicated
+ * by the @authors tag. All rights reserved.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ */
+package org.jboss.tools.overlord.jbossesb.model.actions;
+
+import org.jboss.tools.overlord.jbossesb.model.ConversionContext;
+import org.jboss.tools.overlord.jbossesb.model.ESBAction;
+import org.jboss.tools.overlord.jbossesb.model.ESBLink;
+import org.jboss.tools.overlord.jbossesb.model.ESBService;
+import org.scribble.model.*;
+import org.scribble.conversation.model.*;
+
+/**
+ * The model component for the 'WhileAction'.
+ *  
+ * @author gary
+ */
+public class WhileAction extends ESBAction {
+
+	private static final String SERVICE_NAME = "service-name";
+	private static final String SERVICE_CATEGORY = "service-category";
+	private static final String IMMEDIATE = "immediate";
+	private static final String WHILE = "while";
+	private static final String EXIT = "exit";
+	private static final String PATHS = "paths";
+
+	/**
+	 * This method initializes the links with the ESB service descriptors
+	 * identified in each path of the action.
+	 */
+	@Override
+	protected void initializeLinks() {
+		super.initializeLinks();
+		
+		org.w3c.dom.NodeList nl=getPropertyChildNodes(PATHS);
+		
+		for (int i=0; i < nl.getLength(); i++) {
+			
+			org.w3c.dom.Node n=nl.item(i);
+			
+			if (n instanceof org.w3c.dom.Element) {
+				if (n.getNodeName().equals(WHILE)) {
+					m_loopCategory=((org.w3c.dom.Element)n).getAttribute(SERVICE_CATEGORY);
+					m_loopName=((org.w3c.dom.Element)n).getAttribute(SERVICE_NAME);
+
+					// Lookup service associated with category and name
+					m_loopService=getService().getModel().getService(m_loopCategory, m_loopName);
+				
+					String immediate=((org.w3c.dom.Element)n).getAttribute(IMMEDIATE);
+					
+					// Initialize link, even if service is null - this will be
+					// reported as a validation error later
+					getLinks().add(new ESBLink(m_loopCategory, m_loopName, m_loopService,
+								(immediate != null && immediate.equalsIgnoreCase("true"))));
+				} else if (n.getNodeName().equals(EXIT)) {
+					m_exitCategory=((org.w3c.dom.Element)n).getAttribute(SERVICE_CATEGORY);
+					m_exitName=((org.w3c.dom.Element)n).getAttribute(SERVICE_NAME);
+
+					// Lookup service associated with category and name
+					m_exitService=getService().getModel().getService(m_exitCategory, m_exitName);
+				
+					String immediate=((org.w3c.dom.Element)n).getAttribute(IMMEDIATE);
+					
+					// Initialize link, even if service is null - this will be
+					// reported as a validation error later
+					getLinks().add(new ESBLink(m_exitCategory, m_exitName, m_exitService,
+								(immediate != null && immediate.equalsIgnoreCase("true"))));
+				}
+			}
+		}
+	}
+	
+	/**
+	 * This method determines if the action represents a loop construct.
+	 * 
+	 * @return Whether the action represents a loop construct
+	 */
+	@Override
+	public boolean isLoop() {
+		return(true);
+	}
+	
+	/**
+	 * This method validates the ESB action and reports warnings or
+	 * errors to the supplied model listener.
+	 * 
+	 * @param l The model listener
+	 */
+	@Override
+	public void validate(ModelListener l) {
+		super.validate(l);
+		
+		// While action must be first conversation based action in
+		// the service
+		if (getService() != null && getService().getActions().size() > 0) {
+			ESBAction act=getService().getActions().get(0);
+			
+			if (act != this) {
+				l.error(this, org.scribble.util.MessageUtil.format(
+						java.util.PropertyResourceBundle.getBundle(
+						"org.jboss.tools.overlord.jbossesb.model.actions.Messages"),
+							"_MUST_BE_FIRST_ACTION",
+							new String[]{"While"}), null);
+			}
+		}
+		
+		// TODO: Validate while/exit order, if decision-method
+		// specified, that method exists, if expression, then
+		// validate the expression etc.
+		
+		// TODO: Validate that the loop service returns back to the
+		// while action for all paths
+		
+	}
+
+	/**
+	 * This method converts the ESB action into an equivalent
+	 * behavioural description for conformance checking.
+	 * 
+	 * @param activities The list of activities that will contain
+	 * 				the converted action(s)
+	 * @param context The conversion context
+	 */
+	@Override
+	public void convert(java.util.List<Activity> activities,
+			ConversionContext context) {
+		
+		While elem=new While();
+		activities.add(elem);
+		
+		elem.derivedFrom(this);
+		
+		ConditionalBlock block=new ConditionalBlock();
+		elem.setBlock(block);
+		
+		if (m_loopService != null) {
+			context.push(getService());
+			
+			m_loopService.convert(elem.getBlock().getContents(), context);
+			
+			context.pop(getService());
+		}
+		
+		if (elem.getBlock().getContents().size() == 0) {
+			activities.remove(elem);
+		}
+		
+		if (m_exitService != null) {
+			m_exitService.convert(activities, context);
+		}
+	}
+
+	private String m_loopCategory=null;
+	private String m_loopName=null;
+	private ESBService m_loopService=null;
+	private String m_exitCategory=null;
+	private String m_exitName=null;
+	private ESBService m_exitService=null;
+}




More information about the overlord-commits mailing list