You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sm...@apache.org on 2012/11/30 13:32:13 UTC

svn commit: r1415596 - in /airavata/sandbox/grid-tools/bes-client: ./ src/ src/main/ src/main/assembly/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/airavata/ src/main/java/org/apache/airavata/sample/ src/main/ja...

Author: smarru
Date: Fri Nov 30 12:32:11 2012
New Revision: 1415596

URL: http://svn.apache.org/viewvc?rev=1415596&view=rev
Log:
accepting contributin from shahbaz for AIRAVATA-657

Added:
    airavata/sandbox/grid-tools/bes-client/pom.xml
    airavata/sandbox/grid-tools/bes-client/src/
    airavata/sandbox/grid-tools/bes-client/src/main/
    airavata/sandbox/grid-tools/bes-client/src/main/assembly/
    airavata/sandbox/grid-tools/bes-client/src/main/assembly/dep.xml
    airavata/sandbox/grid-tools/bes-client/src/main/java/
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/BESJob.java
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/CreateActivityTask.java
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/HPCPUtils.java
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/RunBESJob.java
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/UsernamePassword.java
    airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/XmlBeansUtils.java
    airavata/sandbox/grid-tools/bes-client/src/main/resources/
    airavata/sandbox/grid-tools/bes-client/src/main/resources/META-INF/
    airavata/sandbox/grid-tools/bes-client/src/main/resources/META-INF/services/
    airavata/sandbox/grid-tools/bes-client/src/main/resources/META-INF/services/de.fzj.unicore.ucc.ProvidedCommands
    airavata/sandbox/grid-tools/bes-client/src/test/
    airavata/sandbox/grid-tools/bes-client/src/test/java/
    airavata/sandbox/grid-tools/bes-client/src/test/java/org/
    airavata/sandbox/grid-tools/bes-client/src/test/java/org/apache/
    airavata/sandbox/grid-tools/bes-client/src/test/java/org/apache/airavata/
    airavata/sandbox/grid-tools/bes-client/src/test/java/org/apache/airavata/sample/
    airavata/sandbox/grid-tools/bes-client/src/test/java/org/apache/airavata/sample/bes/
    airavata/sandbox/grid-tools/bes-client/src/test/java/org/apache/airavata/sample/bes/TestInterop.java
    airavata/sandbox/grid-tools/bes-client/src/test/resources/
    airavata/sandbox/grid-tools/bes-client/src/test/resources/date-hpcbp.xml
    airavata/sandbox/grid-tools/bes-client/src/test/resources/date.xml

Added: airavata/sandbox/grid-tools/bes-client/pom.xml
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/pom.xml?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/pom.xml (added)
+++ airavata/sandbox/grid-tools/bes-client/pom.xml Fri Nov 30 12:32:11 2012
@@ -0,0 +1,70 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>org.apache.airavata.sample.bes</groupId>
+	<artifactId>bes-simple-client</artifactId>
+	<packaging>jar</packaging>
+	<version>1.0.0-SNAPSHOT</version>
+	<name>BES Interop Implementation</name>
+	<url>http://unicore.sourceforge.net/</url>
+	<repositories>
+		<repository>
+			<id>unicore.eu</id>
+			<name>UNICORE repository</name>
+			<url>http://unicore-dev.zam.kfa-juelich.de/maven</url>
+		</repository>
+	</repositories>
+
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.8.2</version>
+		</dependency>
+
+		<dependency>
+			<groupId>eu.unicore</groupId>
+			<artifactId>ogsabes-client</artifactId>
+			<version>1.5.1-rc3</version>
+		</dependency>
+	</dependencies>
+  <build>
+    <plugins>
+          <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.3.2</version>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+        </configuration>
+      </plugin>
+    
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <configuration>
+          <descriptors>
+            <descriptor>src/main/assembly/dep.xml</descriptor>
+          </descriptors>
+        </configuration>
+        <executions>
+          <execution>
+            <id>make-assembly</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-site-plugin</artifactId>
+        <version>2.2</version>
+      </plugin>
+    </plugins>
+  </build>
+  
+  
+  
+</project>

