001: /*
002: * This file or a portion of this file is licensed under the terms of
003: * the Globus Toolkit Public License, found in file GTPL, or at
004: * http://www.globus.org/toolkit/download/license.html. This notice must
005: * appear in redistributions of this file, with or without modification.
006: *
007: * Redistributions of this Software, with or without modification, must
008: * reproduce the GTPL in: (1) the Software, or (2) the Documentation or
009: * some other similar material which is provided with the Software (if
010: * any).
011: *
012: * Copyright 1999-2004 University of Chicago and The University of
013: * Southern California. All rights reserved.
014: */
015:
016: package org.griphyn.cPlanner.code.generator;
017:
018: import org.griphyn.cPlanner.classes.ADag;
019: import org.griphyn.cPlanner.classes.SubInfo;
020: import org.griphyn.cPlanner.classes.TransferJob;
021: import org.griphyn.cPlanner.classes.PlannerOptions;
022:
023: import org.griphyn.cPlanner.code.CodeGenerator;
024: import org.griphyn.cPlanner.code.CodeGeneratorException;
025:
026: import org.griphyn.cPlanner.common.LogManager;
027: import org.griphyn.cPlanner.common.PegasusProperties;
028:
029: import java.io.PrintWriter;
030: import java.io.IOException;
031:
032: import java.util.StringTokenizer;
033: import org.griphyn.cPlanner.classes.PegasusBag;
034:
035: /**
036: * This implementation generates files that can be understood by Stork.
037: *
038: * @author Karan Vahi
039: * @version $Revision: 462 $
040: */
041:
042: public class Stork extends Abstract {
043:
044: /**
045: * The nice start separator, define once, use often.
046: */
047: public final static String mStartSeparator = "/**********************************************************************";
048:
049: /**
050: * The nice end separator, define once, use often.
051: */
052: public final static String mEndSeparator = " **********************************************************************/";
053:
054: /**
055: * The LogManager object which is used to log all the messages.
056: */
057: private LogManager mLogger;
058:
059: /**
060: * The name of the credential that is to be used for submitting the stork
061: * job.
062: */
063: // private String mCredName;
064:
065: /**
066: * The default constructor.
067: */
068: public Stork() {
069: super ();
070: mLogger = LogManager.getInstance();
071: }
072:
073: /**
074: * Initializes the Code Generator implementation.
075: *
076: * @param bag the bag of initialization objects.
077: *
078: * @throws CodeGeneratorException in case of any error occuring code generation.
079: */
080: public void initialize(PegasusBag bag)
081: throws CodeGeneratorException {
082: super .initialize(bag);
083: // mCredName = mProps.getCredName();
084: }
085:
086: /**
087: * Generates the code for the concrete workflow in the input format of the
088: * workflow executor being used. The method is not yet implemented.
089: *
090: * @param dag the concrete workflow.
091: *
092: * @throws CodeGeneratorException in case of any error occuring code generation.
093: */
094: public void generateCode(ADag dag) throws CodeGeneratorException {
095: throw new CodeGeneratorException(
096: new UnsupportedOperationException(
097: "Stork Code Generator: Method generateCode( ADag) not implemeneted"));
098: }
099:
100: /**
101: * Generates the code for a single job in the Stork format.
102: *
103: * @param dag the dag of which the job is a part of.
104: * @param job the <code>SubInfo</code> object holding the information about
105: * that particular job.
106: *
107: *
108: * @throws CodeGeneratorException in case of any error occuring code generation.
109: */
110: public void generateCode(ADag dag, SubInfo job)
111: throws CodeGeneratorException {
112: String dagname = dag.dagInfo.nameOfADag;
113: String dagindex = dag.dagInfo.index;
114: String dagcount = dag.dagInfo.count;
115:
116: StringTokenizer st = new StringTokenizer(job.strargs, "\n");
117: String srcUrl = (st.hasMoreTokens()) ? st.nextToken() : null;
118: String dstUrl = (st.hasMoreTokens()) ? st.nextToken() : null;
119:
120: //sanity check
121: // Credential name is no longer required. Karan Feb 04, 2008
122: // if(mCredName == null){
123: // mLogger.log("Credential name needs to be specified for " +
124: // " stork job. Set pegasus.transfer.stork.cred property",
125: // LogManager.ERROR_MESSAGE_LEVEL);
126: // throw new CodeGeneratorException(
127: // "Credential name needs to be specified for " +
128: // " stork job. Set pegasus.transfer.stork.cred property");
129: //
130: // }
131:
132: //check for type of job. Stork only understands Transfer Jobs
133: if (!(job instanceof TransferJob)) {
134: throw new CodeGeneratorException(
135: "Stork Code Generator can only generate code for transfer jobs");
136: }
137:
138: PrintWriter writer = null;
139: try {
140: writer = this .getWriter(job);
141: } catch (IOException ioe) {
142: throw new RuntimeException(
143: "Unable to get Writer to write the Stork Submit file",
144: ioe);
145: }
146:
147: writer.println(this .mStartSeparator);
148: writer.println(" * PEGASUS WMS STORK FILE GENERATOR");
149: writer.println(" * DAG : " + dagname + ", Index = " + dagindex
150: + ", Count = " + dagcount);
151: writer.println(" * STORK FILE NAME : "
152: + this .getFileBaseName(job));
153: writer.println(this .mEndSeparator);
154:
155: writer.println("[");
156:
157: writer.println("\tdap_type = \"" + "transfer" + "\";");
158: writer.println("\tsrc_url = \"" + srcUrl + "\";");
159: writer.println("\tdest_url = \"" + dstUrl + "\";");
160: writer.println("\tx509proxy = \"" + "default" + "\";");
161: writer.println("\tlog = \"" + this .getFileBaseName(job)
162: + ".log" + "\";");
163:
164: // DONE
165: writer.println("]");
166:
167: writer.println(this .mStartSeparator);
168: writer.println(" * END OF STORK FILE");
169: writer.println(this .mEndSeparator);
170:
171: //flush the contents
172: writer.close();
173: }
174:
175: /**
176: * Returns the basename of the file to which the job is written to.
177: *
178: * @param job the job whose job information needs to be written.
179: *
180: * @return the basename of the file.
181: */
182: public String getFileBaseName(SubInfo job) {
183: StringBuffer sb = new StringBuffer();
184: sb.append(job.jobName).append(".stork");
185: return sb.toString();
186: }
187:
188: }
|