/*
* 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.toolkit;
import java.io.*;
import java.util.*;
import java.sql.SQLException;
import gnu.getopt.*;
import edu.isi.pegasus.common.util.Version;
import org.griphyn.vdl.parser.*;
import org.griphyn.vdl.classes.*;
import org.griphyn.vdl.dbschema.*;
import org.griphyn.vdl.util.Logging;
import org.griphyn.vdl.util.ChimeraProperties;
import org.griphyn.vdl.directive.*;
/**
* This class deletes definition's that match the namespace, identifier,
* version triple.
*
* @author Jens-S. Vöckler
* @author Yong Zhao
* @version $Revision$
*
* @see org.griphyn.vdl.parser.VDLxParser
*/
public class DeleteVDC extends Toolkit
{
/**
* Constructor
*/
public DeleteVDC(String appName)
{
super(appName);
}
/**
* Print the usage string
*/
public void showUsage()
{
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] [-t tr|dv] [-f] [-n ns] [-i id] [-v vs] [-c fn]" );
System.out.println( linefeed +
"Options: " + linefeed +
" -V|--version print version information and exit." + linefeed +
" -d|--dbase db associates the dbname with the database, unused." + linefeed +
" --verbose increases the verbosity level." + linefeed +
" -t|--type tr|dv limits candidates to either TR or DV, default is both." + linefeed +
" -n|--vdlns ns limits candidates to definition namespace matches." + linefeed +
" -i|--vdlid id limits candidates to definition name matches." + linefeed +
" -v|--vdlvs vs limits candidates to definition version matches." + linefeed +
" -f|--force permits removals in batch mode, assuming wildcards." + linefeed +
" Beware, without any other options, everything will be removed!" + linefeed +
" -c|--capture fn captures removed definitions into file fn." + linefeed );
}
/**
* Creates a set of options.
*/
protected LongOpt[] generateValidOptions()
{
LongOpt[] lo = new LongOpt[16];
lo[0] = new LongOpt( "dbase", LongOpt.REQUIRED_ARGUMENT, null, 'd' );
lo[1] = new LongOpt( "version", LongOpt.NO_ARGUMENT, null, 'V' );
lo[2] = new LongOpt( "help", LongOpt.NO_ARGUMENT, null, 'h' );
lo[3] = new LongOpt( "verbose", LongOpt.NO_ARGUMENT, null, 1 );
lo[4] = new LongOpt( "vdlns", LongOpt.REQUIRED_ARGUMENT, null, 'n' );
lo[5] = new LongOpt( "namespace", LongOpt.REQUIRED_ARGUMENT, null, 'n' );
lo[6] = new LongOpt( "ns", LongOpt.REQUIRED_ARGUMENT, null, 'n' );
lo[7] = new LongOpt( "vdlid", LongOpt.REQUIRED_ARGUMENT, null, 'i' );
lo[8] = new LongOpt( "name", LongOpt.REQUIRED_ARGUMENT, null, 'i' );
lo[9] = new LongOpt( "identifier", LongOpt.REQUIRED_ARGUMENT, null, 'i' );
lo[10] = new LongOpt( "id", LongOpt.REQUIRED_ARGUMENT, null, 'i' );
lo[11] = new LongOpt( "vdlvs", LongOpt.REQUIRED_ARGUMENT, null, 'v' );
lo[12] = new LongOpt( "vs", LongOpt.REQUIRED_ARGUMENT, null, 'v' );
lo[13] = new LongOpt( "type", LongOpt.REQUIRED_ARGUMENT, null, 't' );
lo[14] = new LongOpt( "force", LongOpt.NO_ARGUMENT, null, 'f' );
lo[15] = new LongOpt( "capture", LongOpt.REQUIRED_ARGUMENT, null, 'c' );
return lo;
}
/**
* Delete definition's given the triple: namespace, id and version.
*/
public static void main(String[] args)
{
String arg;
Writer capfile = null;
int classType = -1;
String vdlns = null;
String vdlid = null;
String vdlvs = null;
boolean force = false;
DeleteVDC me = new DeleteVDC("deletevdc");
try {
// obtain commandline options first -- we may need the database stuff
Getopt opts = new Getopt( me.m_application, args,
"c:d:fhi:n:t:v:V", me.generateValidOptions() );
opts.setOpterr(false);
int option = 0;
while ( (option = opts.getopt()) != -1 ) {
switch ( option ) {
case 1:
me.increaseVerbosity();
break;
case 'V':
System.out.println( "$Id$" );
System.out.println( "VDS version " + Version.instance().toString() );
return;
case 'c':
arg = opts.getOptarg();
if ( arg != null && arg.length() != 0 ) {
// yes, risk IOException, will be caught at bottom
capfile = new BufferedWriter( new FileWriter(arg) );
}
break;
case 'd':
// currently inactive option
opts.getOptarg();
break;
case 'f':
force = ! force;
break;
case 'i':
vdlid = opts.getOptarg();
break;
case 'n':
vdlns = opts.getOptarg();
break;
case 't':
// type, must be TR or DV (or T or D)
arg = opts.getOptarg();
switch ( Character.toUpperCase(arg.charAt(0)) ) {
case 'D': // derivation
classType = Definition.DERIVATION;
break;
case 'T': // transformation
classType = Definition.TRANSFORMATION;
break;
default:
me.showUsage();
throw new RuntimeException( "invalid argument \"" + arg + "\" for option t" );
}
break;
case 'v':
vdlvs = opts.getOptarg();
break;
case '?':
System.out.println( "Invalid option '" + (char) opts.getOptopt() + "'" );
default:
case 'h':
me.showUsage();
return;
}
}
// Connect the database.
String schemaName = ChimeraProperties.instance().getVDCSchemaName();
Connect connect = new Connect();
DatabaseSchema dbschema = connect.connectDatabase(schemaName);
// Search the database, delete the matched definitions
me.m_logger.log( "app", 1, "Searching the database");
Delete delete = new Delete(dbschema);
java.util.List defList =
delete.deleteDefinition( vdlns, vdlid, vdlvs, classType, capfile, force );
if ( defList.isEmpty() ) {
me.m_logger.log( "app", 1, "no matching definitions in the database" );
} else {
me.m_logger.log( "app", 1, "removed " + defList.size() + " definitions" );
}
try {
if ( capfile != null ) {
capfile.flush();
capfile.close();
}
} catch ( IOException e ) {
me.m_logger.log( "default", 0, "I/O error: " + e.getMessage() + ", ignoring" );
}
// done
if ( dbschema != null ) dbschema.close();
} catch ( SQLException sql ) {
// database problems
for ( int i=0; sql != null; ++i ) {
Logging.instance().log( "default", 0, "SQL error " + i + ": " +
sql.getErrorCode() + ": " + sql.getMessage() );
sql = sql.getNextException();
}
System.exit(1);
} catch ( IOException e ) {
me.m_logger.log( "default", 0, "I/O error" );
System.err.println( e.getMessage() );
System.exit(1);
} catch ( RuntimeException rte ) {
me.m_logger.log( "default", 0, "runtime error" );
System.err.println( rte.getMessage() );
System.exit(1);
} catch( Exception e ) {
e.printStackTrace();
System.exit(1);
}
}
}