Added: airavata/sandbox/grid-tools/bes-client/src/main/assembly/dep.xml
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/main/assembly/dep.xml?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/main/assembly/dep.xml (added)
+++ airavata/sandbox/grid-tools/bes-client/src/main/assembly/dep.xml Fri Nov 30 12:32:11 2012
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<assembly>
+  <id>all</id>
+  <formats>
+    <format>zip</format>
+    <format>tar.gz</format>
+  </formats>
+  <fileSets>
+    <fileSet>
+      <includes>
+        <include>*.xml</include>
+        <include>*.conf</include>
+      </includes>
+    </fileSet>
+    <fileSet>
+      <directory>src</directory>
+      <outputDirectory>/src</outputDirectory>
+    </fileSet>
+    <fileSet>
+      <directory>target/endorsed</directory>
+      <outputDirectory>/lib/endorsed</outputDirectory>
+    </fileSet>
+  </fileSets>
+  <dependencySets>
+    <dependencySet>
+      <useStrictFiltering>true</useStrictFiltering>
+      <outputDirectory>lib</outputDirectory>
+      <unpack>false</unpack>
+      <scope>runtime</scope>
+      <excludes>
+      <!-- exclude things not needed by pure clients 
+       <exclude>org.mortbay.jetty:jetty</exclude>
+      -->
+     </excludes>
+    </dependencySet>
+  </dependencySets>
+</assembly>

Added: airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/BESJob.java
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/BESJob.java?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/BESJob.java (added)
+++ airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/BESJob.java Fri Nov 30 12:32:11 2012
@@ -0,0 +1,34 @@
+package org.apache.airavata.sample.bes;
+
+
+import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument;
+
+public class BESJob {
+	
+	private String factoryUrl;
+	
+	private JobDefinitionDocument jobDoc;
+		
+	
+	public BESJob() {
+		
+	}
+
+
+	public String getFactoryUrl() {
+		return factoryUrl;
+	}
+
+	public void setFactory(String factoryUrl) {
+		this.factoryUrl = factoryUrl;
+	}
+
+	public JobDefinitionDocument getJobDoc() {
+		return jobDoc;
+	}
+
+	public void setJobDoc(JobDefinitionDocument jobDoc) {
+		this.jobDoc = jobDoc;
+	}
+	
+}

Added: airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/CreateActivityTask.java
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/CreateActivityTask.java?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/CreateActivityTask.java (added)
+++ airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/CreateActivityTask.java Fri Nov 30 12:32:11 2012
@@ -0,0 +1,80 @@
+package org.apache.airavata.sample.bes;
+
+import java.util.Calendar;
+
+import org.ggf.schemas.bes.x2006.x08.besFactory.ActivityStateEnumeration;
+import org.ggf.schemas.bes.x2006.x08.besFactory.CreateActivityDocument;
+import org.ggf.schemas.bes.x2006.x08.besFactory.CreateActivityResponseDocument;
+import org.w3.x2005.x08.addressing.EndpointReferenceType;
+
+import de.fzj.unicore.bes.client.FactoryClient;
+import de.fzj.unicore.wsrflite.xmlbeans.WSUtilities;
+import eu.unicore.security.util.client.IClientProperties;
+
+public class CreateActivityTask {
+
+	private BESJob job;
+
+	private IClientProperties sec;
+	private String jobId;
+	
+	
+	public CreateActivityTask(BESJob job, IClientProperties sec) {
+		this.job = job;
+		this.sec = sec;
+		
+	}
+
+	public void startJob() throws Exception {
+		String factoryUrl = job.getFactoryUrl();
+		EndpointReferenceType eprt = EndpointReferenceType.Factory
+				.newInstance();
+		eprt.addNewAddress().setStringValue(factoryUrl);
+		System.out.println("========================================");
+		System.out.println(String.format("Job Submitted to %s.\n", factoryUrl));
+		FactoryClient factory = new FactoryClient(eprt, sec);
+		CreateActivityDocument cad = CreateActivityDocument.Factory
+				.newInstance();
+		cad.addNewCreateActivity().addNewActivityDocument()
+				.setJobDefinition(job.getJobDoc().getJobDefinition());
+		CreateActivityResponseDocument response = factory.createActivity(cad);
+		EndpointReferenceType activityEpr = response
+				.getCreateActivityResponse().getActivityIdentifier();
+//		factory.waitWhileActivityIsDone(activityEpr, 1000);
+		jobId = WSUtilities.extractResourceID(activityEpr);
+		if (jobId == null) {
+			jobId = new Long(Calendar.getInstance().getTimeInMillis())
+					.toString();
+		}
+		ActivityStateEnumeration.Enum state = factory.getActivityStatus(activityEpr);
+		
+		String status;
+		
+		status = String.format("Job %s is %s.\n", activityEpr.getAddress()
+				.getStringValue(), factory.getActivityStatus(activityEpr)
+				.toString()).toString();
+		
+		
+		while ((factory.getActivityStatus(activityEpr) != ActivityStateEnumeration.FINISHED) && 
+				(factory.getActivityStatus(activityEpr) != ActivityStateEnumeration.FAILED)){
+			status = String.format("Job %s is %s.\n", activityEpr.getAddress()
+					.getStringValue(), factory.getActivityStatus(activityEpr)
+					.toString()).toString();
+			Thread.sleep(1500);
+			continue;
+		}
+		
+		status = String.format("Job %s is %s.\n", activityEpr.getAddress()
+				.getStringValue(), factory.getActivityStatus(activityEpr)
+				.toString()).toString();
+		
+		System.out.println(status);
+		
+		if (!(factory.getActivityStatus(activityEpr) == ActivityStateEnumeration.FINISHED)) {
+			throw new Exception("Job "+activityEpr.getAddress().getStringValue()+" "+state.toString());
+		}
+	}
+
+
+
+}

Added: airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/HPCPUtils.java
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/HPCPUtils.java?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/HPCPUtils.java (added)
+++ airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/HPCPUtils.java Fri Nov 30 12:32:11 2012
@@ -0,0 +1,116 @@
+package org.apache.airavata.sample.bes;
+
+
+import javax.xml.namespace.QName;
+
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlCursor.TokenType;
+import org.apache.xmlbeans.XmlObject;
+import eu.unicore.security.util.Log;
+
+/**
+ * Helper for dealing with the HPC file staging profile (see GFD.135)
+ * (activity credentials)
+ * 
+ * @author schuller
+ */
+public class HPCPUtils {
+	
+	private HPCPUtils(){}
+	
+	public final static QName AC_QNAME=new QName("http://schemas.ogf.org/hpcp/2007/11/ac","Credential");
+	public final static QName AC_USERNAME=new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","Username");
+	public final static QName AC_PASSWD=new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","Password");
+	public final static QName AC_QNAME_2=new QName("http://schemas.ogf.org/hpcp/2007/01/fs","Credential");
+	/** 
+	 * Extracts username and password from the security credentials as defined in the HPC file staging profile (GFD.135)
+	 * <br/><br/>
+	   &lt;Credential xmlns="http://schemas.ogf.org/hpcp/2007/01/ac"&gt;<br/>
+         &lt;UsernameToken xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">&gt;<br/>
+          &lt;Username>sc07demo &lt;/Username&gt;<br/>
+          &lt;Password>hpcpsc07 &lt;/Password&gt;<br/>
+           &lt;/UsernameToken&gt;<br/>
+       &lt;/Credential&gt;<br/>
+     * <br/>
+	 * The first HPCP Activity Credential found in the given source document is used
+	 * 
+	 * @param source -  an XML document 
+	 * @return {@link UsernamePassword} containing the username and password found in the XML
+	 */
+	public static UsernamePassword extractUsernamePassword(XmlObject source){
+		String user=null;
+		String passwd=null;
+		try{
+			XmlObject copy=source.copy();
+			XmlObject credential=XmlBeansUtils.extractFirstAnyElement(copy, AC_QNAME);
+			if(credential==null){
+				//try namespace defined by GFD.135 (but not used in the example)
+				credential=XmlBeansUtils.extractFirstAnyElement(copy, AC_QNAME_2);
+			}
+			if(credential!=null){
+				user=getUserName(credential);
+				passwd=getPassword(credential);
+			}
+		}catch(Exception ex){
+			Log.logException("Problem extracting data staging credentials.", ex);
+		}
+		return new UsernamePassword(user, passwd);
+	}
+	
+	/**
+	 * extract the username token
+	 * @param credentials
+	 * @return username or null if not found
+	 */
+	private static String getUserName(XmlObject credentials){
+		XmlCursor c=credentials.newCursor();
+		try{
+			int t;
+				while(true){
+					t=c.toNextToken().intValue();
+					if(t==TokenType.INT_ENDDOC)return null;
+					if(t==TokenType.INT_START){
+						if(AC_USERNAME.equals(c.getName())){
+							while(c.toNextToken().intValue()!=TokenType.INT_TEXT);
+							String res=c.getChars().trim();
+							c.dispose();
+							return res;
+						}
+					}
+				}
+		}catch(Exception e){ }
+		finally{
+			if(c!=null)c.dispose();
+		}
+		return null;
+	}
+
+	/**
+	 * extract the password token
+	 * @param credentials
+	 * @return password or null if not found
+	 */
+	private static String getPassword(XmlObject credentials){
+		XmlCursor c=credentials.newCursor();
+		try{
+			int t;
+				while(true){
+					t=c.toNextToken().intValue();
+					if(t==TokenType.INT_ENDDOC)return null;
+					if(t==TokenType.INT_START){
+						if(AC_PASSWD.equals(c.getName())){
+							while(c.toNextToken().intValue()!=TokenType.INT_TEXT);
+							String res=c.getChars().trim();
+							c.dispose();
+							return res;
+						}
+					}
+				}
+		}catch(Exception e){ }
+		finally{
+			if(c!=null)c.dispose();
+		}
+		return null;
+	}
+
+}

