All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.airavata.gfac.bes.utils.JSDLUtils Maven / Gradle / Ivy

The newest version!
/*
 *
 * 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.gfac.bes.utils;


import javax.xml.namespace.QName;

import org.apache.commons.httpclient.URIException;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlObject;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.BoundaryType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.CPUArchitectureType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.CandidateHostsType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.CreationFlagEnumeration;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.DataStagingType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.ExactType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDescriptionType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobIdentificationType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.OperatingSystemType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.OperatingSystemTypeEnumeration;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.OperatingSystemTypeType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.ProcessorArchitectureEnumeration;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.ResourcesType;
import org.ggf.schemas.jsdl.x2005.x11.jsdl.SourceTargetType;
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;


/**
 * 
 * @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 setOperatingSystemRequirements(JobDefinitionType value, OSRequirement osType) {
		if(osType == null || osType.getOSType() == null) return;
		OperatingSystemType os_Type = getOrCreateOperatingSystem(value);
		OperatingSystemTypeType ostt = os_Type.addNewOperatingSystemType();
		ostt.setOperatingSystemName(OperatingSystemTypeEnumeration.Enum.forString(osType.getOSType().getValue()));
		if(osType.getOSVersion() != null) 
		{
			os_Type.setOperatingSystemVersion(osType.getOSVersion());
		}
	}

	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);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy