/*
* This file or a portion of this file is licensed under the terms of
* the Globus Toolkit Public License, found in file GTPL, or at
* http://www.globus.org/toolkit/download/license.html. This notice must
* appear in redistributions of this file, with or without modification.
*
* Redistributions of this Software, with or without modification, must
* reproduce the GTPL in: (1) the Software, or (2) the Documentation or
* some other similar material which is provided with the Software (if
* any).
*
* Copyright 1999-2004 University of Chicago and The University of
* Southern California. All rights reserved.
*/
package org.griphyn.vdl.router;
import org.griphyn.vdl.classes.*;
import org.griphyn.vdl.parser.*;
import org.griphyn.vdl.router.*;
import org.griphyn.vdl.toolkit.*;
import org.griphyn.vdl.dbschema.*;
import org.griphyn.vdl.util.ChimeraProperties;
import org.griphyn.vdl.util.Logging;
import org.griphyn.vdl.directive.*;
import edu.isi.pegasus.common.util.Version;
import java.io.Writer;
import java.io.PrintWriter;
import java.io.BufferedWriter;
import gnu.getopt.*;
public class ToDAG extends Toolkit
{
/**
* ctor: Constructs a new instance object with the given application name.
*/
public ToDAG( String appName )
{
super(appName);
}
/**
* Shows the usage.
*/
public void showUsage()
{
String m_usage = "[-d dbname] [-l t|x] -f lfn";
String linefeed = System.getProperty( "line.separator", "\r\n" );
System.out.println(
"$Id$" + linefeed +
"VDS version " + Version.instance().toString() + linefeed );
System.out.println(
"Usage: " + this.m_application + " [-d db] [-l t|x] -f lfn" + linefeed );
System.out.println(
" -V|--version print version information and exit." + linefeed +
" -d|--dbase dbx associates the dbname with the database, unused." + linefeed +
" -l|--list x|t output format, textual or XML, default is XML." + linefeed +
" -f|--file lfn request a filename to be produced" + linefeed );
}
/**
* Creates a set of long options.
* @return the long option vector.
*/
protected LongOpt[] generateValidOptions()
{
LongOpt[] lo = new LongOpt[6];
lo[0] = new LongOpt( "help", LongOpt.NO_ARGUMENT, null, 'h' );
lo[1] = new LongOpt( "dbase", LongOpt.REQUIRED_ARGUMENT, null, 'd' );
lo[2] = new LongOpt( "version", LongOpt.NO_ARGUMENT, null, 'V' );
lo[3] = new LongOpt( "file", LongOpt.REQUIRED_ARGUMENT, null, 'f' );
lo[4] = new LongOpt( "lfn", LongOpt.REQUIRED_ARGUMENT, null, 'f' );
lo[5] = new LongOpt( "list", LongOpt.REQUIRED_ARGUMENT, null, 'l' );
return lo;
}
public static void main( String[] args )
throws IllegalArgumentException
{
// create debug output
Logging.instance().register( "app", System.err );
Logging.instance().register( "dag", System.err );
Logging.instance().register( "state", System.err );
Logging.instance().register( "route", System.err );
Logging.instance().register( "trace", System.err );
Logging.instance().register( "stack", System.err );
try {
// new instance
ToDAG me = new ToDAG("ToDAG");
// get the commandline options
Getopt opts = new Getopt( me.m_application, args,
"hd:f:l:V",
me.generateValidOptions() );
opts.setOpterr(false);
String dbase = null;
String lfn = null;
String t = null;
int option = 0;
while ( (option = opts.getopt()) != -1 ) {
switch ( option ) {
case 'V':
System.out.println( "$Id$" );
System.out.println( "VDS version " + Version.instance().toString() );
return;
case 'd':
dbase = opts.getOptarg();
break;
case 'f':
lfn = opts.getOptarg();
break;
case 'l':
t = opts.getOptarg().toLowerCase();
break;
case 'h':
default:
me.showUsage();
return;
}
}
// sanity check
if ( lfn == null || lfn.length() == 0 ) {
me.showUsage();
System.err.println( "You must specify a value for -f" );
System.exit(1);
}
// user supplied database, set up me.m_dbschema
String vdcSchemaName = ChimeraProperties.instance().getVDCSchemaName();
Connect connect = new Connect();
DatabaseSchema dbschema = connect.connectDatabase(vdcSchemaName);
// output format, defaults to XML
boolean wantText = ( t != null && Character.toLowerCase(t.charAt(0)) == 't' );
Definitions defs = null;
if ( dbschema instanceof InMemorySchema ) {
// already everything in main memory, use backdoor (Yuck! Dirty!)
// avoid duplicating DVs in main memory.
defs = ((InMemorySchema) dbschema).backdoor();
} else {
// Load all Definitions into an in-memory database (uiuiui)
me.m_logger.log( "app", 1, "loading *all* definitions into memory" );
defs = new Definitions();
defs.setDefinition( ((VDC) dbschema).searchDefinition( null, null, null, -1 ) );
}
if ( defs == null ) {
System.err.println( "No input data, nothing to route" );
return ;
}
// create new route object, in memory classes
Route r = new Route( new InMemorySchema(defs) );
// actually do some routing
BookKeeper bk = r.requestLfn(lfn);
// what is it to be, xml or text
Writer bw = new BufferedWriter( new PrintWriter( System.out ) );
if ( wantText ) {
if ( bk != null ) bk.toString(bw);
else bw.write( "# no jobs generated" +
System.getProperty("line.separator","\r\n") );
} else {
if ( bk != null ) bk.toXML(bw,"");
else bw.write( "<!-- no jobs generated -->" +
System.getProperty("line.separator","\r\n") );
}
}
catch ( Exception e ) {
e.printStackTrace();
}
}
}