Added: airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/RunBESJob.java
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/RunBESJob.java?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/RunBESJob.java (added)
+++ airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/RunBESJob.java Fri Nov 30 12:32:11 2012
@@ -0,0 +1,64 @@
+package org.apache.airavata.sample.bes;
+
+import java.io.File;
+import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument;
+import de.fzj.unicore.uas.security.ClientProperties;
+import eu.unicore.security.util.client.IClientProperties;
+
+public class RunBESJob {
+
+	protected IClientProperties securityProperties;
+
+	static final String factoryUrl = "https://zam1161v01.zam.kfa-juelich.de:8002/INTEROP1/services/BESFactory?res=default_bes_factory";
+
+	static final String jsdlPath = "src/test/resources/date.xml";
+
+	public RunBESJob() {
+		securityProperties = initSecurityProperties();
+	}
+
+	public void runJob() {
+
+		JobDefinitionDocument jobDoc = null;
+		try {
+			jobDoc = JobDefinitionDocument.Factory.parse(new File(jsdlPath));
+		} catch (Exception e) {
+			System.err.println("Error parsing JSDL instance. " + e);
+		}
+
+		BESJob job = new BESJob();
+		job.setFactory(factoryUrl);
+		job.setJobDoc(jobDoc);
+
+		CreateActivityTask th = new CreateActivityTask(job, securityProperties);
+		try {
+			th.startJob();
+		} catch (Exception e) {
+
+			System.err.println("Couldn't run job: " + e);
+		}
+
+	}
+
+	protected ClientProperties initSecurityProperties() {
+
+		ClientProperties sp = new ClientProperties();
+
+		sp.setSslEnabled(true);
+		sp.setSignMessage(true);
+
+		sp.setKeystore("src/test/resources/demo-keystore.jks");
+		sp.setKeystorePassword("654321");
+		sp.setKeystoreAlias("demouser-new");
+		sp.setKeystoreType("JKS");
+
+//		sp.setTruststore("src/test/resources/demo-keystore.jks");
+//		sp.setTruststorePassword("654321");
+//		sp.setKeystoreType("JKS");
+
+		return sp;
+
+	}
+
+	
+}

