You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by go...@apache.org on 2017/05/02 17:50:22 UTC

[2/3] airavata git commit: Add implementation for BESJobSubmissionTask

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/JSDLUtils.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/JSDLUtils.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/JSDLUtils.java
new file mode 100644
index 0000000..48e6986
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/JSDLUtils.java
@@ -0,0 +1,517 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+ */
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+
+import org.apache.commons.httpclient.URIException;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlObject;
+import org.ggf.schemas.jsdl.x2005.x11.jsdl.*;
+import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.EnvironmentType;
+import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument;
+import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationType;
+import org.ggf.schemas.jsdl.x2006.x07.jsdlHpcpa.HPCProfileApplicationDocument;
+import org.ggf.schemas.jsdl.x2006.x07.jsdlHpcpa.HPCProfileApplicationType;
+import org.ogf.schemas.jsdl.x2007.x02.jsdlSpmd.SPMDApplicationDocument;
+import org.ogf.schemas.jsdl.x2007.x02.jsdlSpmd.SPMDApplicationType;
+
+import javax.xml.namespace.QName;
+
+
+/**
+ * 
+ * @author shahbaz memon, bastian demuth
+ *
+ */
+public class JSDLUtils
+{
+
+	public static final int FLAG_OVERWRITE = 1;
+	public static final int FLAG_APPEND = 2;
+	public static final int FLAG_DELETE_ON_TERMINATE = 32;
+
+	public static final QName POSIX_APPLICATION=POSIXApplicationDocument.type.getDocumentElementName();
+	
+	public static final QName HPC_PROFILE_APPLICATION=HPCProfileApplicationDocument.type.getDocumentElementName();
+	
+	public static final QName SPMD_APPLICATION=SPMDApplicationDocument.type.getDocumentElementName();
+	
+	public static final String PROCESSESPERHOST = "ProcessesPerHost"; 
+	public static final String NUMBEROFPROCESSES = "NumberOfProcesses";
+	public static final String THREADSPERHOST = "ThreadsPerHost";
+
+
+	
+	public static EnvironmentType addEnvVariable(JobDefinitionType def,String name, String value) {
+		POSIXApplicationType posixApp = getOrCreatePOSIXApplication(def);
+		EnvironmentType newEnv = posixApp.addNewEnvironment();
+		newEnv.setName(name);
+		newEnv.setStringValue(value);
+		return newEnv;
+	}
+
+	public static void setApplicationName(JobDefinitionType value, String applicationName) {
+		getOrCreateApplication(value).setApplicationName(applicationName);
+	}
+
+	public static void setApplicationVersion(JobDefinitionType value, String applicationVersion) {
+		getOrCreateApplication(value).setApplicationVersion(applicationVersion);
+	}
+
+	public static void addProjectName(JobDefinitionType value, String projectName) {
+		getOrCreateJobIdentification(value).addNewJobProject().setStringValue(projectName);
+	}
+	
+	public static void addMultipleProjectNames(JobDefinitionType value, String[] projectNames) {
+		for (String name : projectNames) {
+			getOrCreateJobIdentification(value).addNewJobProject().setStringValue(name);
+		}
+	}
+
+	public static void addCandidateHost(JobDefinitionType value, String host) {
+		getOrCreateCandidateHosts(value).addHostName(host);
+
+	}
+	public static void addDataStagingTargetElement(JobDefinitionType value, String fileSystem, String file, String uri) {
+		addDataStagingTargetElement(value,fileSystem, file, uri, 1);
+	}
+
+	public static void addDataStagingTargetElement(JobDefinitionType value, String fileSystem, String file, String uri, int flags) {
+		JobDescriptionType jobDescr = getOrCreateJobDescription(value);
+		DataStagingType newDS = jobDescr.addNewDataStaging();
+		CreationFlagEnumeration.Enum creationFlag = CreationFlagEnumeration.DONT_OVERWRITE;
+		if((flags & FLAG_OVERWRITE) != 0) creationFlag = CreationFlagEnumeration.OVERWRITE;
+		if((flags & FLAG_APPEND) != 0) creationFlag = CreationFlagEnumeration.APPEND;
+		boolean deleteOnTerminate = (flags & FLAG_DELETE_ON_TERMINATE) != 0;
+		newDS.setCreationFlag(creationFlag);
+		newDS.setDeleteOnTermination(deleteOnTerminate);
+		SourceTargetType target = newDS.addNewTarget();
+
+		try {
+			if (uri != null) { 
+				URIUtils.encodeAll(uri);
+				target.setURI(uri);
+			}
+		} catch (URIException e) {
+		}
+		newDS.setFileName(file);
+		if (fileSystem != null && !fileSystem.equals("Work")) {  //$NON-NLS-1$
+			newDS.setFilesystemName(fileSystem);
+		}
+	}
+
+	public static void addDataStagingSourceElement(JobDefinitionType value, String uri, String fileSystem, String file) {
+		addDataStagingSourceElement(value, uri, fileSystem, file, 1);
+	}
+
+	public static void addDataStagingSourceElement(JobDefinitionType value, String uri, String fileSystem, String file, int flags) {
+		JobDescriptionType jobDescr = getOrCreateJobDescription(value);
+
+		try {
+			uri = (uri == null) ? null : URIUtils.encodeAll(uri);
+		} catch (URIException e) {
+		}
+		DataStagingType newDS = jobDescr.addNewDataStaging();
+		CreationFlagEnumeration.Enum creationFlag = CreationFlagEnumeration.DONT_OVERWRITE;
+		if((flags & FLAG_OVERWRITE) != 0) creationFlag = CreationFlagEnumeration.OVERWRITE;
+		if((flags & FLAG_APPEND) != 0) creationFlag = CreationFlagEnumeration.APPEND;
+		boolean deleteOnTerminate = (flags & FLAG_DELETE_ON_TERMINATE) != 0;
+		newDS.setCreationFlag(creationFlag);
+		newDS.setDeleteOnTermination(deleteOnTerminate);
+		SourceTargetType source = newDS.addNewSource();
+		source.setURI(uri);
+		newDS.setFileName(file);
+		if (fileSystem != null && !fileSystem.equals("Work")) {  //$NON-NLS-1$
+			newDS.setFilesystemName(fileSystem);
+		}
+	}
+
+
+	public static ApplicationType getOrCreateApplication(JobDefinitionType value) {
+		JobDescriptionType jobDescr = getOrCreateJobDescription(value);
+		if (!jobDescr.isSetApplication()) {
+			jobDescr.addNewApplication();
+		}
+		return jobDescr.getApplication();
+	}
+
+	public static CandidateHostsType getOrCreateCandidateHosts(JobDefinitionType value) {
+		ResourcesType resources = getOrCreateResources(value);
+		if (!resources.isSetCandidateHosts()) {
+			resources.addNewCandidateHosts();
+		}
+		return resources.getCandidateHosts();
+	}
+
+	public static CPUArchitectureType getOrCreateCPUArchitecture(JobDefinitionType value) {
+
+		ResourcesType jobResources = getOrCreateResources(value);
+		if (!jobResources.isSetCPUArchitecture()) {
+			jobResources.addNewCPUArchitecture();
+		}
+		return jobResources.getCPUArchitecture();
+	}
+
+	public static org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType getOrCreateIndividualCPUCount(JobDefinitionType value) {
+		ResourcesType jobResources = getOrCreateResources(value);
+		if (!jobResources.isSetIndividualCPUCount()) {
+			jobResources.addNewIndividualCPUCount();
+		}
+		return jobResources.getIndividualCPUCount();
+	}
+
+
+	public static org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType getOrCreateIndividualCPUSpeed(JobDefinitionType value) {
+
+		ResourcesType jobResources = getOrCreateResources(value);
+		if (!jobResources.isSetIndividualCPUSpeed()) {
+			jobResources.addNewIndividualCPUSpeed();
+		}
+		return jobResources.getIndividualCPUSpeed();
+	}
+
+	public static org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType getOrCreateIndividualCPUTime(JobDefinitionType value) {
+
+		ResourcesType jobResources = getOrCreateResources(value);
+		if ( !jobResources.isSetIndividualCPUTime() ) {
+			jobResources.addNewIndividualCPUTime();
+		}
+		return jobResources.getIndividualCPUTime();
+	}
+
+	public static org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType getOrCreateIndividualDiskSpace(JobDefinitionType value) {
+
+		ResourcesType jobResources = getOrCreateResources(value);
+		if (!jobResources.isSetIndividualDiskSpace()) {
+			jobResources.addNewIndividualDiskSpace();
+		}
+		return jobResources.getIndividualDiskSpace();
+	}
+
+	public static org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType getOrCreateIndividualPhysicalMemory(JobDefinitionType value) {
+
+		ResourcesType jobResources = getOrCreateResources(value);
+		if (!jobResources.isSetIndividualPhysicalMemory()) {
+			jobResources.addNewIndividualPhysicalMemory();
+		}
+		return jobResources.getIndividualPhysicalMemory();
+	}
+
+	public static JobDescriptionType getOrCreateJobDescription(JobDefinitionType value) {
+		if (value.getJobDescription() == null) {
+			return value.addNewJobDescription();
+		}
+		return value.getJobDescription();
+	}
+
+	public static JobIdentificationType getOrCreateJobIdentification(JobDefinitionType value) {
+		JobDescriptionType descr = getOrCreateJobDescription(value);
+		if (descr.getJobIdentification() == null) {
+			return descr.addNewJobIdentification();
+		}
+		return descr.getJobIdentification();
+	}
+
+	public static OperatingSystemType getOrCreateOperatingSystem(JobDefinitionType value)
+	{
+		ResourcesType jobResources = getOrCreateResources(value);
+		if(!jobResources.isSetOperatingSystem()) {
+			jobResources.addNewOperatingSystem();
+		}
+		return jobResources.getOperatingSystem();
+	}
+
+	public static ResourcesType getOrCreateResources(JobDefinitionType value) {
+		JobDescriptionType jobDescr = getOrCreateJobDescription(value);
+		if (!jobDescr.isSetResources()) {
+			jobDescr.addNewResources();
+		}
+		return jobDescr.getResources();
+	}
+
+
+	public static org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType getOrCreateTotalCPUCount(JobDefinitionType value) {
+
+		ResourcesType jobResources = getOrCreateResources(value);
+		if ( !jobResources.isSetTotalCPUCount() ) {
+			jobResources.addNewTotalCPUCount();
+		}
+		return jobResources.getTotalCPUCount();
+	}
+
+
+	public static org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType getOrCreateTotalResourceCount(JobDefinitionType value) {
+
+		ResourcesType jobResources = getOrCreateResources(value);
+		if ( !jobResources.isSetTotalResourceCount())
+		{
+			jobResources.addNewTotalResourceCount();
+		}
+		return jobResources.getTotalResourceCount();
+	}
+
+	public static POSIXApplicationType getOrCreatePOSIXApplication(JobDefinitionType value) {
+
+		ApplicationType application = getOrCreateApplication(value);
+
+		if(getHPCProfileApplication(value) != null){
+			//TODO handle: not creating POSIX element if HPCProfile already exists
+			return getPOSIXApplication(value);
+		}
+
+		if (getPOSIXApplication(value) == null) {
+			XmlCursor acursor = application.newCursor();
+			acursor.toEndToken();
+			acursor.insertElement(POSIX_APPLICATION);
+			acursor.dispose();
+		}
+		return getPOSIXApplication(value);
+	}
+
+
+	public static SPMDApplicationType getOrCreateSPMDApplication(JobDefinitionType value) {
+
+		ApplicationType application = getOrCreateApplication(value);
+
+		if (getSPMDApplication(value) == null) {
+			XmlCursor acursor = application.newCursor();
+			acursor.toEndToken();
+			acursor.insertElement(SPMD_APPLICATION);
+			acursor.dispose();
+		}
+		return getSPMDApplication(value);
+	}
+
+	public static SPMDApplicationType getSPMDApplication(JobDefinitionType value) {
+		if (value != null &&
+				value.getJobDescription() != null &&
+				value.getJobDescription().isSetApplication() ) {
+			XmlCursor acursor = value.getJobDescription().getApplication().newCursor();
+			if (acursor.toFirstChild()) {
+				do {
+					if(acursor.getName().equals(SPMD_APPLICATION)) {
+						XmlObject result = acursor.getObject();
+						acursor.dispose();
+						return (SPMDApplicationType) result;
+					}
+				} while (acursor.toNextSibling());
+				acursor.dispose();
+				return null;
+			} else {
+				acursor.dispose();
+				return null;
+			}
+		} else {
+			return null;
+		}
+	}
+
+
+
+	public static POSIXApplicationType getPOSIXApplication(JobDefinitionType value) {
+		if (value != null &&
+				value.getJobDescription() != null &&
+				value.getJobDescription().isSetApplication() ) {
+			XmlCursor acursor = value.getJobDescription().getApplication().newCursor();
+			if (acursor.toFirstChild()) {
+				do {
+					if(acursor.getName().equals(POSIX_APPLICATION)) {
+						XmlObject result = acursor.getObject();
+						acursor.dispose();
+						return (POSIXApplicationType) result;
+					}
+				} while (acursor.toNextSibling());
+				acursor.dispose();
+				return null;
+			} else {
+				acursor.dispose();
+				return null;
+			}
+		} else {
+			return null;
+		}
+	}
+
+
+
+	public static HPCProfileApplicationType getOrCreateHPCProfileApplication(JobDefinitionType value) {
+
+		ApplicationType application = getOrCreateApplication(value);
+
+		if(getPOSIXApplication(value) != null){
+			//TODO handle: creating HPC element if POSIX already exists
+			return getHPCProfileApplication(value);
+		}
+
+		if (getHPCProfileApplication(value) == null) {
+			XmlCursor acursor = application.newCursor();
+			acursor.toEndToken();
+			acursor.insertElement(HPC_PROFILE_APPLICATION);
+			acursor.dispose();
+		}
+		return getHPCProfileApplication(value);
+	}
+
+
+	public static HPCProfileApplicationType getHPCProfileApplication(JobDefinitionType value) {
+		if (value != null &&
+				value.getJobDescription() != null &&
+				value.getJobDescription().isSetApplication() ) {
+			XmlCursor acursor = value.getJobDescription().getApplication().newCursor();
+			if (acursor.toFirstChild()) {
+				do {
+					if(acursor.getName().equals(HPC_PROFILE_APPLICATION)) {
+						XmlObject result = acursor.getObject();
+						acursor.dispose();
+						return (HPCProfileApplicationType) result;
+					}
+				} while (acursor.toNextSibling());
+				acursor.dispose();
+				return null;
+			} else {
+				acursor.dispose();
+				return null;
+			}
+		} else {
+			return null;
+		}
+	}
+
+
+
+
+	public static RangeValueType getTotalCPUCountRequirements(JobDefinitionType value) {
+		if(value != null && value.getJobDescription() != null && value.getJobDescription().isSetResources() &&
+				value.getJobDescription().getResources().isSetTotalCPUCount()){
+			return toU6RangeValue(value.getJobDescription().getResources().getTotalCPUCount());
+		}
+		else
+			return null;
+	}
+
+	public static RangeValueType getTotalResourceCountRequirements(JobDefinitionType value) {
+		if(value != null && value.getJobDescription() != null && value.getJobDescription().isSetResources() &&
+				value.getJobDescription().getResources().isSetTotalResourceCount()){
+			return toU6RangeValue(value.getJobDescription().getResources().getTotalResourceCount());
+		}
+		else
+			return null;
+	}
+
+
+	public static RangeValueType toU6RangeValue(org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType jsdlType) {
+		RangeValueType result = new RangeValueType();
+		if(jsdlType.getExactArray().length > 0){
+			result.setExact(jsdlType.getExactArray(0).getDoubleValue());
+		}
+		if(jsdlType.isSetLowerBoundedRange()){
+			result.setLowerBound(jsdlType.getLowerBoundedRange().getDoubleValue());
+		}
+		if(jsdlType.isSetUpperBoundedRange()){
+			result.setUpperBound(jsdlType.getUpperBoundedRange().getDoubleValue());
+		}
+		return result;
+	}
+
+
+
+	public static void setCPUArchitectureRequirements(JobDefinitionType value, ProcessorRequirement cpuArchitecture) {
+		if(cpuArchitecture == null || cpuArchitecture.getValue() == null) return;
+		CPUArchitectureType cpuArch = getOrCreateCPUArchitecture(value);
+		cpuArch.setCPUArchitectureName(ProcessorArchitectureEnumeration.Enum.forString(cpuArchitecture.getValue()));
+	}
+
+	public static void setIndividualCPUCountRequirements(JobDefinitionType value, RangeValueType cpuCount) {
+		org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType individualCPUCount = getOrCreateIndividualCPUCount(value);
+		setRangeValue(cpuCount, individualCPUCount);
+	}
+
+	public static void setIndividualCPUSpeedRequirements(JobDefinitionType value, RangeValueType cpuSpeed) {
+		org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType individualCPUSpeed = getOrCreateIndividualCPUSpeed(value);
+		setRangeValue(cpuSpeed, individualCPUSpeed);
+	}
+
+	public static void setIndividualCPUTimeRequirements(JobDefinitionType value, RangeValueType cpuTime) {
+		org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType cpuIndividualTime = getOrCreateIndividualCPUTime(value);
+		setRangeValue(cpuTime, cpuIndividualTime);
+	}
+
+	public static void setIndividualDiskSpaceRequirements(JobDefinitionType value, RangeValueType diskSpace) {
+		org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType individualDiskSpace = getOrCreateIndividualDiskSpace(value);
+		setRangeValue(diskSpace, individualDiskSpace);
+	}
+
+	public static void setIndividualPhysicalMemoryRequirements(JobDefinitionType value, RangeValueType physicalMemory) {
+		org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType individualPhysicalMemory = getOrCreateIndividualPhysicalMemory(value);
+		setRangeValue(physicalMemory, individualPhysicalMemory);
+	}
+
+
+	public static void setName(JobDefinitionType value, String name) {
+		getOrCreateJobIdentification(value).setJobName(name);
+	}
+
+
+	public static void setRangeValue(RangeValueType u6Type, org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType jsdlType) {
+		Double exact = u6Type.getExact();
+		Double epsilon = u6Type.getEpsilon();
+		Double lower = u6Type.getLowerBound();
+		Double upper = u6Type.getUpperBound();
+
+
+		if(lower.isNaN() && upper.isNaN())
+		{
+			ExactType exactType = jsdlType.getExactArray().length > 0 ? jsdlType.getExactArray(0) : jsdlType.addNewExact();
+			exactType.setDoubleValue(exact);
+			if(!epsilon.isNaN() && epsilon != 0)
+			{
+				exactType.setEpsilon(epsilon);
+			}
+		}
+		else
+		{
+			if(!lower.isNaN())
+			{
+				BoundaryType lowerBound = jsdlType.isSetLowerBoundedRange() ? jsdlType.getLowerBoundedRange() : jsdlType.addNewLowerBoundedRange();
+				lowerBound.setDoubleValue(lower);
+				lowerBound.setExclusiveBound(!u6Type.isIncludeLowerBound());
+			}
+
+			if(!upper.isNaN())
+			{
+				BoundaryType upperBound = jsdlType.isSetUpperBoundedRange() ? jsdlType.getUpperBoundedRange() : jsdlType.addNewUpperBoundedRange();
+				upperBound.setDoubleValue(upper);
+				upperBound.setExclusiveBound(!u6Type.isIncludeUpperBound());
+			}
+		}
+	}
+
+	public static void setTotalCPUCountRequirements(JobDefinitionType value, RangeValueType cpuCount) {
+		org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType cpuTotalCount = getOrCreateTotalCPUCount(value);
+		setRangeValue(cpuCount, cpuTotalCount);
+	}
+
+	public static void setTotalResourceCountRequirements(JobDefinitionType value, RangeValueType resourceCount) {
+		org.ggf.schemas.jsdl.x2005.x11.jsdl.RangeValueType totalCount = getOrCreateTotalResourceCount(value);
+		setRangeValue(resourceCount, totalCount);
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/Mode.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/Mode.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/Mode.java
new file mode 100644
index 0000000..3694eea
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/Mode.java
@@ -0,0 +1,45 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+ */
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+/**
+ * file creation modes 
+ */
+public enum Mode {
+
+	/**
+	 * overwrite any existing file
+	 */
+	overwrite,
+	
+	/**
+	 * append to an existing file
+	 */
+	append,
+	
+	/**
+	 * do NOT overwrite and fail if the file exists
+	 */
+	nooverwrite
+	
+	
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/MyProxyLogon.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/MyProxyLogon.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/MyProxyLogon.java
new file mode 100644
index 0000000..0794caf
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/MyProxyLogon.java
@@ -0,0 +1,465 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you 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.
+*
+*/
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+import eu.emi.security.authn.x509.CommonX509TrustManager;
+import eu.emi.security.authn.x509.X509CertChainValidator;
+import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
+import org.bouncycastle.asn1.x500.X500Name;
+import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
+import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
+import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
+import org.bouncycastle.crypto.util.PrivateKeyFactory;
+import org.bouncycastle.crypto.util.PublicKeyFactory;
+import org.bouncycastle.crypto.util.SubjectPublicKeyInfoFactory;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.operator.ContentSigner;
+import org.bouncycastle.operator.bc.BcRSAContentSignerBuilder;
+import org.bouncycastle.pkcs.PKCS10CertificationRequestBuilder;
+import org.bouncycastle.util.encoders.Base64;
+
+import javax.net.ssl.*;
+import javax.security.auth.login.FailedLoginException;
+import java.io.*;
+import java.net.ProtocolException;
+import java.security.*;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * The MyProxyLogon class provides an interface for retrieving credentials from
+ * a MyProxy server.
+ * <p/>
+ * First, use <code>setHost</code>, <code>setPort</code>,
+ * <code>setUsername</code>, <code>setPassphrase</code>,
+ * <code>setCredentialName</code>, <code>setLifetime</code> and
+ * <code>requestTrustRoots</code> to configure. Then call <code>connect</code>,
+ * <code>logon</code>, <code>getCredentials</code>, then
+ * <code>disconnect</code>. Use <code>getCertificates</code> and
+ * <code>getPrivateKey</code> to access the retrieved credentials, or
+ * <code>writeProxyFile</code> or <code>saveCredentialsToFile</code> to
+ * write them to a file. Use <code>writeTrustRoots</code>,
+ * <code>getTrustedCAs</code>, <code>getCRLs</code>,
+ * <code>getTrustRootData</code>, and <code>getTrustRootFilenames</code>
+ * for trust root information.
+ *
+ * (modified for use with UNICORE)
+ *
+ * @version 1.1
+ * @see <a href="http://myproxy.ncsa.uiuc.edu/">MyProxy Project Home Page</a>
+ * 
+ */
+public class MyProxyLogon {
+    
+	public final static String version = "1.1";
+
+    private enum State {
+        READY, CONNECTED, LOGGEDON, DONE
+    }
+
+    public final static String VERSION = "VERSION=MYPROXYv2";
+    private final static String GETCOMMAND = "COMMAND=0";
+    private final static String TRUSTROOTS = "TRUSTED_CERTS=";
+    private final static String USERNAME = "USERNAME=";
+    private final static String PASSPHRASE = "PASSPHRASE=";
+    private final static String LIFETIME = "LIFETIME=";
+    private final static String CREDNAME = "CRED_NAME=";
+    public final static String RESPONSE = "RESPONSE=";
+    private final static String ERROR = "ERROR=";
+    private final static String DN = "CN=ignore";
+
+    public final int DEFAULT_KEY_SIZE = 2048;
+    private int keySize = DEFAULT_KEY_SIZE;
+    private final static String keyAlg = "RSA";
+    private State state = State.READY;
+    private String host = "localhost";
+    private String username;
+    private String credname;
+    private char[] passphrase;
+    private int port = 7512;
+    private int lifetime = 43200;
+    private SSLSocket socket;
+    private BufferedInputStream socketIn;
+    private BufferedOutputStream socketOut;
+    private KeyPair keypair;
+    private Collection<X509Certificate> certificateChain;
+    private String[] trustrootFilenames;
+    private String[] trustrootData;
+    private KeyManagerFactory keyManagerFactory;
+    private TrustManager trustManager;
+    
+    /**
+     * Constructs a MyProxyLogon object.
+     */
+    public MyProxyLogon() {
+        super();
+        host = System.getenv("MYPROXY_SERVER");
+        if (host == null) {
+            host = "myproxy.teragrid.org";
+        }
+        String portString = System.getenv("MYPROXY_SERVER_PORT");
+        if (portString != null) {
+            port = Integer.parseInt(portString);
+        }
+        username = System.getProperty("user.name");
+    }
+
+    
+    /**
+     * sets the internal trust manager using the supplied validator
+     */
+    public void setValidator(X509CertChainValidator validator){
+    	 CommonX509TrustManager mtm = new CommonX509TrustManager(validator);
+    	 setTrustManager(mtm);
+    }
+
+    /**
+     * Sets the hostname of the MyProxy server. Defaults to localhost.
+     *
+     * @param host MyProxy server hostname
+     */
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    /**
+     * Sets the port of the MyProxy server. Defaults to 7512.
+     *
+     * @param port MyProxy server port
+     */
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    /**
+     * Sets the key size.
+     *
+     * @param keySize
+     */
+    public void setKeySize(int keySize) {
+        this.keySize = keySize;
+    }
+
+    /**
+     * Gets the MyProxy username.
+     *
+     * @return MyProxy server port
+     */
+    public String getUsername() {
+        return username;
+    }
+
+    /**
+     * Sets the MyProxy username. Defaults to user.name.
+     *
+     * @param username MyProxy username
+     */
+    public void setUsername(String username) {
+    	this.username = username;
+    }
+
+    /**
+     * Sets the optional MyProxy credential name.
+     *
+     * @param credname credential name
+     */
+    public void setCredentialName(String credname) {
+       this.credname = credname;
+    }
+
+    /**
+     * Sets the MyProxy passphrase.
+     *
+     * @param passphrase MyProxy passphrase
+     */
+    public void setPassphrase(char[] passphrase) {
+       this.passphrase = passphrase;
+    }
+
+    /**
+     * Sets the requested credential lifetime. Defaults to 43200 seconds (12
+     * hours).
+     *
+     * @param seconds Credential lifetime
+     */
+    public void setLifetime(int seconds) {
+        lifetime = seconds;
+    }
+
+    /**
+     * Gets the certificates returned from the MyProxy server by
+     * getCredentials().
+     *
+     * @return Collection of java.security.cert.Certificate objects
+     */
+    public Collection<X509Certificate> getCertificates() {
+        return certificateChain;
+    }
+
+    
+    // for unit testing
+    static PrivateKey testingPrivateKey;
+    
+    /**
+     * Gets the private key generated by getCredentials().
+     *
+     * @return PrivateKey
+     */
+    public PrivateKey getPrivateKey() {
+    	if(testingPrivateKey!=null){
+			//for unit testing
+			return testingPrivateKey;	
+		}
+		return keypair.getPrivate();
+    }
+
+    /**
+     * Connects to the MyProxy server at the desired host and port. Requires
+     * host authentication via SSL. The host's certificate subject must
+     * match the requested hostname. If CA certificates are found in the
+     * standard GSI locations, they will be used to verify the server's
+     * certificate. If trust roots are requested and no CA certificates are
+     * found, the server's certificate will still be accepted.
+     */
+    public void connect() throws IOException, GeneralSecurityException {
+        SSLContext sc = SSLContext.getInstance("SSL");
+        if(trustManager==null){
+        	throw new IllegalStateException("No trust manager has been set!");
+        }
+        TrustManager[] trustAllCerts = new TrustManager[]{trustManager};
+        sc.init(getKeyManagers(), trustAllCerts, new SecureRandom());
+        SSLSocketFactory sf = sc.getSocketFactory();
+        socket = (SSLSocket) sf.createSocket(host, port);
+        socket.startHandshake();
+        socketIn = new BufferedInputStream(socket.getInputStream());
+        socketOut = new BufferedOutputStream(socket.getOutputStream());
+        state = State.CONNECTED;
+    }
+
+    /**
+     * Set the key manager factory for use in client-side SSLSocket
+     * certificate-based authentication to the MyProxy server.
+     * Call this before connect().
+     *
+     * @param keyManagerFactory Key manager factory to use
+     */
+    public void setKeyManagerFactory(KeyManagerFactory keyManagerFactory) {
+        this.keyManagerFactory = keyManagerFactory;
+    }
+
+
+	public void setTrustManager(TrustManager trustManager) {
+		this.trustManager = trustManager;
+	}
+
+	/**
+     * Disconnects from the MyProxy server.
+     */
+    public void disconnect() throws IOException {
+        socket.close();
+        socket = null;
+        socketIn = null;
+        socketOut = null;
+        state = State.READY;
+    }
+
+    /**
+     * Logs on to the MyProxy server by issuing the MyProxy GET command.
+     */
+    public void logon() throws IOException, GeneralSecurityException {
+        String line;
+        char response;
+
+        if (state != State.CONNECTED) {
+            connect();
+        }
+
+        socketOut.write('0');
+        socketOut.flush();
+        socketOut.write(VERSION.getBytes());
+        socketOut.write('\n');
+        socketOut.write(GETCOMMAND.getBytes());
+        socketOut.write('\n');
+        socketOut.write(USERNAME.getBytes());
+        socketOut.write(username.getBytes());
+        socketOut.write('\n');
+        socketOut.write(PASSPHRASE.getBytes());
+        socketOut.write(new String(passphrase).getBytes());
+        socketOut.write('\n');
+        socketOut.write(LIFETIME.getBytes());
+        socketOut.write(Integer.toString(lifetime).getBytes());
+        socketOut.write('\n');
+        if (credname != null) {
+            socketOut.write(CREDNAME.getBytes());
+            socketOut.write(credname.getBytes());
+            socketOut.write('\n');
+        }
+        socketOut.flush();
+
+        line = readLine(socketIn);
+        if (line == null) {
+            throw new EOFException();
+        }
+        if (!line.equals(VERSION)) {
+            throw new ProtocolException("bad MyProxy protocol VERSION string: "
+                    + line);
+        }
+        line = readLine(socketIn);
+        if (line == null) {
+            throw new EOFException();
+        }
+        if (!line.startsWith(RESPONSE)
+                || line.length() != RESPONSE.length() + 1) {
+            throw new ProtocolException(
+                    "bad MyProxy protocol RESPONSE string: " + line);
+        }
+        response = line.charAt(RESPONSE.length());
+        if (response == '1') {
+            StringBuffer errString;
+
+            errString = new StringBuffer("MyProxy logon failed");
+            while ((line = readLine(socketIn)) != null) {
+                if (line.startsWith(ERROR)) {
+                    errString.append('\n');
+                    errString.append(line.substring(ERROR.length()));
+                }
+            }
+            throw new FailedLoginException(errString.toString());
+        } else if (response == '2') {
+            throw new ProtocolException(
+                    "MyProxy authorization RESPONSE not implemented");
+        } else if (response != '0') {
+            throw new ProtocolException(
+                    "unknown MyProxy protocol RESPONSE string: " + line);
+        }
+        while ((line = readLine(socketIn)) != null) {
+            if (line.startsWith(TRUSTROOTS)) {
+                String filenameList = line.substring(TRUSTROOTS.length());
+                trustrootFilenames = filenameList.split(",");
+                trustrootData = new String[trustrootFilenames.length];
+                for (int i = 0; i < trustrootFilenames.length; i++) {
+                    String lineStart = "FILEDATA_" + trustrootFilenames[i]
+                            + "=";
+                    line = readLine(socketIn);
+                    if (line == null) {
+                        throw new EOFException();
+                    }
+                    if (!line.startsWith(lineStart)) {
+                        throw new ProtocolException(
+                                "bad MyProxy protocol RESPONSE: expecting "
+                                        + lineStart + " but received " + line);
+                    }
+                    trustrootData[i] = new String(Base64.decode(line
+                            .substring(lineStart.length())));
+                }
+            }
+        }
+        state = State.LOGGEDON;
+    }
+
+   
+    /**
+     * Retrieves credentials from the MyProxy server.
+     */
+    public void getCredentials() throws IOException, GeneralSecurityException {
+
+        KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance(keyAlg);
+        keyGenerator.initialize(keySize);
+        keypair = keyGenerator.genKeyPair();
+        Security.addProvider(new BouncyCastleProvider());
+        
+        org.bouncycastle.pkcs.PKCS10CertificationRequest pkcs10 = null;
+        try{
+        	pkcs10 = generateCertificationRequest(DN, keypair);
+        }
+        catch(Exception ex){
+        	throw new GeneralSecurityException(ex);
+        }
+        getCredentials(pkcs10.getEncoded());
+    }
+
+    
+    public X509Certificate getCertificate() {
+        if (certificateChain == null) {
+           return null;
+        }
+        Iterator<X509Certificate> iter = this.certificateChain.iterator();
+        return iter.next();
+    }
+    
+    
+    private KeyManager[] getKeyManagers() {
+        return keyManagerFactory != null? keyManagerFactory.getKeyManagers() : null ;
+    }
+
+    private void getCredentials(byte[] derEncodedCertRequest) throws IOException, GeneralSecurityException {
+        if (state != State.LOGGEDON) {
+            logon();
+        }
+        socketOut.write(derEncodedCertRequest);
+        socketOut.flush();
+        int numCertificates = socketIn.read();
+        if (numCertificates == -1) {
+            throw new IOException("Error: connection aborted");
+        } else if (numCertificates == 0 || numCertificates < 0) {
+            throw new GeneralSecurityException("Error: bad number of certificates sent by server");
+        }
+        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+        certificateChain = new ArrayList<X509Certificate>();
+        for(int i = 0; i<numCertificates; i++){
+        	X509Certificate c = (X509Certificate)certFactory.generateCertificate(socketIn);
+        	certificateChain.add(c);
+        }
+        state = State.DONE;
+    }
+
+    private String readLine(InputStream is) throws IOException {
+        StringBuffer sb = new StringBuffer();
+        for (int c = is.read(); c > 0 && c != '\n'; c = is.read()) {
+            sb.append((char) c);
+        }
+        if (sb.length() > 0) {
+            return new String(sb);
+        }
+        return null;
+    }
+
+	private org.bouncycastle.pkcs.PKCS10CertificationRequest generateCertificationRequest(String dn, KeyPair kp)
+			throws Exception{
+		X500Name subject=new X500Name(dn);
+		PublicKey pubKey=kp.getPublic();
+		PrivateKey privKey=kp.getPrivate();
+		AsymmetricKeyParameter pubkeyParam = PublicKeyFactory.createKey(pubKey.getEncoded());
+		SubjectPublicKeyInfo publicKeyInfo=SubjectPublicKeyInfoFactory.createSubjectPublicKeyInfo(pubkeyParam);
+		PKCS10CertificationRequestBuilder builder=new PKCS10CertificationRequestBuilder(subject, publicKeyInfo);
+		AlgorithmIdentifier signatureAi = new AlgorithmIdentifier(OIWObjectIdentifiers.sha1WithRSA);
+		BcRSAContentSignerBuilder signerBuilder=new BcRSAContentSignerBuilder(
+				signatureAi, AlgorithmIdentifier.getInstance(OIWObjectIdentifiers.idSHA1));
+		AsymmetricKeyParameter pkParam = PrivateKeyFactory.createKey(privKey.getEncoded());
+		ContentSigner signer=signerBuilder.build(pkParam);
+		return builder.build(signer);
+	}
+}
+

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/OSType.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/OSType.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/OSType.java
new file mode 100644
index 0000000..54481df
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/OSType.java
@@ -0,0 +1,124 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+ */
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+public enum OSType {
+
+	unknown("Unknown"), //$NON-NLS-1$
+	linux("LINUX"), //$NON-NLS-1$
+	mac_os("MACOS"), //$NON-NLS-1$
+	win95("WIN95"), //$NON-NLS-1$
+	win98("WIN98"), //$NON-NLS-1$
+	windows_R_Me("Windows_R_Me"), //$NON-NLS-1$
+	winNT("WINNT"), //$NON-NLS-1$
+	windows_2000("Windows_2000"), //$NON-NLS-1$
+	windows_XP("Windows_XP"), //$NON-NLS-1$
+	msdos("MSDOS"), //$NON-NLS-1$
+	solaris("Solaris"), //$NON-NLS-1$
+	sunOS("SunOS"), //$NON-NLS-1$
+	freeBSD("FreeBSD"), //$NON-NLS-1$
+	netBSD("NetBSD"), //$NON-NLS-1$
+	openBSD("OpenBSD"), //$NON-NLS-1$
+	bsdunix("BSDUNIX"), //$NON-NLS-1$
+	aix("AIX"), //$NON-NLS-1$
+	z_OS("z_OS"), //$NON-NLS-1$
+	os_2("OS_2"), //$NON-NLS-1$
+	os9("OS9"), //$NON-NLS-1$
+	netWare("NetWare"), //$NON-NLS-1$
+	tru64_unix("Tru64_UNIX"), //$NON-NLS-1$
+	irix("IRIX"), //$NON-NLS-1$
+	osf("OSF"), //$NON-NLS-1$
+
+	mvs("MVS"), //$NON-NLS-1$
+	os400("OS400"), //$NON-NLS-1$
+	javaVM("JavaVM"), //$NON-NLS-1$
+	win3x("WIN3x"), //$NON-NLS-1$
+	winCE("WINCE"), //$NON-NLS-1$
+	NCR3000("NCR3000"), //$NON-NLS-1$
+	dc_os("DC_OS"), //$NON-NLS-1$
+	reliant_unix("Reliant_UNIX"), //$NON-NLS-1$
+	sco_unixWare("SCO_UnixWare"), //$NON-NLS-1$
+	sco_openServer("SCO_OpenServer"), //$NON-NLS-1$
+	sequent("Sequent"), //$NON-NLS-1$
+	u6000("U6000"), //$NON-NLS-1$
+	aseries("ASERIES"), //$NON-NLS-1$
+	tandemNSK("TandemNSK"), //$NON-NLS-1$
+	tandemNT("TandemNT"), //$NON-NLS-1$
+	bs2000("BS2000"), //$NON-NLS-1$
+	lynx("Lynx"), //$NON-NLS-1$
+	xenix("XENIX"), //$NON-NLS-1$
+	vm("VM"), //$NON-NLS-1$
+	interactive_unix("Interactive_UNIX"), //$NON-NLS-1$
+	gnu_hurd("GNU_Hurd"), //$NON-NLS-1$
+	mach_kernel("MACH_Kernel"), //$NON-NLS-1$
+	inferno("Inferno"), //$NON-NLS-1$
+	qnx("QNX"), //$NON-NLS-1$
+	epoc("EPOC"), //$NON-NLS-1$
+	ixWorks("IxWorks"), //$NON-NLS-1$
+	vxWorks("VxWorks"), //$NON-NLS-1$
+	mint("MiNT"), //$NON-NLS-1$
+	beOS("BeOS"), //$NON-NLS-1$
+	hp_mpe("HP_MPE"), //$NON-NLS-1$
+	nextStep("NextStep"), //$NON-NLS-1$
+	palmPilot("PalmPilot"), //$NON-NLS-1$
+	rhapsody("Rhapsody"), //$NON-NLS-1$
+	dedicated("Dedicated"), //$NON-NLS-1$
+	os_390("OS_390"), //$NON-NLS-1$
+	vse("VSE"), //$NON-NLS-1$
+	tpf("TPF"), //$NON-NLS-1$
+	caldera_open_unix("Caldera_Open_UNIX"), //$NON-NLS-1$
+	attunix("ATTUNIX"), //$NON-NLS-1$
+	dgux("DGUX"), //$NON-NLS-1$
+	decnt("DECNT"), //$NON-NLS-1$
+	openVMS("OpenVMS"), //$NON-NLS-1$
+	hpux("HPUX"), //$NON-NLS-1$
+	other("other"); //$NON-NLS-1$
+
+
+	private OSType(String value) { 
+		this.value = value;
+	}
+
+	private final String value;
+
+	public String getValue() { 
+		return value;
+	}
+
+	public static OSType fromString(String value)
+	{
+		for(OSType type : values())
+		{
+			if(type.value.equals(value))
+			{
+				return type;
+			}
+		}
+		return null;
+	}
+	
+	public String toString()
+	{
+		return value;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ProcessorRequirement.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ProcessorRequirement.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ProcessorRequirement.java
new file mode 100644
index 0000000..1a26c57
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ProcessorRequirement.java
@@ -0,0 +1,61 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+*/
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+public enum ProcessorRequirement{
+	sparc("sparc"), //$NON-NLS-1$
+	powerpc("powerpc"), //$NON-NLS-1$
+	x86("x86"), //$NON-NLS-1$
+	x86_32("x86_32"), //$NON-NLS-1$
+	x86_64("x86_64"), //$NON-NLS-1$
+	parisc("parisc"), //$NON-NLS-1$
+	mips("mips"), //$NON-NLS-1$
+	ia64("ia64"), //$NON-NLS-1$
+	arm("arm"), //$NON-NLS-1$
+	other("other"); //$NON-NLS-1$
+
+	ProcessorRequirement(String value) {
+		this.value = value; 
+	}
+
+	private final String value;
+
+	public String getValue() { 
+		return value; 
+	}
+
+	public static ProcessorRequirement fromString(String value)
+	{
+		for (ProcessorRequirement type : values()) {
+			if (type.value.equals(value)) {
+				return type;
+			}
+		}
+		return other;
+	}
+	
+	public String toString()
+	{
+		return value;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/RangeValueType.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/RangeValueType.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/RangeValueType.java
new file mode 100644
index 0000000..a18b85a
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/RangeValueType.java
@@ -0,0 +1,271 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+ */
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+
+public class RangeValueType implements ResourceRequirement {
+	
+
+    private double exact = Double.NaN;
+    private double lowerBound = Double.NEGATIVE_INFINITY;
+    private double upperBound = Double.POSITIVE_INFINITY;
+    
+    private double epsilon = Double.NaN;
+    private boolean includeLowerBound = true;
+    private boolean includeUpperBound = true;
+    
+    private boolean enabled = false;
+    
+    
+    public RangeValueType(double exact, double epsilon, double lowerBound, boolean includeLowerBound, double upperBound, boolean includeUpperBound, boolean enabled) {
+        this.exact = exact;
+    	this.epsilon = epsilon;
+    	this.lowerBound = lowerBound;
+        this.includeLowerBound = includeLowerBound;
+        this.upperBound = upperBound;
+        this.includeUpperBound = includeUpperBound;
+        this.enabled = enabled;
+    }
+   
+    
+    
+    /**
+	 * Create the range requirements
+	 * 
+	 * @param exact -
+	 *            the exact value
+	 * @param lowerBound -
+	 *            the lower bound
+	 * @param upperBound -
+	 *            the upper bound
+	 * @param includeUpperBound -
+	 *            true, if upperBound should be included in range
+	 * 
+	 */
+    public RangeValueType(double exact, double epsilon, double lowerBound, boolean includeLowerBound, double upperBound, boolean includeUpperBound) {
+    	this(exact,epsilon,lowerBound,includeLowerBound,upperBound,includeUpperBound,false);
+        
+    }
+    
+    
+    /**
+	 * Create the range requirements
+	 * 
+	 * @param exact -
+	 *            the exact value
+	 * @param lowerBound -
+	 *            the lower bound
+	 * @param upperBound -
+	 *            the upper bound
+	 */
+    public RangeValueType(double exact, double epsilon, double lowerBound, double upperBound) {
+    	this(exact,epsilon,lowerBound,true,upperBound,true);
+    }
+    
+    
+    public RangeValueType(double exact, double lowerBound, double upperBound) {
+    	this(exact,Double.NaN,lowerBound,true,upperBound,true);
+    }
+
+    /**
+	 * Create the exact requirements
+	 * 
+	 * @param exact -
+	 *            the exact value
+	 * @param epsilon -
+	 *            the epsilon arround exact
+	 * 
+	 */
+    public RangeValueType(double exact, double epsilon) {
+        this(exact,epsilon,Double.NaN,Double.NaN);
+    }
+
+    
+    /**
+	 * Create the exact requirements
+	 * 
+	 * @param exact -
+	 *            the exact value
+	 */
+    public RangeValueType(double exact) {
+        this(exact,Double.NaN);
+    }
+
+    public RangeValueType() {
+    }
+
+    /**
+	 * Get exact requirements
+	 * 
+	 * @return the exact requirements
+	 */
+    public double getExact() {
+        return exact;
+    }
+
+    /**
+	 * Set exact requirements
+	 * 
+	 * @param exact -
+	 *            the exact requirements
+	 */
+    public void setExact(double exact) {
+        this.exact = exact;
+    }
+    
+    /**
+	 * Get epsilon
+	 * 
+	 * @return the epsilon
+	 */
+    public double getEpsilon() {
+        return epsilon;
+    }
+
+    /**
+	 * Set epsilon
+	 * 
+	 * @param epsilon -
+	 *            epsilon belonging to to exact requirements
+	 */
+    public void setEpsilon(double epsilon) {
+        this.epsilon = epsilon;
+    }
+
+    /**
+	 * Get lower bound
+	 * 
+	 * @return the lower bound
+	 */
+    public double getLowerBound() {
+        return lowerBound;
+    }
+
+    /**
+	 * Set lower bound
+	 * 
+	 * @param lowerBound -
+	 *            the lower bound
+	 */
+    public void setLowerBound(double lowerBound) {
+        this.lowerBound = lowerBound;
+    }
+
+    /**
+	 * Get upper bound
+	 * 
+	 * @return the upper bound
+	 */
+    public double getUpperBound() {
+        return upperBound;
+    }
+
+    /**
+	 * Set upper bound
+	 * 
+	 * @param upperBound -
+	 *            the upper bound
+	 */
+    public void setUpperBound(double upperBound) {
+        this.upperBound = upperBound;
+    }
+
+    /**
+	 * Test if requirements are met
+	 * 
+	 * @param value -
+	 *            the tested value
+	 * @return <code>true</code> if value is in the range and not less than
+	 *         the exact value
+	 */
+    public boolean lowerThanDouble(double value) {
+        return (value >= exact && value >= lowerBound && value <= upperBound) ? true : false;
+    }
+
+    public String toString() {
+        if (lowerBound == Double.NEGATIVE_INFINITY && upperBound == Double.POSITIVE_INFINITY) {
+            return Double.toString(exact);
+        }
+        else {
+            return "(e=" + Double.toString(exact) + ",l=" + Double.toString(lowerBound) + ",u=" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+                    + Double.toString(upperBound) + ")"; //$NON-NLS-1$
+        }
+    }
+
+
+	public boolean isIncludeLowerBound() {
+		return includeLowerBound;
+	}
+
+
+	public void setIncludeLowerBound(boolean includeLowerBound) {
+		this.includeLowerBound = includeLowerBound;
+	}
+
+
+	public boolean isIncludeUpperBound() {
+		return includeUpperBound;
+	}
+
+
+	public void setIncludeUpperBound(boolean includeUpperBound) {
+		this.includeUpperBound = includeUpperBound;
+	}
+	
+	public RangeValueType clone(){
+		return new RangeValueType(this.exact, this.epsilon, this.lowerBound, this.includeLowerBound, this.upperBound, this.includeUpperBound,this.enabled);
+	}
+
+
+
+	public boolean isEnabled() {
+		return enabled;
+	}
+
+
+
+	public void setEnabled(boolean enabled) {
+		this.enabled = enabled;
+	}
+
+	
+	public boolean equals(Object o)
+	{
+		if(! (o instanceof RangeValueType)) return false;
+		RangeValueType other = (RangeValueType) o;
+		return doublesEqual(getExact(),other.getExact())
+		&& doublesEqual(getEpsilon(), other.getEpsilon())
+		&& doublesEqual(getLowerBound(), other.getLowerBound())
+		&& doublesEqual(getUpperBound(), other.getUpperBound())
+		&& isIncludeLowerBound() == other.isIncludeLowerBound()
+		&& isIncludeUpperBound() == other.isIncludeUpperBound()
+		&& isEnabled() == other.isEnabled();
+	}
+
+	
+	private boolean doublesEqual(double a, double b)
+	{
+		Double A = new Double(a);
+		Double B = new Double(b);
+		return A.equals(B);
+	}
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ResourceProcessor.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ResourceProcessor.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ResourceProcessor.java
new file mode 100644
index 0000000..8723d85
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ResourceProcessor.java
@@ -0,0 +1,97 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+ */
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+import de.fzj.unicore.wsrflite.xmlbeans.WSUtilities;
+import eu.unicore.jsdl.extensions.ResourceRequestDocument;
+import eu.unicore.jsdl.extensions.ResourceRequestType;
+import org.apache.airavata.model.process.ProcessModel;
+import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
+import org.apache.airavata.worker.core.context.ProcessContext;
+import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionType;
+import org.ggf.schemas.jsdl.x2005.x11.jsdl.ResourcesType;
+
+public class ResourceProcessor {
+
+	
+	public static void generateResourceElements(JobDefinitionType value, ProcessContext context) throws Exception {
+        ProcessModel processModel = context.getProcessModel();
+        if (processModel != null) {
+            try {
+                ComputationalResourceSchedulingModel crs = processModel.getProcessResourceSchedule();
+
+                if (crs.getTotalPhysicalMemory() > 0) {
+                    RangeValueType rangeType = new RangeValueType();
+                    rangeType.setLowerBound(Double.NaN);
+                    rangeType.setUpperBound(Double.NaN);
+                    rangeType.setExact(crs.getTotalPhysicalMemory());
+                    JSDLUtils.setIndividualPhysicalMemoryRequirements(value, rangeType);
+                }
+
+                if (crs.getNodeCount() > 0) {
+                    RangeValueType rangeType = new RangeValueType();
+                    rangeType.setLowerBound(Double.NaN);
+                    rangeType.setUpperBound(Double.NaN);
+                    rangeType.setExact(crs.getNodeCount());
+                    JSDLUtils.setTotalResourceCountRequirements(value, rangeType);
+                }
+
+                if (crs.getWallTimeLimit() > 0) {
+                    RangeValueType cpuTime = new RangeValueType();
+                    cpuTime.setLowerBound(Double.NaN);
+                    cpuTime.setUpperBound(Double.NaN);
+                    long wallTime = crs.getWallTimeLimit() * 60;
+                    cpuTime.setExact(wallTime);
+                    JSDLUtils.setIndividualCPUTimeRequirements(value, cpuTime);
+                }
+                // the total cpu count is total cpus per node
+                if (crs.getTotalCPUCount() > 0) {
+                    RangeValueType rangeType = new RangeValueType();
+                    rangeType.setLowerBound(Double.NaN);
+                    rangeType.setUpperBound(Double.NaN);
+                    int nodeCount = crs.getNodeCount();
+                    if (nodeCount <= 0) {
+                        nodeCount = 1;
+                    }
+                    rangeType.setExact(crs.getTotalCPUCount() / nodeCount);
+                    JSDLUtils.setIndividualCPUCountRequirements(value, rangeType);
+                }
+
+                String qName = crs.getQueueName();
+                if (!(qName == null || "".equals(qName))) {
+                    // ignore "default" queue names
+                    if (!(crs.getQueueName().trim().equalsIgnoreCase("default"))) {
+                        ResourceRequestDocument rqDoc = ResourceRequestDocument.Factory.newInstance();
+                        ResourceRequestType rq = rqDoc.addNewResourceRequest();
+                        rq.setName("Queue");
+                        rq.setValue(qName);
+                        ResourcesType res = JSDLUtils.getOrCreateResources(value);
+                        WSUtilities.insertAny(rqDoc, res);
+                    }
+                }
+
+            } catch (NullPointerException npe) {
+                throw new Exception("No value set for resource requirements.", npe);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ResourceRequirement.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ResourceRequirement.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ResourceRequirement.java
new file mode 100644
index 0000000..d5708f3
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/ResourceRequirement.java
@@ -0,0 +1,34 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+ */
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+public interface ResourceRequirement extends Cloneable {
+	
+	/**
+	 * States whether this resource requirement is active
+	 * and should be written into the job description.
+	 * @return
+	 */
+	public boolean isEnabled();
+	
+	public void setEnabled(boolean enabled);
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/SPMDVariations.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/SPMDVariations.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/SPMDVariations.java
new file mode 100644
index 0000000..46414eb
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/SPMDVariations.java
@@ -0,0 +1,52 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+ */
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+public enum SPMDVariations {
+
+	MPI ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/MPI"), 
+	GridMPI ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/GridMPI"),
+	IntelMPI ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/IntelMPI"),
+	LAMMPI ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/LAM-MPI"), 
+	MPICH1 ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/MPICH1"),
+	MPICH2 ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/MPICH2"),
+	MPICHGM ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/MPICH-GM"),
+	MPICHMX ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/MPICH-MX"),
+	MVAPICH ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/MVAPICH"),
+	MVAPICH2 ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/MVAPICH2"),
+	OpenMPI ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/OpenMPI"),
+	POE ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/POE"),
+	PVM ("http://www.ogf.org/jsdl/2007/02/jsdl-spmd/PVM");
+	
+	private final String variation;
+	
+	private SPMDVariations(String variation) {
+		this.variation = variation;
+	}
+	
+	public String value(){
+		return variation;
+	}
+	
+}
+
+

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/SecurityUtils.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/SecurityUtils.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/SecurityUtils.java
new file mode 100644
index 0000000..00fa472
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/SecurityUtils.java
@@ -0,0 +1,160 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you 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.
+*
+*/
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+import eu.emi.security.authn.x509.helpers.CertificateHelpers;
+import eu.emi.security.authn.x509.helpers.proxy.X509v3CertificateBuilder;
+import eu.emi.security.authn.x509.impl.CertificateUtils;
+import eu.emi.security.authn.x509.impl.CertificateUtils.Encoding;
+import eu.emi.security.authn.x509.impl.KeyAndCertCredential;
+import org.apache.airavata.credential.store.store.CredentialReader;
+import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
+import org.apache.airavata.worker.core.RequestData;
+import org.apache.airavata.worker.core.context.ProcessContext;
+import org.apache.airavata.worker.core.exceptions.WorkerException;
+import org.apache.airavata.worker.core.utils.WorkerUtils;
+import org.bouncycastle.asn1.ASN1InputStream;
+import org.bouncycastle.asn1.x500.X500Name;
+import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
+import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.security.auth.x500.X500Principal;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+import java.util.Date;
+import java.util.Random;
+
+public class SecurityUtils {
+	
+	private final static Logger logger = LoggerFactory.getLogger(SecurityUtils.class);
+	
+	
+	public static UNICORESecurityContext getSecurityContext(ProcessContext processContext) throws WorkerException {
+
+		if (processContext.getJobSubmissionProtocol().equals(JobSubmissionProtocol.UNICORE)) {
+			String credentialStoreToken = processContext.getTokenId(); // set by the framework
+			RequestData requestData;
+			requestData = new RequestData(processContext.getProcessModel().getUserDn());
+			requestData.setTokenId(credentialStoreToken);
+			CredentialReader credentialReader = null;
+			try {
+				credentialReader = WorkerUtils.getCredentialReader();
+				if (credentialReader == null) {
+					throw new WorkerException("Credential reader returns null");
+				}
+			} catch (Exception e) {
+				throw new WorkerException("Error while initializing credential reader");
+			}
+			return new UNICORESecurityContext(credentialReader, requestData);
+		} else {
+			throw new WorkerException("Only support UNICORE job submissions, invalid job submission protocol " +
+					processContext.getJobSubmissionProtocol().name());
+		}
+	}
+	
+	public static final KeyAndCertCredential generateShortLivedCertificate(String userDN,
+			String caCertPath, String caKeyPath, String caPwd) throws Exception {
+		final long CredentialGoodFromOffset = 1000L * 60L * 15L; // 15 minutes
+		// ago
+
+		final long startTime = System.currentTimeMillis() - CredentialGoodFromOffset;
+		final long endTime = startTime + 30 * 3600 * 1000;
+
+		final String keyLengthProp = "1024";
+		int keyLength = Integer.parseInt(keyLengthProp);
+		final String signatureAlgorithm = "SHA1withRSA";
+
+		KeyAndCertCredential caCred = getCACredential(caCertPath, caKeyPath,
+				caPwd);
+
+		KeyPairGenerator kpg = KeyPairGenerator.getInstance(caCred.getKey()
+				.getAlgorithm());
+		kpg.initialize(keyLength);
+		KeyPair pair = kpg.generateKeyPair();
+
+		X500Principal subjectDN = new X500Principal(userDN);
+		Random rand = new Random();
+
+		SubjectPublicKeyInfo publicKeyInfo;
+		try {
+			publicKeyInfo = SubjectPublicKeyInfo
+					.getInstance(new ASN1InputStream(pair.getPublic()
+							.getEncoded()).readObject());
+		} catch (IOException e) {
+			throw new InvalidKeyException("Can not parse the public key"
+					+ "being included in the short lived certificate", e);
+		}
+
+		X500Name issuerX500Name = CertificateHelpers.toX500Name(caCred
+				.getCertificate().getSubjectX500Principal());
+
+		X500Name subjectX500Name = CertificateHelpers.toX500Name(subjectDN);
+
+		X509v3CertificateBuilder certBuilder = new X509v3CertificateBuilder(
+				issuerX500Name, new BigInteger(20, rand), new Date(startTime),
+				new Date(endTime), subjectX500Name, publicKeyInfo);
+
+		AlgorithmIdentifier sigAlgId = X509v3CertificateBuilder
+				.extractAlgorithmId(caCred.getCertificate());
+
+		X509Certificate certificate = certBuilder.build(caCred.getKey(),
+				sigAlgId, signatureAlgorithm, null, null);
+
+		certificate.checkValidity(new Date());
+		certificate.verify(caCred.getCertificate().getPublicKey());
+		KeyAndCertCredential result = new KeyAndCertCredential(
+				pair.getPrivate(), new X509Certificate[] { certificate,
+						caCred.getCertificate() });
+
+		return result;
+	}
+	
+	public static KeyAndCertCredential getCACredential(String caCertPath,
+			String caKeyPath, String password) throws Exception {
+		InputStream isKey = new FileInputStream(caKeyPath);
+		PrivateKey pk = CertificateUtils.loadPrivateKey(isKey, Encoding.PEM,
+				password.toCharArray());
+
+		InputStream isCert = new FileInputStream(caCertPath);
+		X509Certificate caCert = CertificateUtils.loadCertificate(isCert,
+				Encoding.PEM);
+
+		if (isKey != null)
+			isKey.close();
+		if (isCert != null)
+			isCert.close();
+
+		return new KeyAndCertCredential(pk, new X509Certificate[] { caCert });
+	}
+
+	
+	
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/StorageCreator.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/StorageCreator.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/StorageCreator.java
new file mode 100644
index 0000000..85da1f2
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/StorageCreator.java
@@ -0,0 +1,207 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+ */
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+import de.fzj.unicore.uas.StorageFactory;
+import de.fzj.unicore.uas.client.StorageClient;
+import de.fzj.unicore.uas.client.StorageFactoryClient;
+import de.fzj.unicore.wsrflite.xmlbeans.WSUtilities;
+import de.fzj.unicore.wsrflite.xmlbeans.client.RegistryClient;
+import de.fzj.unicore.wsrflite.xmlbeans.sg.Registry;
+import eu.unicore.util.httpclient.DefaultClientConfiguration;
+import org.oasisOpen.docs.wsrf.sg2.EntryType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.unigrids.services.atomic.types.PropertyType;
+import org.unigrids.x2006.x04.services.smf.CreateSMSDocument;
+import org.unigrids.x2006.x04.services.smf.StorageBackendParametersDocument.StorageBackendParameters;
+import org.unigrids.x2006.x04.services.smf.StorageDescriptionType;
+import org.w3.x2005.x08.addressing.EndpointReferenceType;
+
+import javax.security.auth.x500.X500Principal;
+import java.util.Calendar;
+
+public class StorageCreator {
+	 protected final Logger log = LoggerFactory.getLogger(this.getClass());
+
+	/**
+	 * the initial lifetime (in days) for newly created SMSs
+	 */
+	private int initialLifeTime;
+
+	/**
+	 * factory URL to use
+	 */
+	private String factoryUrl;
+
+	/**
+	 * site where to create the storage
+	 */
+	private String siteName;
+
+	/**
+	 * storage type to create
+	 */
+	private String storageType;
+
+	private DefaultClientConfiguration secProps;
+	
+	private String userName;
+	
+	public StorageCreator(DefaultClientConfiguration secProps, String besUrl, int initialLifetime, String storageType, String userName) {
+		this.secProps = secProps; 
+		this.factoryUrl = getStorageFactoryUrl(besUrl);
+		this.storageType = storageType;
+		this.initialLifeTime = initialLifetime;
+		this.userName = userName;
+	}
+	
+	
+	public StorageCreator(DefaultClientConfiguration secProps, String besUrl, int initialLifetime, String userName) {
+		this.secProps = secProps; 
+		this.factoryUrl = getStorageFactoryUrl(besUrl);
+		this.initialLifeTime = initialLifetime;
+		this.userName = userName;
+	}
+
+	
+	// The target site must have storage factory deployed with bes factory
+	public StorageClient createStorage() throws Exception{
+		
+		if(factoryUrl == null) {
+			throw new Exception("Cannot create Storage Factory Url");
+		}
+		
+		EndpointReferenceType sfEpr= WSUtilities.makeServiceEPR(factoryUrl, StorageFactory.SMF_PORT);
+		
+		String dn = findServerName(factoryUrl, sfEpr);
+		
+		WSUtilities.addServerIdentity(sfEpr, dn);
+		
+		secProps.getETDSettings().setReceiver(new X500Principal(dn));
+		secProps.getETDSettings().setIssuerCertificateChain(secProps.getCredential().getCertificateChain());
+		
+		// TODO: remove it afterwards
+		if(userName != null) {
+			secProps.getETDSettings().getRequestedUserAttributes2().put("xlogin", new String[]{userName});
+		}
+		
+		StorageFactoryClient sfc = new StorageFactoryClient(sfEpr, secProps);
+		
+		if (log.isDebugEnabled()){
+			log.debug("Using storage factory at <"+sfc.getUrl()+">");
+		}
+		
+		StorageClient sc = null;
+		try{
+			sc=sfc.createSMS(getCreateSMSDocument());
+			
+			String addr=sc.getEPR().getAddress().getStringValue();
+			log.info(addr);
+			
+		}catch(Exception ex){
+			log.error("Could not create storage",ex);
+			throw new Exception(ex);
+		}
+
+		return sc;
+	}
+	
+	protected String findServerName(String besUrl, EndpointReferenceType smsEpr)throws Exception{
+		
+		int besIndex = besUrl.indexOf("StorageFactory?res");
+		String ss = besUrl.substring(0, besIndex);
+		ss = ss + "Registry";
+		
+		EndpointReferenceType eprt = WSUtilities.makeServiceEPR(ss, "default_registry", Registry.REGISTRY_PORT);
+		
+		RegistryClient registry = new RegistryClient(eprt, secProps);
+		
+		//first, check if server name is already in the EPR...
+		String dn=WSUtilities.extractServerIDFromEPR(smsEpr);
+		if(dn!=null){
+			return dn;
+		}
+		//otherwise find a matching service in the registry
+		String url=smsEpr.getAddress().getStringValue();
+		if(url.contains("/services/"))url=url.substring(0,url.indexOf("/services"));
+		if(log.isDebugEnabled()) log.debug("Checking for services at "+url);
+		for(EntryType entry:registry.listEntries()){
+			if(entry.getMemberServiceEPR().getAddress().getStringValue().startsWith(url)){
+				dn=WSUtilities.extractServerIDFromEPR(entry.getMemberServiceEPR());
+				if(dn!=null){
+					return dn;
+				}
+			}
+		}
+		return null;
+	}
+
+	
+	public static String getStorageFactoryUrl(String besUrl){
+		int besIndex = besUrl.indexOf("BESFactory?res");
+		String ss = besUrl.substring(0, besIndex);
+		ss = ss + "StorageFactory?res=default_storage_factory";
+		return ss;
+	}
+	
+	/**
+	 * prepare request
+	 * */
+	protected CreateSMSDocument getCreateSMSDocument(String ...keyValueParams){
+		CreateSMSDocument in=CreateSMSDocument.Factory.newInstance();
+		in.addNewCreateSMS();
+		if(initialLifeTime>0){
+			in.getCreateSMS().addNewTerminationTime().setCalendarValue(getTermTime());
+		}
+		if(storageType!=null){
+			if(log.isDebugEnabled()) {
+				log.debug("Will create storage of type : "+storageType);
+			}
+			StorageDescriptionType desc=in.getCreateSMS().addNewStorageDescription();
+			desc.setStorageBackendType(storageType);
+			if(keyValueParams.length>1){
+				//other parameters from the cmdline as key=value
+				StorageBackendParameters params=desc.addNewStorageBackendParameters();
+				for(int i=1;i<keyValueParams.length;i++){
+					String arg=keyValueParams[i];
+					String[]sp=arg.split("=",2);
+					PropertyType prop=params.addNewProperty();
+					prop.setName(sp[0]);
+					prop.setValue(sp[1]);
+					if(log.isDebugEnabled()) {
+						log.debug("Have parameter : "+arg);
+					}
+				}
+			}
+		}
+		return in;
+	}
+
+	protected Calendar getTermTime(){
+		Calendar c = Calendar.getInstance();
+		c.add(Calendar.DATE, initialLifeTime);
+		return c;
+	}
+
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/d231956e/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/UASDataStagingProcessor.java
----------------------------------------------------------------------
diff --git a/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/UASDataStagingProcessor.java b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/UASDataStagingProcessor.java
new file mode 100644
index 0000000..e550a3d
--- /dev/null
+++ b/modules/worker/task-jobsubmission/src/main/java/org/apache/airavata/worker/task/jobsubmission/utils/bes/UASDataStagingProcessor.java
@@ -0,0 +1,182 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *
+ */
+
+package org.apache.airavata.worker.task.jobsubmission.utils.bes;
+
+import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
+import org.apache.airavata.model.application.io.DataType;
+import org.apache.airavata.model.application.io.InputDataObjectType;
+import org.apache.airavata.model.application.io.OutputDataObjectType;
+import org.apache.airavata.worker.core.context.ProcessContext;
+import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+public class UASDataStagingProcessor {
+	
+	protected final Logger log = LoggerFactory.getLogger(this.getClass());
+
+	
+	public static void generateDataStagingElements(JobDefinitionType value, ProcessContext context, String smsUrl) throws Exception{
+		smsUrl = "BFT:"+smsUrl;
+		
+		if (context.getProcessModel().getProcessOutputs().size() > 0) {
+			buildDataStagingFromInputContext(context, value, smsUrl);
+		}
+		
+		if (context.getProcessModel().getProcessOutputs().size() > 0) {
+			buildFromOutputContext(context, value, smsUrl);
+		}
+	}
+	
+	private static void createInURISMSElement(JobDefinitionType value, String smsUrl, String uri, boolean useSMS)
+			throws Exception {
+		String fileName = new File(uri).getName();
+		
+		if (useSMS && uri.startsWith("file:")) {
+			uri = smsUrl+"#/"+fileName;
+			
+		} 
+		// no need to stage-in those files to the input
+		// directory because unicore site will fetch them for the user
+		// supported third party transfers include 
+		// gsiftp, http, rns, ftp
+		JSDLUtils.addDataStagingSourceElement(value, uri, null, fileName);
+
+	}
+	
+	//TODO: will be deprecated
+	private static void createStdOutURIs(JobDefinitionType value, ProcessContext context, String smsUrl, boolean isUnicore) throws Exception {
+
+		// no need to use smsUrl for output location, because output location is activity's working directory 
+		
+		if(isUnicore) {
+			String scriptExitCodeFName = "UNICORE_SCRIPT_EXIT_CODE";
+			String scriptExitCode = smsUrl+"#/output/"+scriptExitCodeFName;
+			JSDLUtils.addDataStagingTargetElement(value, null,
+					scriptExitCodeFName, null);
+		}
+		
+		if(!isUnicore) {
+		String stdout = ApplicationProcessor.getApplicationStdOut(value, context);
+		
+		String stderr = ApplicationProcessor.getApplicationStdErr(value, context);
+		
+		String stdoutFileName = (stdout == null || stdout.equals("")) ? "stdout"
+				: stdout;
+		String stdoutURI = smsUrl+"#/output/"+stdoutFileName;
+		
+		JSDLUtils.addDataStagingTargetElement(value, null, stdoutFileName,
+				null);
+
+		String stderrFileName = (stdout == null || stderr.equals("")) ? "stderr"
+				: stderr;
+		String stderrURI = smsUrl+"#/output/"+stderrFileName;
+		
+		JSDLUtils.addDataStagingTargetElement(value, null, stderrFileName,
+				null);
+		}
+
+	}
+
+	// TODO: this should be deprecated, because the outputs are fetched using activity working dir from data transferrer
+	private static void createOutStringElements(JobDefinitionType value, String smsUrl, String prmValue) throws Exception {
+		if(prmValue == null || "".equals(prmValue)) return;
+		String finalSMSPath = smsUrl + "#/output/"+prmValue;
+		JSDLUtils.addDataStagingTargetElement(value, null, prmValue, null);
+	}
+
+	
+	private static void createOutURIElement(JobDefinitionType value,
+			String prmValue) throws Exception {
+		String fileName = new File(prmValue.toString()).getName();
+		JSDLUtils.addDataStagingTargetElement(value, null, fileName, prmValue);
+	}
+
+	
+	private static JobDefinitionType buildFromOutputContext(ProcessContext context,
+			JobDefinitionType value, String smsUrl) throws Exception {
+		List<OutputDataObjectType> applicationOutputs = context.getProcessModel().getProcessOutputs();
+		 if (applicationOutputs != null && !applicationOutputs.isEmpty()){
+             for (OutputDataObjectType output : applicationOutputs){
+ 				if("".equals(output.getValue()) || output.getValue() == null) {
+					continue;
+				}
+
+            	if(output.getType().equals(DataType.URI)) {
+            		 createOutURIElement(value, output.getValue());
+            	}
+             }
+		 }
+		return value;
+	}
+
+	
+	private static void buildDataStagingFromInputContext(ProcessContext context, JobDefinitionType value, String smsUrl)
+			throws Exception {
+		  // sort the inputs first and then build the command ListR
+        Comparator<InputDataObjectType> inputOrderComparator = new Comparator<InputDataObjectType>() {
+            @Override
+            public int compare(InputDataObjectType inputDataObjectType, InputDataObjectType t1) {
+                return inputDataObjectType.getInputOrder() - t1.getInputOrder();
+            }
+        };
+        Set<InputDataObjectType> sortedInputSet = new TreeSet<InputDataObjectType>(inputOrderComparator);
+        for (InputDataObjectType input : context.getProcessModel().getProcessInputs()) {
+            sortedInputSet.add(input);
+        }
+      
+		
+		if (sortedInputSet != null && !sortedInputSet.isEmpty()){
+			for (InputDataObjectType input : sortedInputSet){
+				if("".equals(input.getValue()) || input.getValue() == null) {
+					continue;
+				}
+				if(input.getType().equals(DataType.URI)){
+					createInURISMSElement(value, smsUrl, input.getValue(), true);
+				}
+				else if(input.getType().equals(DataType.STRING) && input.isDataStaged()){
+					createInURISMSElement(value, smsUrl, input.getValue(), false);
+				}
+				else if(input.getType().equals(DataType.STRING) && !input.isDataStaged()){
+					ApplicationProcessor.addApplicationArgument(value, context, input.getValue());
+				}
+				else if (input.getType().equals(DataType.FLOAT) || input.getType().equals(DataType.INTEGER)){
+					if(! (input.getName().equals(BESConstants.NUMBER_OF_PROCESSES) || input.getName().equals(BESConstants.PROCESSES_PER_HOST))) {
+						// temp avoid environ going to app args
+						ApplicationProcessor.addApplicationArgument(value, context, String.valueOf(input.getValue()));
+					}
+				}
+			}
+		}
+	}
+	
+	public static boolean isUnicoreEndpoint(ProcessContext context) {
+		return context.getJobSubmissionProtocol().equals(JobSubmissionProtocol.UNICORE);
+	}
+
+}