/** * Copyright 2007-2012 University Of Southern California * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package edu.isi.pegasus.planner.dax; import java.util.List; import java.util.LinkedList; import java.util.Collections; import edu.isi.pegasus.common.logging.LogManager; import edu.isi.pegasus.common.logging.LogManagerFactory; import edu.isi.pegasus.common.util.Separator; import edu.isi.pegasus.common.util.XMLWriter; import java.util.LinkedHashSet; import java.util.Set; /** * * @author gmehta * @version $Revision$ */ public class AbstractJob { protected List mArguments; protected List<Profile> mProfiles; protected File mStdin; protected File mStdout; protected File mStderr; protected Set<File> mUses; protected List<Invoke> mInvokes; protected String mName; protected String mId; protected String mNamespace; protected String mVersion; protected String mNodeLabel; /** * The metadata attributes associated with the whole workflow. */ private Set<MetaData> mMetaDataAttributes; protected static LogManager mLogger; private static final String ARG_DELIMITER = " "; private static final String FILE_DELIMITER = " "; private static final String JOBTYPE="AbstractJob"; protected AbstractJob() { mLogger = LogManagerFactory.loadSingletonInstance(); mArguments = new LinkedList(); mUses = new LinkedHashSet<File>(); mInvokes = new LinkedList<Invoke>(); mProfiles = new LinkedList<Profile>(); mMetaDataAttributes= new LinkedHashSet<MetaData>(); } /** * Copy constructor * @param a */ protected AbstractJob(AbstractJob a) { this.mArguments = new LinkedList(a.mArguments); this.mProfiles = new LinkedList<Profile>(a.mProfiles); this.mStdin = new File(a.mStdin); this.mStdout = new File(a.mStdout); this.mStderr = new File(a.mStderr); this.mUses = new LinkedHashSet<File>(a.mUses); this.mMetaDataAttributes= new LinkedHashSet<MetaData>( a.mMetaDataAttributes ); this.mInvokes = new LinkedList<Invoke>(a.mInvokes); this.mName = a.mName; this.mId = a.mId; this.mNamespace = a.mNamespace; this.mVersion = a.mVersion; this.mNodeLabel = a.mNodeLabel; } /** * Copy Constructor * @param a */ protected static void checkID(String id) { if (!Patterns.isNodeIdValid(id)) { mLogger.log( "Id: " + id + " should of the type [A-Za-z0-9][-A-Za-z0-9]*", LogManager.ERROR_MESSAGE_LEVEL); } } /** * Return the argument List. The List contains both {@link String} as well as {@link File} objects * @return List */ public List getArguments() { return mArguments; } /** * Add a string argument to the argument List. Each call to argument adds a space in between entries * @param argument * @return AbstractJob */ public AbstractJob addArgument(String argument) { if (argument != null) { if (!mArguments.isEmpty()) { mArguments.add(ARG_DELIMITER); } mArguments.add(argument); } return this; } /** * Add a file object to the argument List. Each call to argument adds a space between entries. * @param file * @return AbstractJob * @see File */ public AbstractJob addArgument(File file) { if (file != null) { if (!mArguments.isEmpty()) { mArguments.add(ARG_DELIMITER); } mArguments.add(file); } return this; } /** * Add a Array of {@link File} objects to the argument list. The files will be separated by space when rendered on the command line * @param files File[] * @return AbstractJob * @see File */ public AbstractJob addArgument(File[] files) { this.addArgument(files, FILE_DELIMITER); return this; } /** * Add a List of {@link File} objects to the argument list. The files will be separated by space when rendered on the command line * @param files List<File> * @return AbstractJob * @see File */ public AbstractJob addArgument(List<File> files) { this.addArgument(files, FILE_DELIMITER); return this; } /** * Add a Array of {@link File} objects to the argument list. * The files will be separated by the filedelimiter(default is space) when rendered on the command line. * @param files File[] Array of file objects * @param filedelimiter String delimiter for the files. Default is space * @return AbstractJob * @see File */ public AbstractJob addArgument(File[] files, String filedelimiter) { filedelimiter = (filedelimiter == null) ? FILE_DELIMITER : filedelimiter; if (files != null && files.length > 0) { if (!mArguments.isEmpty()) { mArguments.add(ARG_DELIMITER); } boolean first = true; for (File f : files) { if (!first) { mArguments.add(filedelimiter); } mArguments.add(f); first = false; } } return this; } /** * Add a List of {@link File} objects to the argument list. * The files will be separated by the filedelimiter(default is space) when rendered on the command line. * @param files List<File> Array of file objects * @param filedelimiter String delimiter for the files. Default is space * @return AbstractJob * @see File */ public AbstractJob addArgument(List<File> files, String filedelimiter) { if (files != null && !files.isEmpty()) { this.addArgument((File[]) files.toArray(), filedelimiter); } return this; } /** * Add a argument key and value to the argument List. * The argkey and argvalue are seperated by space. * Example addArgument("-p","0") will result in the argument being added as * -p 0<Br> * Multiple calls to addArgument results in the arguments being separated by space. * @param argkey String * @param argvalue String * @return AbstractJob */ public AbstractJob addArgument(String argkey, String argvalue) { this.addArgument(argkey, argvalue, ARG_DELIMITER); return this; } /** * Add a argument key and value to the argument List.<Br> * The argkey and argvalue are seperated by argdelimiter.<br> * Example addArgument("-p","0","=") will result in the argument being added as * -p=0<Br> * Multiple calls to addArgument results in the arguments being separated by space. * @param argkey String Key * @param argvalue String Value * @param argdelimiter String argdelimiter * @return AbstractJob * */ public AbstractJob addArgument(String argkey, String argvalue, String argdelimiter) { argdelimiter = (argdelimiter == null) ? ARG_DELIMITER : argdelimiter; if (argkey != null && argvalue != null) { this.addArgument(argkey + argdelimiter + argvalue); } return this; } /** * Add a argument key and File value to the argument List.<Br> * The argkey and argvalue are seperated by space.<br> * Example addArgument("-i",new File("f.a")) will result in the argument being added as * -i <file name="f.a"><Br> * Multiple calls to addArgument results in the arguments being separated by space. * @param argkey String * @param argvalue File * @return AbstractJob */ public AbstractJob addArgument(String argkey, File argvalue) { this.addArgument(argkey, argvalue, ARG_DELIMITER); return this; } /** * Add a argument key and File value to the argument List.<Br> * The argkey and argvalue are separated by the argdelimiter.<br> * Example addArgument("-i",new File("f.a"),"=") will result in the argument being added as * -i=<file name="f.a"><Br> * Multiple calls to addArgument results in the arguments being separated by space. * @param argkey String * @param argvalue File * @param argdelimiter * @return AbstractJob */ public AbstractJob addArgument(String argkey, File argvalue, String argdelimiter) { argdelimiter = (argdelimiter == null) ? ARG_DELIMITER : argdelimiter; if (argkey != null && argvalue != null) { this.addArgument(argkey + argdelimiter); mArguments.add(argvalue); } return this; } /** * Add a argument key and an array of Files to the argument List.<Br> * The argkey and argvalue are separated space.<br> * The files are separated by a space <br> * Example:<br> * <i>File[] files = {new File("f.a1"), new File("f.a2")};<br> * job.addArgument("-i",files)</i><br> * will result in the argument being added as * <b>-i <file name="f.a1"> <file name="f.a2"></b><Br> * Multiple calls to addArgument results in the arguments being separated by space. * @param argkey String * @param argvalue File[] * @return AbstractJob */ public AbstractJob addArgument(String argkey, File[] argvalue) { this.addArgument(argkey, argvalue, ARG_DELIMITER, FILE_DELIMITER); return this; } /** * Add a argument key and a List of Files to the argument List.<Br> * The argkey and argvalue are separated space.<br> * The files are separated by a space <br> * Example:<br> * <i>List<File> files = new LinkedList<File>();<br> * files.add(new File("f.a1"));<br> * files.add(new File("f.a2"));<br> * job.addArgument("-i",files)</i><br> * will result in the argument being added as * <b>-i <file name="f.a1"> <file name="f.a2"></b><Br> * Multiple calls to addArgument results in the arguments being separated by space. * @param argkey String * @param argvalue List<File> * @return AbstractJob */ public AbstractJob addArgument(String argkey, List<File> argvalue) { this.addArgument(argkey, argvalue, ARG_DELIMITER, FILE_DELIMITER); return this; } /** * Add a argument key and an array of Files to the argument List.<Br> * The argkey and argvalue are separated by the argdelimiter.<br> * The files are separated by a filedelimiter <br> * Example:<br> * <i>File[] files = {new File("f.a1"), new File("f.a2")};<br> * job.addArgument("-i",files,"=",",")</i><br> * will result in the argument being added as * <b>-i=<file name="f.a1">,<file name="f.a2"></b><Br> * Multiple calls to addArgument results in the arguments being separated by space. * @param argkey String * @param argvalue File[] * @param argdelimiter String * @param filedelimiter String * @return AbstractJob */ public AbstractJob addArgument(String argkey, File[] argvalue, String argdelimiter, String filedelimiter) { argdelimiter = (argdelimiter == null) ? ARG_DELIMITER : argdelimiter; filedelimiter = (filedelimiter == null) ? FILE_DELIMITER : filedelimiter; if (argkey != null && argvalue != null && argvalue.length > 0) { this.addArgument(argkey + argdelimiter); boolean first = true; for (File f : argvalue) { if (!first) { mArguments.add(filedelimiter); } mArguments.add(f); first = false; } } return this; } /** * Add a argument key and a List of Files to the argument List.<Br> * The argkey and argvalue are separated by the argdelimiter.<br> * The files are separated by a filedelimter <br> * Example:<br> * <i>List<File> files = new LinkedList<File>();<br> * files.add(new File("f.a1"));<br> * files.add(new File("f.a2"));<br> * job.addArgument("-i",files,"=",",")</i><br> * will result in the argument being added as * <b>-i=<file name="f.a1">,<file name="f.a2"></b><Br> * Multiple calls to addArgument results in the arguments being separated by space. * @param argkey String * @param argvalue List<File> List of File objects * @param argdelimiter String * @param filedelimiter String * @return AbstractJob */ public AbstractJob addArgument(String argkey, List<File> argvalue, String argdelimiter, String filedelimiter) { if (argkey != null && argvalue != null && !argvalue.isEmpty()) { this.addArgument(argkey, (File[]) argvalue.toArray(), argdelimiter, filedelimiter); } return this; } /** * Add a profile to the job * @param namespace String * @param key String * @param value String * @return AbstractJob */ public AbstractJob addProfile(String namespace, String key, String value) { mProfiles.add(new Profile(namespace, key, value)); return this; } /** * Add a profile to the job * @param namespace {@link Profile.NAMESPACE} * @param key String * @param value String * @return AbstractJob */ public AbstractJob addProfile(Profile.NAMESPACE namespace, String key, String value) { mProfiles.add(new Profile(namespace, key, value)); return this; } /** * Add a Profile object * @param profile * @return AbstractJob * @see Profile */ public AbstractJob addProfile(Profile profile) { mProfiles.add(profile); return this; } /** * Add a list of Profile objects * @param profiles List<Profile> * @return */ public AbstractJob addProfiles(List<Profile> profiles) { mProfiles.addAll(profiles); return this; } /** * Return the profile List. The List contains both {@link Profile} objects * @return List */ public List getProfiles() { return mProfiles; } /** * Get the STDIN file object * @return File */ public File getStdin() { return mStdin; } /** * * @param stdin * @return AbstractJob */ public AbstractJob setStdin(File stdin) { File f = new File(stdin, File.LINK.INPUT); mStdin = f; return this; } /** * * @param stdin * @param transfer * @return AbstractJob */ public AbstractJob setStdin(File stdin, File.TRANSFER transfer) { File f = new File(stdin, File.LINK.INPUT); f.setTransfer(transfer); mStdin = f; return this; } /** * * @param stdin * @param register * @return AbstractJob */ public AbstractJob setStdin(File stdin, boolean register) { File f = new File(stdin, File.LINK.INPUT); f.setRegister(register); mStdin = f; return this; } /** * * @param stdin * @param transfer * @param register * @return AbstractJob */ public AbstractJob setStdin(File stdin, File.TRANSFER transfer, boolean register) { File f = new File(stdin, File.LINK.INPUT); f.setTransfer(transfer); f.setRegister(register); mStdin = f; return this; } /** * * @param stdin * @param transfer * @param register * @return AbstractJob */ public AbstractJob setStdin(File stdin, File.TRANSFER transfer, boolean register, boolean optional) { File f = new File(stdin, File.LINK.INPUT); f.setTransfer(transfer); f.setRegister(register); f.setOptional(optional); mStdin = f; return this; } /** * * @param stdin * @return AbstractJob */ public AbstractJob setStdin(String stdin) { File f = new File(stdin, File.LINK.INPUT); mStdin = f; return this; } /** * * @param stdin * @param transfer * @return AbstractJob */ public AbstractJob setStdin(String stdin, File.TRANSFER transfer) { File f = new File(stdin, File.LINK.INPUT); f.setTransfer(transfer); mStdin = f; return this; } /** * * @param stdin * @param register * @return AbstractJob */ public AbstractJob setStdin(String stdin, boolean register) { File f = new File(stdin, File.LINK.INPUT); f.setRegister(register); mStdin = f; return this; } /** * * @param stdin * @param transfer * @param register * @return AbstractJob */ public AbstractJob setStdin(String stdin, File.TRANSFER transfer, boolean register) { File f = new File(stdin, File.LINK.INPUT); f.setTransfer(transfer); f.setRegister(register); mStdin = f; return this; } /** * * @param stdin * @param transfer * @param register * @param optional * @return AbstractJob */ public AbstractJob setStdin(String stdin, File.TRANSFER transfer, boolean register, boolean optional) { File f = new File(stdin, File.LINK.INPUT); f.setTransfer(transfer); f.setRegister(register); f.setOptional(optional); mStdin = f; return this; } /** * * @return File */ public File getStdout() { return mStdout; } /** * * @param stdout * @return AbstractJob */ public AbstractJob setStdout(File stdout) { File f = new File(stdout, File.LINK.OUTPUT); mStdout = f; return this; } /** * * @param stdout * @param transfer * @return AbstractJob */ public AbstractJob setStdout(File stdout, File.TRANSFER transfer) { File f = new File(stdout, File.LINK.OUTPUT); f.setTransfer(transfer); mStdout = f; return this; } /** * * @param stdout * @param register * @return AbstractJob */ public AbstractJob setStdout(File stdout, boolean register) { File f = new File(stdout, File.LINK.OUTPUT); f.setRegister(register); mStdout = f; return this; } /** * * @param stdout * @param transfer * @param register * @return AbstractJob */ public AbstractJob setStdout(File stdout, File.TRANSFER transfer, boolean register) { File f = new File(stdout, File.LINK.OUTPUT); f.setTransfer(transfer); f.setRegister(register); mStdout = f; return this; } /** * * @param stdout * @param transfer * @param register * @param optional * @return AbstractJob */ public AbstractJob setStdout(File stdout, File.TRANSFER transfer, boolean register, boolean optional) { File f = new File(stdout, File.LINK.OUTPUT); f.setTransfer(transfer); f.setRegister(register); f.setOptional(optional); mStdout = f; return this; } /** * * @param stdout * @return AbstractJob */ public AbstractJob setStdout(String stdout) { File f = new File(stdout, File.LINK.OUTPUT); mStdout = f; return this; } /** * * @param stdout * @param transfer * @return AbstractJob */ public AbstractJob setStdout(String stdout, File.TRANSFER transfer) { File f = new File(stdout, File.LINK.OUTPUT); f.setTransfer(transfer); mStdout = f; return this; } /** * * @param stdout * @param register * @return AbstractJob */ public AbstractJob setStdout(String stdout, boolean register) { File f = new File(stdout, File.LINK.OUTPUT); f.setRegister(register); mStdout = f; return this; } /** * * @param stdout * @param transfer * @param register * @return AbstractJob */ public AbstractJob setStdout(String stdout, File.TRANSFER transfer, boolean register) { File f = new File(stdout, File.LINK.OUTPUT); f.setTransfer(transfer); f.setRegister(register); mStdout = f; mUses.add(f); return this; } /** * * @param stdout * @param transfer * @param register * @param optional * @return AbstractJob */ public AbstractJob setStdout(String stdout, File.TRANSFER transfer, boolean register, boolean optional) { File f = new File(stdout, File.LINK.OUTPUT); f.setTransfer(transfer); f.setRegister(register); f.setOptional(optional); mStdout = f; return this; } /** * * @return File */ public File getStderr() { return mStderr; } /** * * @param stderr * @return AbstractJob */ public AbstractJob setStderr(File stderr) { File f = new File(stderr, File.LINK.OUTPUT); mStderr = f; return this; } /** * * @param stderr * @param transfer * @return AbstractJob */ public AbstractJob setStderr(File stderr, File.TRANSFER transfer) { File f = new File(stderr, File.LINK.OUTPUT); f.setTransfer(transfer); mStderr = f; return this; } /** * * @param stderr * @param register * @return AbstractJob */ public AbstractJob setStderr(File stderr, boolean register) { File f = new File(stderr, File.LINK.OUTPUT); f.setRegister(register); mStderr = f; return this; } /** * * @param stderr * @param transfer * @param register * @return AbstractJob */ public AbstractJob setStderr(File stderr, File.TRANSFER transfer, boolean register) { File f = new File(stderr, File.LINK.OUTPUT); f.setTransfer(transfer); f.setRegister(register); mStderr = f; return this; } /** * * @param stderr * @param transfer * @param register * @param optional * @return AbstractJob */ public AbstractJob setStderr(File stderr, File.TRANSFER transfer, boolean register, boolean optional) { File f = new File(stderr, File.LINK.OUTPUT); f.setTransfer(transfer); f.setRegister(register); f.setOptional(optional); mStderr = f; return this; } /** * * @param stderr * @return AbstractJob */ public AbstractJob setStderr(String stderr) { File f = new File(stderr, File.LINK.OUTPUT); mStderr = f; return this; } /** * * @param stderr * @param transfer * @return AbstractJob */ public AbstractJob setStderr(String stderr, File.TRANSFER transfer) { File f = new File(stderr, File.LINK.OUTPUT); f.setTransfer(transfer); mStderr = f; return this; } /** * * @param stderr * @param register * @return AbstractJob */ public AbstractJob setStderr(String stderr, boolean register) { File f = new File(stderr, File.LINK.OUTPUT); f.setRegister(register); mStderr = f; return this; } /** * * @param stderr * @param transfer * @param register * @return AbstractJob */ public AbstractJob setStderr(String stderr, File.TRANSFER transfer, boolean register) { File f = new File(stderr, File.LINK.OUTPUT); f.setTransfer(transfer); f.setRegister(register); mStderr = f; return this; } /** * * @param stderr * @param transfer * @param register * @param optional * @return AbstractJob */ public AbstractJob setStderr(String stderr, File.TRANSFER transfer, boolean register, boolean optional) { File f = new File(stderr, File.LINK.OUTPUT); f.setTransfer(transfer); f.setRegister(register); f.setOptional(optional); mStderr = f; return this; } /** * * @return Set<File> */ public Set<File> getUses() { return mUses; } /** * * * * * @param file * @param link * @return AbstractJob */ public AbstractJob uses(String file, File.LINK link) { File f = new File(file, link); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator. combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param register * @return AbstractJob */ public AbstractJob uses(String file, File.LINK link, boolean register) { File f = new File(file, link); f.setRegister(register); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator. combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param register * @param size * @return AbstractJob */ public AbstractJob uses(String file, File.LINK link, boolean register,String size) { File f = new File(file, link); f.setRegister(register); f.setSize(size); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator. combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param size * @return AbstractJob */ public AbstractJob uses(String file, File.LINK link, String size) { File f = new File(file, link); f.setSize(size); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator. combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @return AbstractJob */ public AbstractJob uses(String file, File.LINK link, File.TRANSFER transfer) { File f = new File(file, link); f.setTransfer(transfer); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator. combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @param size * @return AbstractJob */ public AbstractJob uses(String file, File.LINK link, File.TRANSFER transfer, String size) { File f = new File(file, link); f.setTransfer(transfer); f.setSize(size); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator. combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @param register * @return AbstractJob */ public AbstractJob uses(String file, File.LINK link, File.TRANSFER transfer, boolean register) { File f = new File(file, link); f.setRegister(register); f.setTransfer(transfer); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator. combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @param register * @param size * @return AbstractJob */ public AbstractJob uses(String file, File.LINK link, File.TRANSFER transfer, boolean register, String size) { File f = new File(file, link); f.setRegister(register); f.setTransfer(transfer); f.setSize(size); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator. combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @param register * @param optional * @param executable * @return AbstractJob */ public AbstractJob uses(String file, File.LINK link, File.TRANSFER transfer, boolean register, boolean optional, boolean executable) { File f = new File(file, link); f.setRegister(register); f.setOptional(optional); f.setTransfer(transfer); f.setExecutable(executable); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine( f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @param register * @param optional * @param executable * @param size * @return AbstractJob */ public AbstractJob uses(String file, File.LINK link, File.TRANSFER transfer, boolean register, boolean optional, boolean executable, String size) { File f = new File(file, link); f.setRegister(register); f.setOptional(optional); f.setTransfer(transfer); f.setExecutable(executable); f.setSize(size); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine( f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @return AbstractJob */ public AbstractJob uses(File file, File.LINK link) { File f = new File(file, link); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine( f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @return AbstractJob */ public AbstractJob uses(File file, File.LINK link, File.TRANSFER transfer) { File f = new File(file, link); f.setTransfer(transfer); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine( f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @param size * @return AbstractJob */ public AbstractJob uses(File file, File.LINK link, File.TRANSFER transfer,String size) { File f = new File(file, link); f.setTransfer(transfer); f.setSize(size); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine( f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param register * @return AbstractJob */ public AbstractJob uses(File file, File.LINK link, boolean register) { File f = new File(file, link); f.setRegister(register); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param register * @param size * @return AbstractJob */ public AbstractJob uses(File file, File.LINK link, boolean register, String size) { File f = new File(file, link); f.setRegister(register); f.setSize(size); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param size * @return AbstractJob */ public AbstractJob uses(File file, File.LINK link, String size) { File f = new File(file, link); f.setSize(size); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine(f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @param register * @return AbstractJob */ public AbstractJob uses(File file, File.LINK link, File.TRANSFER transfer, boolean register) { File f = new File(file, link); f.setTransfer(transfer); f.setRegister(register); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine( f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @param register * @param size * @return AbstractJob */ public AbstractJob uses(File file, File.LINK link, File.TRANSFER transfer, boolean register, String size) { File f = new File(file, link); f.setTransfer(transfer); f.setRegister(register); f.setSize(size); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine( f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @param register * @param optional * @param executable * @return AbstractJob */ public AbstractJob uses(File file, File.LINK link, File.TRANSFER transfer, boolean register, boolean optional, boolean executable) { File f = new File(file, link); f.setTransfer(transfer); f.setRegister(register); f.setOptional(optional); f.setExecutable(executable); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine( f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param file * @param link * @param transfer * @param register * @param optional * @param executable * @param size * @return AbstractJob */ public AbstractJob uses(File file, File.LINK link, File.TRANSFER transfer, boolean register, boolean optional, boolean executable, String size) { File f = new File(file, link); f.setTransfer(transfer); f.setRegister(register); f.setOptional(optional); f.setExecutable(executable); f.setSize(size); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine( f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } return this; } /** * * @param files * @param link * @return AbstractJob */ public AbstractJob uses(List<File> files, File.LINK link) { for (File file : files) { File f = new File(file, link); if (!mUses.contains(f)) { mUses.add(f); } else { mLogger.log("Job " + Separator.combine(mNamespace, mName, mVersion) + "already contains a file " + Separator.combine( f.mNamespace, f.mName, f.mVersion) + ". Ignoring", LogManager.WARNING_MESSAGE_LEVEL); } } return this; } /** * Returns list of Invoke objects * @return List<Invoke> */ public List<Invoke> getInvoke() { return mInvokes; } /** * Same as getInvoke(). Returns list of Invoke objects * @return List<Invoke> */ public List<Invoke> getNotification() { return getInvoke(); } /** * Add Notification to the job * @param when * @param what * @return AbstractJob */ public AbstractJob addInvoke(Invoke.WHEN when, String what) { Invoke i = new Invoke(when, what); mInvokes.add(i); return this; } /** * Add Notification to the job * @param when * @param what * @return AbstractJob */ public AbstractJob addNotification(Invoke.WHEN when, String what) { return addInvoke(when,what); } /** * Add notification to the job * @param invoke * @return AbstractJob */ public AbstractJob addInvoke(Invoke invoke) { mInvokes.add(invoke.clone()); return this; } /** * Add notification to the job * @param invoke * @return AbstractJob */ public AbstractJob addNotification(Invoke invoke) { return addInvoke(invoke); } /** * Add Notifications to the job * @param invokes * @return AbstractJob */ public AbstractJob addInvokes(List<Invoke> invokes) { for (Invoke invoke : invokes) { this.addInvoke(invoke); } return this; } /** * Add Notifications to the job * @param invokes * @return AbstractJob */ public AbstractJob addNotifications(List<Invoke> invokes) { return addInvokes(invokes); } /** * Adds metadata to the workflow * * @param key key name for metadata * @param value value * @return */ public AbstractJob addMetaData( String key, String value ){ this.mMetaDataAttributes.add( new MetaData( key, value ) ); return this; } /** * Returns the metadata associated for a key if exists, else null * * @param key * * @return */ public String getMetaData( String key ){ return this.mMetaDataAttributes.contains( key )? ((MetaData)mMetaDataAttributes).getValue(): null; } /** * Is this Object a Job * @return */ public boolean isJob() { return false; } /** * Is this Object a DAX * @return */ public boolean isDAX() { return false; } /** * Is this Object a DAG * @return */ public boolean isDAG() { return false; } /** * * @return String */ public String getName() { return mName; } /** * * @return String */ public String getId() { return mId; } /** * * @return String */ public String getNodeLabel() { return mNodeLabel; } /** * * @param label */ public void setNodeLabel(String label) { this.mNodeLabel = label; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final AbstractJob other = (AbstractJob) obj; if ((this.mId == null) ? (other.mId != null) : !this.mId.equals( other.mId)) { return false; } return true; } @Override public int hashCode() { int hash = 7; hash = 29 * hash + (this.mId != null ? this.mId.hashCode() : 0); return hash; } /** * * @param writer */ public void toXML(XMLWriter writer) { toXML(writer, 0); } /** * * @param writer * @param indent */ public void toXML(XMLWriter writer, int indent) { //Check if its a dax, dag or job class if (mNodeLabel != null && !mNodeLabel.isEmpty()) { writer.writeAttribute("node-label", mNodeLabel); } //add argument if (!mArguments.isEmpty()) { writer.startElement("argument", indent + 1); for (Object o : mArguments) { if (o.getClass() == String.class) { //if class is string add argument string in the data section writer.writeData( (String) o); } if (o.getClass() == File.class) { //add file tags in the argument elements data section ((File) o).toXML(writer, 0, "argument"); } } writer.endElement(); } //PM-902 for (MetaData md : mMetaDataAttributes) { md.toXML(writer, indent + 1); } //add profiles for (Profile p : mProfiles) { p.toXML(writer, indent + 1); } //PM-708 add extra uses for stdout|stderr|stdin if not //specified by the user in the uses section Set<File> addOnUses = new LinkedHashSet<File>(); //add stdin if (mStdin != null) { if( !mUses.contains( mStdin) ){ //add uses with default flags File f = new File( mStdin, File.LINK.INPUT); addOnUses.add(f); } mStdin.toXML(writer, indent + 1, "stdin"); } //add stdout if (mStdout != null) { if( !mUses.contains( mStdout) ){ //add uses with default flags File f = new File( mStdout, File.LINK.OUTPUT); addOnUses.add(f); } mStdout.toXML(writer, indent + 1, "stdout"); } //add stderr if (mStderr != null) { if( !mUses.contains( mStderr) ){ //add uses with default flags File f = new File( mStderr, File.LINK.OUTPUT); addOnUses.add(f); } mStderr.toXML(writer, indent + 1, "stderr"); } //print add on uses first for (File f : addOnUses) { f.toXML(writer, indent + 1, "uses"); } //add uses for (File f : mUses) { f.toXML(writer, indent + 1, "uses"); } //add invoke for (Invoke i : mInvokes) { i.toXML(writer, indent + 1); } if (!(mUses.isEmpty() && mInvokes.isEmpty() && mStderr == null && mStdout == null && mStdin == null && mProfiles. isEmpty() && mArguments.isEmpty())) { writer.endElement(indent); } else { writer.endElement(); } } }