Added: airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/UsernamePassword.java
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/UsernamePassword.java?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/UsernamePassword.java (added)
+++ airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/UsernamePassword.java Fri Nov 30 12:32:11 2012
@@ -0,0 +1,36 @@
+package org.apache.airavata.sample.bes;
+import java.io.Serializable;
+
+
+
+/**
+ * holds username and password for some types of data staging, 
+ * as found in the job description
+ * 
+ * @author schuller
+ */
+public class UsernamePassword implements Serializable {
+
+	private static final long serialVersionUID=1L;
+	
+	private final String user;
+	
+	private final String password;
+	
+	public UsernamePassword(String user, String password){
+		this.user=user;
+		this.password=password;
+	}
+
+	public String getUser() {
+		return user;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public String toString(){
+		return "UsernamePassword["+user+" "+password+"]";
+	}
+}

Added: airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/XmlBeansUtils.java
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/XmlBeansUtils.java?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/XmlBeansUtils.java (added)
+++ airavata/sandbox/grid-tools/bes-client/src/main/java/org/apache/airavata/sample/bes/XmlBeansUtils.java Fri Nov 30 12:32:11 2012
@@ -0,0 +1,289 @@
+package org.apache.airavata.sample.bes;
+
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.XmlCursor.TokenType;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class XmlBeansUtils {
+
+	/**
+	 * appends a XmlObject into another, immediately before the end tag<br>
+	 * @param what
+	 * @param toWhere
+	 */
+	public static void append(XmlObject what, XmlObject toWhere){
+		XmlCursor sourceCurs=what.newCursor();
+		sourceCurs.toNextToken();
+		XmlCursor targetCurs = toWhere.newCursor();
+		targetCurs.toEndDoc();
+		targetCurs.toPrevToken();
+		sourceCurs.copyXml(targetCurs);
+		sourceCurs.dispose();
+		targetCurs.dispose();
+	}
+
+	/**
+	 * returns the QName for the "root element" of the Argument
+	 * @param o
+	 * @return
+	 */
+	public static QName getQNameFor(XmlObject o){
+		XmlCursor c=o.newCursor();
+		try{
+			c.toFirstChild();
+			return c.getName();
+		}finally{
+			c.dispose();
+		}
+	}
+	/**
+	 * extract xsd:any elements using DOM
+	 * 
+	 * @param source - the xml fragment
+	 * @param q - QName of elements to extract. If null, all children will be returned
+	 * @return XmlObject[]
+	 * @throws XmlException
+	 */
+	public static XmlObject[] extractAnyElements(XmlObject source, QName q)throws XmlException{
+		NodeList nodes=source.getDomNode().getChildNodes();
+		List<XmlObject>results=new ArrayList<XmlObject>();
+		for(int i=0;i<nodes.getLength();i++){
+			Node n=nodes.item(i);
+			if(q!=null){
+				if(q.getNamespaceURI().equals(n.getNamespaceURI()) 
+						&& q.getLocalPart().equals(n.getLocalName())){
+					XmlObject o=XmlObject.Factory.parse(n);
+					results.add(o);
+				}
+			}else{
+				XmlObject o=XmlObject.Factory.parse(n);
+				results.add(o);
+			}
+		}
+		return results.toArray(new XmlObject[results.size()]);
+	}
+
+	public static XmlObject extractFirstAnyElement(XmlObject source, QName q)throws XmlException,IOException{
+		XmlCursor c=source.newCursor();
+		if(skipToElement(c, q)){
+			XmlObject res=XmlObject.Factory.parse(c.newInputStream());
+			c.dispose();
+			return res;
+		}else{
+			return null;
+		}
+	}
+
+	public static XmlObject extractFirstAnyElement(XmlObject source, QName[] q)throws XmlException,IOException{
+		XmlCursor c=source.newCursor();
+		if(skipToElement(c, q)){
+			XmlObject res=XmlObject.Factory.parse(c.newInputStream());
+			c.dispose();
+			return res;
+		}else{
+			return null;
+		}
+	}
+
+	public static Map<String,String>extractAttributes(XmlObject source){
+		Map<String,String>result=new HashMap<String,String>();
+		XmlCursor curs=source.newCursor();
+		while(curs.hasNextToken()){
+			TokenType type=curs.toNextToken();
+			if(TokenType.END.equals(type))break;
+			if(TokenType.ATTR.equals(type)){
+				QName q=curs.getName();
+				String val=curs.getTextValue();
+				result.put(q.getLocalPart(),val);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * extract the text content of an XML element 
+	 * 
+	 * @param source the xml element
+	 * 
+	 * @return the text content, or "" if element has no content
+	 */
+	public static String extractElementTextAsString(XmlObject source){
+		XmlCursor c=null;
+		try{
+			c=source.newCursor();
+			while(c.hasNextToken()){
+				if(c.toNextToken().equals(TokenType.TEXT)){
+					return c.getChars();	
+				}
+			}
+			return "";
+		}finally{
+			try{
+				c.dispose();
+			}catch(Exception e){}
+		}
+	}
+
+	/**
+	 * fast-forward the cursor up to the element with the given QName
+	 *  
+	 * @param cursor
+	 * @param name
+	 * @return false if element does not exist
+	 */
+	public static boolean skipToElement(XmlCursor cursor, QName name){
+		// walk through element tree in prefix order (root first, then children from left to right)
+		if(name.equals(cursor.getName())) return true;
+		boolean hasMoreChildren=true;
+		int i=0;
+		while(hasMoreChildren){
+			hasMoreChildren = cursor.toChild(i++);
+			if(hasMoreChildren){
+				boolean foundInChild = skipToElement(cursor, name);
+				if(foundInChild) return true;
+				cursor.toParent();
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * fast-forward the cursor up to the element with one of the given QNames
+	 *  
+	 * @param cursor
+	 * @param names - list of acceptable qnames
+	 * @return false if element does not exist
+	 */
+	public static boolean skipToElement(XmlCursor cursor, QName[] names){
+		// walk through element tree in prefix order (root first, then children from left to right)
+		for(QName name: names){	
+			if(name.equals(cursor.getName())) return true;
+		}
+		boolean hasMoreChildren=true;
+		int i=0;
+		while(hasMoreChildren){
+			hasMoreChildren = cursor.toChild(i++);
+			if(hasMoreChildren){
+				boolean foundInChild = skipToElement(cursor, names);
+				if(foundInChild) return true;
+				cursor.toParent();
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * extract the text of a certain element from an xml document
+	 * @param source
+	 * @param names
+	 * @return text or null if undefined
+	 */
+	public static String getElementText(XmlObject source, QName[] names){
+		try{
+			XmlObject o=extractFirstAnyElement(source, names);
+			return extractElementTextAsString(o);	
+		}
+		catch(Exception ex){
+			return null;
+		}
+	}
+
+
+	/**
+	 * extract the text of the specified element
+	 * @param source - the source XML document
+	 * @param name - the qname of the desired element
+	 * @return
+	 */
+	public static String getElementText(XmlObject source, QName name){
+		try{
+			XmlObject o=extractFirstAnyElement(source, name);
+			if(o==null)return null;
+			return extractElementTextAsString(o);	
+		}
+		catch(Exception ex){
+			return null;
+		}
+	}
+
+	public static String getAttributeText(XmlObject source, QName elementName, QName attributeName){
+		try{
+			XmlObject o=extractFirstAnyElement(source, elementName);
+			if(o==null)return null;
+			return getAttributeText(o, attributeName);
+		}
+		catch(Exception ex){
+		}
+		return null;
+	}
+
+	public static String getAttributeText(XmlObject source, QName attributeName){
+		XmlCursor c=source.newCursor();
+		try{
+			TokenType t=null;
+			do{
+				t=c.toNextToken();
+				if(t.isAttr()){
+					if(attributeName.equals(c.getName())){
+						return c.getTextValue();
+					}
+				}
+			}while(!TokenType.END.equals(t));
+			return null;
+		}finally{
+			c.dispose();
+		}
+	}
+
+	/**
+	 * extract an array of XML elements identified by their qname from an XML source 
+	 * document. 
+	 * 
+	 * @param source - the xml fragment
+	 * @param q - QName of elements to extract
+	 * @param asClass - the XMLbeans class of the elements to extract
+	 * @return List<T> - a list of XMLBeans objects with the correct runtime type
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> List<T>extractAnyElements(XmlObject source, QName q, Class<? extends XmlObject>asClass){
+		List<T>results=new ArrayList<T>();
+		XmlCursor cursor=null;
+		try{
+			if(source != null){
+				cursor = source.newCursor();
+				skipToElement(cursor, q);
+				String ns=q.getNamespaceURI();
+				boolean hasMore =true;
+				while(hasMore){
+					XmlObject next = XmlObject.Factory.parse(cursor.newXMLStreamReader());
+					QName name = cursor.getName();
+					if( (name!=null &&  (ns.equals(name.getNamespaceURI()) || "*".equals(ns))) 
+							&& q.getLocalPart().equals(name.getLocalPart())){
+						results.add((T)next);
+					}
+					hasMore = cursor.toNextSibling();
+				}
+			}
+		}
+		catch(XmlException xe){
+			//what?
+		}
+		finally{
+			if(cursor!=null)cursor.dispose();
+		}
+		return results;
+	}
+}
+

Added: airavata/sandbox/grid-tools/bes-client/src/main/resources/META-INF/services/de.fzj.unicore.ucc.ProvidedCommands
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/main/resources/META-INF/services/de.fzj.unicore.ucc.ProvidedCommands?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/main/resources/META-INF/services/de.fzj.unicore.ucc.ProvidedCommands (added)
+++ airavata/sandbox/grid-tools/bes-client/src/main/resources/META-INF/services/de.fzj.unicore.ucc.ProvidedCommands Fri Nov 30 12:32:11 2012
@@ -0,0 +1,4 @@
+#
+# commands provided by the UCC workflow module
+#
+eu.unicore.interop.bes.BESInteropCommands
\ No newline at end of file

Added: airavata/sandbox/grid-tools/bes-client/src/test/java/org/apache/airavata/sample/bes/TestInterop.java
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/test/java/org/apache/airavata/sample/bes/TestInterop.java?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/test/java/org/apache/airavata/sample/bes/TestInterop.java (added)
+++ airavata/sandbox/grid-tools/bes-client/src/test/java/org/apache/airavata/sample/bes/TestInterop.java Fri Nov 30 12:32:11 2012
@@ -0,0 +1,17 @@
+package org.apache.airavata.sample.bes;
+
+import org.apache.airavata.sample.bes.RunBESJob;
+import org.junit.Test;
+
+
+
+public class TestInterop {
+
+	@Test
+	public void testRunJob(){
+		RunBESJob besJob = new RunBESJob();
+		besJob.runJob();
+	}
+	
+	
+}

Added: airavata/sandbox/grid-tools/bes-client/src/test/resources/date-hpcbp.xml
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/test/resources/date-hpcbp.xml?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/test/resources/date-hpcbp.xml (added)
+++ airavata/sandbox/grid-tools/bes-client/src/test/resources/date-hpcbp.xml Fri Nov 30 12:32:11 2012
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jsdl:JobDefinition xmlns:jsdl="http://schemas.ggf.org/jsdl/2005/11/jsdl"
+                    xmlns:jsdl-hpcpa="http://schemas.ggf.org/jsdl/2006/07/jsdl-hpcpa"
+                    xmlns:cred="http://schemas.ogf.org/hpcp/2007/11/ac"
+                    xmlns:token="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
+  <jsdl:JobDescription>
+    <jsdl:JobIdentification>
+      <jsdl:JobName>Date-Job</jsdl:JobName>
+      <jsdl:JobProject>SG-ExampleJob</jsdl:JobProject>
+    </jsdl:JobIdentification>
+    <jsdl:Resources>
+      <jsdl:TotalCPUCount>
+        <jsdl:Exact>1</jsdl:Exact>
+      </jsdl:TotalCPUCount>
+      <jsdl:IndividualCPUTime>
+        <jsdl:Exact>3600</jsdl:Exact>
+      </jsdl:IndividualCPUTime>
+    </jsdl:Resources>
+    <jsdl:Application>
+      <jsdl-hpcpa:HPCProfileApplication>
+	      <jsdl-hpcpa:Executable>/bin/date</jsdl-hpcpa:Executable>
+	      <jsdl-hpcpa:Output>stdout.txt</jsdl-hpcpa:Output>
+      </jsdl-hpcpa:HPCProfileApplication>
+    </jsdl:Application>
+  </jsdl:JobDescription>
+</jsdl:JobDefinition>
+

Added: airavata/sandbox/grid-tools/bes-client/src/test/resources/date.xml
URL: http://svn.apache.org/viewvc/airavata/sandbox/grid-tools/bes-client/src/test/resources/date.xml?rev=1415596&view=auto
==============================================================================
--- airavata/sandbox/grid-tools/bes-client/src/test/resources/date.xml (added)
+++ airavata/sandbox/grid-tools/bes-client/src/test/resources/date.xml Fri Nov 30 12:32:11 2012
@@ -0,0 +1,9 @@
+<jsdl:JobDefinition xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:app="http://schemas.ggf.org/jsdl/2006/07/jsdl-hpcpa" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:jsdl="http://schemas.ggf.org/jsdl/2005/11/jsdl" xmlns:bes="http://schemas.ggf.org/bes/2006/08/bes-factory" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://schemas.ggf.org/jsdl/2005/11/jsdl-posix">
+  <jsdl:JobDescription>
+    <jsdl:Application>
+      <POSIXApplication>
+        <Executable>/bin/date</Executable>
+      </POSIXApplication>
+    </jsdl:Application>
+  </jsdl:JobDescription>
+</jsdl:JobDefinition>
\ No newline at end of file